from dataclasses import dataclass from campaigns.auth.dtos import User from campaigns.connectors.db import Database, session_context from campaigns.core.handler import Handler from campaigns.meta.dtos import EngagementAudienceEvent from campaigns.meta.enums import CampaignPlatform from campaigns.meta.repositories.engagement_audience_event import ( EngagementAudienceEventRepository, ) from campaigns.meta.services import CampaignService @dataclass(frozen=True) class GetEngagementAudienceEventsRequest: user: User campaign_id: str @dataclass class GetEngagementAudienceEventsHandler( Handler[GetEngagementAudienceEventsRequest, list[EngagementAudienceEvent]], ): db: Database campaign_service: CampaignService engagement_audience_event_repository: EngagementAudienceEventRepository @session_context(in_transaction=False) async def handle( self, request: GetEngagementAudienceEventsRequest ) -> list[EngagementAudienceEvent]: campaign = await self.campaign_service.get_user_campaign( user=request.user, campaign_id=request.campaign_id ) if campaign.instagram_account_external_id: event_platforms = [ CampaignPlatform.FACEBOOK, CampaignPlatform.INSTAGRAM, ] else: event_platforms = [CampaignPlatform.FACEBOOK] return self.engagement_audience_event_repository.find_by_platforms( platforms=event_platforms )