diff --git a/lib/src/fixtures/app_config.json b/lib/src/fixtures/app_config.json deleted file mode 100644 index 3ae14fc..0000000 --- a/lib/src/fixtures/app_config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "app_config", - "user_preference_limits": { - "guest_followed_items_limit": 5, - "guest_saved_headlines_limit": 10, - "authenticated_followed_items_limit": 15, - "authenticated_saved_headlines_limit": 30, - "premium_followed_items_limit": 30, - "premium_saved_headlines_limit": 100 - }, - "ad_config": { - "guest_ad_frequency": 5, - "guest_ad_placement_interval": 3, - "authenticated_ad_frequency": 10, - "authenticated_ad_placement_interval": 5, - "premium_ad_frequency": 0, - "premium_ad_placement_interval": 0 - }, - "account_action_config": { - "guest_days_between_account_actions": 2, - "standard_user_days_between_account_actions": 7 - } -} diff --git a/lib/src/fixtures/categories.json b/lib/src/fixtures/categories.json deleted file mode 100644 index 76d7cb9..0000000 --- a/lib/src/fixtures/categories.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "icon_url": null, - "type": "category" - }, - { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "icon_url": null, - "type": "category" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "icon_url": null, - "type": "category" - }, - { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "icon_url": null, - "type": "category" - } -] diff --git a/lib/src/fixtures/countries.json b/lib/src/fixtures/countries.json deleted file mode 100644 index f9e5026..0000000 --- a/lib/src/fixtures/countries.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - { - "id": "country-ca", - "iso_code": "CA", - "name": "Canada", - "flag_url": "https://example.com/flags/ca.png", - "type": "country" - }, - { - "id": "country-de", - "iso_code": "DE", - "name": "Germany", - "flag_url": "https://example.com/flags/de.png", - "type": "country" - } -] diff --git a/lib/src/fixtures/headlines.json b/lib/src/fixtures/headlines.json deleted file mode 100644 index 1bfc37d..0000000 --- a/lib/src/fixtures/headlines.json +++ /dev/null @@ -1,1520 +0,0 @@ -[ - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef", - "title": "Dart Frog 1.0 Released!", - "description": "The minimalist backend framework for Dart reaches a major milestone.", - "url": "https://dartfrog.vgv.dev/docs/overview", - "image_url": null, - "published_at": "2025-04-20T10:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development and frameworks.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef0", - "title": "Flutter Adaptive UI Best Practices", - "description": "Building responsive and adaptive user interfaces in Flutter.", - "url": "https://docs.flutter.dev/ui/layout/adaptive", - "image_url": null, - "published_at": "2025-04-22T14:30:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef1", - "title": "New Study Shows Benefits of Dark Mode", - "description": "Research indicates reduced eye strain with darker interfaces.", - "url": "https://example.com/dark-mode-study", - "image_url": "https://example.com/images/dark-mode.png", - "published_at": "2025-05-01T08:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef2", - "title": "Flutter Engage Highlights", - "description": "Key announcements and sessions from the recent Flutter conference.", - "url": "https://example.com/flutter-engage-highlights", - "image_url": "https://example.com/images/flutter-engage.png", - "published_at": "2025-05-05T11:30:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef34", - "title": "Global Stock Markets React to New Economic Data", - "description": "Analysis of the latest trends in international finance.", - "url": "https://example.com/global-markets", - "image_url": null, - "published_at": "2025-05-10T09:15:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef56", - "title": "Premier League Season Concludes", - "description": "Review of the top moments and final standings.", - "url": "https://example.com/premier-league-review", - "image_url": "https://example.com/images/premier-league.png", - "published_at": "2025-05-15T16:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef78", - "title": "New AI Model Achieves Breakthrough in Language Understanding", - "description": "Researchers announce significant progress in natural language processing.", - "url": "https://example.com/ai-breakthrough", - "image_url": "https://example.com/images/ai-breakthrough.png", - "published_at": "2025-05-18T09:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef90", - "title": "Upcoming Features in Flutter 3.20", - "description": "A look at what's coming in the next stable release of Flutter.", - "url": "https://example.com/flutter-3-20-preview", - "image_url": null, - "published_at": "2025-05-20T14:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef12", - "title": "Major Acquisition in the Semiconductor Industry", - "description": "Company X acquires Company Y in a multi-billion dollar deal.", - "url": "https://example.com/semiconductor-acquisition", - "image_url": "https://example.com/images/acquisition.png", - "published_at": "2025-05-21T10:30:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef34", - "title": "Euro 2025 Qualifiers Update", - "description": "Results and analysis from the latest international football matches.", - "url": "https://example.com/euro-qualifiers", - "image_url": "https://example.com/images/euro-qualifiers.png", - "published_at": "2025-05-22T19:45:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef56", - "title": "The Future of Quantum Computing", - "description": "Experts discuss the potential impact of quantum technology.", - "url": "https://example.com/quantum-computing-future", - "image_url": null, - "published_at": "2025-05-23T11:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef78", - "title": "Building Cross-Platform Apps with Dart and Flutter", - "description": "A guide to developing for multiple platforms from a single codebase.", - "url": "https://example.com/cross-platform-guide", - "image_url": "https://example.com/images/cross-platform.png", - "published_at": "2025-05-24T15:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef90", - "title": "Startup Funding Reaches Record Highs in Q2 2025", - "description": "Venture capital investment continues to grow.", - "url": "https://example.com/startup-funding-report", - "image_url": "https://example.com/images/funding.png", - "published_at": "2025-05-25T09:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef12", - "title": "Wimbledon 2025 Preview", - "description": "Analysis of the top contenders for the grass court championships.", - "url": "https://example.com/wimbledon-preview", - "image_url": "https://example.com/images/wimbledon.png", - "published_at": "2025-05-25T10:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef34", - "title": "New Framework for Building Scalable Backend Services", - "description": "Exploring a new approach to microservices architecture.", - "url": "https://example.com/scalable-backend", - "image_url": null, - "published_at": "2025-05-25T11:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "action": { - "type": "open_internal_content", - "content_id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "content_type": "source" - } - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "action": { - "type": "open_internal_content", - "content_id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "content_type": "category" - } - }, - "action": { - "type": "open_internal_content", - "content_id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef34", - "content_type": "headline" - } - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef56", - "title": "Mobile App Security Best Practices for 2025", - "description": "Key considerations for protecting user data in mobile applications.", - "url": "https://example.com/mobile-security-guide", - "image_url": "https://example.com/images/mobile-security.png", - "published_at": "2025-05-25T12:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "action": { - "type": "open_internal_content", - "content_id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "content_type": "source" - } - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "action": { - "type": "open_internal_content", - "content_id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "content_type": "category" - } - }, - "action": { - "type": "open_internal_content", - "content_id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef56", - "content_type": "headline" - } - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef78", - "title": "Inflation Rates Continue to Fluctuate Globally", - "description": "Economists analyze the latest reports on consumer prices.", - "url": "https://example.com/inflation-report", - "image_url": null, - "published_at": "2025-05-25T13:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef90", - "title": "Champions League Final Preview", - "description": "Analyzing the strengths and weaknesses of the two finalists.", - "url": "https://example.com/champions-league-preview", - "image_url": "https://example.com/images/champions-league.png", - "published_at": "2025-05-25T14:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef123", - "title": "The Rise of Low-Code Development Platforms", - "description": "How visual tools are changing the software development landscape.", - "url": "https://example.com/low-code-platforms", - "image_url": null, - "published_at": "2025-05-25T15:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef456", - "title": "State Management in Flutter: A Deep Dive", - "description": "Comparing different approaches to managing application state.", - "url": "https://example.com/flutter-state-management", - "image_url": "https://example.com/images/state-management.png", - "published_at": "2025-05-25T16:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef789", - "title": "Impact of Global Supply Chain Issues on Tech Manufacturing", - "description": "Analysis of how disruptions affect production and pricing.", - "url": "https://example.com/supply-chain-impact", - "image_url": "https://example.com/images/supply-chain.png", - "published_at": "2025-05-25T17:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "action": { - "type": "open_internal_content", - "content_id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "content_type": "source" - } - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "action": { - "type": "open_internal_content", - "content_id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "content_type": "category" - } - }, - "action": { - "type": "open_internal_content", - "content_id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef789", - "content_type": "headline" - } - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef012", - "title": "Cricket World Cup Preparations Underway", - "description": "Teams finalize squads and strategies for the upcoming tournament.", - "url": "https://example.com/cricket-world-cup-prep", - "image_url": "https://example.com/images/cricket.png", - "published_at": "2025-05-25T18:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "action": { - "type": "open_internal_content", - "content_id": "country-gb", - "content_type": "country" - } - }, - "action": { - "type": "open_internal_content", - "content_id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "content_type": "source" - } - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "action": { - "type": "open_internal_content", - "content_id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "content_type": "category" - } - }, - "action": { - "type": "open_internal_content", - "content_id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef012", - "content_type": "headline" - } - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef345", - "title": "Cybersecurity Threats on the Rise", - "description": "New report highlights increasing risks for businesses and individuals.", - "url": "https://example.com/cybersecurity-report", - "image_url": "https://example.com/images/cybersecurity.png", - "published_at": "2025-05-25T19:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef678", - "title": "Optimizing Flutter Performance", - "description": "Tips and tricks for building fast and smooth Flutter apps.", - "url": "https://example.com/flutter-performance", - "image_url": null, - "published_at": "2025-05-25T20:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef901", - "title": "Economic Forecast for the Next Quarter", - "description": "Analysts provide their predictions for the global economy.", - "url": "https://example.com/economic-forecast", - "image_url": "https://example.com/images/economic-forecast.png", - "published_at": "2025-05-25T21:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef234", - "title": "New Innovations in Renewable Energy", - "description": "Breakthroughs in solar and wind power technology.", - "url": "https://example.com/renewable-energy-innovations", - "image_url": "https://example.com/images/renewable-energy.png", - "published_at": "2025-05-25T22:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef567", - "title": "Designing User-Friendly Mobile Forms", - "description": "Tips for creating intuitive and efficient form experiences on mobile.", - "url": "https://example.com/mobile-forms-design", - "image_url": null, - "published_at": "2025-05-25T23:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef890", - "title": "The Impact of AI on the Job Market", - "description": "Analyzing how artificial intelligence is reshaping industries and roles.", - "url": "https://example.com/ai-job-market", - "image_url": "https://example.com/images/ai-jobs.png", - "published_at": "2025-05-26T08:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef1234", - "title": "Understanding the Latest Privacy Regulations", - "description": "A guide to navigating new data protection laws.", - "url": "https://example.com/privacy-regulations", - "image_url": null, - "published_at": "2025-05-26T09:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef5678", - "title": "Exploring the Latest Trends in Mobile UI/UX", - "description": "What's new in designing intuitive and engaging mobile interfaces.", - "url": "https://example.com/mobile-ui-ux-trends", - "image_url": "https://example.com/images/mobile-ui-ux.png", - "published_at": "2025-05-26T10:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef9012", - "title": "The Role of 5G in Future Technology", - "description": "How faster networks will enable new applications and services.", - "url": "https://example.com/5g-future", - "image_url": "https://example.com/images/5g.png", - "published_at": "2025-05-26T11:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef3456", - "title": "Building Accessible Flutter Apps", - "description": "Ensuring your mobile applications are usable by everyone.", - "url": "https://example.com/accessible-flutter", - "image_url": null, - "published_at": "2025-05-26T12:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef7890", - "title": "The Latest Trends in Venture Capital", - "description": "Analyzing investment patterns across different sectors.", - "url": "https://example.com/vc-trends", - "image_url": "https://example.com/images/vc-trends.png", - "published_at": "2025-05-26T13:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef12345", - "title": "Six Nations Championship Review", - "description": "Highlights and analysis from the recent rugby tournament.", - "url": "https://example.com/six-nations-review", - "image_url": "https://example.com/images/six-nations.png", - "published_at": "2025-05-26T14:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef67890", - "title": "The Ethics of AI in Decision Making", - "description": "Discussing fairness, bias, and transparency in artificial intelligence.", - "url": "https://example.com/ai-ethics", - "image_url": "https://example.com/images/ai-ethics.png", - "published_at": "2025-05-26T15:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef123456", - "title": "Mastering Flutter Animations", - "description": "Creating smooth and engaging user interfaces with Flutter's animation framework.", - "url": "https://example.com/flutter-animations", - "image_url": null, - "published_at": "2025-05-26T16:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef78901", - "title": "The Future of Electric Vehicles", - "description": "Analyzing the growth and challenges of the EV market.", - "url": "https://example.com/ev-future", - "image_url": "https://example.com/images/ev-future.png", - "published_at": "2025-05-26T17:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef234567", - "title": "Building Scalable APIs with Dart Frog", - "description": "Tips and best practices for developing robust backend services.", - "url": "https://example.com/dart-frog-scalable-apis", - "image_url": null, - "published_at": "2025-05-26T18:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef89012", - "title": "The Latest in Mobile Gaming Technology", - "description": "Exploring new engines and trends in mobile game development.", - "url": "https://example.com/mobile-gaming-tech", - "image_url": "https://example.com/images/mobile-gaming.png", - "published_at": "2025-05-26T19:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef34567", - "title": "Global Economic Outlook: Challenges and Opportunities", - "description": "A comprehensive review of the current economic climate.", - "url": "https://example.com/global-economic-outlook", - "image_url": "https://example.com/images/global-economy.png", - "published_at": "2025-05-26T20:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef89012", - "title": "The Science Behind Athletic Performance", - "description": "How training and nutrition impact sports results.", - "url": "https://example.com/athletic-science", - "image_url": "https://example.com/images/athletic-science.png", - "published_at": "2025-05-26T21:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef345678", - "title": "The Evolution of Web Development Frameworks", - "description": "From traditional MVC to modern component-based architectures.", - "url": "https://example.com/web-framework-evolution", - "image_url": null, - "published_at": "2025-05-26T22:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef90123", - "title": "Building Offline-First Mobile Applications", - "description": "Strategies for creating apps that work reliably without a network connection.", - "url": "https://example.com/offline-first-apps", - "image_url": "https://example.com/images/offline-first.png", - "published_at": "2025-05-26T23:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "b2c3d4e5-f6a7-8901-2345-67890abcdef456789", - "title": "Global Markets Close Mixed", - "description": "Summary of the day's trading activity.", - "url": "https://example.com/market-close", - "image_url": null, - "published_at": "2025-05-27T00:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef01234", - "title": "New Training Regimens for Olympic Athletes", - "description": "How sports science is optimizing performance for the next games.", - "url": "https://example.com/olympic-training", - "image_url": "https://example.com/images/olympic-training.png", - "published_at": "2025-05-27T01:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "d4e5f6a7-b8c9-d012-e345-f67890abcdef567890", - "title": "The Future of Wearable Technology", - "description": "Exploring the latest devices and their potential impact on health and lifestyle.", - "url": "https://example.com/wearable-tech-future", - "image_url": "https://example.com/images/wearable-tech.png", - "published_at": "2025-05-27T02:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "e5f6a7b8-c9d0-e123-f456-7890abcdef1234567", - "title": "Building Robust Backend Services with Dart", - "description": "Leveraging Dart's features for server-side development.", - "url": "https://example.com/dart-backend-services", - "image_url": null, - "published_at": "2025-05-27T03:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "f6a7b8c9-d0e1-f234-a567-890abcdef890123", - "title": "The Latest in Mobile UI Design Trends", - "description": "Exploring new patterns and aesthetics in mobile user interfaces.", - "url": "https://example.com/mobile-ui-trends", - "image_url": "https://example.com/images/mobile-ui-trends.png", - "published_at": "2025-05-27T04:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef4567890", - "title": "Understanding the Stock Market Volatility", - "description": "Factors influencing recent fluctuations in global stock markets.", - "url": "https://example.com/stock-market-volatility", - "image_url": "https://example.com/images/stock-market.png", - "published_at": "2025-05-27T05:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "type": "category" - }, - "type": "headline" - }, - { - "id": "0f8fad5b-d9cb-469f-a165-70867728950e", - "title": "VGV's Take on Cross-Platform Mobile Strategy for 2026", - "description": "Exploring how Very Good Ventures approaches mobile development with an eye on future trends and framework choices.", - "url": "https://example.com/vgv-mobile-strategy-2026", - "image_url": null, - "published_at": "2025-05-30T10:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "description": "Insights from the Very Good Ventures team.", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "language": "en", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "1c9c07df-19e8-40e0-9f3a-6410bf9a0b5a", - "title": "The Business of Open Source: A VGV Perspective", - "description": "How Very Good Ventures balances community contributions with sustainable business models in the open-source world.", - "url": "https://example.com/vgv-open-source-business", - "image_url": "https://example.com/images/vgv-business.png", - "published_at": "2025-05-30T11:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "description": "Insights from the Very Good Ventures team.", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "language": "en", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "8f5dbf2e-0a3f-4a9c-8b7c-3e4d5f6a7b8c", - "title": "VGV Team Builds Fantasy Sports App with Dart Frog", - "description": "A case study on using Dart Frog for a high-performance backend for a new fantasy sports platform, by the VGV team.", - "url": "https://example.com/vgv-fantasy-sports-dartfrog", - "image_url": null, - "published_at": "2025-05-30T12:00:00Z", - "source": { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "description": "Insights from the Very Good Ventures team.", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "language": "en", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "3a2b1c0d-ef98-7654-3210-fedcba987654", - "title": "Flutter for Desktop: Expanding Horizons Beyond Mobile", - "description": "The Flutter team discusses the growing capabilities and use cases for Flutter in desktop application development.", - "url": "https://flutter.dev/desktop-future", - "image_url": "https://example.com/images/flutter-desktop.png", - "published_at": "2025-05-30T13:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "description": "Official documentation and news for the Flutter framework.", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "language": "fr", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "4b3c2d1e-f0a9-8765-4321-0fedcba98765", - "title": "How Businesses are Leveraging Flutter for Rapid MVP Development", - "description": "Case studies and insights from the Flutter team on enterprises using Flutter to quickly build and iterate on new products.", - "url": "https://flutter.dev/business-mvp-flutter", - "image_url": null, - "published_at": "2025-05-30T14:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "description": "Official documentation and news for the Flutter framework.", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "language": "fr", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c3d4e5f6-a7b8-c901-d234-e56789abcdef", - "name": "Business", - "description": "News about companies, finance, and the economy.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "5c4d3e2f-1ba0-9876-5432-10fedcba9876", - "title": "Building Engaging Sports Fan Apps with Flutter", - "description": "The Flutter team showcases examples of sports applications built with Flutter, highlighting UI/UX possibilities.", - "url": "https://flutter.dev/sports-apps-showcase", - "image_url": "https://example.com/images/flutter-sports.png", - "published_at": "2025-05-30T15:00:00Z", - "source": { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "description": "Official documentation and news for the Flutter framework.", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "language": "fr", - "headquarters": null, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "6d5e4f3a-2cb1-0987-6543-210fedcba987", - "title": "Mobile Gaming Startup 'PixelPlay' Raises $15M Series A", - "description": "TechCrunch reports on PixelPlay's latest funding round to expand its mobile game portfolio and user acquisition efforts.", - "url": "https://techcrunch.com/pixelplay-series-a", - "image_url": "https://example.com/images/pixelplay.png", - "published_at": "2025-05-30T16:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "description": "Startup and technology news.", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "language": "en", - "headquarters": { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "7e6f5a4b-3dc2-1098-7654-3210fedcba98", - "title": "TechCrunch Disrupt: The Future of Sports Tech Startups", - "description": "A panel at TechCrunch Disrupt discusses innovation in sports technology, from wearables to fan engagement platforms.", - "url": "https://techcrunch.com/disrupt-sports-tech-2025", - "image_url": null, - "published_at": "2025-05-30T17:00:00Z", - "source": { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "description": "Startup and technology news.", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "language": "en", - "headquarters": { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c4e5f6a7-b8c9-d012-e345-f67890abcdef", - "name": "Sports", - "description": "Latest updates from the world of sports.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "8f7a6b5c-4ed3-2109-8765-43210fedcba9", - "title": "UK Government Announces New Funding for AI Research", - "description": "BBC News reports on a significant government investment aimed at boosting the UK's artificial intelligence capabilities.", - "url": "https://www.bbc.com/news/technology-uk-ai-funding", - "image_url": "https://example.com/images/uk-ai.png", - "published_at": "2025-05-30T18:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "description": "British public service broadcaster.", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Technology", - "description": "News about software development, hardware, and the internet.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - }, - { - "id": "9a8b7c6d-5fe4-3210-9876-543210fedcba", - "title": "BBC Investigates: The Rise of Mobile Banking Apps in the UK", - "description": "A BBC News feature exploring the adoption and security of mobile banking applications across the United Kingdom.", - "url": "https://www.bbc.com/news/business-mobile-banking-uk", - "image_url": null, - "published_at": "2025-05-30T19:00:00Z", - "source": { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "description": "British public service broadcaster.", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - }, - "category": { - "id": "c2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Mobile Development", - "description": "Articles related to mobile app development for iOS and Android.", - "icon_url": null, - "type": "category" - }, - "type": "headline" - } -] diff --git a/lib/src/fixtures/sources.json b/lib/src/fixtures/sources.json deleted file mode 100644 index 31d937d..0000000 --- a/lib/src/fixtures/sources.json +++ /dev/null @@ -1,66 +0,0 @@ -[ - { - "id": "s1a2b3c4-d5e6-f789-0123-456789abcdef", - "name": "Very Good Ventures Blog", - "description": "Insights from the Very Good Ventures team.", - "url": "https://vgv.dev/blog", - "source_type": "blog", - "language": "en", - "headquarters": { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - "type": "source" - }, - { - "id": "s2b3c4d5-e6f7-a890-1234-567890abcdef", - "name": "Flutter Dev", - "description": "Official documentation and news for the Flutter framework.", - "url": "https://flutter.dev", - "source_type": "specialized_publisher", - "language": "fr", - "headquarters": { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - "type": "source" - }, - { - "id": "s3c4d5e6-f7a8-b901-c234-d56789abcdef", - "name": "TechCrunch", - "description": "Startup and technology news.", - "url": "https://techcrunch.com/", - "source_type": "specialized_publisher", - "language": "en", - "headquarters": { - "id": "country-us", - "iso_code": "US", - "name": "United States", - "flag_url": "https://example.com/flags/us.png", - "type": "country" - }, - "type": "source" - }, - { - "id": "s4d5e6f7-a8b9-c012-d345-e67890abcdef", - "name": "BBC News", - "description": "British public service broadcaster.", - "url": "https://www.bbc.com/news", - "source_type": "national_news_outlet", - "language": "en", - "headquarters": { - "id": "country-gb", - "iso_code": "GB", - "name": "United Kingdom", - "flag_url": "https://example.com/flags/gb.png", - "type": "country" - }, - "type": "source" - } -] diff --git a/routes/_middleware.dart b/routes/_middleware.dart index 93bf34a..7198224 100644 --- a/routes/_middleware.dart +++ b/routes/_middleware.dart @@ -1,17 +1,13 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - import 'package:dart_frog/dart_frog.dart'; import 'package:ht_api/src/middlewares/error_handler.dart'; -import 'package:ht_api/src/rbac/permission_service.dart'; // Import PermissionService +import 'package:ht_api/src/rbac/permission_service.dart'; import 'package:ht_api/src/registry/model_registry.dart'; import 'package:ht_api/src/services/auth_service.dart'; import 'package:ht_api/src/services/auth_token_service.dart'; -import 'package:ht_api/src/services/default_user_preference_limit_service.dart'; // Import DefaultUserPreferenceLimitService +import 'package:ht_api/src/services/default_user_preference_limit_service.dart'; import 'package:ht_api/src/services/jwt_auth_token_service.dart'; import 'package:ht_api/src/services/token_blacklist_service.dart'; -import 'package:ht_api/src/services/user_preference_limit_service.dart'; // Import UserPreferenceLimitService interface +import 'package:ht_api/src/services/user_preference_limit_service.dart'; import 'package:ht_api/src/services/verification_code_storage_service.dart'; import 'package:ht_data_inmemory/ht_data_inmemory.dart'; import 'package:ht_data_repository/ht_data_repository.dart'; @@ -65,61 +61,11 @@ class RequestId { final String id; } -// --- Helper Function to Load Fixtures --- -// Note: -// Error handling here is basic, consider more robust file checks. -// ignore: unused_element -Future>> _loadFixture(String fileName) async { - final path = 'lib/src/fixtures/$fileName'; - try { - final file = File(path); - if (!file.existsSync()) { - print('Warning: Fixture file not found at $path. Returning empty list.'); - return []; - } - final content = await file.readAsString(); - final decoded = jsonDecode(content) as List?; // Allow null - // Ensure items are maps - return decoded?.whereType>().toList() ?? []; - } catch (e) { - print('Error loading or parsing fixture file $path: $e'); - return []; // Return empty on error to avoid crashing startup - } -} - // --- Repository Creation Logic --- -// Synchronous fixture loader (use with caution) -List> _loadFixtureSync(String fileName) { - final path = 'lib/src/fixtures/$fileName'; - try { - final file = File(path); - if (!file.existsSync()) { - print('Warning: Fixture file not found at $path. Returning empty list.'); - return []; - } - final content = file.readAsStringSync(); - final decoded = jsonDecode(content); - - if (decoded is Map) { - // If it's a single object, wrap it in a list - return [decoded]; - } else if (decoded is List) { - // If it's a list, filter for maps and return - return decoded.whereType>().toList(); - } else { - print('Error: Fixture file $path contains unexpected JSON type.'); - return []; - } - } catch (e) { - print('Error loading or parsing fixture file $path: $e'); - return []; - } -} - HtDataRepository _createHeadlineRepository() { print('Initializing Headline Repository...'); final initialData = - _loadFixtureSync('headlines.json').map(Headline.fromJson).toList(); + headlinesFixturesData.map(Headline.fromJson).toList(); final client = HtDataInMemoryClient( toJson: (i) => i.toJson(), getId: (i) => i.id, @@ -132,7 +78,7 @@ HtDataRepository _createHeadlineRepository() { HtDataRepository _createCategoryRepository() { print('Initializing Category Repository...'); final initialData = - _loadFixtureSync('categories.json').map(Category.fromJson).toList(); + categoriesFixturesData.map(Category.fromJson).toList(); final client = HtDataInMemoryClient( toJson: (i) => i.toJson(), getId: (i) => i.id, @@ -145,7 +91,7 @@ HtDataRepository _createCategoryRepository() { HtDataRepository _createSourceRepository() { print('Initializing Source Repository...'); final initialData = - _loadFixtureSync('sources.json').map(Source.fromJson).toList(); + sourcesFixturesData.map(Source.fromJson).toList(); final client = HtDataInMemoryClient( toJson: (i) => i.toJson(), getId: (i) => i.id, @@ -158,7 +104,7 @@ HtDataRepository _createSourceRepository() { HtDataRepository _createCountryRepository() { print('Initializing Country Repository...'); final initialData = - _loadFixtureSync('countries.json').map(Country.fromJson).toList(); + countriesFixturesData.map(Country.fromJson).toList(); final client = HtDataInMemoryClient( toJson: (i) => i.toJson(), getId: (i) => i.id, @@ -194,12 +140,8 @@ HtDataRepository HtDataRepository _createAppConfigRepository() { print('Initializing AppConfig Repository...'); - final fixtureData = _loadFixtureSync('app_config.json'); - if (fixtureData.isEmpty) { - throw Exception('Failed to load app_config.json fixture or it is empty.'); - } final initialData = [ - AppConfig.fromJson(fixtureData.first), + AppConfig.fromJson(appConfigFixtureData), ]; // Assuming one config final client = HtDataInMemoryClient( toJson: (i) => i.toJson(), diff --git a/routes/api/v1/_middleware.dart b/routes/api/v1/_middleware.dart index 1044eea..f7a57b1 100644 --- a/routes/api/v1/_middleware.dart +++ b/routes/api/v1/_middleware.dart @@ -24,7 +24,7 @@ Handler middleware(Handler handler) { // This default allows credentials, so it cannot be '*'. // Adjust 'http://localhost:3000' if your local Flutter web dev server // typically runs on a different port. - effectiveOrigin = 'http://localhost:45535'; + effectiveOrigin = 'http://localhost:39155'; print('------------------------------------------------------------------'); print('WARNING: CORS_ALLOWED_ORIGIN environment variable is NOT SET.'); print(