import logging from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.types import Permission from ows_text_campaigns.adapters.db.decorators import transactional from ows_text_campaigns.artist.exceptions import InvalidArtistImageError from ows_text_campaigns.artist.services import ArtistSettingsService from ows_text_campaigns.artist.validators import ArtistSettingsValidator from ows_text_campaigns.assets.image import ImageProcessor from ows_text_campaigns.assets.models import Asset from ows_text_campaigns.assets.services import AssetService from ows_text_campaigns.config import Settings logger = logging.getLogger(__name__) @dataclass(kw_only=True) class CreateArtistImageRequest(AuthRequest): global_participant_id: str image_key: str @singleton class CreateArtistImageHandler: permission = Permission("text_campaign", "create") def __init__( self, asset_service: AssetService, artist_settings_service: ArtistSettingsService, artist_settings_validator: ArtistSettingsValidator, image_processor: ImageProcessor, settings: Settings, ) -> None: self.asset_service = asset_service self.artist_settings_service = artist_settings_service self.artist_settings_validator = artist_settings_validator self.image_processor = image_processor self.settings = settings @transactional def handle(self, request: CreateArtistImageRequest) -> Asset: self.artist_settings_validator.validate_roster_access( identity_id=request.identity_id, global_participant_id=request.global_participant_id, permission=self.permission, ) artist_settings = self.artist_settings_service.get_settings( request.global_participant_id ) try: binary_asset = self.asset_service.get_asset_from_s3(request.image_key) except Exception as exc: logger.exception( "Failed to process artist `%s` image", artist_settings.global_participant_id, extra={ "image_key": request.image_key, "global_participant_id": artist_settings.global_participant_id, }, ) raise InvalidArtistImageError from exc asset = self.artist_settings_service.create_and_upload_artist_image( global_participant_id=artist_settings.global_participant_id, asset=binary_asset, key=request.image_key, identity_id=request.identity_id, ) self.artist_settings_service.create_and_upload_vcard( artist_settings, photo=binary_asset, sync_artist_name=True, ) return asset