from dataclasses import dataclass from campaigns.connectors.aws.kms import BaseKMS from campaigns.connectors.facebook.base import FacebookClient from campaigns.core.types import EncryptedToken, PlainToken from campaigns.meta.models import FacebookPage from campaigns.meta.repositories import FacebookPageRepository @dataclass class FacebookPageTokenService: kms: BaseKMS facebook_client: FacebookClient facebook_page_repository: FacebookPageRepository async def encrypt_token(self, plain_token: PlainToken) -> EncryptedToken: return await self.kms.encrypt(plain_token, context={"field": "page_token"}) async def decrypt_token(self, page: FacebookPage) -> PlainToken: plain_token = await self.kms.decrypt( page.token, context={"field": "page_token"} ) page.plain_token = plain_token return plain_token async def debug_tokens(self, *, pages: list[FacebookPage]) -> list[FacebookPage]: if not pages: return [] page_tokens = await self.kms.decrypt_many( [page.token for page in pages], context={"field": "page_token"} ) debug_tokens = await self.facebook_client.debug_tokens( list(page_tokens.values()) ) for page in pages: page_token = page_tokens[page.token] page.plain_token = page_token page.is_valid = debug_tokens[page_token].is_valid self.facebook_page_repository.add(page) return pages