Skip to content

Conversation

fulleni
Copy link
Member

@fulleni fulleni commented Aug 31, 2025

Status

READY

Description

This pull request implements a significant architectural improvement to the local ad system by transitioning from a single, monolithic LocalAd class to a more robust and extensible abstract base class with distinct concrete ad type implementations. This refactoring enhances the system's ability to manage diverse ad formats, simplifies future additions of new ad types, and improves overall code organization and clarity.

Type of Change

  • ✨ New feature (non-breaking change which adds functionality)
  • 🛠️ Bug fix (non-breaking change which fixes an issue)
  • ❌ Breaking change (fix or feature that would cause existing functionality to change)
  • 🧹 Code refactor
  • ✅ Build configuration change
  • 📝 Documentation
  • 🗑️ Chore

fulleni added 20 commits August 31, 2025 09:19
- Create new LocalVideoAd class for serving custom video ads locally
- Implement JSON serialization and deserialization
- Include properties for id, videoUrl, and targetUrl
- Add copyWith method for creating modified instances
- Create new LocalNativeAd class for custom native ads served locally
- Implement JsonSerializable for easy serialization/deserialization
- Add properties for id, title, subtitle, imageUrl, and targetUrl
- Include factory constructor for creating instance from JSON
- Implement copyWith method for creating modified copies
- Create new LocalInterstitialAd class for serving local interstitial ads
- Implement JSON serialization and deserialization
- Define properties for ad ID, image URL, and target URL
- Add copyWith method for creating modified instances
- Update type field to 'localInterstitialAd'
- Create new LocalBannerAd class for custom banner ads served locally
- Implement JSON serialization and deserialization
- Define immutable properties for id, imageUrl, and targetUrl
- Add copyWith method for creating modified instances
- Update FeedItem type to support localBannerAd
- Add exports for local_banner_ad, local_interstitial_ad, local_native_ad, and local_video_ad
- Create new file with predefined local ad fixtures for testing and development purposes
- Include various types of local ads: native, banner, interstitial, and video
- Each ad has placeholder IDs and sample content with example URLs
- Convert LocalAd into an abstract class acting as a router for different local ad types
- Implement factory constructor to dispatch JSON deserialization to concrete types
- Remove properties and methods specific to native ads, as they will be handled by subclass
- Add documentation explaining the new routing mechanism for local ad types
- Change parent class from FeedItem to LocalAd
- Add @OverRide for toJson method
- Include adType and type in JSON representation
- Update constructor to use AdType.banner
…lization

- Change parent class from FeedItem to LocalAd
- Update constructor to use AdType.interstitial
- Override toJson method to include adType and type for routing and compatibility
- Change LocalNativeAd to extend LocalAd
- Update constructor and toJson method
- Add adType field and include it in JSON representation
- Maintain type field for backwards compatibility
- Change LocalVideoAd to extend LocalAd instead of FeedItem
- Update constructor to use adType parameter
- Modify toJson method to include both adType and type
- Update props to include adType
- Adjust copyWith method for new parameter
…ndling

- Remove json_annotation and related code
- Replace AdType enum with String directly
- Simplify.fromJson factory method
- Remove toJson method declaration
- Remove unnecessary overrides and props
- Simplify adType assignment in constructor
…oJson

- Change adType from AdType enum to string
- Remove override of toJson method
- Simplify props list in get props override
- Change adType from AdType enum to string literal 'native'
- Remove @OverRide annotation for toJson method
- Simplify toJson implementation by removing redundant comments
…verride

- Remove @OverRide annotation for toJson and props
- Directly assign 'video' string to super adType
- Simplify toJson method by removing unnecessary comments
- Remove unnecessary List<Object?> get props override
- Update local ads fixtures to use IDs from fixture_ids.dart
- Remove unnecessary imports
- Replace hardcoded LocalAd with fixture data
- Update test descriptions to reflect use of LocalNativeAd
- Adjust type checks in tests to use LocalNativeAd instead of LocalAd
…and concrete subclasses

- Refactor tests to cover LocalAd as an abstract class with named constructors
- Add tests for fromJson dispatching to correct subclasses
- Include tests for props and equality checks on a concrete subclass (LocalNativeAd)
- Update test descriptions and expectations to reflect the new implementation
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @fulleni, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request implements a significant architectural improvement to the local ad system by transitioning from a single, monolithic LocalAd class to a more robust and extensible abstract base class with distinct concrete ad type implementations. This refactoring enhances the system's ability to manage diverse ad formats, simplifies future additions of new ad types, and improves overall code organization and clarity.

Highlights

  • Refactored LocalAd Model: The LocalAd class has been refactored from a concrete class into an abstract base class. This introduces a polymorphic structure for handling different types of local advertisements.
  • Introduced Specific Ad Subtypes: New concrete ad types have been added: LocalNativeAd, LocalBannerAd, LocalInterstitialAd, and LocalVideoAd. Each subtype now encapsulates properties specific to its ad format, inheriting common functionality from the abstract LocalAd.
  • Centralized JSON Deserialization: The LocalAd.fromJson factory constructor now acts as a central dispatcher, intelligently deserializing JSON data into the correct concrete ad subtype based on the adType field, improving flexibility and maintainability.
  • Updated Fixtures and Tests: Fixture data for local ads has been updated to reflect the new subtype structure, and corresponding tests have been significantly refactored to validate the new class hierarchy and JSON serialization/deserialization logic.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request is a great refactoring that introduces specific subtypes for LocalAd (LocalNativeAd, LocalBannerAd, etc.), moving from a single generic class to a more robust and type-safe hierarchy with an abstract base class. The use of a factory constructor in the LocalAd base class for deserialization is a clean and effective pattern. The changes are well-implemented and the tests have been updated to cover the new structure.

I have a couple of minor suggestions to improve consistency and fix a typo. Overall, this is a high-quality contribution that improves the codebase's maintainability.

- Prefix local ad id constants with 'k' to follow consistent naming convention
- Update constant names for local ad ids to improve clarity and consistency
- Replaced hardcoded local ad IDs with predefined constants
- Updated all LocalAd instances to use constant IDs
- This change improves code maintainability and readability
- Remove local ad exports from feed_decorators.dart
- Create new local_ads.dart file for local ad exports
- Move local ad model classes to a new local_ads directory
- Update models.dart to export new local_ads.dart file
- Correct the typo in the exception message from 'LocalAds' to 'LocalAd'
- Improve consistency and accuracy of error reporting
@fulleni fulleni merged commit 88f9257 into main Aug 31, 2025
0 of 2 checks passed
@fulleni fulleni deleted the Refactor-LocalAd-into-Specific-Ad-Subtypes branch August 31, 2025 09:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant