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.models import ArtistSettings from ows_text_campaigns.artist.repositories import ArtistSettingsRepository from ows_text_campaigns.artist.services import ArtistSettingsService from ows_text_campaigns.artist.validators import ArtistSettingsValidator from ows_text_campaigns.assets.exceptions import AssetNotFoundError from ows_text_campaigns.assets.services import AssetService @dataclass(kw_only=True) class DeleteArtistImageRequest(AuthRequest): global_participant_id: str @singleton class DeleteArtistImageHandler: permission = Permission("text_campaign", "delete") def __init__( self, asset_service: AssetService, artist_settings_repository: ArtistSettingsRepository, artist_settings_service: ArtistSettingsService, artist_settings_validator: ArtistSettingsValidator, ) -> None: self.asset_service = asset_service self.artist_settings_repository = artist_settings_repository self.artist_settings_service = artist_settings_service self.artist_settings_validator = artist_settings_validator @transactional def handler(self, request: DeleteArtistImageRequest) -> ArtistSettings: 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 ) if artist_settings.asset is None: raise AssetNotFoundError asset = artist_settings.asset self.asset_service.delete_asset(asset) # Reset the asset in artist settings artist_settings.asset = None artist_settings.asset_id = None self.artist_settings_repository.save(artist_settings) return artist_settings