import { Migration } from '@mikro-orm/migrations'; export class Migration20260704140000_addCampaignUserGroupsTable extends Migration { override async up(): Promise { this.addSql(` create table "campaign_user_groups" ( "campaign_id" char(26) not null, "user_group_id" char(26) not null, constraint "campaign_user_groups_pkey" primary key ("campaign_id", "user_group_id") ); `); this.addSql(` alter table "campaign_user_groups" add constraint "campaign_user_groups_campaign_id_foreign" foreign key ("campaign_id") references "campaigns" ("id") on update cascade on delete cascade; `); this.addSql(` alter table "campaign_user_groups" add constraint "campaign_user_groups_user_group_id_foreign" foreign key ("user_group_id") references "user_groups" ("id") on update cascade on delete cascade; `); this.addSql(` insert into "campaign_user_groups" ("campaign_id", "user_group_id") select c."id", g."id" from "campaigns" c cross join lateral jsonb_array_elements_text(c."groups") as gid("id") inner join "user_groups" g on g."id" = gid."id" on conflict do nothing; `); this.addSql(`alter table "campaigns" drop column "groups";`); } override async down(): Promise { this.addSql(`alter table "campaigns" add column "groups" jsonb not null default '[]';`); this.addSql(` update "campaigns" c set "groups" = coalesce( ( select jsonb_agg(cug."user_group_id") from "campaign_user_groups" cug where cug."campaign_id" = c."id" ), '[]'::jsonb ); `); this.addSql(`drop table if exists "campaign_user_groups" cascade;`); } }