3 - Add UrlDiscovered event
This commit is contained in:
parent
52d6b493cb
commit
3eff919945
9 changed files with 121 additions and 2 deletions
24
database/factories/PageFactory.php
Normal file
24
database/factories/PageFactory.php
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\Page;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @extends Factory<Page>
|
||||||
|
*/
|
||||||
|
class PageFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,6 +19,7 @@ public function up(): void
|
||||||
$table->unsignedInteger('interval_seconds')->default(300);
|
$table->unsignedInteger('interval_seconds')->default(300);
|
||||||
$table->json('extras')->default('{}');
|
$table->json('extras')->default('{}');
|
||||||
$table->timestampTz('last_polled_at')->nullable();
|
$table->timestampTz('last_polled_at')->nullable();
|
||||||
|
$table->string('last_seen_id')->nullable();
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
|
|
||||||
$table->unique(['type', 'url']);
|
$table->unique(['type', 'url']);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ public function definition(): array
|
||||||
'enabled' => null,
|
'enabled' => null,
|
||||||
'interval_seconds' => 600,
|
'interval_seconds' => 600,
|
||||||
'extras' => [],
|
'extras' => [],
|
||||||
|
'last_seen_id' => null,
|
||||||
'last_polled_at' => now(),
|
'last_polled_at' => now(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
26
packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php
Normal file
26
packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lvl0\FediDiscover\Events;
|
||||||
|
|
||||||
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||||
|
use Illuminate\Broadcasting\PrivateChannel;
|
||||||
|
use Illuminate\Foundation\Events\Dispatchable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class UrlDiscovered
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
public string $url,
|
||||||
|
public ?string $postUrl,
|
||||||
|
public ?string $postBody
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function broadcastOn(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new PrivateChannel('discovery'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,8 +4,10 @@
|
||||||
|
|
||||||
namespace Lvl0\FediDiscover;
|
namespace Lvl0\FediDiscover;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Event;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
use Lvl0\FediDiscover\Console\Commands\ValidateInstancesCommand;
|
use Lvl0\FediDiscover\Console\Commands\ValidateInstancesCommand;
|
||||||
|
use Lvl0\FediDiscover\Events\UrlDiscovered;
|
||||||
|
|
||||||
class FediDiscoverServiceProvider extends ServiceProvider
|
class FediDiscoverServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
|
|
@ -18,6 +20,10 @@ public function boot(): void
|
||||||
{
|
{
|
||||||
$this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
|
$this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
|
||||||
|
|
||||||
|
Event::listen(
|
||||||
|
UrlDiscovered::class,
|
||||||
|
);
|
||||||
|
|
||||||
if ($this->app->runningInConsole()) {
|
if ($this->app->runningInConsole()) {
|
||||||
$this->publishes([
|
$this->publishes([
|
||||||
__DIR__ . '/../config/fedi-discover.php' => config_path('fedi-discover.php'),
|
__DIR__ . '/../config/fedi-discover.php' => config_path('fedi-discover.php'),
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
* @property bool $enabled
|
* @property bool $enabled
|
||||||
* @property int $interval_seconds
|
* @property int $interval_seconds
|
||||||
* @property array<string, mixed> $extras
|
* @property array<string, mixed> $extras
|
||||||
|
* @property int $last_seen_id
|
||||||
* @property Carbon|null $last_polled_at
|
* @property Carbon|null $last_polled_at
|
||||||
* @property Carbon $created_at
|
* @property Carbon $created_at
|
||||||
* @property Carbon $updated_at
|
* @property Carbon $updated_at
|
||||||
|
|
@ -30,7 +31,7 @@ class Instance extends Model
|
||||||
|
|
||||||
protected $table = 'fedi_discover_instances';
|
protected $table = 'fedi_discover_instances';
|
||||||
|
|
||||||
protected $fillable = ['type', 'url', 'enabled', 'interval_seconds', 'extras', 'last_polled_at'];
|
protected $fillable = ['type', 'url', 'enabled', 'interval_seconds', 'extras', 'last_seen_id', 'last_polled_at'];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'type' => InstanceType::class,
|
'type' => InstanceType::class,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ class InstanceConfigPersistenceTest extends TestCase
|
||||||
{
|
{
|
||||||
use RefreshDatabase;
|
use RefreshDatabase;
|
||||||
|
|
||||||
public function test_instance_config_toArray_is_mass_assignable_on_the_model(): void
|
public function test_instance_config_to_array_is_mass_assignable_on_the_model(): void
|
||||||
{
|
{
|
||||||
$config = InstanceConfig::fromArray([
|
$config = InstanceConfig::fromArray([
|
||||||
'type' => InstanceType::Mastodon->value,
|
'type' => InstanceType::Mastodon->value,
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,31 @@ public function test_last_polled_at_is_fillable_and_cast_to_datetime(): void
|
||||||
$this->assertTrue($fresh->last_polled_at->equalTo($polledAt));
|
$this->assertTrue($fresh->last_polled_at->equalTo($polledAt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_last_seen_id_defaults_to_null(): void
|
||||||
|
{
|
||||||
|
$instance = Instance::create([
|
||||||
|
'type' => InstanceType::Mastodon,
|
||||||
|
'url' => 'https://mastodon.social',
|
||||||
|
'enabled' => true,
|
||||||
|
'interval_seconds' => 600,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertNull($instance->fresh()->last_seen_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_last_seen_id_is_fillable_and_persists_as_string(): void
|
||||||
|
{
|
||||||
|
$instance = Instance::create([
|
||||||
|
'type' => InstanceType::Mastodon,
|
||||||
|
'url' => 'https://mastodon.social',
|
||||||
|
'enabled' => true,
|
||||||
|
'interval_seconds' => 600,
|
||||||
|
'last_seen_id' => '109876543210',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertSame('109876543210', $instance->fresh()->last_seen_id);
|
||||||
|
}
|
||||||
|
|
||||||
public function test_enabled_scope_returns_only_enabled_instances(): void
|
public function test_enabled_scope_returns_only_enabled_instances(): void
|
||||||
{
|
{
|
||||||
Instance::create([
|
Instance::create([
|
||||||
|
|
|
||||||
35
packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php
Normal file
35
packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Lvl0\FediDiscover\Tests\Unit;
|
||||||
|
|
||||||
|
use Lvl0\FediDiscover\Events\UrlDiscovered;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class UrlDiscoveredTest extends TestCase
|
||||||
|
{
|
||||||
|
public function test_it_exposes_all_payload_fields(): void
|
||||||
|
{
|
||||||
|
$event = new UrlDiscovered(
|
||||||
|
url: 'https://example.com/article',
|
||||||
|
postUrl: 'https://mastodon.social/@alice/109876543210',
|
||||||
|
postBody: 'Check out this article: https://example.com/article'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertSame('https://example.com/article', $event->url);
|
||||||
|
$this->assertSame('https://mastodon.social/@alice/109876543210', $event->postUrl);
|
||||||
|
$this->assertSame('Check out this article: https://example.com/article', $event->postBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_post_body_is_nullable(): void
|
||||||
|
{
|
||||||
|
$event = new UrlDiscovered(
|
||||||
|
url: 'https://example.com/article',
|
||||||
|
postUrl: 'https://mastodon.social/@alice/109876543210',
|
||||||
|
postBody: null
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertNull($event->postBody);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue