from dataclasses import dataclass from typing import Any from campaigns.auth.dtos import User from campaigns.connectors.db import Database, session_context from campaigns.core.handler import Handler from campaigns.meta.enums import AudienceGender from campaigns.meta.models import TargetingAudience from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignService @dataclass(frozen=True) class CreateOrUpdateCampaignTargetingAudienceRequest: user: User campaign_id: str locations: list[dict[str, Any]] age_min: int age_max: int genders: list[AudienceGender] interests: list[dict[str, Any]] @dataclass class CreateOrUpdateCampaignTargetingAudienceHandler( Handler[CreateOrUpdateCampaignTargetingAudienceRequest, TargetingAudience], ): db: Database campaign_repository: CampaignRepository campaign_service: CampaignService @session_context(in_transaction=True) async def handle( self, request: CreateOrUpdateCampaignTargetingAudienceRequest ) -> TargetingAudience: campaign = await self.campaign_service.get_user_campaign( user=request.user, campaign_id=request.campaign_id ) if campaign.targeting_audience is None: campaign.targeting_audience = TargetingAudience() campaign.targeting_audience.locations = request.locations campaign.targeting_audience.age_min = request.age_min campaign.targeting_audience.age_max = request.age_max campaign.targeting_audience.genders = request.genders campaign.targeting_audience.interests = request.interests self.campaign_repository.add(campaign) return campaign.targeting_audience