Compare commits
4 Commits
af606ce9a7
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f78691f91 | |||
| aef712ca1d | |||
| 77783549fa | |||
| be6e4a8d32 |
@@ -33,7 +33,7 @@ SMS_PATTERN_NEW_TICKET_GLOBAL=536596
|
|||||||
SMS_PATTERN_NEW_CRITICISM=983724
|
SMS_PATTERN_NEW_CRITICISM=983724
|
||||||
SMS_PATTERN_USER_PASSWORD=486237
|
SMS_PATTERN_USER_PASSWORD=486237
|
||||||
SMTP_HOST=smtps.danakcorp.com
|
SMTP_HOST=smtps.danakcorp.com
|
||||||
SMTP_PORT=465
|
SMTP_PORT=587
|
||||||
SMTP_USER=no-reply-danakcorp.com
|
SMTP_USER=no-reply-danakcorp.com
|
||||||
SMTP_PASS=Mahyar.SR4@
|
SMTP_PASS=Mahyar.SR4@
|
||||||
MAIL_FROM=no-reply <no-reply@danakcorp.com>
|
MAIL_FROM=no-reply <no-reply@danakcorp.com>
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
export class AddTicketMasterEntity1785000000000 implements MigrationInterface {
|
||||||
|
name = "AddTicketMasterEntity1785000000000";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(
|
||||||
|
`CREATE TABLE "ticket_master" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "userId" uuid NOT NULL, CONSTRAINT "UQ_ticket_master_user" UNIQUE ("userId"), CONSTRAINT "PK_ticket_master" PRIMARY KEY ("id"))`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "ticket_master" ADD CONSTRAINT "FK_ticket_master_user" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "ticket_master" DROP CONSTRAINT "FK_ticket_master_user"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "ticket_master"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
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"`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
const NEW_PERMISSIONS = [
|
||||||
|
{ name: "blog_categories_create", title: "ایجاد دستهبندی بلاگ", source: "blogs_create" },
|
||||||
|
{ name: "blog_categories_read", title: "مشاهده دستهبندی بلاگ", source: "blogs_read" },
|
||||||
|
{ name: "blog_categories_update", title: "ویرایش دستهبندی بلاگ", source: "blogs_update" },
|
||||||
|
{ name: "blog_categories_delete", title: "حذف دستهبندی بلاگ", source: "blogs_delete" },
|
||||||
|
{ name: "blog_comments_create", title: "ایجاد نظرات بلاگ", source: "blogs_create" },
|
||||||
|
{ name: "blog_comments_read", title: "مشاهده نظرات بلاگ", source: "blogs_read" },
|
||||||
|
{ name: "blog_comments_update", title: "ویرایش نظرات بلاگ", source: "blogs_update" },
|
||||||
|
{ name: "blog_comments_delete", title: "حذف نظرات بلاگ", source: "blogs_delete" },
|
||||||
|
{ name: "sliders_create", title: "ایجاد اسلایدر", source: "blogs_create" },
|
||||||
|
{ name: "sliders_read", title: "مشاهده اسلایدر", source: "blogs_read" },
|
||||||
|
{ name: "sliders_update", title: "ویرایش اسلایدر", source: "blogs_update" },
|
||||||
|
{ name: "sliders_delete", title: "حذف اسلایدر", source: "blogs_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",
|
||||||
|
"ticket_masters_create",
|
||||||
|
"ticket_masters_read",
|
||||||
|
"ticket_masters_update",
|
||||||
|
"ticket_masters_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("blogs_delete") + 1),
|
||||||
|
...NEW_PERMISSIONS.map((p) => p.name),
|
||||||
|
...CURRENT_ENUM_VALUES.slice(CURRENT_ENUM_VALUES.indexOf("blogs_delete") + 1),
|
||||||
|
];
|
||||||
|
|
||||||
|
export class AddBlogCategoriesCommentsSlidersPermissions1785200000000 implements MigrationInterface {
|
||||||
|
name = "AddBlogCategoriesCommentsSlidersPermissions1785200000000";
|
||||||
|
|
||||||
|
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, 'content', 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"`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"folders": [
|
"folders": [
|
||||||
{
|
{
|
||||||
"path": "./"
|
"path": "."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "./danak-admin"
|
"path": "../danak-admin"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {}
|
"settings": {}
|
||||||
|
|||||||
@@ -330,6 +330,12 @@ export const enum TicketMessageEnum {
|
|||||||
INVALID_TICKET_LIMIT = "محدودیت تعداد تیکت در پلن پشتیبانی شما نامعتبر است",
|
INVALID_TICKET_LIMIT = "محدودیت تعداد تیکت در پلن پشتیبانی شما نامعتبر است",
|
||||||
TICKET_LIMIT_EXCEEDED = "شما به محدودیت تعداد تیکت در پلن پشتیبانی خود رسیدهاید",
|
TICKET_LIMIT_EXCEEDED = "شما به محدودیت تعداد تیکت در پلن پشتیبانی خود رسیدهاید",
|
||||||
OPENED = "تیکت با موفقیت باز شد",
|
OPENED = "تیکت با موفقیت باز شد",
|
||||||
|
MASTER_USER_ID_REQUIRED = "شناسه کاربر مستر تیکت اجباری است",
|
||||||
|
MASTER_USER_ID_SHOULD_BE_UUID = "شناسه کاربر مستر تیکت باید یک UUID معتبر باشد",
|
||||||
|
MASTER_CREATED = "مستر تیکت با موفقیت ایجاد شد",
|
||||||
|
MASTER_NOT_FOUND = "مستر تیکت یافت نشد",
|
||||||
|
MASTER_EXIST = "این کاربر قبلاً به عنوان مستر تیکت ثبت شده است",
|
||||||
|
MASTER_DELETED = "مستر تیکت با موفقیت حذف شد",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum WalletMessage {
|
export const enum WalletMessage {
|
||||||
|
|||||||
@@ -5,27 +5,33 @@ import { MailerAsyncOptions } from "@nestjs-modules/mailer/dist/interfaces/maile
|
|||||||
export function mailerConfig(): MailerAsyncOptions {
|
export function mailerConfig(): MailerAsyncOptions {
|
||||||
return {
|
return {
|
||||||
inject: [ConfigService],
|
inject: [ConfigService],
|
||||||
useFactory: (configService: ConfigService) => ({
|
useFactory: (configService: ConfigService) => {
|
||||||
transport: {
|
const port = Number(configService.getOrThrow<number>("SMTP_PORT"));
|
||||||
host: configService.getOrThrow<string>("SMTP_HOST"),
|
// 465 = implicit TLS; 587 = STARTTLS (required by zone-mta behind Traefik)
|
||||||
port: configService.getOrThrow<number>("SMTP_PORT"),
|
const secure = port === 465;
|
||||||
secure: true,
|
|
||||||
auth: {
|
|
||||||
user: configService.getOrThrow<string>("SMTP_USER"),
|
|
||||||
pass: configService.getOrThrow<string>("SMTP_PASS"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
defaults: {
|
|
||||||
from: configService.getOrThrow<string>("MAIL_FROM"),
|
|
||||||
},
|
|
||||||
|
|
||||||
template: {
|
return {
|
||||||
dir: process.cwd() + "/src/modules/templates/email",
|
transport: {
|
||||||
adapter: new HandlebarsAdapter(),
|
host: configService.getOrThrow<string>("SMTP_HOST"),
|
||||||
options: {
|
port,
|
||||||
strict: true,
|
secure,
|
||||||
|
requireTLS: !secure,
|
||||||
|
auth: {
|
||||||
|
user: configService.getOrThrow<string>("SMTP_USER"),
|
||||||
|
pass: configService.getOrThrow<string>("SMTP_PASS"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
defaults: {
|
||||||
}),
|
from: configService.getOrThrow<string>("MAIL_FROM"),
|
||||||
|
},
|
||||||
|
template: {
|
||||||
|
dir: process.cwd() + "/src/modules/templates/email",
|
||||||
|
adapter: new HandlebarsAdapter(),
|
||||||
|
options: {
|
||||||
|
strict: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ export class BlogsController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Get all comments for a blog (admin route)" })
|
@ApiOperation({ summary: "Get all comments for a blog (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_READ)
|
@PermissionsDec(PermissionEnum.BLOG_COMMENTS_READ)
|
||||||
@Get(":id/comments")
|
@Get(":id/comments")
|
||||||
getBlogCommentsForAdmin(@Param() paramDto: ParamDto) {
|
getBlogCommentsForAdmin(@Param() paramDto: ParamDto) {
|
||||||
return this.blogCommentService.getBlogCommentsForAdmin(paramDto.id);
|
return this.blogCommentService.getBlogCommentsForAdmin(paramDto.id);
|
||||||
@@ -157,7 +157,7 @@ export class BlogsController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Get all comments for a blog (admin route)" })
|
@ApiOperation({ summary: "Get all comments for a blog (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_READ)
|
@PermissionsDec(PermissionEnum.BLOG_COMMENTS_READ)
|
||||||
@Get("comments")
|
@Get("comments")
|
||||||
getAllCommentForAdmin(@Query() queryDto: BlogCommentQueryDto) {
|
getAllCommentForAdmin(@Query() queryDto: BlogCommentQueryDto) {
|
||||||
return this.blogCommentService.getAllCommentForAdmin(queryDto);
|
return this.blogCommentService.getAllCommentForAdmin(queryDto);
|
||||||
@@ -165,7 +165,7 @@ export class BlogsController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Update the status of a comment (admin route)" })
|
@ApiOperation({ summary: "Update the status of a comment (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_UPDATE)
|
@PermissionsDec(PermissionEnum.BLOG_COMMENTS_UPDATE)
|
||||||
@Patch("comments/:id/status")
|
@Patch("comments/:id/status")
|
||||||
updateCommentStatus(@Param() paramDto: ParamDto, @Body() updateCommentStatusDto: UpdateCommentStatusDto) {
|
updateCommentStatus(@Param() paramDto: ParamDto, @Body() updateCommentStatusDto: UpdateCommentStatusDto) {
|
||||||
return this.blogCommentService.updateCommentStatus(paramDto.id, updateCommentStatusDto);
|
return this.blogCommentService.updateCommentStatus(paramDto.id, updateCommentStatusDto);
|
||||||
@@ -196,7 +196,7 @@ export class BlogsController {
|
|||||||
@ApiOperation({ summary: "Create a new category (admin route)" })
|
@ApiOperation({ summary: "Create a new category (admin route)" })
|
||||||
@Post("categories")
|
@Post("categories")
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_CREATE)
|
@PermissionsDec(PermissionEnum.BLOG_CATEGORIES_CREATE)
|
||||||
createCategory(@Body() createCategoryDto: CreateBlogCategoryDto) {
|
createCategory(@Body() createCategoryDto: CreateBlogCategoryDto) {
|
||||||
return this.blogsService.createCategory(createCategoryDto);
|
return this.blogsService.createCategory(createCategoryDto);
|
||||||
}
|
}
|
||||||
@@ -204,7 +204,7 @@ export class BlogsController {
|
|||||||
@ApiOperation({ summary: "Update a category (admin route)" })
|
@ApiOperation({ summary: "Update a category (admin route)" })
|
||||||
@Patch("categories/:id")
|
@Patch("categories/:id")
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_UPDATE)
|
@PermissionsDec(PermissionEnum.BLOG_CATEGORIES_UPDATE)
|
||||||
updateCategory(@Param() paramDto: ParamDto, @Body() updateCategoryDto: UpdateBlogCategoryDto) {
|
updateCategory(@Param() paramDto: ParamDto, @Body() updateCategoryDto: UpdateBlogCategoryDto) {
|
||||||
return this.blogsService.updateCategory(paramDto.id, updateCategoryDto);
|
return this.blogsService.updateCategory(paramDto.id, updateCategoryDto);
|
||||||
}
|
}
|
||||||
@@ -212,13 +212,13 @@ export class BlogsController {
|
|||||||
@ApiOperation({ summary: "Delete a category (admin route)" })
|
@ApiOperation({ summary: "Delete a category (admin route)" })
|
||||||
@Delete("categories/:id")
|
@Delete("categories/:id")
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_DELETE)
|
@PermissionsDec(PermissionEnum.BLOG_CATEGORIES_DELETE)
|
||||||
deleteCategory(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
deleteCategory(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
return this.blogsService.deleteCategory(paramDto.id, userIpAndHeaders);
|
return this.blogsService.deleteCategory(paramDto.id, userIpAndHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation({ summary: "toggle status of categories (admin route)" })
|
@ApiOperation({ summary: "toggle status of categories (admin route)" })
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_CREATE)
|
@PermissionsDec(PermissionEnum.BLOG_CATEGORIES_UPDATE)
|
||||||
@HttpCode(HttpStatus.OK)
|
@HttpCode(HttpStatus.OK)
|
||||||
@Post("categories/toggle-status/:id")
|
@Post("categories/toggle-status/:id")
|
||||||
toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export class SlidersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "create slider (admin route)" })
|
@ApiOperation({ summary: "create slider (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_CREATE)
|
@PermissionsDec(PermissionEnum.SLIDERS_CREATE)
|
||||||
@Post()
|
@Post()
|
||||||
create(@Body() createSliderDto: CreateSliderDto) {
|
create(@Body() createSliderDto: CreateSliderDto) {
|
||||||
return this.slidersService.create(createSliderDto);
|
return this.slidersService.create(createSliderDto);
|
||||||
@@ -26,7 +26,7 @@ export class SlidersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Get all sliders (admin route)" })
|
@ApiOperation({ summary: "Get all sliders (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_READ)
|
@PermissionsDec(PermissionEnum.SLIDERS_READ)
|
||||||
@Get()
|
@Get()
|
||||||
getSlidersList(@Query() queryDto: PaginationDto) {
|
getSlidersList(@Query() queryDto: PaginationDto) {
|
||||||
return this.slidersService.getSlidersList(queryDto);
|
return this.slidersService.getSlidersList(queryDto);
|
||||||
@@ -34,7 +34,7 @@ export class SlidersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Get a slider by id (admin route)" })
|
@ApiOperation({ summary: "Get a slider by id (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_READ)
|
@PermissionsDec(PermissionEnum.SLIDERS_READ)
|
||||||
@Get(":id")
|
@Get(":id")
|
||||||
getSliderById(@Param() paramDto: ParamDto) {
|
getSliderById(@Param() paramDto: ParamDto) {
|
||||||
return this.slidersService.getSliderById(paramDto.id);
|
return this.slidersService.getSliderById(paramDto.id);
|
||||||
@@ -42,7 +42,7 @@ export class SlidersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Update a slider (admin route)" })
|
@ApiOperation({ summary: "Update a slider (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_UPDATE)
|
@PermissionsDec(PermissionEnum.SLIDERS_UPDATE)
|
||||||
@Patch(":id")
|
@Patch(":id")
|
||||||
update(@Param() paramDto: ParamDto, @Body() updateSliderDto: UpdateSliderDto) {
|
update(@Param() paramDto: ParamDto, @Body() updateSliderDto: UpdateSliderDto) {
|
||||||
return this.slidersService.update(paramDto.id, updateSliderDto);
|
return this.slidersService.update(paramDto.id, updateSliderDto);
|
||||||
@@ -50,7 +50,7 @@ export class SlidersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "Delete a slider (admin route)" })
|
@ApiOperation({ summary: "Delete a slider (admin route)" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@PermissionsDec(PermissionEnum.BLOGS_DELETE)
|
@PermissionsDec(PermissionEnum.SLIDERS_DELETE)
|
||||||
@Delete(":id")
|
@Delete(":id")
|
||||||
remove(@Param() paramDto: ParamDto) {
|
remove(@Param() paramDto: ParamDto) {
|
||||||
return this.slidersService.remove(paramDto.id);
|
return this.slidersService.remove(paramDto.id);
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import { PermissionEnum } from '../../users/enums/permission.enum';
|
|||||||
import { UserDec } from '../../../common/decorators/user.decorator';
|
import { UserDec } from '../../../common/decorators/user.decorator';
|
||||||
import { AuthGuards } from '../../../common/decorators/auth-guard.decorator';
|
import { AuthGuards } from '../../../common/decorators/auth-guard.decorator';
|
||||||
import { ITokenPayload } from '../../auth/interfaces/IToken-payload';
|
import { ITokenPayload } from '../../auth/interfaces/IToken-payload';
|
||||||
|
import { ParamDto } from '../../../common/DTO/param.dto';
|
||||||
|
import { User } from '../../users/entities/user.entity';
|
||||||
|
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
@@ -28,6 +30,14 @@ export class WorkspaceController {
|
|||||||
return this.workspaceService.findOneOrFail(id);
|
return this.workspaceService.findOneOrFail(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Get(':id/users')
|
||||||
|
@ApiOperation({ summary: 'Get workspace users' })
|
||||||
|
@ApiResponse({ status: 200, description: 'Got Workspace Users Successfully!' })
|
||||||
|
@ApiResponse({ status: 404, description: 'Workspace Not Found!' })
|
||||||
|
getWorkspaceUsers(@Param() paramDto: ParamDto): Promise<User[]> {
|
||||||
|
return this.workspaceService.getWorkspaceUsers(paramDto.id);
|
||||||
|
}
|
||||||
|
|
||||||
@Post()
|
@Post()
|
||||||
@PermissionsDec(PermissionEnum.WORKSPACE_CREATE)
|
@PermissionsDec(PermissionEnum.WORKSPACE_CREATE)
|
||||||
@ApiOperation({ summary: 'Create a new workspace' })
|
@ApiOperation({ summary: 'Create a new workspace' })
|
||||||
|
|||||||
@@ -71,4 +71,9 @@ export class WorkspaceService {
|
|||||||
}
|
}
|
||||||
return await this.workspaceRepository.findByUser(userId);
|
return await this.workspaceRepository.findByUser(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getWorkspaceUsers(workspaceId: string): Promise<User[]> {
|
||||||
|
const workspace = await this.findOneOrFail(workspaceId);
|
||||||
|
return workspace.users;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ export class WorkspaceRepository extends Repository<TMWorkspace> {
|
|||||||
'workspace',
|
'workspace',
|
||||||
'user.id',
|
'user.id',
|
||||||
'user.firstName',
|
'user.firstName',
|
||||||
'user.lastName'
|
'user.lastName',
|
||||||
|
'user.profilePic',
|
||||||
]).where('workspace.id = :workspaceId', {workspaceId})
|
]).where('workspace.id = :workspaceId', {workspaceId})
|
||||||
.getOne();
|
.getOne();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { ApiProperty } from "@nestjs/swagger";
|
||||||
|
import { IsNotEmpty, IsUUID } from "class-validator";
|
||||||
|
|
||||||
|
import { TicketMessageEnum } from "../../../common/enums/message.enum";
|
||||||
|
|
||||||
|
export class CreateTicketMasterDto {
|
||||||
|
@IsNotEmpty({ message: TicketMessageEnum.MASTER_USER_ID_REQUIRED })
|
||||||
|
@IsUUID("4", { message: TicketMessageEnum.MASTER_USER_ID_SHOULD_BE_UUID })
|
||||||
|
@ApiProperty({ description: "User ID of the ticket master", example: "123e4567-e89b-12d3-a456-426614174000" })
|
||||||
|
userId: string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { ApiProperty } from "@nestjs/swagger";
|
||||||
|
import { IsNotEmpty, IsUUID } from "class-validator";
|
||||||
|
|
||||||
|
import { TicketMessageEnum } from "../../../common/enums/message.enum";
|
||||||
|
|
||||||
|
export class UpdateTicketMasterDto {
|
||||||
|
@IsNotEmpty({ message: TicketMessageEnum.MASTER_USER_ID_REQUIRED })
|
||||||
|
@IsUUID("4", { message: TicketMessageEnum.MASTER_USER_ID_SHOULD_BE_UUID })
|
||||||
|
@ApiProperty({ description: "User ID of the ticket master", example: "123e4567-e89b-12d3-a456-426614174000" })
|
||||||
|
userId: string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { Entity, JoinColumn, ManyToOne, Unique } from "typeorm";
|
||||||
|
|
||||||
|
import { BaseEntity } from "../../../common/entities/base.entity";
|
||||||
|
import { User } from "../../users/entities/user.entity";
|
||||||
|
|
||||||
|
@Entity("ticket_master")
|
||||||
|
@Unique(["user"])
|
||||||
|
export class TicketMaster extends BaseEntity {
|
||||||
|
@ManyToOne(() => User, { nullable: false, onDelete: "CASCADE" })
|
||||||
|
@JoinColumn()
|
||||||
|
user: User;
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ import { User } from "../../users/entities/user.entity";
|
|||||||
import { AdminsService } from "../../users/providers/admins.service";
|
import { AdminsService } from "../../users/providers/admins.service";
|
||||||
import { UsersService } from "../../users/providers/users.service";
|
import { UsersService } from "../../users/providers/users.service";
|
||||||
import { CreateTicketCategoryDto } from "../DTO/create-ticket-category.dto";
|
import { CreateTicketCategoryDto } from "../DTO/create-ticket-category.dto";
|
||||||
|
import { CreateTicketMasterDto } from "../DTO/create-ticket-master.dto";
|
||||||
import { CreateTicketMessageDto } from "../DTO/create-ticket-message.dto";
|
import { CreateTicketMessageDto } from "../DTO/create-ticket-message.dto";
|
||||||
import { CreateTicketByAdminDto, CreateTicketDto } from "../DTO/create-ticket.dto";
|
import { CreateTicketByAdminDto, CreateTicketDto } from "../DTO/create-ticket.dto";
|
||||||
import { ReferTicketDto } from "../DTO/refer-ticket.dto";
|
import { ReferTicketDto } from "../DTO/refer-ticket.dto";
|
||||||
@@ -30,6 +31,7 @@ import { TicketMessageAttachment } from "../entities/ticket-message-attachment";
|
|||||||
import { TicketMessage } from "../entities/ticket-message.entity";
|
import { TicketMessage } from "../entities/ticket-message.entity";
|
||||||
import { Ticket } from "../entities/ticket.entity";
|
import { Ticket } from "../entities/ticket.entity";
|
||||||
import { TicketStatus } from "../enums/ticket-status.enum";
|
import { TicketStatus } from "../enums/ticket-status.enum";
|
||||||
|
import { TicketMasterRepository } from "../repositories/ticket-master.repository";
|
||||||
import { TicketCategoryRepository } from "../repositories/tickets-category.repository";
|
import { TicketCategoryRepository } from "../repositories/tickets-category.repository";
|
||||||
import { TicketMessagesRepository } from "../repositories/tickets-message.repository";
|
import { TicketMessagesRepository } from "../repositories/tickets-message.repository";
|
||||||
import { TicketsRepository } from "../repositories/tickets.repository";
|
import { TicketsRepository } from "../repositories/tickets.repository";
|
||||||
@@ -43,6 +45,7 @@ export class TicketsService implements OnModuleInit {
|
|||||||
@InjectQueue(TICKET.QUEUE_NAME) private readonly ticketQueue: Queue,
|
@InjectQueue(TICKET.QUEUE_NAME) private readonly ticketQueue: Queue,
|
||||||
private readonly ticketsRepository: TicketsRepository,
|
private readonly ticketsRepository: TicketsRepository,
|
||||||
private readonly ticketsCategoryRepository: TicketCategoryRepository,
|
private readonly ticketsCategoryRepository: TicketCategoryRepository,
|
||||||
|
private readonly ticketMasterRepository: TicketMasterRepository,
|
||||||
private readonly ticketMessagesRepository: TicketMessagesRepository,
|
private readonly ticketMessagesRepository: TicketMessagesRepository,
|
||||||
private readonly usersService: UsersService,
|
private readonly usersService: UsersService,
|
||||||
private readonly adminsService: AdminsService,
|
private readonly adminsService: AdminsService,
|
||||||
@@ -167,6 +170,79 @@ export class TicketsService implements OnModuleInit {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//******************************** */
|
||||||
|
// ticket masters
|
||||||
|
//******************************** */
|
||||||
|
|
||||||
|
async createTicketMaster(createDto: CreateTicketMasterDto, userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
|
const { user } = await this.usersService.findOneById(createDto.userId);
|
||||||
|
|
||||||
|
const existingMaster = await this.ticketMasterRepository.findByUserId(createDto.userId);
|
||||||
|
if (existingMaster) throw new BadRequestException(TicketMessageEnum.MASTER_EXIST);
|
||||||
|
|
||||||
|
const ticketMaster = this.ticketMasterRepository.create({ user });
|
||||||
|
await this.ticketMasterRepository.save(ticketMaster);
|
||||||
|
|
||||||
|
await this.accessLogService.logCreate("TicketMaster", UserType.ADMIN, {
|
||||||
|
user: { id: userIpAndHeaders.userId },
|
||||||
|
endpoint: "/tickets/masters",
|
||||||
|
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||||
|
ipAddress: userIpAndHeaders.ip,
|
||||||
|
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||||
|
actionDescription: `Admin created ticket master for user: ${user.id}`,
|
||||||
|
metadata: {
|
||||||
|
ticketMasterId: ticketMaster.id,
|
||||||
|
masterUserId: user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: TicketMessageEnum.MASTER_CREATED,
|
||||||
|
ticketMaster: await this.ticketMasterRepository.findByIdWithUser(ticketMaster.id),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//******************************** */
|
||||||
|
|
||||||
|
async getTicketMasters() {
|
||||||
|
const ticketMasters = await this.ticketMasterRepository.findAllWithUser();
|
||||||
|
return { ticketMasters };
|
||||||
|
}
|
||||||
|
|
||||||
|
//******************************** */
|
||||||
|
|
||||||
|
async getTicketMaster(paramDto: ParamDto) {
|
||||||
|
const ticketMaster = await this.ticketMasterRepository.findByIdWithUser(paramDto.id);
|
||||||
|
if (!ticketMaster) throw new BadRequestException(TicketMessageEnum.MASTER_NOT_FOUND);
|
||||||
|
return { ticketMaster };
|
||||||
|
}
|
||||||
|
|
||||||
|
//******************************** */
|
||||||
|
|
||||||
|
async deleteTicketMaster(paramDto: ParamDto, userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
|
const ticketMaster = await this.ticketMasterRepository.findByIdWithUser(paramDto.id);
|
||||||
|
if (!ticketMaster) throw new BadRequestException(TicketMessageEnum.MASTER_NOT_FOUND);
|
||||||
|
|
||||||
|
await this.ticketMasterRepository.delete(paramDto.id);
|
||||||
|
|
||||||
|
await this.accessLogService.logDelete("TicketMaster", paramDto.id, UserType.ADMIN, {
|
||||||
|
user: { id: userIpAndHeaders.userId },
|
||||||
|
endpoint: "/tickets/masters",
|
||||||
|
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||||
|
ipAddress: userIpAndHeaders.ip,
|
||||||
|
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||||
|
actionDescription: `Admin deleted ticket master: ${paramDto.id}`,
|
||||||
|
metadata: {
|
||||||
|
ticketMasterId: ticketMaster.id,
|
||||||
|
masterUserId: ticketMaster.user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: TicketMessageEnum.MASTER_DELETED,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
//******************************** */
|
//******************************** */
|
||||||
|
|
||||||
private async checkTicketLimit(userId: string, queryRunner: QueryRunner): Promise<void> {
|
private async checkTicketLimit(userId: string, queryRunner: QueryRunner): Promise<void> {
|
||||||
@@ -539,7 +615,7 @@ export class TicketsService implements OnModuleInit {
|
|||||||
|
|
||||||
//***************************** */
|
//***************************** */
|
||||||
private async assignTicketAndNotify(ticket: Ticket, ticketCategory: TicketCategory, user: User, queryRunner: QueryRunner) {
|
private async assignTicketAndNotify(ticket: Ticket, ticketCategory: TicketCategory, user: User, queryRunner: QueryRunner) {
|
||||||
const assignedUser = await this.referralService.assignAdmin(ticketCategory.group);
|
const assignedUser = (await this.assignFromTicketMasters()) ?? (await this.referralService.assignAdmin(ticketCategory.group));
|
||||||
//
|
//
|
||||||
ticket.assignedTo = assignedUser;
|
ticket.assignedTo = assignedUser;
|
||||||
await queryRunner.manager.save(Ticket, ticket);
|
await queryRunner.manager.save(Ticket, ticket);
|
||||||
@@ -562,6 +638,22 @@ export class TicketsService implements OnModuleInit {
|
|||||||
});
|
});
|
||||||
await this.notifySuperAdminsForTicket(queryRunner, ticket);
|
await this.notifySuperAdminsForTicket(queryRunner, ticket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//***************************** */
|
||||||
|
|
||||||
|
private async assignFromTicketMasters(): Promise<User | null> {
|
||||||
|
const masters = await this.ticketMasterRepository.findAllWithUser();
|
||||||
|
if (!masters.length) return null;
|
||||||
|
|
||||||
|
const mastersWithLoad = await Promise.all(
|
||||||
|
masters.map(async (master) => ({
|
||||||
|
user: master.user,
|
||||||
|
assignedCount: await this.ticketsRepository.count({ where: { assignedTo: { id: master.user.id } } }),
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
|
return mastersWithLoad.reduce((prev, curr) => (prev.assignedCount < curr.assignedCount ? prev : curr)).user;
|
||||||
|
}
|
||||||
//***************************** */
|
//***************************** */
|
||||||
|
|
||||||
private async findTicket(queryRunner: QueryRunner, ticketId: string, userId: string, isAdmin: boolean): Promise<Ticket> {
|
private async findTicket(queryRunner: QueryRunner, ticketId: string, userId: string, isAdmin: boolean): Promise<Ticket> {
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import { Injectable } from "@nestjs/common";
|
||||||
|
import { InjectRepository } from "@nestjs/typeorm";
|
||||||
|
import { Repository } from "typeorm";
|
||||||
|
|
||||||
|
import { TicketMaster } from "../entities/ticket-master.entity";
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class TicketMasterRepository extends Repository<TicketMaster> {
|
||||||
|
constructor(@InjectRepository(TicketMaster) ticketMasterRepository: Repository<TicketMaster>) {
|
||||||
|
super(ticketMasterRepository.target, ticketMasterRepository.manager, ticketMasterRepository.queryRunner);
|
||||||
|
}
|
||||||
|
|
||||||
|
findAllWithUser(): Promise<TicketMaster[]> {
|
||||||
|
return this.find({
|
||||||
|
relations: { user: true },
|
||||||
|
order: { createdAt: "ASC" },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
findByIdWithUser(id: string): Promise<TicketMaster | null> {
|
||||||
|
return this.findOne({
|
||||||
|
where: { id },
|
||||||
|
relations: { user: true },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
findByUserId(userId: string): Promise<TicketMaster | null> {
|
||||||
|
return this.findOne({
|
||||||
|
where: { user: { id: userId } },
|
||||||
|
relations: { user: true },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query } from "@nestjs/common";
|
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Query } from "@nestjs/common";
|
||||||
import { ApiOperation, ApiTags } from "@nestjs/swagger";
|
import { ApiOperation, ApiTags } from "@nestjs/swagger";
|
||||||
|
|
||||||
import { CreateTicketCategoryDto } from "./DTO/create-ticket-category.dto";
|
import { CreateTicketCategoryDto } from "./DTO/create-ticket-category.dto";
|
||||||
|
import { CreateTicketMasterDto } from "./DTO/create-ticket-master.dto";
|
||||||
import { CreateTicketMessageDto } from "./DTO/create-ticket-message.dto";
|
import { CreateTicketMessageDto } from "./DTO/create-ticket-message.dto";
|
||||||
import { CreateTicketByAdminDto, CreateTicketDto } from "./DTO/create-ticket.dto";
|
import { CreateTicketByAdminDto, CreateTicketDto } from "./DTO/create-ticket.dto";
|
||||||
import { ReferTicketDto } from "./DTO/refer-ticket.dto";
|
import { ReferTicketDto } from "./DTO/refer-ticket.dto";
|
||||||
@@ -16,6 +17,7 @@ import { IUserIpAndHeaders, UserDec, UserIpAndHeaders } from "../../common/decor
|
|||||||
import { ParamDto } from "../../common/DTO/param.dto";
|
import { ParamDto } from "../../common/DTO/param.dto";
|
||||||
import { PermissionEnum } from "../users/enums/permission.enum";
|
import { PermissionEnum } from "../users/enums/permission.enum";
|
||||||
import { ITokenPayload } from "../auth/interfaces/IToken-payload";
|
import { ITokenPayload } from "../auth/interfaces/IToken-payload";
|
||||||
|
|
||||||
@Controller("tickets")
|
@Controller("tickets")
|
||||||
@ApiTags("Tickets")
|
@ApiTags("Tickets")
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
@@ -65,6 +67,40 @@ export class TicketsController {
|
|||||||
return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders);
|
return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------- ticket masters -------------------
|
||||||
|
|
||||||
|
@ApiOperation({ summary: "Create ticket master => admin route" })
|
||||||
|
@AdminRoute()
|
||||||
|
@PermissionsDec(PermissionEnum.TICKET_MASTERS_CREATE)
|
||||||
|
@Post("masters")
|
||||||
|
createTicketMaster(@Body() createDto: CreateTicketMasterDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
|
return this.ticketsService.createTicketMaster(createDto, userIpAndHeaders);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation({ summary: "Get all ticket masters => admin route" })
|
||||||
|
@AdminRoute()
|
||||||
|
@PermissionsDec(PermissionEnum.TICKET_MASTERS_READ)
|
||||||
|
@Get("masters")
|
||||||
|
getTicketMasters() {
|
||||||
|
return this.ticketsService.getTicketMasters();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation({ summary: "Get ticket master by id => admin route" })
|
||||||
|
@AdminRoute()
|
||||||
|
@PermissionsDec(PermissionEnum.TICKET_MASTERS_READ)
|
||||||
|
@Get("masters/:id")
|
||||||
|
getTicketMaster(@Param() paramDto: ParamDto) {
|
||||||
|
return this.ticketsService.getTicketMaster(paramDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation({ summary: "Delete ticket master => admin route" })
|
||||||
|
@AdminRoute()
|
||||||
|
@PermissionsDec(PermissionEnum.TICKET_MASTERS_DELETE)
|
||||||
|
@Delete("masters/:id")
|
||||||
|
deleteTicketMaster(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||||
|
return this.ticketsService.deleteTicketMaster(paramDto, userIpAndHeaders);
|
||||||
|
}
|
||||||
|
|
||||||
//----------------- ticket and ticket messages -------------------
|
//----------------- ticket and ticket messages -------------------
|
||||||
|
|
||||||
@ApiOperation({ summary: "create ticket ==> user route" })
|
@ApiOperation({ summary: "create ticket ==> user route" })
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ import { TypeOrmModule } from "@nestjs/typeorm";
|
|||||||
|
|
||||||
import { TICKET } from "./constant";
|
import { TICKET } from "./constant";
|
||||||
import { TicketCategory } from "./entities/ticket-category.entity";
|
import { TicketCategory } from "./entities/ticket-category.entity";
|
||||||
|
import { TicketMaster } from "./entities/ticket-master.entity";
|
||||||
import { TicketMessage } from "./entities/ticket-message.entity";
|
import { TicketMessage } from "./entities/ticket-message.entity";
|
||||||
import { Ticket } from "./entities/ticket.entity";
|
import { Ticket } from "./entities/ticket.entity";
|
||||||
import { ReferralStrategyFactory } from "./providers/referral-strategy.factory";
|
import { ReferralStrategyFactory } from "./providers/referral-strategy.factory";
|
||||||
import { TicketsService } from "./providers/tickets.service";
|
import { TicketsService } from "./providers/tickets.service";
|
||||||
|
import { TicketMasterRepository } from "./repositories/ticket-master.repository";
|
||||||
import { TicketCategoryRepository } from "./repositories/tickets-category.repository";
|
import { TicketCategoryRepository } from "./repositories/tickets-category.repository";
|
||||||
import { TicketMessagesRepository } from "./repositories/tickets-message.repository";
|
import { TicketMessagesRepository } from "./repositories/tickets-message.repository";
|
||||||
import { TicketsRepository } from "./repositories/tickets.repository";
|
import { TicketsRepository } from "./repositories/tickets.repository";
|
||||||
@@ -27,7 +29,7 @@ import { LoggerModule } from "../logger/logger.module";
|
|||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
TypeOrmModule.forFeature([Ticket, TicketCategory, TicketMessageAttachment, TicketMessage]),
|
TypeOrmModule.forFeature([Ticket, TicketCategory, TicketMaster, TicketMessageAttachment, TicketMessage]),
|
||||||
AccessLogsModule,
|
AccessLogsModule,
|
||||||
BullModule.registerQueue({ name: TICKET.QUEUE_NAME }),
|
BullModule.registerQueue({ name: TICKET.QUEUE_NAME }),
|
||||||
UsersModule,
|
UsersModule,
|
||||||
@@ -48,6 +50,7 @@ import { LoggerModule } from "../logger/logger.module";
|
|||||||
TicketsService,
|
TicketsService,
|
||||||
TicketsRepository,
|
TicketsRepository,
|
||||||
TicketCategoryRepository,
|
TicketCategoryRepository,
|
||||||
|
TicketMasterRepository,
|
||||||
TicketMessagesRepository,
|
TicketMessagesRepository,
|
||||||
TicketMessageAttachmentsRepository,
|
TicketMessageAttachmentsRepository,
|
||||||
TicketProcessor,
|
TicketProcessor,
|
||||||
|
|||||||
@@ -57,6 +57,11 @@ export const permissionMeta: Record<PermissionEnum, PermissionMeta> = {
|
|||||||
[PermissionEnum.TICKET_CATEGORIES_UPDATE]: { title: "ویرایش دستهبندی تیکت", group: PermissionGroupEnum.SUPPORT },
|
[PermissionEnum.TICKET_CATEGORIES_UPDATE]: { title: "ویرایش دستهبندی تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
[PermissionEnum.TICKET_CATEGORIES_DELETE]: { title: "حذف دستهبندی تیکت", group: PermissionGroupEnum.SUPPORT },
|
[PermissionEnum.TICKET_CATEGORIES_DELETE]: { title: "حذف دستهبندی تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
|
|
||||||
|
[PermissionEnum.TICKET_MASTERS_CREATE]: { title: "ایجاد مستر تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
|
[PermissionEnum.TICKET_MASTERS_READ]: { title: "مشاهده مستر تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
|
[PermissionEnum.TICKET_MASTERS_UPDATE]: { title: "ویرایش مستر تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
|
[PermissionEnum.TICKET_MASTERS_DELETE]: { title: "حذف مستر تیکت", group: PermissionGroupEnum.SUPPORT },
|
||||||
|
|
||||||
[PermissionEnum.CRITICISMS_CREATE]: { title: "ایجاد انتقادات", group: PermissionGroupEnum.OTHER },
|
[PermissionEnum.CRITICISMS_CREATE]: { title: "ایجاد انتقادات", group: PermissionGroupEnum.OTHER },
|
||||||
[PermissionEnum.CRITICISMS_READ]: { title: "مشاهده انتقادات", group: PermissionGroupEnum.OTHER },
|
[PermissionEnum.CRITICISMS_READ]: { title: "مشاهده انتقادات", group: PermissionGroupEnum.OTHER },
|
||||||
[PermissionEnum.CRITICISMS_UPDATE]: { title: "ویرایش انتقادات", group: PermissionGroupEnum.OTHER },
|
[PermissionEnum.CRITICISMS_UPDATE]: { title: "ویرایش انتقادات", group: PermissionGroupEnum.OTHER },
|
||||||
@@ -82,6 +87,21 @@ export const permissionMeta: Record<PermissionEnum, PermissionMeta> = {
|
|||||||
[PermissionEnum.BLOGS_UPDATE]: { title: "ویرایش بلاگها", group: PermissionGroupEnum.CONTENT },
|
[PermissionEnum.BLOGS_UPDATE]: { title: "ویرایش بلاگها", group: PermissionGroupEnum.CONTENT },
|
||||||
[PermissionEnum.BLOGS_DELETE]: { title: "حذف بلاگها", group: PermissionGroupEnum.CONTENT },
|
[PermissionEnum.BLOGS_DELETE]: { title: "حذف بلاگها", group: PermissionGroupEnum.CONTENT },
|
||||||
|
|
||||||
|
[PermissionEnum.BLOG_CATEGORIES_CREATE]: { title: "ایجاد دستهبندی بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_CATEGORIES_READ]: { title: "مشاهده دستهبندی بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_CATEGORIES_UPDATE]: { title: "ویرایش دستهبندی بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_CATEGORIES_DELETE]: { title: "حذف دستهبندی بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
|
||||||
|
[PermissionEnum.BLOG_COMMENTS_CREATE]: { title: "ایجاد نظرات بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_COMMENTS_READ]: { title: "مشاهده نظرات بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_COMMENTS_UPDATE]: { title: "ویرایش نظرات بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.BLOG_COMMENTS_DELETE]: { title: "حذف نظرات بلاگ", group: PermissionGroupEnum.CONTENT },
|
||||||
|
|
||||||
|
[PermissionEnum.SLIDERS_CREATE]: { title: "ایجاد اسلایدر", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.SLIDERS_READ]: { title: "مشاهده اسلایدر", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.SLIDERS_UPDATE]: { title: "ویرایش اسلایدر", group: PermissionGroupEnum.CONTENT },
|
||||||
|
[PermissionEnum.SLIDERS_DELETE]: { title: "حذف اسلایدر", group: PermissionGroupEnum.CONTENT },
|
||||||
|
|
||||||
[PermissionEnum.LEARNINGS_CREATE]: { title: "ایجاد آموزشها", group: PermissionGroupEnum.CONTENT },
|
[PermissionEnum.LEARNINGS_CREATE]: { title: "ایجاد آموزشها", group: PermissionGroupEnum.CONTENT },
|
||||||
[PermissionEnum.LEARNINGS_READ]: { title: "مشاهده آموزشها", group: PermissionGroupEnum.CONTENT },
|
[PermissionEnum.LEARNINGS_READ]: { title: "مشاهده آموزشها", group: PermissionGroupEnum.CONTENT },
|
||||||
[PermissionEnum.LEARNINGS_UPDATE]: { title: "ویرایش آموزشها", group: PermissionGroupEnum.CONTENT },
|
[PermissionEnum.LEARNINGS_UPDATE]: { title: "ویرایش آموزشها", group: PermissionGroupEnum.CONTENT },
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ export enum PermissionEnum {
|
|||||||
TICKET_CATEGORIES_UPDATE = "ticket_categories_update",
|
TICKET_CATEGORIES_UPDATE = "ticket_categories_update",
|
||||||
TICKET_CATEGORIES_DELETE = "ticket_categories_delete",
|
TICKET_CATEGORIES_DELETE = "ticket_categories_delete",
|
||||||
|
|
||||||
|
// ticket_masters
|
||||||
|
TICKET_MASTERS_CREATE = "ticket_masters_create",
|
||||||
|
TICKET_MASTERS_READ = "ticket_masters_read",
|
||||||
|
TICKET_MASTERS_UPDATE = "ticket_masters_update",
|
||||||
|
TICKET_MASTERS_DELETE = "ticket_masters_delete",
|
||||||
|
|
||||||
// criticisms
|
// criticisms
|
||||||
CRITICISMS_CREATE = "criticisms_create",
|
CRITICISMS_CREATE = "criticisms_create",
|
||||||
CRITICISMS_READ = "criticisms_read",
|
CRITICISMS_READ = "criticisms_read",
|
||||||
@@ -89,6 +95,24 @@ export enum PermissionEnum {
|
|||||||
BLOGS_UPDATE = "blogs_update",
|
BLOGS_UPDATE = "blogs_update",
|
||||||
BLOGS_DELETE = "blogs_delete",
|
BLOGS_DELETE = "blogs_delete",
|
||||||
|
|
||||||
|
// blog_categories
|
||||||
|
BLOG_CATEGORIES_CREATE = "blog_categories_create",
|
||||||
|
BLOG_CATEGORIES_READ = "blog_categories_read",
|
||||||
|
BLOG_CATEGORIES_UPDATE = "blog_categories_update",
|
||||||
|
BLOG_CATEGORIES_DELETE = "blog_categories_delete",
|
||||||
|
|
||||||
|
// blog_comments
|
||||||
|
BLOG_COMMENTS_CREATE = "blog_comments_create",
|
||||||
|
BLOG_COMMENTS_READ = "blog_comments_read",
|
||||||
|
BLOG_COMMENTS_UPDATE = "blog_comments_update",
|
||||||
|
BLOG_COMMENTS_DELETE = "blog_comments_delete",
|
||||||
|
|
||||||
|
// sliders
|
||||||
|
SLIDERS_CREATE = "sliders_create",
|
||||||
|
SLIDERS_READ = "sliders_read",
|
||||||
|
SLIDERS_UPDATE = "sliders_update",
|
||||||
|
SLIDERS_DELETE = "sliders_delete",
|
||||||
|
|
||||||
// learnings
|
// learnings
|
||||||
LEARNINGS_CREATE = "learnings_create",
|
LEARNINGS_CREATE = "learnings_create",
|
||||||
LEARNINGS_READ = "learnings_read",
|
LEARNINGS_READ = "learnings_read",
|
||||||
|
|||||||
@@ -277,7 +277,11 @@ export class AdminsService {
|
|||||||
paginate: true,
|
paginate: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
|
async getAllAdmins() {
|
||||||
|
return this.userRepository.find({ where: { roles: { isAdmin: true } } });
|
||||||
|
}
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
async getAdminById(id: string) {
|
async getAdminById(id: string) {
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ export class CustomersService {
|
|||||||
password,
|
password,
|
||||||
phone,
|
phone,
|
||||||
birthDate,
|
birthDate,
|
||||||
|
nationalCode,
|
||||||
};
|
};
|
||||||
|
|
||||||
// const addressUpdateData = {
|
// const addressUpdateData = {
|
||||||
@@ -169,7 +170,7 @@ export class CustomersService {
|
|||||||
|
|
||||||
if (nationalCode) {
|
if (nationalCode) {
|
||||||
const existingNationalCode = await queryRunner.manager.findOne(this.realUserRepository.target, {
|
const existingNationalCode = await queryRunner.manager.findOne(this.realUserRepository.target, {
|
||||||
where: { nationalCode: nationalCode, id: Not(user.id) },
|
where: { nationalCode: nationalCode, user: { id: Not(user.id) } },
|
||||||
});
|
});
|
||||||
if (existingNationalCode) throw new BadRequestException(UserMessage.NATIONAL_CODE_EXIST);
|
if (existingNationalCode) throw new BadRequestException(UserMessage.NATIONAL_CODE_EXIST);
|
||||||
}
|
}
|
||||||
@@ -180,6 +181,15 @@ export class CustomersService {
|
|||||||
await queryRunner.manager.update(this.userRepository.target, { id: customerId }, { password: hashPassword });
|
await queryRunner.manager.update(this.userRepository.target, { id: customerId }, { password: hashPassword });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nationalCode) {
|
||||||
|
const realUser = await queryRunner.manager.findOne(this.realUserRepository.target, {
|
||||||
|
where: { user: { id: customerId } },
|
||||||
|
});
|
||||||
|
if (realUser) {
|
||||||
|
await queryRunner.manager.update(this.realUserRepository.target, { id: realUser.id }, { nationalCode });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const hasLegalUpdateData = Boolean(
|
const hasLegalUpdateData = Boolean(
|
||||||
registrationName || economicCode || nationalIdentity || registrationCode || postalCode || address || cityId,
|
registrationName || economicCode || nationalIdentity || registrationCode || postalCode || address || cityId,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -171,12 +171,18 @@ export class UsersController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "get all admins ==> admin route" })
|
@ApiOperation({ summary: "get all admins ==> admin route" })
|
||||||
@AdminRoute()
|
@AdminRoute()
|
||||||
// @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
|
|
||||||
@Get("admins")
|
@Get("admins")
|
||||||
getAdmins(@Query() queryDto: SearchAdminQueryDto) {
|
getAdmins(@Query() queryDto: SearchAdminQueryDto) {
|
||||||
return this.adminsService.getAdmins(queryDto);
|
return this.adminsService.getAdmins(queryDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation({ summary: "get all admins without pagination==> admin route" })
|
||||||
|
@AdminRoute()
|
||||||
|
@Get("admins-list/all")
|
||||||
|
getAllAdmins() {
|
||||||
|
return this.adminsService.getAllAdmins();
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation({ summary: "get admin by id ==> admin route" })
|
@ApiOperation({ summary: "get admin by id ==> admin route" })
|
||||||
@PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
|
@PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
|
||||||
@Get("admins/:id")
|
@Get("admins/:id")
|
||||||
|
|||||||
Reference in New Issue
Block a user