from migrations.fixtures.delphi_tables.v1.triggers.base_trigger import BaseTrigger class LinkfireCampaignTrigger(BaseTrigger): table = "LinkfireCampaign" function_name = "log_linkfire_campaign_changes" def on_insert(self): return f""" IF (({self.__select_campaign(columns='campaign.external_id')}) IS NOT NULL) THEN INSERT INTO linkfire_link_campaign(campaign_id, link_id) VALUES ( ({self.__select_campaign(columns="campaign_dsp_id(campaign.source, campaign.external_id)")}), ({self.__select_link_id()}) ) ON CONFLICT DO NOTHING; ELSE UPDATE "Campaign" SET source = COALESCE(({self.__select_campaign(columns='campaign.source')}), 'dec'), external_id = ({self.__select_campaign(columns='campaign.id')}) WHERE id = NEW.campaign_id; END IF; """ def on_delete(self): return f""" DELETE FROM linkfire_link_campaign WHERE linkfire_link_campaign.campaign_id = ({ self.__select_campaign(columns="campaign_dsp_id(campaign.source, campaign.external_id)", state="OLD") }) AND linkfire_link_campaign.link_id = ({self.__select_link_id(state="OLD")}); IF NOT EXISTS ({self.__is_links_exists_for_campaigns()}) THEN UPDATE "Campaign" SET external_id = NULL, source = ( CASE WHEN ({self.__select_campaign(columns='campaign.source', state='OLD')}) in ('PRS') THEN 'PRS' ELSE NULL END ) WHERE id = OLD.campaign_id AND source in ('dec', 'PRS'); END IF; """ def __select_campaign(self, columns="campaign.id, campaign.source, campaign.external_id", state="NEW"): return f""" SELECT {columns} FROM "Campaign" as campaign WHERE campaign.id = {state}.campaign_id LIMIT 1 """ def __is_links_exists_for_campaigns(self): return f""" SELECT 1 FROM "LinkfireCampaign" AS linkfire_campaign WHERE linkfire_campaign.campaign_id = OLD.campaign_id """ def __select_link_id(self, state="NEW"): return f""" SELECT linkfire.link_id::uuid FROM "Linkfire" linkfire WHERE linkfire.id = {state}.linkfire_id """