from pyxdi import Module, provider from campaigns.assets.services import AssetService from campaigns.auth.services import AuthService from campaigns.connectors.aws.kms import BaseKMS from campaigns.connectors.aws.s3 import S3Client from campaigns.connectors.db import Database from campaigns.connectors.facebook.base import FacebookClient from campaigns.connectors.ows_account import OwsAccount from campaigns.connectors.ows_product import OwsProduct from campaigns.meta.handlers import ( ConnectFacebookUserHandler, CreateCampaignAdImageHandler, CreateCampaignAdVideoHandler, CreateCampaignEngagementAudienceHandler, CreateCampaignHandler, CreateCampaignImageHandler, CreateCampaignVideoHandler, CreateOrUpdateCampaignTargetingAudienceHandler, DeleteCampaignImageHandler, DeleteCampaignVideoHandler, DisconnectFacebookUserHandler, GetCampaignAdFormatsHandler, GetCampaignAdPreviewHandler, GetCampaignAudiencesHandler, GetCampaignAudienceSummaryHandler, GetCampaignImageHandler, GetCampaignImagesHandler, GetCampaignOverviewHandler, GetCampaignPostHandler, GetCampaignPostsHandler, GetCampaignVideoHandler, GetCampaignVideosHandler, GetEngagementAudienceEventsHandler, GetFacebookConnectionStatusHandler, GetFacebookUserPageForLabelHandler, GetFacebookUserPagesForLabelHandler, GetFacebookUserPagesHandler, GetInstagramAccountForFacebookPageHandler, RefreshCampaignAdImageHandler, RefreshCampaignAdVideoHandler, SubmitCampaignHandler, UpdateCampaignCreativeHandler, UpdateCampaignHandler, UpdateCampaignScheduleAndBudgetHandler, ) from campaigns.meta.repositories import ( AdFormatRepository, CampaignAdCreativeRepository, CampaignAdRepository, CampaignAdSetEngagementAudienceRepository, CampaignAdSetRepository, CampaignAdSetTargetingAudienceRepository, CampaignImageRepository, CampaignRepository, CampaignVideoRepository, EngagementAudienceEventRepository, EngagementAudienceRepository, FacebookAssociationRepository, FacebookPageLabelRepository, FacebookPageRepository, TargetingAudienceRepository, ) from campaigns.meta.services import ( AdFormatService, CampaignImageService, CampaignPostService, CampaignService, CampaignVideoService, FacebookPageService, FacebookPageTokenService, InstagramAccountService, ) from campaigns.meta.validators import CampaignValidator class MetaModule(Module): # Repositories @provider(scope="singleton") def ad_format_repository(self) -> AdFormatRepository: return AdFormatRepository() @provider(scope="singleton") def campaign_repository(self, db: Database) -> CampaignRepository: return CampaignRepository(db=db) @provider(scope="singleton") def campaign_ad_repository(self, db: Database) -> CampaignAdRepository: return CampaignAdRepository(db=db) @provider(scope="singleton") def campaign_ad_creative_repository( self, db: Database ) -> CampaignAdCreativeRepository: return CampaignAdCreativeRepository(db=db) @provider(scope="singleton") def campaign_ad_set_repository(self, db: Database) -> CampaignAdSetRepository: return CampaignAdSetRepository(db=db) @provider(scope="singleton") def campaign_ad_set_engagement_audience_repository( self, db: Database ) -> CampaignAdSetEngagementAudienceRepository: return CampaignAdSetEngagementAudienceRepository(db=db) @provider(scope="singleton") def campaign_ad_set_targeting_audience_repository( self, db: Database ) -> CampaignAdSetTargetingAudienceRepository: return CampaignAdSetTargetingAudienceRepository(db=db) @provider(scope="singleton") def campaign_image_repository(self, db: Database) -> CampaignImageRepository: return CampaignImageRepository(db=db) @provider(scope="singleton") def campaign_video_repository(self, db: Database) -> CampaignVideoRepository: return CampaignVideoRepository(db=db) @provider(scope="singleton") def engagement_audience_repository( self, db: Database ) -> EngagementAudienceRepository: return EngagementAudienceRepository(db=db) @provider(scope="singleton") def engagement_audience_event_repository(self) -> EngagementAudienceEventRepository: return EngagementAudienceEventRepository() @provider(scope="singleton") def targeting_audience_repository( self, db: Database ) -> TargetingAudienceRepository: return TargetingAudienceRepository(db=db) @provider(scope="singleton") def facebook_association_repository( self, db: Database ) -> FacebookAssociationRepository: return FacebookAssociationRepository(db=db) @provider(scope="singleton") def facebook_page_label_repository( self, db: Database ) -> FacebookPageLabelRepository: return FacebookPageLabelRepository(db=db) @provider(scope="singleton") def facebook_page_repository(self, db: Database) -> FacebookPageRepository: return FacebookPageRepository(db=db) # Services @provider(scope="singleton") def facebook_page_token_service( self, kms: BaseKMS, facebook_client: FacebookClient, facebook_page_repository: FacebookPageRepository, ) -> FacebookPageTokenService: return FacebookPageTokenService( kms=kms, facebook_client=facebook_client, facebook_page_repository=facebook_page_repository, ) @provider(scope="singleton") def facebook_page_service( self, s3: S3Client, facebook_page_repository: FacebookPageRepository, facebook_page_token_service: FacebookPageTokenService, ) -> FacebookPageService: return FacebookPageService( s3=s3, facebook_page_repository=facebook_page_repository, facebook_page_token_service=facebook_page_token_service, ) @provider(scope="singleton") def instagram_account_service( self, facebook_client: FacebookClient, facebook_page_token_service: FacebookPageTokenService, ) -> InstagramAccountService: return InstagramAccountService( facebook_client=facebook_client, facebook_page_token_service=facebook_page_token_service, ) @provider(scope="singleton") def ad_format_service( self, ad_format_repository: AdFormatRepository ) -> AdFormatService: return AdFormatService(ad_format_repository=ad_format_repository) @provider(scope="singleton") def campaign_service( self, campaign_repository: CampaignRepository ) -> CampaignService: return CampaignService(campaign_repository=campaign_repository) @provider(scope="singleton") def campaign_image_service( self, facebook_client: FacebookClient, campaign_image_repository: CampaignImageRepository, asset_service: AssetService, ) -> CampaignImageService: return CampaignImageService( facebook_client=facebook_client, campaign_image_repository=campaign_image_repository, asset_service=asset_service, ) @provider(scope="singleton") def campaign_video_service( self, facebook_client: FacebookClient, campaign_video_repository: CampaignVideoRepository, asset_service: AssetService, ) -> CampaignVideoService: return CampaignVideoService( facebook_client=facebook_client, campaign_video_repository=campaign_video_repository, asset_service=asset_service, ) @provider(scope="singleton") def campaign_post_service( self, facebook_client: FacebookClient, facebook_page_token_service: FacebookPageTokenService, ) -> CampaignPostService: return CampaignPostService( facebook_client=facebook_client, facebook_page_token_service=facebook_page_token_service, ) # Validators @provider(scope="singleton", override=True) def campaign_validator( self, ows_account: OwsAccount, ows_product: OwsProduct, facebook_page_service: FacebookPageService, campaign_post_service: CampaignPostService, ) -> CampaignValidator: return CampaignValidator( ows_account=ows_account, ows_product=ows_product, facebook_page_service=facebook_page_service, campaign_post_service=campaign_post_service, ) # Handlers @provider(scope="singleton") def connect_facebook_user_handler( self, db: Database, kms: BaseKMS, auth_service: AuthService, facebook_client: FacebookClient, facebook_association_repository: FacebookAssociationRepository, facebook_page_label_repository: FacebookPageLabelRepository, facebook_page_service: FacebookPageService, ) -> ConnectFacebookUserHandler: return ConnectFacebookUserHandler( db=db, kms=kms, auth_service=auth_service, facebook_client=facebook_client, facebook_association_repository=facebook_association_repository, facebook_page_label_repository=facebook_page_label_repository, facebook_page_service=facebook_page_service, ) @provider(scope="singleton") def create_campaign_handler( self, db: Database, facebook_client: FacebookClient, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, ) -> CreateCampaignHandler: return CreateCampaignHandler( db=db, facebook_client=facebook_client, campaign_validator=campaign_validator, campaign_repository=campaign_repository, ) @provider(scope="singleton") def create_campaign_ad_image_handler( self, db: Database, facebook_client: FacebookClient, campaign_image_repository: CampaignImageRepository, campaign_image_service: CampaignImageService, asset_service: AssetService, ) -> CreateCampaignAdImageHandler: return CreateCampaignAdImageHandler( db=db, facebook_client=facebook_client, campaign_image_repository=campaign_image_repository, campaign_image_service=campaign_image_service, asset_service=asset_service, ) @provider(scope="singleton") def create_campaign_ad_video_handler( self, db: Database, facebook_client: FacebookClient, campaign_video_repository: CampaignVideoRepository, campaign_video_service: CampaignVideoService, ) -> CreateCampaignAdVideoHandler: return CreateCampaignAdVideoHandler( db=db, facebook_client=facebook_client, campaign_video_repository=campaign_video_repository, campaign_video_service=campaign_video_service, ) @provider(scope="singleton") def create_campaign_engagement_audience_handler( self, db: Database, campaign_repository: CampaignRepository, campaign_service: CampaignService, facebook_client: FacebookClient, engagement_audience_event_repository: EngagementAudienceEventRepository, engagement_audience_repository: EngagementAudienceRepository, ) -> CreateCampaignEngagementAudienceHandler: return CreateCampaignEngagementAudienceHandler( db=db, campaign_repository=campaign_repository, campaign_service=campaign_service, facebook_client=facebook_client, engagement_audience_event_repository=engagement_audience_event_repository, engagement_audience_repository=engagement_audience_repository, ) @provider(scope="singleton") def create_campaign_image_handler( self, db: Database, campaign_service: CampaignService, campaign_image_service: CampaignImageService, ) -> CreateCampaignImageHandler: return CreateCampaignImageHandler( db=db, campaign_service=campaign_service, campaign_image_service=campaign_image_service, ) @provider(scope="singleton") def create_campaign_video_handler( self, db: Database, campaign_service: CampaignService, campaign_video_service: CampaignVideoService, ) -> CreateCampaignVideoHandler: return CreateCampaignVideoHandler( db=db, campaign_service=campaign_service, campaign_video_service=campaign_video_service, ) @provider(scope="singleton") def create_or_update_campaign_targeting_audience_handler( self, db: Database, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> CreateOrUpdateCampaignTargetingAudienceHandler: return CreateOrUpdateCampaignTargetingAudienceHandler( db=db, campaign_repository=campaign_repository, campaign_service=campaign_service, ) @provider(scope="singleton") def delete_campaign_image_handler( self, db: Database, campaign_service: CampaignService, campaign_image_service: CampaignImageService, ) -> DeleteCampaignImageHandler: return DeleteCampaignImageHandler( db=db, campaign_service=campaign_service, campaign_image_service=campaign_image_service, ) @provider(scope="singleton") def delete_campaign_video_handler( self, db: Database, campaign_service: CampaignService, campaign_video_service: CampaignVideoService, ) -> DeleteCampaignVideoHandler: return DeleteCampaignVideoHandler( db=db, campaign_service=campaign_service, campaign_video_service=campaign_video_service, ) @provider(scope="singleton") def disconnect_facebook_user_handler( self, db: Database, kms: BaseKMS, facebook_client: FacebookClient, facebook_association_repository: FacebookAssociationRepository, ) -> DisconnectFacebookUserHandler: return DisconnectFacebookUserHandler( db=db, kms=kms, facebook_client=facebook_client, facebook_association_repository=facebook_association_repository, ) @provider(scope="singleton") def get_campaign_ad_formats_handler( self, db: Database, campaign_service: CampaignService, ad_format_service: AdFormatService, ) -> GetCampaignAdFormatsHandler: return GetCampaignAdFormatsHandler( db=db, campaign_service=campaign_service, ad_format_service=ad_format_service, ) @provider(scope="singleton") def get_campaign_ad_preview_handler( self, db: Database, facebook_client: FacebookClient, campaign_service: CampaignService, ad_format_repository: AdFormatRepository, campaign_post_service: CampaignPostService, ) -> GetCampaignAdPreviewHandler: return GetCampaignAdPreviewHandler( db=db, campaign_service=campaign_service, facebook_client=facebook_client, ad_format_repository=ad_format_repository, campaign_post_service=campaign_post_service, ) @provider(scope="singleton") def get_campaign_audience_summary_handler( self, db: Database, facebook_client: FacebookClient, campaign_service: CampaignService, ad_format_service: AdFormatService, ) -> GetCampaignAudienceSummaryHandler: return GetCampaignAudienceSummaryHandler( db=db, facebook_client=facebook_client, campaign_service=campaign_service, ad_format_service=ad_format_service, ) @provider(scope="singleton") def get_campaign_audiences_handler( self, db: Database, campaign_service: CampaignService ) -> GetCampaignAudiencesHandler: return GetCampaignAudiencesHandler(db=db, campaign_service=campaign_service) @provider(scope="singleton") def get_engagement_audience_events_handler( self, db: Database, campaign_service: CampaignService, engagement_audience_event_repository: EngagementAudienceEventRepository, ) -> GetEngagementAudienceEventsHandler: return GetEngagementAudienceEventsHandler( db=db, campaign_service=campaign_service, engagement_audience_event_repository=engagement_audience_event_repository, ) @provider(scope="singleton") def get_campaign_image_handler( self, db: Database, campaign_service: CampaignService ) -> GetCampaignImageHandler: return GetCampaignImageHandler(db=db, campaign_service=campaign_service) @provider(scope="singleton") def get_campaign_images_handler( self, db: Database, campaign_service: CampaignService ) -> GetCampaignImagesHandler: return GetCampaignImagesHandler(db=db, campaign_service=campaign_service) @provider(scope="singleton") def get_campaign_overview_handler( self, db: Database, campaign_service: CampaignService, campaign_validator: CampaignValidator, ) -> GetCampaignOverviewHandler: return GetCampaignOverviewHandler( db=db, campaign_service=campaign_service, campaign_validator=campaign_validator, ) @provider(scope="singleton") def get_campaign_post_handler( self, db: Database, campaign_service: CampaignService, campaign_post_service: CampaignPostService, ) -> GetCampaignPostHandler: return GetCampaignPostHandler( db=db, campaign_service=campaign_service, campaign_post_service=campaign_post_service, ) @provider(scope="singleton") def get_campaign_posts_handler( self, db: Database, facebook_client: FacebookClient, campaign_service: CampaignService, facebook_page_token_service: FacebookPageTokenService, ) -> GetCampaignPostsHandler: return GetCampaignPostsHandler( db=db, facebook_client=facebook_client, campaign_service=campaign_service, facebook_page_token_service=facebook_page_token_service, ) @provider(scope="singleton") def get_campaign_video_handler( self, db: Database, campaign_service: CampaignService ) -> GetCampaignVideoHandler: return GetCampaignVideoHandler(db=db, campaign_service=campaign_service) @provider(scope="singleton") def get_campaign_videos_handler( self, db: Database, campaign_service: CampaignService ) -> GetCampaignVideosHandler: return GetCampaignVideosHandler(db=db, campaign_service=campaign_service) @provider(scope="singleton") def get_facebook_connection_status_handler( self, db: Database, kms: BaseKMS, facebook_client: FacebookClient, facebook_association_repository: FacebookAssociationRepository, ) -> GetFacebookConnectionStatusHandler: return GetFacebookConnectionStatusHandler( db=db, kms=kms, facebook_client=facebook_client, facebook_association_repository=facebook_association_repository, ) @provider(scope="singleton") def get_facebook_user_page_for_label_handler( self, db: Database, facebook_page_service: FacebookPageService, ) -> GetFacebookUserPageForLabelHandler: return GetFacebookUserPageForLabelHandler( db=db, facebook_page_service=facebook_page_service ) @provider(scope="singleton") def get_facebook_user_pages_handler( self, db: Database, facebook_page_repository: FacebookPageRepository ) -> GetFacebookUserPagesHandler: return GetFacebookUserPagesHandler( db=db, facebook_page_repository=facebook_page_repository ) @provider(scope="singleton") def get_facebook_user_pages_for_label_handler( self, db: Database, facebook_page_repository: FacebookPageRepository, facebook_page_token_service: FacebookPageTokenService, ) -> GetFacebookUserPagesForLabelHandler: return GetFacebookUserPagesForLabelHandler( db=db, facebook_page_repository=facebook_page_repository, facebook_page_token_service=facebook_page_token_service, ) @provider(scope="singleton") def get_instagram_account_for_facebook_page_handler( self, db: Database, facebook_page_service: FacebookPageService, instagram_account_service: InstagramAccountService, ) -> GetInstagramAccountForFacebookPageHandler: return GetInstagramAccountForFacebookPageHandler( db=db, facebook_page_service=facebook_page_service, instagram_account_service=instagram_account_service, ) @provider(scope="singleton") def refresh_campaign_ad_image_handler( self, db: Database, facebook_client: FacebookClient, campaign_image_repository: CampaignImageRepository, campaign_image_service: CampaignImageService, ) -> RefreshCampaignAdImageHandler: return RefreshCampaignAdImageHandler( db=db, facebook_client=facebook_client, campaign_image_repository=campaign_image_repository, campaign_image_service=campaign_image_service, ) @provider(scope="singleton") def refresh_campaign_ad_video_handler( self, db: Database, facebook_client: FacebookClient, campaign_video_repository: CampaignVideoRepository, campaign_video_service: CampaignVideoService, asset_service: AssetService, ) -> RefreshCampaignAdVideoHandler: return RefreshCampaignAdVideoHandler( db=db, facebook_client=facebook_client, campaign_video_repository=campaign_video_repository, campaign_video_service=campaign_video_service, asset_service=asset_service, ) @provider(scope="singleton") def submit_campaign_handler( self, db: Database, facebook_client: FacebookClient, campaign_service: CampaignService, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_ad_set_repository: CampaignAdSetRepository, campaign_ad_set_targeting_audience_repository: CampaignAdSetTargetingAudienceRepository, campaign_ad_set_engagement_audience_repository: CampaignAdSetEngagementAudienceRepository, campaign_ad_creative_repository: CampaignAdCreativeRepository, campaign_ad_repository: CampaignAdRepository, ad_format_service: AdFormatService, ) -> SubmitCampaignHandler: return SubmitCampaignHandler( db=db, facebook_client=facebook_client, campaign_service=campaign_service, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_ad_set_repository=campaign_ad_set_repository, campaign_ad_set_targeting_audience_repository=campaign_ad_set_targeting_audience_repository, campaign_ad_set_engagement_audience_repository=campaign_ad_set_engagement_audience_repository, campaign_ad_creative_repository=campaign_ad_creative_repository, campaign_ad_repository=campaign_ad_repository, ad_format_service=ad_format_service, ) @provider(scope="singleton") def update_campaign_handler( self, db: Database, facebook_client: FacebookClient, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> UpdateCampaignHandler: return UpdateCampaignHandler( db=db, facebook_client=facebook_client, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, ) @provider(scope="singleton") def update_campaign_creative_handler( self, db: Database, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, campaign_post_service: CampaignPostService, ) -> UpdateCampaignCreativeHandler: return UpdateCampaignCreativeHandler( db=db, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, campaign_post_service=campaign_post_service, ) @provider(scope="singleton") def update_campaign_schedule_and_budget_handler( self, db: Database, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> UpdateCampaignScheduleAndBudgetHandler: return UpdateCampaignScheduleAndBudgetHandler( db=db, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, )