From 3eff919945d343ff3b8d6e9468b317d55cdc1eb5 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Fri, 24 Apr 2026 21:55:57 +0200 Subject: [PATCH] 3 - Add UrlDiscovered event --- database/factories/PageFactory.php | 24 +++++++++++++ ...7_create_fedi_discover_instances_table.php | 1 + .../Database/Factories/InstanceFactory.php | 1 + .../FediDiscover/src/Events/UrlDiscovered.php | 26 ++++++++++++++ .../src/FediDiscoverServiceProvider.php | 6 ++++ .../Lvl0/FediDiscover/src/Models/Instance.php | 3 +- .../Feature/InstanceConfigPersistenceTest.php | 2 +- .../tests/Feature/InstanceModelTest.php | 25 +++++++++++++ .../tests/Unit/UrlDiscoveredTest.php | 35 +++++++++++++++++++ 9 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 database/factories/PageFactory.php create mode 100644 packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php create mode 100644 packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php diff --git a/database/factories/PageFactory.php b/database/factories/PageFactory.php new file mode 100644 index 0000000..52302a8 --- /dev/null +++ b/database/factories/PageFactory.php @@ -0,0 +1,24 @@ + + */ +class PageFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/packages/Lvl0/FediDiscover/database/migrations/2026_04_23_205027_create_fedi_discover_instances_table.php b/packages/Lvl0/FediDiscover/database/migrations/2026_04_23_205027_create_fedi_discover_instances_table.php index 841949d..5a9fb60 100644 --- a/packages/Lvl0/FediDiscover/database/migrations/2026_04_23_205027_create_fedi_discover_instances_table.php +++ b/packages/Lvl0/FediDiscover/database/migrations/2026_04_23_205027_create_fedi_discover_instances_table.php @@ -19,6 +19,7 @@ public function up(): void $table->unsignedInteger('interval_seconds')->default(300); $table->json('extras')->default('{}'); $table->timestampTz('last_polled_at')->nullable(); + $table->string('last_seen_id')->nullable(); $table->timestamps(); $table->unique(['type', 'url']); diff --git a/packages/Lvl0/FediDiscover/src/Database/Factories/InstanceFactory.php b/packages/Lvl0/FediDiscover/src/Database/Factories/InstanceFactory.php index b8df1f8..1b7e74d 100644 --- a/packages/Lvl0/FediDiscover/src/Database/Factories/InstanceFactory.php +++ b/packages/Lvl0/FediDiscover/src/Database/Factories/InstanceFactory.php @@ -26,6 +26,7 @@ public function definition(): array 'enabled' => null, 'interval_seconds' => 600, 'extras' => [], + 'last_seen_id' => null, 'last_polled_at' => now(), ]; } diff --git a/packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php b/packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php new file mode 100644 index 0000000..b63eb1e --- /dev/null +++ b/packages/Lvl0/FediDiscover/src/Events/UrlDiscovered.php @@ -0,0 +1,26 @@ +loadMigrationsFrom(__DIR__ . '/../database/migrations'); + Event::listen( + UrlDiscovered::class, + ); + if ($this->app->runningInConsole()) { $this->publishes([ __DIR__ . '/../config/fedi-discover.php' => config_path('fedi-discover.php'), diff --git a/packages/Lvl0/FediDiscover/src/Models/Instance.php b/packages/Lvl0/FediDiscover/src/Models/Instance.php index 866ef17..da751f9 100644 --- a/packages/Lvl0/FediDiscover/src/Models/Instance.php +++ b/packages/Lvl0/FediDiscover/src/Models/Instance.php @@ -19,6 +19,7 @@ * @property bool $enabled * @property int $interval_seconds * @property array $extras + * @property int $last_seen_id * @property Carbon|null $last_polled_at * @property Carbon $created_at * @property Carbon $updated_at @@ -30,7 +31,7 @@ class Instance extends Model 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 = [ 'type' => InstanceType::class, diff --git a/packages/Lvl0/FediDiscover/tests/Feature/InstanceConfigPersistenceTest.php b/packages/Lvl0/FediDiscover/tests/Feature/InstanceConfigPersistenceTest.php index 7f8bf43..ee35919 100644 --- a/packages/Lvl0/FediDiscover/tests/Feature/InstanceConfigPersistenceTest.php +++ b/packages/Lvl0/FediDiscover/tests/Feature/InstanceConfigPersistenceTest.php @@ -14,7 +14,7 @@ class InstanceConfigPersistenceTest extends TestCase { 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([ 'type' => InstanceType::Mastodon->value, diff --git a/packages/Lvl0/FediDiscover/tests/Feature/InstanceModelTest.php b/packages/Lvl0/FediDiscover/tests/Feature/InstanceModelTest.php index ae0634e..d6cde01 100644 --- a/packages/Lvl0/FediDiscover/tests/Feature/InstanceModelTest.php +++ b/packages/Lvl0/FediDiscover/tests/Feature/InstanceModelTest.php @@ -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)); } + 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 { Instance::create([ diff --git a/packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php b/packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php new file mode 100644 index 0000000..c493961 --- /dev/null +++ b/packages/Lvl0/FediDiscover/tests/Unit/UrlDiscoveredTest.php @@ -0,0 +1,35 @@ +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); + } +}