55 lines
1.7 KiB
TypeScript
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;`);
|
|
}
|
|
|
|
}
|