Files
dmenu-api/database/migrations/Migration20260704140000_addCampaignUserGroupsTable.ts
T
morteza 5b6fb16f5c
deploy to danak / build_and_deploy (push) Has been cancelled
transactions
2026-07-04 12:26:30 +03:30

55 lines
1.7 KiB
TypeScript

import { Migration } from '@mikro-orm/migrations';
export class Migration20260704140000_addCampaignUserGroupsTable extends Migration {
override async up(): Promise<void> {
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<void> {
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;`);
}
}