From 1140e527f11aef45d98cbc2ddd240e552b2383b8 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Sun, 2 Aug 2026 12:55:53 +0200 Subject: [PATCH] 115 - Read Belga API url from config and sync the feed row via migration --- .../Parsers/BelgaHomepageParserAdapter.php | 18 ++--- config/feed.php | 2 +- ...2_sync_belga_feed_to_website_discovery.php | 65 +++++++++++++++++++ .../Parsers/BelgaHomepageParserTest.php | 15 +++-- 4 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 database/migrations/2024_01_01_000012_sync_belga_feed_to_website_discovery.php diff --git a/app/Services/Parsers/BelgaHomepageParserAdapter.php b/app/Services/Parsers/BelgaHomepageParserAdapter.php index 0adb6750..e8b49a66 100644 --- a/app/Services/Parsers/BelgaHomepageParserAdapter.php +++ b/app/Services/Parsers/BelgaHomepageParserAdapter.php @@ -7,15 +7,13 @@ class BelgaHomepageParserAdapter implements HomepageParserInterface { /** - * Must stay in sync with config('feed.providers.belga.languages.en.url'). - * Nothing calls getHomepageUrl() at runtime — the fetcher uses $feed->url, - * seeded from that config value — so drift here would go unnoticed. + * Belga is English-only for now (#124). The unused $language argument keeps + * the constructor compatible with HomepageParserFactory, which passes one + * positionally to every homepage parser. + * + * @phpstan-ignore constructor.unusedParameter */ - private const API_URL = 'https://capi.belga.press/belgapress/api/public/pressreleases?offset=1&count=6&search=&start=&end=&newsroomId=70&language=EN'; - - public function __construct( - private string $language = 'en', - ) {} + public function __construct(string $language = 'en') {} public function canParse(string $url): bool { @@ -29,7 +27,9 @@ public function extractArticleUrls(string $html): array public function getHomepageUrl(): string { - return str_replace('language=EN', 'language='.strtoupper($this->language), self::API_URL); + $url = config('feed.providers.belga.languages.en.url'); + + return is_string($url) ? $url : ''; } public function getSourceName(): string diff --git a/config/feed.php b/config/feed.php index 0d82739e..78d23199 100644 --- a/config/feed.php +++ b/config/feed.php @@ -45,7 +45,7 @@ 'type' => 'website', 'is_active' => true, 'languages' => [ - 'en' => ['url' => 'https://capi.belga.press/belgapress/api/public/pressreleases?offset=1&count=6&search=&start=&end=&newsroomId=70&language=EN'], + 'en' => ['url' => 'https://capi.belga.press/belgapress/api/public/pressreleases?offset=1&count=50&search=&start=&end=&newsroomId=70&language=EN'], ], 'parsers' => [ 'homepage' => BelgaHomepageParserAdapter::class, diff --git a/database/migrations/2024_01_01_000012_sync_belga_feed_to_website_discovery.php b/database/migrations/2024_01_01_000012_sync_belga_feed_to_website_discovery.php new file mode 100644 index 00000000..275afc74 --- /dev/null +++ b/database/migrations/2024_01_01_000012_sync_belga_feed_to_website_discovery.php @@ -0,0 +1,65 @@ +where('provider', 'belga')->where('url', $url)->min('id') + ?? DB::table('feeds')->where('provider', 'belga')->min('id'); + + if ($keepId === null) { + return; + } + + DB::table('feeds') + ->where('provider', 'belga') + ->where('id', '!=', $keepId) + ->update([ + 'is_active' => false, + 'updated_at' => now(), + ]); + + DB::table('feeds') + ->where('id', $keepId) + ->update([ + 'type' => 'website', + 'url' => $url, + 'updated_at' => now(), + ]); + } + + public function down(): void + { + // No rollback: the previous RSS endpoint 404s, so restoring it would + // only reinstate a feed that silently yields no articles. + } +}; diff --git a/tests/Unit/Services/Parsers/BelgaHomepageParserTest.php b/tests/Unit/Services/Parsers/BelgaHomepageParserTest.php index 7fd3b933..15b74342 100644 --- a/tests/Unit/Services/Parsers/BelgaHomepageParserTest.php +++ b/tests/Unit/Services/Parsers/BelgaHomepageParserTest.php @@ -4,7 +4,7 @@ use App\Services\Parsers\BelgaHomepageParser; use App\Services\Parsers\BelgaHomepageParserAdapter; -use PHPUnit\Framework\TestCase; +use Tests\TestCase; class BelgaHomepageParserTest extends TestCase { @@ -98,10 +98,14 @@ public function test_adapter_delegates_and_reports_source(): void $this->assertSame('Belga News Agency', $adapter->getSourceName()); } - public function test_adapter_uppercases_language_in_api_url(): void + public function test_adapter_url_comes_from_config(): void { - $this->assertStringContainsString('language=EN', (new BelgaHomepageParserAdapter('en'))->getHomepageUrl()); - $this->assertStringContainsString('language=NL', (new BelgaHomepageParserAdapter('nl'))->getHomepageUrl()); + config(['feed.providers.belga.languages.en.url' => 'https://example.test/pressreleases?count=7']); + + $this->assertSame( + 'https://example.test/pressreleases?count=7', + (new BelgaHomepageParserAdapter('en'))->getHomepageUrl() + ); } public function test_adapter_api_url_pins_load_bearing_query_params(): void @@ -111,6 +115,7 @@ public function test_adapter_api_url_pins_load_bearing_query_params(): void $this->assertStringStartsWith('https://capi.belga.press/belgapress/api/public/pressreleases?', $url); $this->assertStringContainsString('newsroomId=70', $url); $this->assertStringContainsString('offset=1', $url); - $this->assertStringContainsString('count=6', $url); + $this->assertStringContainsString('count=50', $url); + $this->assertStringContainsString('language=EN', $url); } }