from dataclasses import dataclass from campaigns.connectors.aws.kms import BaseKMS from campaigns.connectors.db import Database, session_context from campaigns.connectors.facebook.base import FacebookClient from campaigns.core.handler import Handler from campaigns.meta.dtos import FacebookConnection from campaigns.meta.repositories import FacebookAssociationRepository @dataclass(frozen=True) class DisconnectFacebookUserRequest: identity_id: str @dataclass class DisconnectFacebookUserHandler( Handler[DisconnectFacebookUserRequest, FacebookConnection], ): db: Database kms: BaseKMS facebook_client: FacebookClient facebook_association_repository: FacebookAssociationRepository @session_context(in_transaction=True) async def handle( self, request: DisconnectFacebookUserRequest ) -> FacebookConnection: association = ( await self.facebook_association_repository.get_by_identity_id_or_none( identity_id=request.identity_id ) ) if not association: return FacebookConnection.not_connected() access_token = await self.kms.decrypt( association.token, context={"field": "token"} ) await self.facebook_client.delete_user_permissions( user_id=association.user_id, user_access_token=access_token, ) association.is_connected = False for page in association.pages: page.is_valid = False page.is_agency_provider = False # TODO: action required for campaigns which have invalid page ids self.facebook_association_repository.add(association) return FacebookConnection.not_connected()