from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from ows_text_campaigns.adapters.scanner import ContentScanner from ows_text_campaigns.artist.repositories import ArtistSettingsRepository from ows_text_campaigns.artist.services import ArtistSettingsService from ows_text_campaigns.artist.types import ArtistContentRecommendations from ows_text_campaigns.artist.validators import ArtistSettingsValidator @dataclass(kw_only=True) class ScanArtistContentRequest(AuthRequest): global_participant_id: str opt_in_message: str welcome_message: str @singleton class ScanArtistContentHandler: permission = Permission("text_campaign", "edit") def __init__( self, auth_service: AuthService, artist_settings_repository: ArtistSettingsRepository, artist_settings_service: ArtistSettingsService, artist_settings_validator: ArtistSettingsValidator, scanner: ContentScanner, ) -> None: self.auth_service = auth_service self.artist_settings_repository = artist_settings_repository self.artist_settings_service = artist_settings_service self.artist_settings_validator = artist_settings_validator self.scanner = scanner def handle(self, request: ScanArtistContentRequest) -> ArtistContentRecommendations: 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_configured_settings( request.global_participant_id ) opt_in_scan_result = self.scanner.scan( content=request.opt_in_message, artist_name=artist_settings.artist_name, ) welcome_message_scan_result = self.scanner.scan( content=request.welcome_message, artist_name=artist_settings.artist_name, ) return ArtistContentRecommendations( optInMessage=opt_in_scan_result, welcomeMessage=welcome_message_scan_result )