from typing import List from db import db from utils.list_utils import first_or_none from models.projects import Project from models.campaign import Campaign from models.linkfire import Linkfire, LinkfireCampaign, LinkfireProject, LinkfireAddType from linkfire.schemas import LinkfireLinkSchema from utils.snowflake.google_data.models import LinkfireLink class LinkfireRepository: def commit_changes(self, campaign: Campaign): db.session.commit() db.session.refresh(campaign) def update_project_linkfire_links(self, project: Project, links: List[LinkfireLinkSchema]): link_ids = [link.link_id for link in links] deletable_links = self.__get_linkfire_projects_by( project_id=project.id, filter_items=[ LinkfireProject.add_type == LinkfireAddType.MANUALLY.value, Linkfire.link_id.notin_(link_ids), ], ) [db.session.delete(d_link) for d_link in deletable_links] existed_links = db.session.query(Linkfire).filter(Linkfire.link_id.in_(link_ids)).all() for link in links: persisted_link = first_or_none(existed_links, lambda x: x.link_id == link.link_id) if persisted_link: link_project = self.__get_linkfire_project_by(project.id, persisted_link.id) if not link_project: db.session.add(LinkfireProject(project=project, linkfire_link=persisted_link)) else: new_link = Linkfire(link_id=link.link_id, link_url=link.link_url) db.session.add(LinkfireProject(project=project, linkfire_link=new_link)) def update_campaign_linkfire_links(self, campaign: Campaign, links: List[LinkfireLinkSchema]): link_ids = [link.link_id for link in links] deletable_links = self.__get_linkfire_campaigns_by( campaign_id=campaign.id, filter_items=[ LinkfireCampaign.add_type == LinkfireAddType.MANUALLY.value, Linkfire.link_id.notin_(link_ids), ], ) [db.session.delete(d_link) for d_link in deletable_links] existed_links = db.session.query(Linkfire).filter(Linkfire.link_id.in_(link_ids)).all() for link in links: persisted_link = first_or_none(existed_links, lambda x: x.link_id == link.link_id) if persisted_link: link_campaign = self.__get_linkfire_campaign_by(campaign.id, persisted_link.id) if not link_campaign: db.session.add(LinkfireCampaign(campaign=campaign, linkfire_link=persisted_link)) else: new_link = Linkfire(link_id=link.link_id, link_url=link.link_url) db.session.add(LinkfireCampaign(campaign=campaign, linkfire_link=new_link)) def import_linkfire_campaign_links(self, campaign: Campaign, links: List[LinkfireLink]): link_ids = [link.link_id for link in links] deletable_links = self.__get_linkfire_campaigns_by( campaign_id=campaign.id, filter_items=[ LinkfireCampaign.add_type == LinkfireAddType.AUTO_IMPORTED.value, Linkfire.link_id.notin_(link_ids), ], ) [db.session.delete(d_link) for d_link in deletable_links] existed_links = db.session.query(Linkfire).filter(Linkfire.link_id.in_(link_ids)).all() for link in links: persisted_link = first_or_none(existed_links, lambda x: x.link_id == link.link_id) if persisted_link: link_campaign = self.__get_linkfire_campaign_by(campaign.id, persisted_link.id) if link_campaign: link_campaign.add_type = LinkfireAddType.AUTO_IMPORTED.value else: db.session.add( LinkfireCampaign( campaign=campaign, linkfire_link=persisted_link, add_type=LinkfireAddType.AUTO_IMPORTED.value, ) ) else: new_link = Linkfire(link_id=link.link_id, link_url=link.link_url) db.session.add( LinkfireCampaign( campaign=campaign, linkfire_link=new_link, add_type=LinkfireAddType.AUTO_IMPORTED.value ) ) def __get_linkfire_campaigns_by(self, campaign_id: int, filter_items: list): query = ( db.session.query(LinkfireCampaign) .join(Linkfire, LinkfireCampaign.linkfire_id == Linkfire.id) .filter(LinkfireCampaign.campaign_id == campaign_id) ) return query.filter(*filter_items).all() def __get_linkfire_projects_by(self, project_id: int, filter_items: list): query = ( db.session.query(LinkfireProject) .join(Linkfire, LinkfireProject.linkfire_id == Linkfire.id) .filter(LinkfireProject.project_id == project_id) ) return query.filter(*filter_items).all() def __get_linkfire_campaign_by(self, campaign_id: int, linkfire_id: int): return ( db.session.query(LinkfireCampaign) .filter(LinkfireCampaign.campaign_id == campaign_id, LinkfireCampaign.linkfire_id == linkfire_id) .one_or_none() ) def __get_linkfire_project_by(self, project_id: int, linkfire_id: int): return ( db.session.query(LinkfireProject) .filter(LinkfireProject.project_id == project_id, LinkfireProject.linkfire_id == linkfire_id) .one_or_none() )