180 lines
5.5 KiB
TypeScript
180 lines
5.5 KiB
TypeScript
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<void> {
|
|
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<void> {
|
|
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"`,
|
|
);
|
|
}
|
|
}
|