from migrations.fixtures.delphi_tables.v1.triggers.base_trigger import BaseTrigger from migrations.fixtures.delphi_tables.v1.triggers.queries.phase_campaigns_query import PhaseCampaignsQuery from migrations.fixtures.delphi_tables.v4.triggers.queries.campaigns_query import CampaignsQuery class CampaignTrigger(BaseTrigger): table = "Campaign" function_name = "log_campaign_changes" def on_insert(self): return f""" IF (NEW.source is NOT NULL AND NEW.external_id is NOT NULL) THEN {self.__insert_campaign()}; {self.__set_campaign_types()}; {self.__insert_campaign_platforms()}; {self.__phase_campaigns_updates()} END IF; """ def on_update(self): return f""" IF (NEW.external_id is NOT NULL AND OLD.is_deleted IS FALSE) THEN IF (OLD.is_deleted IS FALSE AND NEW.is_deleted IS TRUE) THEN DELETE FROM linkfire_link_campaign WHERE campaign_id = campaign_dsp_id(OLD.source::text, OLD.external_id); DELETE FROM campaigns WHERE id = campaign_dsp_id(NEW.source::text, NEW.external_id); DELETE FROM project_campaigns WHERE campaign_id = campaign_dsp_id(NEW.source::text, NEW.external_id); DELETE FROM phase_campaigns WHERE campaign_id = campaign_dsp_id(NEW.source::text, NEW.external_id); ELSE IF (OLD.external_id IS NULL AND NEW.external_id IS NOT NULL AND (NEW.source = 'dec' OR NEW.source = 'PRS')) THEN {self.__insert_campaign(is_pending='FALSE')}; {self.__insert_campaign_platforms()}; {self.__set_campaign_types()}; {self.__phase_campaigns_updates()} {self.__insert_project_campaign()}; {self.__insert_linkfire_campaigns()}; ELSE UPDATE campaigns SET name = subquery.name, budget = subquery.budget, spend = subquery.spend, provider_id = subquery.provider_id, start_date = subquery.start_date, end_date = subquery.end_date, is_pending = subquery.is_pending, objective_id = subquery.objective_id, decibel_label_id = subquery.decibel_label_id, category_id = subquery.category_id, sub_category_id = subquery.sub_category_id FROM ({CampaignsQuery.select_campaign()}) as subquery WHERE campaigns.id = campaign_dsp_id(NEW.source::text, NEW.external_id); {self.__phase_campaigns_updates()} END IF; END IF; ELSIF (OLD.external_id IS NOT NULL AND NEW.external_id IS NULL) THEN DELETE FROM linkfire_link_campaign WHERE campaign_id = campaign_dsp_id(OLD.source::text, OLD.external_id); DELETE FROM campaigns WHERE id = campaign_dsp_id(OLD.source::text, OLD.external_id); DELETE FROM project_campaigns WHERE campaign_id = campaign_dsp_id(OLD.source::text, OLD.external_id); DELETE FROM phase_campaigns WHERE campaign_id = campaign_dsp_id(OLD.source::text, OLD.external_id); DELETE FROM campaign_platforms WHERE campaign_id = campaign_dsp_id(OLD.source::text, OLD.external_id); END IF; """ def __insert_campaign(self, is_pending='TRUE'): return f""" INSERT INTO campaigns(id, name, budget, spend, provider_id, start_date, end_date, objective_id, is_pending, decibel_label_id) VALUES( campaign_dsp_id(NEW.source::text, NEW.external_id), NEW.name, NEW.planned_budget, NEW.budget_spend, NEW.provider_id, NEW.start_date, NEW.end_date, NEW.objective_id, {is_pending}, COALESCE( (SELECT label_id FROM "Project" WHERE id = NEW.project_id), (SELECT label_id FROM "MarketingAccount" WHERE external_id::text = NEW.external_marketing_account_id::text) ) ) """ def __insert_campaign_platforms(self): return """ INSERT INTO campaign_platforms(campaign_id, name) SELECT campaign_dsp_id(campaign.source::text, campaign.external_id) AS campaign_id, campaign_platforms.name FROM "Campaign" campaign JOIN "CampaignPlatformsLinks" cpl ON cpl.campaign_id = campaign.id JOIN "CampaignPlatforms" campaign_platforms ON cpl.platform_id = campaign_platforms.id WHERE campaign.id = NEW.id """ def __phase_campaigns_updates(self): return f""" IF EXISTS (SELECT 1 FROM phase_campaigns WHERE campaign_id = campaign_dsp_id(NEW.source::text, NEW.external_id)) THEN DELETE FROM phase_campaigns WHERE campaign_id = campaign_dsp_id(NEW.source::text, NEW.external_id); END IF; INSERT INTO phase_campaigns(campaign_id, phase_id) {PhaseCampaignsQuery.select_phase_campaigns(where_clause="campaign.id = NEW.id")}; """ def __insert_project_campaign(self): return f""" INSERT INTO project_campaigns(project_id, campaign_id) VALUES( (SELECT dsp_id(source, coalesce(prs_project_code, ccp_project_code)) FROM "Project" WHERE id = NEW.project_id), campaign_dsp_id(NEW.source::text, NEW.external_id) ) """ def __insert_linkfire_campaigns(self): return f""" INSERT INTO linkfire_link_campaign(campaign_id, link_id) SELECT campaign_dsp_id(campaign.source::text, campaign.external_id) AS campaign_id, linkfire_link.link_id::uuid AS link_id FROM "LinkfireCampaign" AS linkfire_campaign JOIN "Linkfire" AS linkfire_link ON linkfire_campaign.linkfire_id = linkfire_link.id JOIN "Campaign" AS campaign ON linkfire_campaign.campaign_id = campaign.id WHERE campaign.external_id IS NOT NULL AND campaign.is_deleted IS FALSE AND campaign.id = NEW.id """ def __set_campaign_types(self): return f''' UPDATE campaigns SET category_id = cp.category_id, sub_category_id = cp.sub_category_id FROM ( SELECT campaign_dsp_id(campaign.source::text, campaign.external_id) AS campaign_id, ct.id AS sub_category_id, ct.group_id AS category_id FROM "Campaign" campaign join "CampaignTypes" as ct on ct.id = campaign.type_id where campaign.id = NEW.id ) as cp WHERE campaigns.id = cp.campaign_id '''