import { MigrationInterface, QueryRunner } from "typeorm"; const NEW_PERMISSIONS = [ { name: "ticket_masters_create", title: "ایجاد مستر تیکت", source: "tickets_create" }, { name: "ticket_masters_read", title: "مشاهده مستر تیکت", source: "tickets_read" }, { name: "ticket_masters_update", title: "ویرایش مستر تیکت", source: "tickets_update" }, { name: "ticket_masters_delete", title: "حذف مستر تیکت", source: "tickets_delete" }, ] as const; const CURRENT_ENUM_VALUES = [ "services_create", "services_read", "services_update", "services_delete", "customers_create", "customers_read", "customers_update", "customers_delete", "agents_create", "agents_read", "agents_update", "agents_delete", "developers_create", "developers_read", "developers_update", "developers_delete", "invoices_create", "invoices_read", "invoices_update", "invoices_delete", "transactions_create", "transactions_read", "transactions_update", "transactions_delete", "discounts_create", "discounts_read", "discounts_update", "discounts_delete", "admins_create", "admins_read", "admins_update", "admins_delete", "tickets_create", "tickets_read", "tickets_update", "tickets_delete", "ticket_categories_create", "ticket_categories_read", "ticket_categories_update", "ticket_categories_delete", "criticisms_create", "criticisms_read", "criticisms_update", "criticisms_delete", "contacts_us_create", "contacts_us_read", "contacts_us_update", "contacts_us_delete", "advertisements_create", "advertisements_read", "advertisements_update", "advertisements_delete", "announcements_create", "announcements_read", "announcements_update", "announcements_delete", "blogs_create", "blogs_read", "blogs_update", "blogs_delete", "learnings_create", "learnings_read", "learnings_update", "learnings_delete", "settings_create", "settings_read", "settings_update", "settings_delete", "bank_accounts_create", "bank_accounts_read", "bank_accounts_update", "bank_accounts_delete", "payments_create", "payments_read", "payments_update", "payments_delete", "support_plan_create", "support_plan_read", "support_plan_update", "support_plan_delete", "reseller_create", "reseller_read", "reseller_update", "reseller_delete", "workspace_create", "workspace_read", "workspace_update", "workspace_delete", "project_create", "project_read", "project_update", "project_delete", "task_create", "task_read", "task_update", "task_delete", "task_phase_create", "task_phase_read", "task_phase_update", "task_phase_delete", "logs", "manage_sso_clients", "dmenu", "dkala", "dpage", "dmail", "view_all_workspaces", "view_all_projects", ]; const UPDATED_ENUM_VALUES = [ ...CURRENT_ENUM_VALUES.slice(0, CURRENT_ENUM_VALUES.indexOf("ticket_categories_delete") + 1), ...NEW_PERMISSIONS.map((p) => p.name), ...CURRENT_ENUM_VALUES.slice(CURRENT_ENUM_VALUES.indexOf("ticket_categories_delete") + 1), ]; export class AddTicketMastersPermissions1785100000000 implements MigrationInterface { name = "AddTicketMastersPermissions1785100000000"; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "name" TYPE text USING "name"::text`); await queryRunner.query(`DROP TYPE "public"."permission_name_enum"`); const enumList = UPDATED_ENUM_VALUES.map((v) => `'${v}'`).join(", "); await queryRunner.query(`CREATE TYPE "public"."permission_name_enum" AS ENUM(${enumList})`); await queryRunner.query( `ALTER TABLE "permission" ALTER COLUMN "name" TYPE "public"."permission_name_enum" USING "name"::"public"."permission_name_enum"`, ); for (const perm of NEW_PERMISSIONS) { const inserted = await queryRunner.query( `INSERT INTO "permission" ("id", "name", "title", "group", "createdAt", "updatedAt") VALUES (uuid_generate_v4(), $1, $2, 'support', NOW(), NOW()) RETURNING id`, [perm.name, perm.title], ); const newId = inserted[0].id as string; const sourcePerm = await queryRunner.query(`SELECT id FROM "permission" WHERE "name" = $1`, [perm.source]); if (!sourcePerm.length) continue; await queryRunner.query( `INSERT INTO "role_permission_relation" ("roleId", "permissionId") SELECT "roleId", $1 FROM "role_permission_relation" WHERE "permissionId" = $2 ON CONFLICT ("roleId", "permissionId") DO NOTHING`, [newId, sourcePerm[0].id], ); } } public async down(queryRunner: QueryRunner): Promise { for (const perm of NEW_PERMISSIONS) { const rows = await queryRunner.query(`SELECT id FROM "permission" WHERE "name" = $1`, [perm.name]); if (!rows.length) continue; await queryRunner.query(`DELETE FROM "role_permission_relation" WHERE "permissionId" = $1`, [rows[0].id]); await queryRunner.query(`DELETE FROM "permission" WHERE "id" = $1`, [rows[0].id]); } await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "name" TYPE text USING "name"::text`); await queryRunner.query(`DROP TYPE "public"."permission_name_enum"`); const enumList = CURRENT_ENUM_VALUES.map((v) => `'${v}'`).join(", "); await queryRunner.query(`CREATE TYPE "public"."permission_name_enum" AS ENUM(${enumList})`); await queryRunner.query( `ALTER TABLE "permission" ALTER COLUMN "name" TYPE "public"."permission_name_enum" USING "name"::"public"."permission_name_enum"`, ); } }