from dataclasses import dataclass from campaigns.assets.dtos import AssetUploadCredentials 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 AssetPositionGroup from campaigns.meta.models import CampaignImage from campaigns.meta.services import CampaignImageService, CampaignService @dataclass(frozen=True) class CreateCampaignImageRequest: user: User campaign_id: str filename: str position_group: AssetPositionGroup @dataclass class CreateCampaignImageHandler( Handler[CreateCampaignImageRequest, tuple[CampaignImage, AssetUploadCredentials]], ): db: Database campaign_service: CampaignService campaign_image_service: CampaignImageService @session_context(in_transaction=True) async def handle( self, request: CreateCampaignImageRequest ) -> tuple[CampaignImage, AssetUploadCredentials]: campaign = await self.campaign_service.get_user_campaign( user=request.user, campaign_id=request.campaign_id ) return await self.campaign_image_service.create_campaign_image( campaign, filename=request.filename, position_group=request.position_group )