from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.adapters.db import DefaultDB from dmp.google.dtos import GoogleUserAdAccountLabel from dmp.google.exceptions import GoogleUserConnectionNotFoundError from dmp.google.repositories import GoogleUserConnectionRepository from dmp.google.services import GoogleAdAccountService @dataclass(frozen=True) class GetGoogleUserAdAccountsRequest: identity_id: str user_id: str @singleton class GetGoogleUserAdAccountsHandler: permission = Permission("ad_connection", "view") def __init__( self, db: DefaultDB, auth_service: AuthService, ad_account_service: GoogleAdAccountService, user_connection_repository: GoogleUserConnectionRepository, ) -> None: self.db = db self.auth_service = auth_service self.ad_account_service = ad_account_service self.user_connection_repository = user_connection_repository def handle( self, request: GetGoogleUserAdAccountsRequest ) -> list[GoogleUserAdAccountLabel]: user_connection = ( self.user_connection_repository.get_by_identity_id_and_user_id( identity_id=request.identity_id, user_id=request.user_id ) ) if not user_connection: raise GoogleUserConnectionNotFoundError self.auth_service.check_owned_resource( user_connection.identity_id, permission=self.permission, resource_id=user_connection.id, ) return self.ad_account_service.get_user_ad_accounts_for_assignment( identity_id=request.identity_id, user_id=request.user_id )