from flask import g from typing import List, Optional from external_api.base.clients.delphi_client import DelphiClient from external_api.base.clients.client_factory import ApiClientFactory from external_api.base.analytics_models import LinkfireQuery from linkfire.linkfire_repository import LinkfireRepository from campaigns.repositories.campaigns_repository import CampaignsRepository from linkfire.schemas import ( LinkfireLinkSchema, LinkfireResponseSchema, LinkfireLinkListRequestSchema, CampaignLinkfireLinkListResponseSchema, ) from shared.schemas import CampaignLinkfireLinkListMapper from linkfire.services.linkfire_history_service import LinkfireHistoryService class LinkfireService: delphi_client: DelphiClient linkfire_repository: LinkfireRepository campaigns_repository: CampaignsRepository linkfire_history_service: LinkfireHistoryService def __init__(self, delphi_client: DelphiClient = ApiClientFactory.delphi_client()): self.delphi_client = delphi_client self.linkfire_repository = LinkfireRepository() self.campaigns_repository = CampaignsRepository() self.linkfire_history_service = LinkfireHistoryService() async def get_linkfire_link_by_url(self, name: Optional[str], limit: int) -> List[LinkfireResponseSchema]: linkfire_link_response = await self.delphi_client.search_for_linkfire_links(LinkfireQuery(name, limit)) return [LinkfireResponseSchema(linkId=i.link_id, linkUrl=i.link_url) for i in linkfire_link_response.items] def set_linkfire_links_to_campaign( self, campaign_uuid: str, linkfire_params: LinkfireLinkListRequestSchema ) -> CampaignLinkfireLinkListResponseSchema: campaign = self.campaigns_repository.get_campaign_by_uuid(campaign_uuid) old_linkfire_state = CampaignLinkfireLinkListMapper.map(campaign.linkfire_campaigns) self.linkfire_repository.update_campaign_linkfire_links( campaign, self.__map_linkfire_links(linkfire_params.linkfireLinks) ) self.linkfire_repository.commit_changes(campaign) self.linkfire_history_service.log_campaign_linkfire_changes_if_needed( campaign=campaign, old_value=old_linkfire_state, new_value=CampaignLinkfireLinkListMapper.map(campaign.linkfire_campaigns), user_id=g.user_id, ) return CampaignLinkfireLinkListResponseSchema(CampaignLinkfireLinkListMapper.map(campaign.linkfire_campaigns)) def __map_linkfire_links(self, linkfire_links): return [ LinkfireLinkSchema(id=link.id, link_id=link.linkId, link_url=link.linkUrl, deletable=link.deletable) for link in linkfire_links ]