import datetime import decimal 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.models import Campaign from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignService from campaigns.meta.validators import CampaignValidator @dataclass(frozen=True) class UpdateCampaignScheduleAndBudgetRequest: user: User campaign_id: str start_time: datetime.datetime end_time: datetime.datetime lifetime_budget: decimal.Decimal @dataclass class UpdateCampaignScheduleAndBudgetHandler( Handler[UpdateCampaignScheduleAndBudgetRequest, Campaign], ): db: Database campaign_validator: CampaignValidator campaign_repository: CampaignRepository campaign_service: CampaignService @session_context(in_transaction=True) async def handle(self, request: UpdateCampaignScheduleAndBudgetRequest) -> Campaign: campaign = await self.campaign_service.get_user_campaign( user=request.user, campaign_id=request.campaign_id ) campaign.start_time = request.start_time campaign.end_time = request.end_time campaign.lifetime_budget = request.lifetime_budget campaign.updated_by = request.user.id.identity_id self.campaign_validator.validate_schedule(campaign) await self.campaign_validator.validate_lifetime_budget(campaign) self.campaign_repository.add(campaign) return campaign