6 Commits

Author SHA1 Message Date
morteza f66bc9fa8c fix permission bug
Build and Deploy Docker Images / build_and_deploy (push) Has been cancelled
2026-07-20 11:13:35 +03:30
morteza 6b222db890 refactor permissions 2026-07-20 10:16:45 +03:30
morteza c82cc654f0 add title to permission
Build and Deploy Docker Images / build_and_deploy (push) Has been cancelled
2026-07-19 16:37:45 +03:30
morteza c956bc0deb Merge branch 'rafi/taskmanager'
Build and Deploy Docker Images / build_and_deploy (push) Has been cancelled
2026-07-15 12:11:03 +03:30
morteza 30d86c9775 task time 2026-07-15 10:37:19 +03:30
realrafi 4263d7118e refactor: changed the findTasksByTaskPhase to include task info like remark, etc 2026-07-14 21:39:37 +03:30
46 changed files with 1239 additions and 194 deletions
@@ -0,0 +1,39 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class AddTaskTimeTable1784100000000 implements MigrationInterface {
name = "AddTaskTimeTable1784100000000";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
CREATE TABLE "tm_times" (
"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(),
"startedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"endedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"duration" integer NOT NULL,
"adminId" uuid NOT NULL,
"taskId" uuid NOT NULL,
CONSTRAINT "PK_tm_times" PRIMARY KEY ("id")
)
`);
await queryRunner.query(`
ALTER TABLE "tm_times"
ADD CONSTRAINT "FK_tm_times_admin"
FOREIGN KEY ("adminId") REFERENCES "user"("id")
ON DELETE RESTRICT ON UPDATE NO ACTION
`);
await queryRunner.query(`
ALTER TABLE "tm_times"
ADD CONSTRAINT "FK_tm_times_task"
FOREIGN KEY ("taskId") REFERENCES "tm_tasks"("id")
ON DELETE CASCADE ON UPDATE NO ACTION
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "tm_times" DROP CONSTRAINT "FK_tm_times_task"`);
await queryRunner.query(`ALTER TABLE "tm_times" DROP CONSTRAINT "FK_tm_times_admin"`);
await queryRunner.query(`DROP TABLE "tm_times"`);
}
}
@@ -0,0 +1,25 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class MakeTaskTimeEndedAtAndDurationNullable1784200000000
implements MigrationInterface
{
name = "MakeTaskTimeEndedAtAndDurationNullable1784200000000";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "tm_times" ALTER COLUMN "endedAt" DROP NOT NULL`,
);
await queryRunner.query(
`ALTER TABLE "tm_times" ALTER COLUMN "duration" DROP NOT NULL`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "tm_times" ALTER COLUMN "endedAt" SET NOT NULL`,
);
await queryRunner.query(
`ALTER TABLE "tm_times" ALTER COLUMN "duration" SET NOT NULL`,
);
}
}
@@ -0,0 +1,15 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class AddTitleToPermission1784465631499 implements MigrationInterface {
name = "AddTitleToPermission1784465631499";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "permission" ADD "title" character varying(150)`);
await queryRunner.query(`UPDATE "permission" SET "title" = "name"::text WHERE "title" IS NULL`);
await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "title" SET NOT NULL`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "permission" DROP COLUMN "title"`);
}
}
@@ -0,0 +1,300 @@
import { MigrationInterface, QueryRunner } from "typeorm";
type CrudResource = {
old: string;
group: string;
titles: { create: string; read: string; update: string; delete: string };
};
const CRUD_RESOURCES: CrudResource[] = [
{
old: "services",
group: "services",
titles: { create: "ایجاد سرویس‌ها", read: "مشاهده سرویس‌ها", update: "ویرایش سرویس‌ها", delete: "حذف سرویس‌ها" },
},
{
old: "customers",
group: "customers",
titles: { create: "ایجاد مشتریان", read: "مشاهده مشتریان", update: "ویرایش مشتریان", delete: "حذف مشتریان" },
},
{
old: "agents",
group: "representatives",
titles: { create: "ایجاد نمایندگان", read: "مشاهده نمایندگان", update: "ویرایش نمایندگان", delete: "حذف نمایندگان" },
},
{
old: "developers",
group: "users",
titles: {
create: "ایجاد توسعه‌دهندگان",
read: "مشاهده توسعه‌دهندگان",
update: "ویرایش توسعه‌دهندگان",
delete: "حذف توسعه‌دهندگان",
},
},
{
old: "invoices",
group: "financial",
titles: { create: "ایجاد صورتحساب‌ها", read: "مشاهده صورتحساب‌ها", update: "ویرایش صورتحساب‌ها", delete: "حذف صورتحساب‌ها" },
},
{
old: "transactions",
group: "financial",
titles: { create: "ایجاد تراکنش‌ها", read: "مشاهده تراکنش‌ها", update: "ویرایش تراکنش‌ها", delete: "حذف تراکنش‌ها" },
},
{
old: "discounts",
group: "financial",
titles: { create: "ایجاد تخفیف‌ها", read: "مشاهده تخفیف‌ها", update: "ویرایش تخفیف‌ها", delete: "حذف تخفیف‌ها" },
},
{
old: "admins",
group: "users",
titles: { create: "ایجاد ادمین‌ها", read: "مشاهده ادمین‌ها", update: "ویرایش ادمین‌ها", delete: "حذف ادمین‌ها" },
},
{
old: "tickets",
group: "support",
titles: { create: "ایجاد تیکت‌ها", read: "مشاهده تیکت‌ها", update: "ویرایش تیکت‌ها", delete: "حذف تیکت‌ها" },
},
{
old: "criticisms",
group: "other",
titles: { create: "ایجاد انتقادات", read: "مشاهده انتقادات", update: "ویرایش انتقادات", delete: "حذف انتقادات" },
},
{
old: "contacts_us",
group: "other",
titles: { create: "ایجاد تماس با ما", read: "مشاهده تماس با ما", update: "ویرایش تماس با ما", delete: "حذف تماس با ما" },
},
{
old: "advertisements",
group: "content",
titles: { create: "ایجاد تبلیغات", read: "مشاهده تبلیغات", update: "ویرایش تبلیغات", delete: "حذف تبلیغات" },
},
{
old: "announcements",
group: "content",
titles: { create: "ایجاد اطلاعیه‌ها", read: "مشاهده اطلاعیه‌ها", update: "ویرایش اطلاعیه‌ها", delete: "حذف اطلاعیه‌ها" },
},
{
old: "blogs",
group: "content",
titles: { create: "ایجاد بلاگ‌ها", read: "مشاهده بلاگ‌ها", update: "ویرایش بلاگ‌ها", delete: "حذف بلاگ‌ها" },
},
{
old: "learnings",
group: "content",
titles: { create: "ایجاد آموزش‌ها", read: "مشاهده آموزش‌ها", update: "ویرایش آموزش‌ها", delete: "حذف آموزش‌ها" },
},
{
old: "settings",
group: "other",
titles: { create: "ایجاد تنظیمات", read: "مشاهده تنظیمات", update: "ویرایش تنظیمات", delete: "حذف تنظیمات" },
},
{
old: "bank_accounts",
group: "financial",
titles: {
create: "ایجاد حساب‌های بانکی",
read: "مشاهده حساب‌های بانکی",
update: "ویرایش حساب‌های بانکی",
delete: "حذف حساب‌های بانکی",
},
},
{
old: "payments",
group: "financial",
titles: { create: "ایجاد پرداخت‌ها", read: "مشاهده پرداخت‌ها", update: "ویرایش پرداخت‌ها", delete: "حذف پرداخت‌ها" },
},
{
old: "support_plan",
group: "support",
titles: {
create: "ایجاد پلن پشتیبانی",
read: "مشاهده پلن پشتیبانی",
update: "ویرایش پلن پشتیبانی",
delete: "حذف پلن پشتیبانی",
},
},
{
old: "reseller",
group: "representatives",
titles: {
create: "ایجاد نمایندگی فروش",
read: "مشاهده نمایندگی فروش",
update: "ویرایش نمایندگی فروش",
delete: "حذف نمایندگی فروش",
},
},
{
old: "workspace",
group: "task_manager",
titles: { create: "ایجاد فضای کار", read: "مشاهده فضای کار", update: "ویرایش فضای کار", delete: "حذف فضای کار" },
},
{
old: "project",
group: "task_manager",
titles: { create: "ایجاد پروژه", read: "مشاهده پروژه", update: "ویرایش پروژه", delete: "حذف پروژه" },
},
{
old: "task",
group: "task_manager",
titles: { create: "ایجاد وظیفه", read: "مشاهده وظیفه", update: "ویرایش وظیفه", delete: "حذف وظیفه" },
},
{
old: "task_phase",
group: "task_manager",
titles: { create: "ایجاد فاز وظیفه", read: "مشاهده فاز وظیفه", update: "ویرایش فاز وظیفه", delete: "حذف فاز وظیفه" },
},
];
const SINGLE_PERMISSIONS: { name: string; group: string; title: string }[] = [
{ name: "logs", group: "other", title: "لاگ‌ها" },
{ name: "manage_sso_clients", group: "other", title: "مدیریت کلاینت‌های SSO" },
{ name: "dmenu", group: "products", title: "دی‌منو" },
{ name: "dkala", group: "products", title: "دی‌کالا" },
{ name: "dpage", group: "products", title: "دی‌پیج" },
{ name: "dmail", group: "products", title: "دی‌میل" },
{ name: "view_all_workspaces", group: "task_manager", title: "مشاهده همه فضاهای کار" },
{ name: "view_all_projects", group: "task_manager", title: "مشاهده همه پروژه‌ها" },
];
const NEW_ENUM_VALUES = [
...CRUD_RESOURCES.flatMap((r) => [`${r.old}_create`, `${r.old}_read`, `${r.old}_update`, `${r.old}_delete`]),
...SINGLE_PERMISSIONS.map((p) => p.name),
];
const OLD_ENUM_VALUES = [
"services",
"customers",
"agents",
"developers",
"invoices",
"transactions",
"discounts",
"admins",
"tickets",
"criticisms",
"contacts_us",
"advertisements",
"announcements",
"blogs",
"learnings",
"logs",
"settings",
"bank_accounts",
"payments",
"manage_sso_clients",
"support_plan",
"dmenu",
"dkala",
"dpage",
"dmail",
"reseller",
"workspace",
"view_all_workspaces",
"project",
"view_all_projects",
"task",
"task_phase",
];
export class RefactorPermissionsToCrudAndGroup1784500000000 implements MigrationInterface {
name = "RefactorPermissionsToCrudAndGroup1784500000000";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`CREATE TYPE "public"."permission_group_enum" AS ENUM('services', 'customers', 'users', 'financial', 'content', 'support', 'other', 'products', 'representatives', 'task_manager')`,
);
await queryRunner.query(`ALTER TABLE "permission" ADD "group" "public"."permission_group_enum"`);
await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "name" TYPE text USING "name"::text`);
await queryRunner.query(`DROP TYPE "public"."permission_name_enum"`);
for (const resource of CRUD_RESOURCES) {
const oldPerm = await queryRunner.query(`SELECT id FROM "permission" WHERE "name" = $1`, [resource.old]);
if (!oldPerm.length) continue;
const oldId = oldPerm[0].id as string;
const actions = ["create", "read", "update", "delete"] as const;
for (const action of actions) {
const newName = `${resource.old}_${action}`;
const title = resource.titles[action];
const inserted = await queryRunner.query(
`INSERT INTO "permission" ("id", "name", "title", "group", "createdAt", "updatedAt")
VALUES (uuid_generate_v4(), $1, $2, $3, NOW(), NOW())
RETURNING id`,
[newName, title, resource.group],
);
const newId = inserted[0].id as string;
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, oldId],
);
}
await queryRunner.query(`DELETE FROM "role_permission_relation" WHERE "permissionId" = $1`, [oldId]);
await queryRunner.query(`DELETE FROM "permission" WHERE "id" = $1`, [oldId]);
}
for (const perm of SINGLE_PERMISSIONS) {
await queryRunner.query(`UPDATE "permission" SET "group" = $1, "title" = COALESCE(NULLIF("title", ''), $2) WHERE "name" = $3`, [
perm.group,
perm.title,
perm.name,
]);
}
await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "group" SET NOT NULL`);
const enumList = NEW_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"`,
);
}
public async down(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"`);
for (const resource of CRUD_RESOURCES) {
// const actions = ["create", "read", "update", "delete"];
const crudRows = await queryRunner.query(`SELECT id, name FROM "permission" WHERE "name" LIKE $1`, [`${resource.old}_%`]);
if (!crudRows.length) continue;
const inserted = await queryRunner.query(
`INSERT INTO "permission" ("id", "name", "title", "group", "createdAt", "updatedAt")
VALUES (uuid_generate_v4(), $1, $2, $3, NOW(), NOW())
RETURNING id`,
[resource.old, resource.old, resource.group],
);
const oldId = inserted[0].id as string;
for (const row of crudRows) {
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`,
[oldId, row.id],
);
await queryRunner.query(`DELETE FROM "role_permission_relation" WHERE "permissionId" = $1`, [row.id]);
await queryRunner.query(`DELETE FROM "permission" WHERE "id" = $1`, [row.id]);
}
}
const oldEnumList = OLD_ENUM_VALUES.map((v) => `'${v}'`).join(", ");
await queryRunner.query(`CREATE TYPE "public"."permission_name_enum" AS ENUM(${oldEnumList})`);
await queryRunner.query(
`ALTER TABLE "permission" ALTER COLUMN "name" TYPE "public"."permission_name_enum" USING "name"::"public"."permission_name_enum"`,
);
await queryRunner.query(`ALTER TABLE "permission" DROP COLUMN "group"`);
await queryRunner.query(`DROP TYPE "public"."permission_group_enum"`);
}
}
+44 -3
View File
@@ -6,8 +6,46 @@ import { DataSource } from "typeorm";
import { PermissionEnum } from "../../src/modules/users/enums/permission.enum"; import { PermissionEnum } from "../../src/modules/users/enums/permission.enum";
import { RoleEnum } from "../../src/modules/users/enums/role.enum"; import { RoleEnum } from "../../src/modules/users/enums/role.enum";
const permissionTitles: Record<PermissionEnum, string> = {
[PermissionEnum.SERVICES]: "سرویس‌ها",
[PermissionEnum.CUSTOMERS]: "مشتریان",
[PermissionEnum.AGENTS]: "نمایندگان",
[PermissionEnum.DEVELOPERS]: "توسعه‌دهندگان",
[PermissionEnum.INVOICES]: "صورتحساب‌ها",
[PermissionEnum.TRANSACTIONS]: "تراکنش‌ها",
[PermissionEnum.DISCOUNTS]: "تخفیف‌ها",
[PermissionEnum.ADMINS]: "ادمین‌ها",
[PermissionEnum.TICKETS]: "تیکت‌ها",
[PermissionEnum.CRITICISMS]: "انتقادات",
[PermissionEnum.CONTACTS_US]: "تماس با ما",
[PermissionEnum.ADVERTISEMENTS]: "تبلیغات",
[PermissionEnum.ANNOUNCEMENTS]: "اطلاعیه‌ها",
[PermissionEnum.BLOGS]: "بلاگ‌ها",
[PermissionEnum.LEARNINGS]: "آموزش‌ها",
[PermissionEnum.LOGS]: "لاگ‌ها",
[PermissionEnum.SETTINGS]: "تنظیمات",
[PermissionEnum.BANK_ACCOUNTS]: "حساب‌های بانکی",
[PermissionEnum.PAYMENTS]: "پرداخت‌ها",
[PermissionEnum.MANAGE_SSO_CLIENTS]: "مدیریت کلاینت‌های SSO",
[PermissionEnum.SUPPORT_PLAN]: "پلن پشتیبانی",
[PermissionEnum.DMENU]: "دی‌منو",
[PermissionEnum.DKALA]: "دی‌کالا",
[PermissionEnum.DPAGE]: "دی‌پیج",
[PermissionEnum.DMAIL]: "دی‌میل",
[PermissionEnum.RESELLER]: "نمایندگی فروش",
[PermissionEnum.WORKSPACE]: "فضای کار",
[PermissionEnum.VIEW_ALL_WORKSPACES]: "مشاهده همه فضاهای کار",
[PermissionEnum.PROJECT]: "پروژه",
[PermissionEnum.VIEW_ALL_PROJECTS]: "مشاهده همه پروژه‌ها",
[PermissionEnum.TASK]: "وظیفه",
[PermissionEnum.TASK_PHASE]: "فاز وظیفه",
};
// Define permissions // Define permissions
const permissions = Object.values(PermissionEnum).map((perm) => ({ name: perm })); const permissions = Object.values(PermissionEnum).map((perm) => ({
name: perm,
title: permissionTitles[perm],
}));
// Define roles with their default permissions // Define roles with their default permissions
const rolesWithPermissions: { name: RoleEnum; permissions: PermissionEnum[] }[] = [ const rolesWithPermissions: { name: RoleEnum; permissions: PermissionEnum[] }[] = [
@@ -23,8 +61,8 @@ const rolesWithPermissions: { name: RoleEnum; permissions: PermissionEnum[] }[]
export const seedPermissionsAndRoles = async (dataSource: DataSource, logger: Logger) => { export const seedPermissionsAndRoles = async (dataSource: DataSource, logger: Logger) => {
try { try {
const permissionRepo = dataSource.getRepository('Permission'); const permissionRepo = dataSource.getRepository("Permission");
const roleRepo = dataSource.getRepository('Role'); const roleRepo = dataSource.getRepository("Role");
// Seed Permissions // Seed Permissions
logger.log("Seeding Permissions..."); logger.log("Seeding Permissions...");
@@ -33,6 +71,9 @@ export const seedPermissionsAndRoles = async (dataSource: DataSource, logger: Lo
if (!existingPerm) { if (!existingPerm) {
const newPerm = permissionRepo.create(perm); const newPerm = permissionRepo.create(perm);
await permissionRepo.save(newPerm); await permissionRepo.save(newPerm);
} else if (!existingPerm.title || existingPerm.title !== perm.title) {
existingPerm.title = perm.title;
await permissionRepo.save(existingPerm);
} }
} }
logger.log("Permissions seeded successfully"); logger.log("Permissions seeded successfully");
+7
View File
@@ -956,3 +956,10 @@ export const enum checkListItemMessage {
export const enum attachmentMessage { export const enum attachmentMessage {
ATTACHMENT_NOT_FOUND = "ضمیمه پیدا نشد!" ATTACHMENT_NOT_FOUND = "ضمیمه پیدا نشد!"
} }
export const enum timeMessage {
TIME_NOT_FOUND = "زمان ثبت شده پیدا نشد!",
INVALID_TIME_RANGE = "زمان پایان باید بعد از زمان شروع باشد!",
TIME_ALREADY_STARTED = "برای این تسک یک زمان در حال اجرا وجود دارد!",
NO_RUNNING_TIME = "زمان در حال اجرایی برای این تسک پیدا نشد!"
}
+6 -6
View File
@@ -19,41 +19,41 @@ export class AdsController {
@ApiOperation({ summary: "Create new ads" }) @ApiOperation({ summary: "Create new ads" })
@Post() @Post()
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_CREATE)
createAds(@Body() createDto: CreateAdsDto) { createAds(@Body() createDto: CreateAdsDto) {
return this.adsService.createAds(createDto); return this.adsService.createAds(createDto);
} }
@ApiOperation({ summary: "Get all ads" }) @ApiOperation({ summary: "Get all ads" })
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_READ)
@Get("list") @Get("list")
getAdsList(@Query() queryDto: AdsSearchQueryDto) { getAdsList(@Query() queryDto: AdsSearchQueryDto) {
return this.adsService.getAdsList(queryDto); return this.adsService.getAdsList(queryDto);
} }
@ApiOperation({ summary: "Get ads by id" }) @ApiOperation({ summary: "Get ads by id" })
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_READ)
@Get(":id") @Get(":id")
getAdsById(@Param() paramDto: ParamDto) { getAdsById(@Param() paramDto: ParamDto) {
return this.adsService.getAdsById(paramDto.id); return this.adsService.getAdsById(paramDto.id);
} }
@ApiOperation({ summary: "Update ads by id" }) @ApiOperation({ summary: "Update ads by id" })
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_UPDATE)
@Patch(":id") @Patch(":id")
updateAdsById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdsDto) { updateAdsById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdsDto) {
return this.adsService.updateAdsById(paramDto.id, updateDto); return this.adsService.updateAdsById(paramDto.id, updateDto);
} }
@ApiOperation({ summary: "Delete ads by id" }) @ApiOperation({ summary: "Delete ads by id" })
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_DELETE)
@Delete(":id") @Delete(":id")
deleteAdsById(@Param() paramDto: ParamDto) { deleteAdsById(@Param() paramDto: ParamDto) {
return this.adsService.deleteAdsById(paramDto.id); return this.adsService.deleteAdsById(paramDto.id);
} }
@ApiOperation({ summary: "Toggle ads status" }) @ApiOperation({ summary: "Toggle ads status" })
@PermissionsDec(PermissionEnum.ADVERTISEMENTS) @PermissionsDec(PermissionEnum.ADVERTISEMENTS_UPDATE)
@Patch("toggle-status/:id") @Patch("toggle-status/:id")
toggleAdsStatus(@Param() paramDto: ParamDto) { toggleAdsStatus(@Param() paramDto: ParamDto) {
return this.adsService.toggleAdsStatus(paramDto.id); return this.adsService.toggleAdsStatus(paramDto.id);
@@ -16,14 +16,14 @@ import { PermissionEnum } from "../users/enums/permission.enum";
export class AnnouncementController { export class AnnouncementController {
constructor(private readonly announcementService: AnnouncementService) {} constructor(private readonly announcementService: AnnouncementService) {}
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS) @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_CREATE)
@ApiProperty({ description: "Create a new announcement (admin route)" }) @ApiProperty({ description: "Create a new announcement (admin route)" })
@Post() @Post()
create(@Body() createAnnouncementDto: CreateAnnouncementDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { create(@Body() createAnnouncementDto: CreateAnnouncementDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.announcementService.createAnnouncement(createAnnouncementDto, userIpAndHeaders); return this.announcementService.createAnnouncement(createAnnouncementDto, userIpAndHeaders);
} }
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS) @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_UPDATE)
@ApiProperty({ description: "Update an announcement (admin route)" }) @ApiProperty({ description: "Update an announcement (admin route)" })
@Patch(":id") @Patch(":id")
update( update(
@@ -34,7 +34,7 @@ export class AnnouncementController {
return this.announcementService.updateAnnouncement(paramDto.id, updateAnnouncementDto, userIpAndHeaders); return this.announcementService.updateAnnouncement(paramDto.id, updateAnnouncementDto, userIpAndHeaders);
} }
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS) @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_DELETE)
@ApiProperty({ description: "Delete an announcement (admin route)" }) @ApiProperty({ description: "Delete an announcement (admin route)" })
@Delete(":id") @Delete(":id")
delete(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { delete(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
@@ -42,7 +42,7 @@ export class AnnouncementController {
} }
@ApiProperty({ description: "Get all announcements (admin route)" }) @ApiProperty({ description: "Get all announcements (admin route)" })
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS) @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_READ)
@Get() @Get()
getAnnouncements(@Query() queryDto: SearchAnnouncementQueryDto) { getAnnouncements(@Query() queryDto: SearchAnnouncementQueryDto) {
return this.announcementService.getAnnouncements(queryDto); return this.announcementService.getAnnouncements(queryDto);
@@ -61,7 +61,7 @@ export class AnnouncementController {
} }
@ApiProperty({ description: "Get one announcements with id (admin route)" }) @ApiProperty({ description: "Get one announcements with id (admin route)" })
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS) @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_READ)
@Get(":id/admin") @Get(":id/admin")
getAnnouncementByIdAdmin(@Param() paramDto: ParamDto) { getAnnouncementByIdAdmin(@Param() paramDto: ParamDto) {
return this.announcementService.getAnnouncementByIdAdmin(paramDto.id); return this.announcementService.getAnnouncementByIdAdmin(paramDto.id);
+13 -13
View File
@@ -51,7 +51,7 @@ export class BlogsController {
@ApiOperation({ summary: "Get all blogs (admin route)" }) @ApiOperation({ summary: "Get all blogs (admin route)" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_READ)
@Get("list") @Get("list")
getBlogList(@Query() queryDto: BlogListSearchQueryDto) { getBlogList(@Query() queryDto: BlogListSearchQueryDto) {
return this.blogsService.getBlogList(queryDto); return this.blogsService.getBlogList(queryDto);
@@ -85,7 +85,7 @@ export class BlogsController {
} }
@ApiOperation({ summary: "toggle status of blogs (admin route)" }) @ApiOperation({ summary: "toggle status of blogs (admin route)" })
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_CREATE)
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Post(":id/toggle-status") @Post(":id/toggle-status")
toggleBlogStatus(@Param() paramDto: ParamDto) { toggleBlogStatus(@Param() paramDto: ParamDto) {
@@ -103,7 +103,7 @@ export class BlogsController {
@ApiOperation({ summary: "Toggle pinned status of a blog (admin route)" }) @ApiOperation({ summary: "Toggle pinned status of a blog (admin route)" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_CREATE)
@Post(":id/toggle-pinned") @Post(":id/toggle-pinned")
togglePinnedStatus(@Param() paramDto: ParamDto) { togglePinnedStatus(@Param() paramDto: ParamDto) {
return this.blogsService.togglePinnedStatus(paramDto.id); return this.blogsService.togglePinnedStatus(paramDto.id);
@@ -112,7 +112,7 @@ export class BlogsController {
@ApiOperation({ summary: "Create a new blog (admin route)" }) @ApiOperation({ summary: "Create a new blog (admin route)" })
@Post() @Post()
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_CREATE)
createBlog(@Body() createBlogDto: CreateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createBlog(@Body() createBlogDto: CreateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.blogsService.createBlog(createBlogDto, userIpAndHeaders); return this.blogsService.createBlog(createBlogDto, userIpAndHeaders);
} }
@@ -120,7 +120,7 @@ export class BlogsController {
@ApiOperation({ summary: "Update a blog (admin route)" }) @ApiOperation({ summary: "Update a blog (admin route)" })
@Patch(":id") @Patch(":id")
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_UPDATE)
updateBlog(@Param() paramDto: ParamDto, @Body() updateBlogDto: UpdateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { updateBlog(@Param() paramDto: ParamDto, @Body() updateBlogDto: UpdateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.blogsService.updateBlog(paramDto.id, updateBlogDto, userIpAndHeaders); return this.blogsService.updateBlog(paramDto.id, updateBlogDto, userIpAndHeaders);
} }
@@ -128,7 +128,7 @@ export class BlogsController {
@ApiOperation({ summary: "Delete a blog (admin route) " }) @ApiOperation({ summary: "Delete a blog (admin route) " })
@Delete(":id") @Delete(":id")
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_DELETE)
deleteBlog(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { deleteBlog(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.blogsService.deleteBlog(paramDto.id, userIpAndHeaders); return this.blogsService.deleteBlog(paramDto.id, userIpAndHeaders);
} }
@@ -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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_CREATE)
@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) {
@@ -25,7 +25,7 @@ export class ContactUsController {
//******************** */ //******************** */
@PermissionsDec(PermissionEnum.CONTACTS_US) @PermissionsDec(PermissionEnum.CONTACTS_US_READ)
@AdminRoute() @AdminRoute()
@ApiOperation({ summary: "Get all contact us (admin route)" }) @ApiOperation({ summary: "Get all contact us (admin route)" })
@Get() @Get()
@@ -36,7 +36,7 @@ export class ContactUsController {
//******************** */ //******************** */
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.CONTACTS_US) @PermissionsDec(PermissionEnum.CONTACTS_US_READ)
@ApiOperation({ summary: "Get one contact us with id (admin route)" }) @ApiOperation({ summary: "Get one contact us with id (admin route)" })
@Get(":id") @Get(":id")
getOneContactUs(@Param() paramDto: ParamDto) { getOneContactUs(@Param() paramDto: ParamDto) {
@@ -23,7 +23,7 @@ export class CriticismController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.CRITICISMS) @PermissionsDec(PermissionEnum.CRITICISMS_READ)
@ApiOperation({ summary: "Get all Criticism ===> login as admin" }) @ApiOperation({ summary: "Get all Criticism ===> login as admin" })
@Get() @Get()
findAll(@Query() queryDto: SearchCriticismQueryDto) { findAll(@Query() queryDto: SearchCriticismQueryDto) {
@@ -31,7 +31,7 @@ export class CriticismController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.CRITICISMS) @PermissionsDec(PermissionEnum.CRITICISMS_READ)
@ApiOperation({ summary: "Get one Criticism with id ===> login as admin" }) @ApiOperation({ summary: "Get one Criticism with id ===> login as admin" })
@Get(":id") @Get(":id")
fineOne(@Param() paramDto: ParamDto) { fineOne(@Param() paramDto: ParamDto) {
@@ -39,7 +39,7 @@ export class CriticismController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.CRITICISMS) @PermissionsDec(PermissionEnum.CRITICISMS_DELETE)
@ApiOperation({ summary: "Delete one Criticism with id ===> login as admin" }) @ApiOperation({ summary: "Delete one Criticism with id ===> login as admin" })
@Delete(":id") @Delete(":id")
delete(@Param() paramDto: ParamDto) { delete(@Param() paramDto: ParamDto) {
@@ -37,7 +37,7 @@ export class DanakServicesController {
//------------------------ service categories ------------------------ //------------------------ service categories ------------------------
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@ApiOperation({ summary: "Create a new service category => admin route" }) @ApiOperation({ summary: "Create a new service category => admin route" })
@Post("categories") @Post("categories")
createCategory(@Body() createDto: CreateDanakServiceCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createCategory(@Body() createDto: CreateDanakServiceCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
@@ -45,7 +45,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@ApiOperation({ summary: "Get all service categories => admin route" }) @ApiOperation({ summary: "Get all service categories => admin route" })
@Get("categories") @Get("categories")
getCategories(@Query() queryDto: CategorySearchQueryDto) { getCategories(@Query() queryDto: CategorySearchQueryDto) {
@@ -53,7 +53,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@ApiOperation({ summary: "Get all service categories => admin route" }) @ApiOperation({ summary: "Get all service categories => admin route" })
@Pagination() @Pagination()
@Get("categories/list") @Get("categories/list")
@@ -69,7 +69,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@ApiOperation({ summary: "Get category by id => admin route" }) @ApiOperation({ summary: "Get category by id => admin route" })
@Get("categories/:id") @Get("categories/:id")
getCategoryById(@Param() paramDto: ParamDto) { getCategoryById(@Param() paramDto: ParamDto) {
@@ -77,7 +77,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_UPDATE)
@ApiOperation({ summary: "update category by id => admin route" }) @ApiOperation({ summary: "update category by id => admin route" })
@Patch("categories/:id") @Patch("categories/:id")
updateCategory( updateCategory(
@@ -89,7 +89,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_DELETE)
@ApiOperation({ summary: "delete category by id => admin route" }) @ApiOperation({ summary: "delete category by id => admin route" })
@Delete("categories/:id") @Delete("categories/:id")
deleteCategoryById(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { deleteCategoryById(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
@@ -97,7 +97,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@ApiOperation({ summary: "toggle status of categories => admin route" }) @ApiOperation({ summary: "toggle status of categories => admin route" })
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Post("categories/toggle-status/:id") @Post("categories/toggle-status/:id")
@@ -106,7 +106,7 @@ export class DanakServicesController {
} }
//-------------------- service management -------------------------- //-------------------- service management --------------------------
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@ApiOperation({ summary: "create new danak services => admin route" }) @ApiOperation({ summary: "create new danak services => admin route" })
@Post() @Post()
createService(@Body() createDto: CreateServiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createService(@Body() createDto: CreateServiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
@@ -114,7 +114,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@ApiOperation({ summary: "get all danak services ==> admin route" }) @ApiOperation({ summary: "get all danak services ==> admin route" })
@Get() @Get()
getServices(@Query() queryDto: DanakServicesSearchQueryDto) { getServices(@Query() queryDto: DanakServicesSearchQueryDto) {
@@ -136,7 +136,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@ApiOperation({ summary: "toggle status of danak service => admin route" }) @ApiOperation({ summary: "toggle status of danak service => admin route" })
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Post("toggle-status/:id") @Post("toggle-status/:id")
@@ -145,7 +145,7 @@ export class DanakServicesController {
} }
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@ApiOperation({ summary: "toggle status of danak service slider => admin route" }) @ApiOperation({ summary: "toggle status of danak service slider => admin route" })
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Post("toggle-slider/:id") @Post("toggle-slider/:id")
@@ -192,7 +192,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "update danak service" }) @ApiOperation({ summary: "update danak service" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_UPDATE)
@Patch(":id") @Patch(":id")
updateDanakService( updateDanakService(
@Param() paramDto: ParamDto, @Param() paramDto: ParamDto,
@@ -204,7 +204,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "delete danak service" }) @ApiOperation({ summary: "delete danak service" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_DELETE)
@Delete(":id") @Delete(":id")
deleteServiceById(@Param() paramDto: ParamDto) { deleteServiceById(@Param() paramDto: ParamDto) {
return this.danakServicesService.deleteServiceById(paramDto.id); return this.danakServicesService.deleteServiceById(paramDto.id);
@@ -212,7 +212,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "get service users" }) @ApiOperation({ summary: "get service users" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Get(":id/users") @Get(":id/users")
getServiceUsers(@Param() paramDto: ParamDto) { getServiceUsers(@Param() paramDto: ParamDto) {
return this.danakServicesService.getServiceUsers(paramDto.id); return this.danakServicesService.getServiceUsers(paramDto.id);
@@ -235,7 +235,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "get danak service reviews ==> admin route" }) @ApiOperation({ summary: "get danak service reviews ==> admin route" })
@AuthGuards() @AuthGuards()
@Pagination() @Pagination()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Get("reviews") @Get("reviews")
getDanakServiceReviews(@Query() queryDto: DanakServiceReviewQueryDto) { getDanakServiceReviews(@Query() queryDto: DanakServiceReviewQueryDto) {
return this.danakServiceReviewService.getDanakServiceReviews(queryDto); return this.danakServiceReviewService.getDanakServiceReviews(queryDto);
@@ -243,7 +243,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "update danak service review status ==> admin route" }) @ApiOperation({ summary: "update danak service review status ==> admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_UPDATE)
@Patch("reviews/:id/:status") @Patch("reviews/:id/:status")
updateDanakServiceReviewStatus(@Param() updateParamDto: UpdateReviewStatusDto) { updateDanakServiceReviewStatus(@Param() updateParamDto: UpdateReviewStatusDto) {
return this.danakServiceReviewService.updateDanakServiceReviewStatus(updateParamDto); return this.danakServiceReviewService.updateDanakServiceReviewStatus(updateParamDto);
@@ -252,7 +252,7 @@ export class DanakServicesController {
//------------------------ service guides ------------------------ //------------------------ service guides ------------------------
@ApiOperation({ summary: "Create a service guide => admin route" }) @ApiOperation({ summary: "Create a service guide => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@Post("guides") @Post("guides")
createServiceGuide(@Body() createDto: CreateServiceGuideDto) { createServiceGuide(@Body() createDto: CreateServiceGuideDto) {
return this.danakServicesService.createServiceGuide(createDto); return this.danakServicesService.createServiceGuide(createDto);
@@ -266,7 +266,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "Update service guide => admin route" }) @ApiOperation({ summary: "Update service guide => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_UPDATE)
@Patch("guides/:id") @Patch("guides/:id")
updateServiceGuide(@Param() paramDto: ParamDto, @Body() updateDto: UpdateServiceGuideDto) { updateServiceGuide(@Param() paramDto: ParamDto, @Body() updateDto: UpdateServiceGuideDto) {
return this.danakServicesService.updateServiceGuide(paramDto.id, updateDto); return this.danakServicesService.updateServiceGuide(paramDto.id, updateDto);
@@ -274,7 +274,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "Delete service guide => admin route" }) @ApiOperation({ summary: "Delete service guide => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_DELETE)
@Delete("guides/:id") @Delete("guides/:id")
@HttpCode(HttpStatus.NO_CONTENT) @HttpCode(HttpStatus.NO_CONTENT)
deleteServiceGuide(@Param() paramDto: ParamDto) { deleteServiceGuide(@Param() paramDto: ParamDto) {
@@ -283,7 +283,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "Get service guide by id => admin route" }) @ApiOperation({ summary: "Get service guide by id => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Get("guides/:id") @Get("guides/:id")
getServiceGuideById(@Param() paramDto: ParamDto) { getServiceGuideById(@Param() paramDto: ParamDto) {
return this.danakServicesService.getServiceGuideById(paramDto.id); return this.danakServicesService.getServiceGuideById(paramDto.id);
@@ -299,7 +299,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "Get service feedbacks => admin route" }) @ApiOperation({ summary: "Get service feedbacks => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Pagination() @Pagination()
@Get("feedback") @Get("feedback")
getServiceFeedbacks(@Query() queryDto: ServiceFeedbackQueryDto) { getServiceFeedbacks(@Query() queryDto: ServiceFeedbackQueryDto) {
@@ -308,7 +308,7 @@ export class DanakServicesController {
@ApiOperation({ summary: "Get service feedback statistics => admin route" }) @ApiOperation({ summary: "Get service feedback statistics => admin route" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Get(":id/feedback") @Get(":id/feedback")
getServiceFeedbackStats(@Param() paramDto: ParamDto) { getServiceFeedbackStats(@Param() paramDto: ParamDto) {
return this.danakServicesService.getServiceFeedback(paramDto.id); return this.danakServicesService.getServiceFeedback(paramDto.id);
@@ -19,7 +19,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Create a new discount" }) @ApiOperation({ summary: "Create a new discount" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_CREATE)
@Post() @Post()
@ApiResponse({ status: 201, description: "Discount created successfully" }) @ApiResponse({ status: 201, description: "Discount created successfully" })
create(@Body() createDiscountDto: CreateDiscountDto) { create(@Body() createDiscountDto: CreateDiscountDto) {
@@ -28,7 +28,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Get all discounts for admin" }) @ApiOperation({ summary: "Get all discounts for admin" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_READ)
@Get() @Get()
@ApiResponse({ status: 200, description: "Discounts fetched successfully" }) @ApiResponse({ status: 200, description: "Discounts fetched successfully" })
getDiscountsForAdmin(@Query() queryDto: SearchDiscountQueryDto) { getDiscountsForAdmin(@Query() queryDto: SearchDiscountQueryDto) {
@@ -37,7 +37,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Get discount by id" }) @ApiOperation({ summary: "Get discount by id" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_READ)
@Get(":id") @Get(":id")
@ApiResponse({ status: 200, description: "Discount fetched successfully" }) @ApiResponse({ status: 200, description: "Discount fetched successfully" })
getDiscountById(@Param() paramDto: ParamDto) { getDiscountById(@Param() paramDto: ParamDto) {
@@ -46,7 +46,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Toggle discount status" }) @ApiOperation({ summary: "Toggle discount status" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_CREATE)
@Post(":id/toggle-status") @Post(":id/toggle-status")
toggleDiscountStatus(@Param() paramDto: ParamDto) { toggleDiscountStatus(@Param() paramDto: ParamDto) {
return this.discountsService.toggleDiscountStatus(paramDto.id); return this.discountsService.toggleDiscountStatus(paramDto.id);
@@ -54,7 +54,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Delete discount" }) @ApiOperation({ summary: "Delete discount" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_DELETE)
@Delete(":id") @Delete(":id")
deleteDiscount(@Param() paramDto: ParamDto) { deleteDiscount(@Param() paramDto: ParamDto) {
return this.discountsService.softDeleteDiscount(paramDto.id); return this.discountsService.softDeleteDiscount(paramDto.id);
@@ -62,7 +62,7 @@ export class DiscountsController {
@ApiOperation({ summary: "Update discount" }) @ApiOperation({ summary: "Update discount" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DISCOUNTS) @PermissionsDec(PermissionEnum.DISCOUNTS_UPDATE)
@Patch(":id") @Patch(":id")
updateDiscount(@Param() paramDto: ParamDto, @Body() updateDiscountDto: UpdateDiscountDto) { updateDiscount(@Param() paramDto: ParamDto, @Body() updateDiscountDto: UpdateDiscountDto) {
return this.discountsService.updateDiscount(paramDto.id, updateDiscountDto); return this.discountsService.updateDiscount(paramDto.id, updateDiscountDto);
+4
View File
@@ -5,6 +5,8 @@ import { FindBusinessesDto } from './dto/find-businesses.dto';
import { AuthGuards } from '../../common/decorators/auth-guard.decorator'; import { AuthGuards } from '../../common/decorators/auth-guard.decorator';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { AdminRoute } from '../../common/decorators/admin.decorator'; import { AdminRoute } from '../../common/decorators/admin.decorator';
import { PermissionsDec } from '../../common/decorators/permission.decorator';
import { PermissionEnum } from '../users/enums/permission.enum';
@Controller('dmail') @Controller('dmail')
@ApiTags('d-mail') @ApiTags('d-mail')
@@ -15,6 +17,7 @@ export class DmailController {
@Get() @Get()
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DMAIL)
findAll(@Query() query: FindBusinessesDto) { findAll(@Query() query: FindBusinessesDto) {
return this.dmailService.findAllBusinesses(query) return this.dmailService.findAllBusinesses(query)
} }
@@ -27,6 +30,7 @@ export class DmailController {
@Patch(':id/active') @Patch(':id/active')
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.DMAIL)
update(@Param('id') id: string, @Body() updateDmailDto: UpdateDmailAciveStatusDto) { update(@Param('id') id: string, @Body() updateDmailDto: UpdateDmailAciveStatusDto) {
return this.dmailService.updateDMailActiveStatus(id, updateDmailDto.isActive); return this.dmailService.updateDMailActiveStatus(id, updateDmailDto.isActive);
} }
+4 -4
View File
@@ -21,28 +21,28 @@ export class InvoicesController {
constructor(private readonly invoiceService: InvoicesService) {} constructor(private readonly invoiceService: InvoicesService) {}
@ApiOperation({ summary: "create an invoice ==> admin route" }) @ApiOperation({ summary: "create an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES) @PermissionsDec(PermissionEnum.INVOICES_CREATE)
@Post() @Post()
createInvoice(@Body() createDto: CreateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createInvoice(@Body() createDto: CreateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.invoiceService.createInvoiceAdmin(createDto, userIpAndHeaders); return this.invoiceService.createInvoiceAdmin(createDto, userIpAndHeaders);
} }
@ApiOperation({ summary: "update an invoice ==> admin route" }) @ApiOperation({ summary: "update an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES) @PermissionsDec(PermissionEnum.INVOICES_UPDATE)
@Patch(":id") @Patch(":id")
updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userIpAndHeaders); return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userIpAndHeaders);
} }
@ApiOperation({ summary: "delete an invoice ==> admin route" }) @ApiOperation({ summary: "delete an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES) @PermissionsDec(PermissionEnum.INVOICES_DELETE)
@Delete(":id") @Delete(":id")
deleteInvoice(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { deleteInvoice(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userIpAndHeaders); return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userIpAndHeaders);
} }
@ApiOperation({ summary: "get all invoices ==> admin route" }) @ApiOperation({ summary: "get all invoices ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES) @PermissionsDec(PermissionEnum.INVOICES_READ)
@Get() @Get()
getInvoices(@Query() queryDto: InvoicesSearchQueryDto) { getInvoices(@Query() queryDto: InvoicesSearchQueryDto) {
return this.invoiceService.getInvoices(queryDto); return this.invoiceService.getInvoices(queryDto);
+6 -6
View File
@@ -18,7 +18,7 @@ export class LearningController {
constructor(private readonly learningService: LearningService) {} constructor(private readonly learningService: LearningService) {}
@ApiOperation({ summary: "Create learning video" }) @ApiOperation({ summary: "Create learning video" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_CREATE)
@Post() @Post()
createLearningVideo(@Body() createDto: CreateLearningDto) { createLearningVideo(@Body() createDto: CreateLearningDto) {
return this.learningService.createLearningVideo(createDto); return this.learningService.createLearningVideo(createDto);
@@ -37,14 +37,14 @@ export class LearningController {
} }
@ApiOperation({ summary: "delete learning video by id" }) @ApiOperation({ summary: "delete learning video by id" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_DELETE)
@Delete(":id") @Delete(":id")
deleteLearningVideoById(@Param() paramDto: ParamDto) { deleteLearningVideoById(@Param() paramDto: ParamDto) {
return this.learningService.deleteLearningVideoById(paramDto.id); return this.learningService.deleteLearningVideoById(paramDto.id);
} }
@ApiOperation({ summary: "update learning video by id" }) @ApiOperation({ summary: "update learning video by id" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_UPDATE)
@Patch(":id") @Patch(":id")
updateLearningVideoById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningDto) { updateLearningVideoById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningDto) {
return this.learningService.updateLearningVideo(paramDto.id, updateDto); return this.learningService.updateLearningVideo(paramDto.id, updateDto);
@@ -53,7 +53,7 @@ export class LearningController {
//----------------- category management ---------------------- //----------------- category management ----------------------
@ApiOperation({ summary: "Create learning category" }) @ApiOperation({ summary: "Create learning category" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_CREATE)
@Post("category") @Post("category")
createCategory(@Body() createDto: CreateLearningCategoryDto) { createCategory(@Body() createDto: CreateLearningCategoryDto) {
return this.learningService.createLearningCategory(createDto); return this.learningService.createLearningCategory(createDto);
@@ -72,14 +72,14 @@ export class LearningController {
} }
@ApiOperation({ summary: "update learning category ==> admin route" }) @ApiOperation({ summary: "update learning category ==> admin route" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_UPDATE)
@Patch("category/:id") @Patch("category/:id")
updateLearningCategory(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningCategoryDto) { updateLearningCategory(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningCategoryDto) {
return this.learningService.updateLearningCategory(paramDto.id, updateDto); return this.learningService.updateLearningCategory(paramDto.id, updateDto);
} }
@ApiOperation({ summary: "delete category by id" }) @ApiOperation({ summary: "delete category by id" })
@PermissionsDec(PermissionEnum.LEARNINGS) @PermissionsDec(PermissionEnum.LEARNINGS_DELETE)
@Delete("category/:id") @Delete("category/:id")
deleteCategoryById(@Param() paramDto: ParamDto) { deleteCategoryById(@Param() paramDto: ParamDto) {
return this.learningService.deleteCategoryById(paramDto.id); return this.learningService.deleteCategoryById(paramDto.id);
+7 -7
View File
@@ -45,7 +45,7 @@ export class PaymentsController {
} }
@ApiOperation({ summary: "get deposit request of users ==> admin route" }) @ApiOperation({ summary: "get deposit request of users ==> admin route" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_READ)
@AuthGuards() @AuthGuards()
@Pagination() @Pagination()
@Get("deposit/transfer") @Get("deposit/transfer")
@@ -54,7 +54,7 @@ export class PaymentsController {
} }
@ApiOperation({ summary: "get deposit gateway payment ==> admin route" }) @ApiOperation({ summary: "get deposit gateway payment ==> admin route" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_READ)
@AuthGuards() @AuthGuards()
@Pagination() @Pagination()
@Get("deposit/gateway") @Get("deposit/gateway")
@@ -63,7 +63,7 @@ export class PaymentsController {
} }
@ApiOperation({ summary: "approve deposit request ==> admin route" }) @ApiOperation({ summary: "approve deposit request ==> admin route" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_UPDATE)
@AuthGuards() @AuthGuards()
@Post("deposit/transfer/approve/:id") @Post("deposit/transfer/approve/:id")
approverDepositRequest(@Param() paramDto: ParamDto) { approverDepositRequest(@Param() paramDto: ParamDto) {
@@ -71,7 +71,7 @@ export class PaymentsController {
} }
@ApiOperation({ summary: "reject deposit request ==> admin route" }) @ApiOperation({ summary: "reject deposit request ==> admin route" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_UPDATE)
@AuthGuards() @AuthGuards()
@Post("deposit/transfer/reject/:id") @Post("deposit/transfer/reject/:id")
rejectDepositRequest(@Param() paramDto: ParamDto, @Body() rejectDto: RejectDepositRequestDto) { rejectDepositRequest(@Param() paramDto: ParamDto, @Body() rejectDto: RejectDepositRequestDto) {
@@ -79,7 +79,7 @@ export class PaymentsController {
} }
@ApiOperation({ summary: "get transaction for admin" }) @ApiOperation({ summary: "get transaction for admin" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_READ)
@AuthGuards() @AuthGuards()
@Pagination() @Pagination()
@Get("transactions") @Get("transactions")
@@ -108,7 +108,7 @@ export class PaymentsController {
///------------------- bank account ----------------------------- ///------------------- bank account -----------------------------
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.PAYMENTS, PermissionEnum.BANK_ACCOUNTS) @PermissionsDec(PermissionEnum.PAYMENTS_CREATE, PermissionEnum.BANK_ACCOUNTS_CREATE)
@ApiOperation({ summary: "add bank account for transfer and deposit ==> admin route" }) @ApiOperation({ summary: "add bank account for transfer and deposit ==> admin route" })
@Post("bank-account") @Post("bank-account")
addBankAccount(@Body() createDto: CreateBankAccountDto) { addBankAccount(@Body() createDto: CreateBankAccountDto) {
@@ -124,7 +124,7 @@ export class PaymentsController {
@AuthGuards() @AuthGuards()
@ApiOperation({ summary: "update bank account with its id" }) @ApiOperation({ summary: "update bank account with its id" })
@PermissionsDec(PermissionEnum.PAYMENTS, PermissionEnum.BANK_ACCOUNTS) @PermissionsDec(PermissionEnum.PAYMENTS_UPDATE, PermissionEnum.BANK_ACCOUNTS_UPDATE)
@Patch("bank-account/:id") @Patch("bank-account/:id")
updateBankAccount(@Body() updateDto: UpdateBankAccountDto, @Param() paramDto: ParamDto) { updateBankAccount(@Body() updateDto: UpdateBankAccountDto, @Param() paramDto: ParamDto) {
return this.paymentsService.updateBankAccount(updateDto, paramDto.id); return this.paymentsService.updateBankAccount(updateDto, paramDto.id);
+4 -4
View File
@@ -34,7 +34,7 @@ export class ResellerController {
//***************** DSC Endpoints **************** */ //***************** DSC Endpoints **************** */
@ApiOperation({ summary: "Create reseller ==> admin route" }) @ApiOperation({ summary: "Create reseller ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.RESELLER) @PermissionsDec(PermissionEnum.RESELLER_CREATE)
@Post() @Post()
createReseller(@Body() dto: CreateResellerDto) { createReseller(@Body() dto: CreateResellerDto) {
return this.resellerService.create(dto); return this.resellerService.create(dto);
@@ -42,7 +42,7 @@ export class ResellerController {
@ApiOperation({ summary: "Get resellers ==> admin route" }) @ApiOperation({ summary: "Get resellers ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.RESELLER) @PermissionsDec(PermissionEnum.RESELLER_READ)
@Get() @Get()
getResellers() { getResellers() {
return this.resellerService.findAll(); return this.resellerService.findAll();
@@ -52,7 +52,7 @@ export class ResellerController {
@ApiOperation({ summary: "Get withdraw requests ==> admin route" }) @ApiOperation({ summary: "Get withdraw requests ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.RESELLER) @PermissionsDec(PermissionEnum.RESELLER_READ)
@Pagination() @Pagination()
@Get("withdraw-request/admin") @Get("withdraw-request/admin")
getRewardRequests(@Query() query: SearchWithdrawRequestQueryDto) { getRewardRequests(@Query() query: SearchWithdrawRequestQueryDto) {
@@ -61,7 +61,7 @@ export class ResellerController {
@ApiOperation({ summary: "Confirm withdraw request ==> admin route" }) @ApiOperation({ summary: "Confirm withdraw request ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.RESELLER) @PermissionsDec(PermissionEnum.RESELLER_UPDATE)
@Patch("withdraw-request/:id") @Patch("withdraw-request/:id")
confirmWithdrawRequests(@Param() paramDto: ParamDto, @Body() dto: ConfirmwithdrawRequestDto) { confirmWithdrawRequests(@Param() paramDto: ParamDto, @Body() dto: ConfirmwithdrawRequestDto) {
return this.resellerService.confirmWithdrawRequest(paramDto.id, dto.transactionId); return this.resellerService.confirmWithdrawRequest(paramDto.id, dto.transactionId);
+5 -5
View File
@@ -18,7 +18,7 @@ export class SlidersController {
@ApiOperation({ summary: "create slider (admin route)" }) @ApiOperation({ summary: "create slider (admin route)" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.BLOGS) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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) @PermissionsDec(PermissionEnum.BLOGS_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);
@@ -31,7 +31,7 @@ export class SubscriptionsController {
) {} ) {}
@ApiOperation({ summary: "Delete subscription =. admin route" }) @ApiOperation({ summary: "Delete subscription =. admin route" })
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_DELETE)
@AdminRoute() @AdminRoute()
@Delete(':id') @Delete(':id')
deleteSubscription(@Param('id') id :string) { deleteSubscription(@Param('id') id :string) {
@@ -39,14 +39,14 @@ export class SubscriptionsController {
} }
@ApiOperation({ summary: "Create a subscription plan" }) @ApiOperation({ summary: "Create a subscription plan" })
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@Post() @Post()
createSubscription(@Body() createDto: AddSubscriptionsToServiceDto) { createSubscription(@Body() createDto: AddSubscriptionsToServiceDto) {
return this.subscriptionService.createSubscriptionsPlan(createDto); return this.subscriptionService.createSubscriptionsPlan(createDto);
} }
@ApiOperation({ summary: "get all subscription plans" }) @ApiOperation({ summary: "get all subscription plans" })
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
@Get("service/:serviceId") @Get("service/:serviceId")
getServiceSubscriptions(@Param() paramDto: ServiceIdParamDto, @Query() queryDto: ServiceSubsQueryDto) { getServiceSubscriptions(@Param() paramDto: ServiceIdParamDto, @Query() queryDto: ServiceSubsQueryDto) {
return this.subscriptionService.getServiceSubscriptions(paramDto.serviceId, queryDto); return this.subscriptionService.getServiceSubscriptions(paramDto.serviceId, queryDto);
@@ -65,7 +65,7 @@ export class SubscriptionsController {
} }
@ApiOperation({ summary: "toggle status of service subs" }) @ApiOperation({ summary: "toggle status of service subs" })
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_CREATE)
@Post("toggle-status/:id") @Post("toggle-status/:id")
toggleStatusOfServiceSub(@Param() paramDto: ParamDto) { toggleStatusOfServiceSub(@Param() paramDto: ParamDto) {
return this.subscriptionService.toggleSubStatus(paramDto.id); return this.subscriptionService.toggleSubStatus(paramDto.id);
@@ -73,14 +73,14 @@ export class SubscriptionsController {
@ApiOperation({ summary: "get a subscription plan by id" }) @ApiOperation({ summary: "get a subscription plan by id" })
@Get(":id") @Get(":id")
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_READ)
getSubscription(@Param() paramDto: ParamDto) { getSubscription(@Param() paramDto: ParamDto) {
return this.subscriptionService.getSubscriptionPlanById(paramDto.id); return this.subscriptionService.getSubscriptionPlanById(paramDto.id);
} }
@ApiOperation({ summary: "update a subscription plan by id" }) @ApiOperation({ summary: "update a subscription plan by id" })
@Patch(":id") @Patch(":id")
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES_UPDATE)
updateSubscription(@Param() paramDto: ParamDto, @Body() updateDto: UpdateSubscriptionPlanDto) { updateSubscription(@Param() paramDto: ParamDto, @Body() updateDto: UpdateSubscriptionPlanDto) {
return this.subscriptionService.updateSubscriptionPlan(paramDto.id, updateDto); return this.subscriptionService.updateSubscriptionPlan(paramDto.id, updateDto);
} }
@@ -144,7 +144,7 @@ export class SubscriptionsController {
} }
@ApiOperation({ summary: "get all user subscriptions with pagination and filters ==> admin route" }) @ApiOperation({ summary: "get all user subscriptions with pagination and filters ==> admin route" })
@PermissionsDec(PermissionEnum.PAYMENTS) @PermissionsDec(PermissionEnum.PAYMENTS_READ)
@Get("admin/user-subscriptions/all") @Get("admin/user-subscriptions/all")
getAllUserSubscriptions(@Query() queryDto: AdminUserSubscriptionsQueryDto) { getAllUserSubscriptions(@Query() queryDto: AdminUserSubscriptionsQueryDto) {
return this.subscriptionService.getAllUserSubscriptions(queryDto); return this.subscriptionService.getAllUserSubscriptions(queryDto);
@@ -19,7 +19,7 @@ export class SupportPlansController {
constructor(private readonly supportPlansService: SupportPlansService) {} constructor(private readonly supportPlansService: SupportPlansService) {}
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_CREATE)
@ApiOperation({ summary: "Create a new support plan (admin)" }) @ApiOperation({ summary: "Create a new support plan (admin)" })
@Post() @Post()
createSupportPlan(@Body() createSupportPlanDto: CreateSupportPlanDto) { createSupportPlan(@Body() createSupportPlanDto: CreateSupportPlanDto) {
@@ -27,7 +27,7 @@ export class SupportPlansController {
} }
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ)
@ApiOperation({ summary: "Get all support plans (admin)" }) @ApiOperation({ summary: "Get all support plans (admin)" })
@Get("list") @Get("list")
getSupportPlansList(@Query() queryDto: GetSupportPlanListQueryDto) { getSupportPlansList(@Query() queryDto: GetSupportPlanListQueryDto) {
@@ -35,7 +35,7 @@ export class SupportPlansController {
} }
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ)
@ApiOperation({ summary: "Get a support plan by id (admin)" }) @ApiOperation({ summary: "Get a support plan by id (admin)" })
@Get(":id") @Get(":id")
getSupportPlanById(@Param() paramDto: ParamDto) { getSupportPlanById(@Param() paramDto: ParamDto) {
@@ -43,7 +43,7 @@ export class SupportPlansController {
} }
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_DELETE)
@ApiOperation({ summary: "Delete a support plan by id (admin)" }) @ApiOperation({ summary: "Delete a support plan by id (admin)" })
@Delete(":id") @Delete(":id")
deleteSupportPlanById(@Param() paramDto: ParamDto) { deleteSupportPlanById(@Param() paramDto: ParamDto) {
@@ -51,7 +51,7 @@ export class SupportPlansController {
} }
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_UPDATE)
@ApiOperation({ summary: "Update a support plan by id (admin)" }) @ApiOperation({ summary: "Update a support plan by id (admin)" })
@Patch(":id") @Patch(":id")
updateSupportPlanById(@Param() paramDto: ParamDto, @Body() updateSupportPlanDto: UpdateSupportPlanDto) { updateSupportPlanById(@Param() paramDto: ParamDto, @Body() updateSupportPlanDto: UpdateSupportPlanDto) {
@@ -71,7 +71,7 @@ export class SupportPlansController {
} }
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.SUPPORT_PLAN) @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ)
@ApiOperation({ summary: "Get support plan users (admin)" }) @ApiOperation({ summary: "Get support plan users (admin)" })
@Get(":id/users") @Get(":id/users")
getSupportPlanUsers(@Param() paramDto: ParamDto, @Query() queryDto: SearchSupportPlanUsersQueryDto) { getSupportPlanUsers(@Param() paramDto: ParamDto, @Query() queryDto: SearchSupportPlanUsersQueryDto) {
@@ -30,7 +30,7 @@ export class ProjectController {
} }
@Post() @Post()
@PermissionsDec(PermissionEnum.PROJECT) @PermissionsDec(PermissionEnum.PROJECT_CREATE)
@ApiOperation({ summary: "Create a new project" }) @ApiOperation({ summary: "Create a new project" })
@ApiResponse({ status: 201, description: "Project created", type: TMProject }) @ApiResponse({ status: 201, description: "Project created", type: TMProject })
@ApiResponse({ status: 400, description: "One or more users are not members of the workspace" }) @ApiResponse({ status: 400, description: "One or more users are not members of the workspace" })
@@ -40,7 +40,7 @@ export class ProjectController {
} }
@Patch(":id") @Patch(":id")
@PermissionsDec(PermissionEnum.PROJECT) @PermissionsDec(PermissionEnum.PROJECT_UPDATE)
@ApiOperation({ summary: "Update a project" }) @ApiOperation({ summary: "Update a project" })
@ApiParam({ name: "id", description: "Project ID" }) @ApiParam({ name: "id", description: "Project ID" })
@ApiResponse({ status: 200, description: "Project updated", type: TMProject }) @ApiResponse({ status: 200, description: "Project updated", type: TMProject })
@@ -51,7 +51,7 @@ export class ProjectController {
} }
@Delete(":id") @Delete(":id")
@PermissionsDec(PermissionEnum.PROJECT) @PermissionsDec(PermissionEnum.PROJECT_DELETE)
@ApiOperation({ summary: "Delete a project" }) @ApiOperation({ summary: "Delete a project" })
@ApiParam({ name: "id", description: "Project ID" }) @ApiParam({ name: "id", description: "Project ID" })
@ApiResponse({ status: 200, description: "Project deleted", type: TMProject }) @ApiResponse({ status: 200, description: "Project deleted", type: TMProject })
@@ -11,13 +11,13 @@ import { PermissionEnum } from "../../users/enums/permission.enum";
@AuthGuards() @AuthGuards()
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TASK_PHASE)
@ApiTags("Task Manager - Task Phases") @ApiTags("Task Manager - Task Phases")
@Controller("task-manager/task-phases") @Controller("task-manager/task-phases")
export class TaskPhaseController { export class TaskPhaseController {
constructor(private readonly taskPhaseService: TaskPhaseService) {} constructor(private readonly taskPhaseService: TaskPhaseService) {}
@Post() @Post()
@PermissionsDec(PermissionEnum.TASK_PHASE_CREATE)
@ApiOperation({ summary: "Create a new task phase" }) @ApiOperation({ summary: "Create a new task phase" })
@ApiResponse({ status: 201, description: "TaskPhase created", type: TMTaskPhase }) @ApiResponse({ status: 201, description: "TaskPhase created", type: TMTaskPhase })
@ApiResponse({ status: 404, description: "Project not found" }) @ApiResponse({ status: 404, description: "Project not found" })
@@ -26,6 +26,7 @@ export class TaskPhaseController {
} }
@Patch(":id") @Patch(":id")
@PermissionsDec(PermissionEnum.TASK_PHASE_UPDATE)
@ApiOperation({ summary: "Update a task phase" }) @ApiOperation({ summary: "Update a task phase" })
@ApiParam({ name: "id", description: "TaskPhase ID" }) @ApiParam({ name: "id", description: "TaskPhase ID" })
@ApiResponse({ status: 200, description: "TaskPhase updated", type: TMTaskPhase }) @ApiResponse({ status: 200, description: "TaskPhase updated", type: TMTaskPhase })
@@ -35,6 +36,7 @@ export class TaskPhaseController {
} }
@Delete(":id") @Delete(":id")
@PermissionsDec(PermissionEnum.TASK_PHASE_DELETE)
@ApiOperation({ summary: "Delete a task phase" }) @ApiOperation({ summary: "Delete a task phase" })
@ApiParam({ name: "id", description: "TaskPhase ID" }) @ApiParam({ name: "id", description: "TaskPhase ID" })
@ApiResponse({ status: 200, description: "TaskPhase deleted" }) @ApiResponse({ status: 200, description: "TaskPhase deleted" })
@@ -23,7 +23,7 @@ export class TaskController {
constructor(private readonly taskService: TaskService) {} constructor(private readonly taskService: TaskService) {}
@Post() @Post()
@PermissionsDec(PermissionEnum.TASK) @PermissionsDec(PermissionEnum.TASK_CREATE)
@ApiOperation({ summary: "Create a new task" }) @ApiOperation({ summary: "Create a new task" })
@ApiResponse({ status: 201, description: "Task created", type: TMTask }) @ApiResponse({ status: 201, description: "Task created", type: TMTask })
@ApiResponse({ status: 404, description: "TaskPhase not found" }) @ApiResponse({ status: 404, description: "TaskPhase not found" })
@@ -32,7 +32,7 @@ export class TaskController {
} }
@Patch(":id") @Patch(":id")
@PermissionsDec(PermissionEnum.TASK) @PermissionsDec(PermissionEnum.TASK_UPDATE)
@ApiOperation({ summary: "Update a task" }) @ApiOperation({ summary: "Update a task" })
@ApiParam({ name: "id", description: "Task ID" }) @ApiParam({ name: "id", description: "Task ID" })
@ApiResponse({ status: 200, description: "Task updated", type: TMTask }) @ApiResponse({ status: 200, description: "Task updated", type: TMTask })
@@ -42,18 +42,17 @@ export class TaskController {
} }
@Patch(":id/change-phase") @Patch(":id/change-phase")
@PermissionsDec(PermissionEnum.TASK)
@ApiOperation({ summary: "Move a task to a different phase within the same project" }) @ApiOperation({ summary: "Move a task to a different phase within the same project" })
@ApiParam({ name: "id", description: "Task ID" }) @ApiParam({ name: "id", description: "Task ID" })
@ApiResponse({ status: 200, description: "Task phase changed", type: TMTask }) @ApiResponse({ status: 200, description: "Task phase changed", type: TMTask })
@ApiResponse({ status: 400, description: "Target phase belongs to a different project" }) @ApiResponse({ status: 400, description: "Target phase belongs to a different project" })
@ApiResponse({ status: 404, description: "Task or TaskPhase not found" }) @ApiResponse({ status: 404, description: "Task or TaskPhase not found" })
changePhase(@Param("id") id: string, @Body() body: ChangeTaskPhaseDto): Promise<TMTask> { changePhase(@Param("id") id: string,@UserDec() user: ITokenPayload, @Body() body: ChangeTaskPhaseDto): Promise<TMTask> {
return this.taskService.changePhase(id, body); return this.taskService.changePhase(id, user.permissions, user.id, body);
} }
@Delete(":id") @Delete(":id")
@PermissionsDec(PermissionEnum.TASK) @PermissionsDec(PermissionEnum.TASK_DELETE)
@ApiOperation({ summary: "Delete a task" }) @ApiOperation({ summary: "Delete a task" })
@ApiParam({ name: "id", description: "Task ID" }) @ApiParam({ name: "id", description: "Task ID" })
@ApiResponse({ status: 200, description: "Task deleted" }) @ApiResponse({ status: 200, description: "Task deleted" })
@@ -98,7 +97,7 @@ export class TaskController {
@ApiResponse({ status: 200, description: "Changed the task priority successfully!" }) @ApiResponse({ status: 200, description: "Changed the task priority successfully!" })
@ApiResponse({ status: 400, description: "Bad Request from user." }) @ApiResponse({ status: 400, description: "Bad Request from user." })
@ApiResponse({ status: 404, description: "Task not found!" }) @ApiResponse({ status: 404, description: "Task not found!" })
changePriority(@Param("srcid") srcId: string, @Param("desid") desId: string): Promise<TMTask> { changePriority(@Param("srcid") srcId: string, @Param("desid") desId: string,@UserDec() user: ITokenPayload): Promise<TMTask> {
return this.taskService.changePriority(srcId, desId); return this.taskService.changePriority(srcId, user.permissions, user.id, desId);
} }
} }
@@ -0,0 +1,69 @@
import { Controller, Post, Patch, Delete, Param, Body, Get } from "@nestjs/common";
import { ApiTags, ApiOperation, ApiResponse, ApiParam } from "@nestjs/swagger";
import { TimeService } from "../providers/time.service";
import { CreateTimeDto } from "../dto/time/create-time.dto";
import { UpdateTimeDto } from "../dto/time/update-time.dto";
import { TMTime } from "../entities/time.entity";
import { AuthGuards } from "../../../common/decorators/auth-guard.decorator";
import { AdminRoute } from "../../../common/decorators/admin.decorator";
import { UserDec } from "../../../common/decorators/user.decorator";
@AuthGuards()
@AdminRoute()
@ApiTags("Task Manager - Times")
@Controller("task-manager/times")
export class TimeController {
constructor(private readonly timeService: TimeService) { }
@Get("task/:taskId")
@ApiOperation({ summary: "Get all time entries for a task" })
@ApiParam({ name: "taskId", description: "Task ID" })
getTaskTimes(@UserDec("id") adminId: string, @Param("taskId") taskId: string): Promise<TMTime[]> {
return this.timeService.getTaskTimes(adminId, taskId);
}
@Post()
@ApiOperation({ summary: "Create a new time entry for a task" })
@ApiResponse({ status: 201, description: "Time entry created", type: TMTime })
@ApiResponse({ status: 404, description: "Task not found" })
create(@UserDec("id") adminId: string, @Body() body: CreateTimeDto): Promise<TMTime> {
return this.timeService.create(adminId, body);
}
@Post("start/:taskId")
@ApiOperation({ summary: "Start tracking time for a task" })
@ApiParam({ name: "taskId", description: "Task ID" })
@ApiResponse({ status: 201, description: "Time tracking started", type: TMTime })
@ApiResponse({ status: 400, description: "A running time entry already exists" })
@ApiResponse({ status: 404, description: "Task not found" })
start(@UserDec("id") adminId: string, @Param("taskId") taskId: string): Promise<TMTime> {
return this.timeService.start(adminId, taskId);
}
@Post("end/:taskId")
@ApiOperation({ summary: "Stop the current running time entry for a task" })
@ApiParam({ name: "taskId", description: "Task ID" })
@ApiResponse({ status: 200, description: "Time tracking stopped", type: TMTime })
@ApiResponse({ status: 400, description: "No running time entry found" })
@ApiResponse({ status: 404, description: "Task not found" })
end(@UserDec("id") adminId: string, @Param("taskId") taskId: string): Promise<TMTime> {
return this.timeService.end(adminId, taskId);
}
@Patch(":id")
@ApiOperation({ summary: "Update a time entry" })
@ApiParam({ name: "id", description: "Time entry ID" })
@ApiResponse({ status: 200, description: "Time entry updated", type: TMTime })
@ApiResponse({ status: 404, description: "Time entry or Task not found" })
update(@Param("id") id: string, @Body() body: UpdateTimeDto): Promise<TMTime> {
return this.timeService.update(id, body);
}
@Delete(":id")
@ApiOperation({ summary: "Delete a time entry" })
@ApiParam({ name: "id", description: "Time entry ID" })
@ApiResponse({ status: 200, description: "Time entry deleted" })
@ApiResponse({ status: 404, description: "Time entry not found" })
remove(@Param("id") id: string): Promise<void> {
return this.timeService.remove(id);
}
}
@@ -19,7 +19,7 @@ export class WorkspaceController {
constructor(private readonly workspaceService: WorkspaceService) {} constructor(private readonly workspaceService: WorkspaceService) {}
@Get(':id') @Get(':id')
@PermissionsDec(PermissionEnum.WORKSPACE) @PermissionsDec(PermissionEnum.WORKSPACE_READ)
@ApiOperation({summary: "Get one workspace by ID"}) @ApiOperation({summary: "Get one workspace by ID"})
@ApiResponse({status: 200, description: 'Received workspace', type: TMWorkspace}) @ApiResponse({status: 200, description: 'Received workspace', type: TMWorkspace})
@ApiResponse({status: 404, description: 'Workspace Not Found!'}) @ApiResponse({status: 404, description: 'Workspace Not Found!'})
@@ -29,7 +29,7 @@ export class WorkspaceController {
} }
@Post() @Post()
@PermissionsDec(PermissionEnum.WORKSPACE) @PermissionsDec(PermissionEnum.WORKSPACE_CREATE)
@ApiOperation({ summary: 'Create a new workspace' }) @ApiOperation({ summary: 'Create a new workspace' })
@ApiResponse({ status: 201, description: 'Workspace created', type: TMWorkspace }) @ApiResponse({ status: 201, description: 'Workspace created', type: TMWorkspace })
create(@Body() body: CreateWorkspaceDto): Promise<TMWorkspace> { create(@Body() body: CreateWorkspaceDto): Promise<TMWorkspace> {
@@ -37,7 +37,7 @@ export class WorkspaceController {
} }
@Patch(':id') @Patch(':id')
@PermissionsDec(PermissionEnum.WORKSPACE) @PermissionsDec(PermissionEnum.WORKSPACE_UPDATE)
@ApiOperation({ summary: 'Update a workspace' }) @ApiOperation({ summary: 'Update a workspace' })
@ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiParam({ name: 'id', description: 'Workspace ID' })
@ApiResponse({ status: 200, description: 'Workspace updated', type: TMWorkspace }) @ApiResponse({ status: 200, description: 'Workspace updated', type: TMWorkspace })
@@ -47,7 +47,7 @@ export class WorkspaceController {
} }
@Delete(':id') @Delete(':id')
@PermissionsDec(PermissionEnum.WORKSPACE) @PermissionsDec(PermissionEnum.WORKSPACE_DELETE)
@ApiOperation({ summary: 'Delete a workspace' }) @ApiOperation({ summary: 'Delete a workspace' })
@ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiParam({ name: 'id', description: 'Workspace ID' })
@ApiResponse({ status: 200, description: 'Workspace deleted' }) @ApiResponse({ status: 200, description: 'Workspace deleted' })
@@ -0,0 +1,19 @@
import { ApiProperty } from "@nestjs/swagger";
import { IsDateString, IsNotEmpty, IsUUID } from "class-validator";
export class CreateTimeDto {
@ApiProperty({ description: "Start time of the entry", example: "2026-07-15T08:00:00.000Z" })
@IsDateString()
@IsNotEmpty()
startedAt: string;
@ApiProperty({ description: "End time of the entry", example: "2026-07-15T10:30:00.000Z" })
@IsDateString()
@IsNotEmpty()
endedAt: string;
@ApiProperty({ description: "ID of the task this time entry belongs to", example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" })
@IsUUID()
@IsNotEmpty()
taskId: string;
}
@@ -0,0 +1,4 @@
import { PartialType } from "@nestjs/swagger";
import { CreateTimeDto } from "./create-time.dto";
export class UpdateTimeDto extends PartialType(CreateTimeDto) {}
@@ -4,6 +4,7 @@ import { TMTaskPhase } from "./task-phase.entity";
import { TMRemark } from "./remark.entity"; import { TMRemark } from "./remark.entity";
import { TMAttachment } from "./attachment.entity"; import { TMAttachment } from "./attachment.entity";
import { TMCheckListItem } from "./check-list-item.entity"; import { TMCheckListItem } from "./check-list-item.entity";
import { TMTime } from "./time.entity";
import { User } from "../../users/entities/user.entity"; import { User } from "../../users/entities/user.entity";
@Entity("tm_tasks") @Entity("tm_tasks")
@@ -53,6 +54,11 @@ export class TMTask extends BaseEntity {
}) })
checkListItems: TMCheckListItem[]; checkListItems: TMCheckListItem[];
@OneToMany(() => TMTime, (time) => time.task, {
cascade: ["insert", "update"],
})
times: TMTime[];
@ManyToMany(() => User, (user) => user.tasks) @ManyToMany(() => User, (user) => user.tasks)
@JoinTable({ @JoinTable({
name: "tm_task_users", name: "tm_task_users",
@@ -65,4 +71,5 @@ export class TMTask extends BaseEntity {
attachmentCount?: number; attachmentCount?: number;
checkListItemCount?: number; checkListItemCount?: number;
completedCheckListItemCount?: number; completedCheckListItemCount?: number;
time?: number;
} }
@@ -0,0 +1,38 @@
import { Column, Entity, JoinColumn, ManyToOne } from "typeorm";
import { BaseEntity } from "../../../common/entities/base.entity";
import { TMTask } from "./task.entity";
import { User } from "../../users/entities/user.entity";
@Entity("tm_times")
export class TMTime extends BaseEntity {
@Column({ type: "timestamptz" })
startedAt: Date;
@Column({ type: "timestamptz", nullable: true })
endedAt: Date | null;
@Column({ type: "int", nullable: true })
duration: number | null;
// --- Relations ---
@ManyToOne(() => User, {
nullable: false,
onDelete: "RESTRICT",
})
@JoinColumn({ name: "adminId" })
admin: User;
@Column({ type: "uuid" })
adminId: string;
@ManyToOne(() => TMTask, (task) => task.times, {
nullable: false,
onDelete: "CASCADE",
})
@JoinColumn({ name: "taskId" })
task: TMTask;
@Column({ type: "uuid" })
taskId: string;
}
@@ -131,7 +131,7 @@ export class ProjectService {
const limit = pagination.limit ?? 10; const limit = pagination.limit ?? 10;
const skip = (page - 1) * limit; const skip = (page - 1) * limit;
const isPermissionIncluded = permissions.includes(PermissionEnum.VIEW_ALL_PROJECTS); const isPermissionIncluded = permissions.includes(PermissionEnum.PROJECT_READ);
const isUserMemeberOfWorkspace = workspace.users.some((user) => user.id === userId); const isUserMemeberOfWorkspace = workspace.users.some((user) => user.id === userId);
var res: [TMProject[], number]; var res: [TMProject[], number];
@@ -158,7 +158,7 @@ export class ProjectService {
if (!project) throw new NotFoundException(ProjectMessage.PROJECT_NOT_FOUND); if (!project) throw new NotFoundException(ProjectMessage.PROJECT_NOT_FOUND);
const isUserMember = project.users.some((user) => user.id === userId); const isUserMember = project.users.some((user) => user.id === userId);
if (!isUserMember && !permissions.includes(PermissionEnum.VIEW_ALL_PROJECTS)) if (!isUserMember && !permissions.includes(PermissionEnum.PROJECT_READ))
throw new ForbiddenException(ProjectMessage.NOT_MEMBER_OF_PROJECT); throw new ForbiddenException(ProjectMessage.NOT_MEMBER_OF_PROJECT);
const projectDetail = await this.projectRepository.getProjectDetail(projectId); const projectDetail = await this.projectRepository.getProjectDetail(projectId);
@@ -98,9 +98,13 @@ export class TaskService {
return this.taskRepository.save(task); return this.taskRepository.save(task);
} }
async changePhase(id: string, dto: ChangeTaskPhaseDto): Promise<TMTask> { async changePhase(id: string,permissions: PermissionEnum[],userId: string, dto: ChangeTaskPhaseDto): Promise<TMTask> {
const task = await this.findOneOrFail(id); const task = await this.findOneOrFail(id);
const isTaskMember = task.users.some((user) => user.id === userId);
const hasPermission = permissions.includes(PermissionEnum.TASK_UPDATE);
if (!isTaskMember && !hasPermission) throw new ForbiddenException(TaskMessage.USER_NOT_TASK_MEMBER);
const newPhase = await this.findTaskPhaseOrFail(dto.taskPhaseId); const newPhase = await this.findTaskPhaseOrFail(dto.taskPhaseId);
if (task.taskPhase.projectId !== newPhase.projectId) { if (task.taskPhase.projectId !== newPhase.projectId) {
@@ -122,7 +126,7 @@ export class TaskService {
const task = await this.findOneOrFail(taskId); const task = await this.findOneOrFail(taskId);
const isTaskMember = task.users.some((user) => user.id === userId); const isTaskMember = task.users.some((user) => user.id === userId);
const hasPermission = permissions.includes(PermissionEnum.TASK); const hasPermission = permissions.includes(PermissionEnum.TASK_READ);
if (!isTaskMember && !hasPermission) throw new ForbiddenException(TaskMessage.USER_NOT_TASK_MEMBER); if (!isTaskMember && !hasPermission) throw new ForbiddenException(TaskMessage.USER_NOT_TASK_MEMBER);
const taskDetail = await this.taskRepository.getTaskDetail(taskId); const taskDetail = await this.taskRepository.getTaskDetail(taskId);
@@ -156,10 +160,14 @@ export class TaskService {
return { data: items, nextCursor, previousCursor, hasNextPage, hasPreviousPage, cursorPaginate: true }; return { data: items, nextCursor, previousCursor, hasNextPage, hasPreviousPage, cursorPaginate: true };
} }
async changePriority(srcTaskId: string, destTaskId: string): Promise<TMTask> { async changePriority(srcTaskId: string,permissions: PermissionEnum[],userId: string, destTaskId: string): Promise<TMTask> {
const srcTask = await this.findOneOrFail(srcTaskId); const srcTask = await this.findOneOrFail(srcTaskId);
const desTask = await this.findOneOrFail(destTaskId); const desTask = await this.findOneOrFail(destTaskId);
const isTaskMember = srcTask.users.some((user) => user.id === userId);
const hasPermission = permissions.includes(PermissionEnum.TASK_UPDATE);
if (!isTaskMember && !hasPermission) throw new ForbiddenException(TaskMessage.USER_NOT_TASK_MEMBER);
if (srcTask.taskPhaseId !== desTask.taskPhaseId) if (srcTask.taskPhaseId !== desTask.taskPhaseId)
throw new BadRequestException(TaskMessage.TASKS_NOT_IN_THE_SAME_TASK_PHASE); throw new BadRequestException(TaskMessage.TASKS_NOT_IN_THE_SAME_TASK_PHASE);
@@ -0,0 +1,119 @@
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
import { IsNull } from "typeorm";
import { TimeRepository } from "../repositories/time.repository";
import { TMTime } from "../entities/time.entity";
import { CreateTimeDto } from "../dto/time/create-time.dto";
import { UpdateTimeDto } from "../dto/time/update-time.dto";
import { timeMessage } from "../../../common/enums/message.enum";
import { TaskService } from "./task.service";
@Injectable()
export class TimeService {
constructor(
private readonly timeRepository: TimeRepository,
private readonly taskService: TaskService,
) { }
private calculateDuration(startedAt: Date, endedAt: Date): number {
if (endedAt.getTime() < startedAt.getTime()) {
throw new BadRequestException(timeMessage.INVALID_TIME_RANGE);
}
return Math.floor((endedAt.getTime() - startedAt.getTime()) / 1000);
}
private async findRunningTime(adminId: string, taskId: string): Promise<TMTime | null> {
return this.timeRepository.findOne({
where: { adminId, taskId, endedAt: IsNull() },
order: { startedAt: "DESC" },
});
}
async findOneOrFail(id: string): Promise<TMTime> {
const time = await this.timeRepository.findOne({
where: { id },
relations: { admin: true, task: true },
});
if (!time) throw new NotFoundException(timeMessage.TIME_NOT_FOUND);
return time;
}
async start(adminId: string, taskId: string): Promise<TMTime> {
await this.taskService.findOneOrFail(taskId);
const runningTime = await this.findRunningTime(adminId, taskId);
if (runningTime) throw new BadRequestException(timeMessage.TIME_ALREADY_STARTED);
const time = this.timeRepository.create({
taskId,
adminId,
startedAt: new Date(),
endedAt: null,
duration: null,
});
return this.timeRepository.save(time);
}
async getTaskTimes(adminId: string, taskId: string): Promise<TMTime[]> {
return this.timeRepository.find({
where: { adminId, taskId },
order: { startedAt: "DESC" },
});
}
async end(adminId: string, taskId: string): Promise<TMTime> {
await this.taskService.findOneOrFail(taskId);
const runningTime = await this.findRunningTime(adminId, taskId);
if (!runningTime) throw new BadRequestException(timeMessage.NO_RUNNING_TIME);
const endedAt = new Date();
runningTime.endedAt = endedAt;
runningTime.duration = this.calculateDuration(runningTime.startedAt, endedAt);
return this.timeRepository.save(runningTime);
}
async create(adminId: string, dto: CreateTimeDto): Promise<TMTime> {
await this.taskService.findOneOrFail(dto.taskId);
const startedAt = new Date(dto.startedAt);
const endedAt = new Date(dto.endedAt);
const time = this.timeRepository.create({
taskId: dto.taskId,
adminId,
startedAt,
endedAt,
duration: this.calculateDuration(startedAt, endedAt),
});
return this.timeRepository.save(time);
}
async update(id: string, dto: UpdateTimeDto): Promise<TMTime> {
const time = await this.findOneOrFail(id);
if (dto.taskId) {
await this.taskService.findOneOrFail(dto.taskId);
}
const startedAt = dto.startedAt ? new Date(dto.startedAt) : time.startedAt;
const endedAt = dto.endedAt ? new Date(dto.endedAt) : time.endedAt;
Object.assign(time, {
...dto,
startedAt,
endedAt,
duration: endedAt ? this.calculateDuration(startedAt, endedAt) : null,
});
return this.timeRepository.save(time);
}
async remove(id: string): Promise<void> {
await this.findOneOrFail(id);
await this.timeRepository.delete(id);
}
}
@@ -66,7 +66,7 @@ export class WorkspaceService {
} }
async findByUser(userId: string, permissions: PermissionEnum[]): Promise<TMWorkspace[]> { async findByUser(userId: string, permissions: PermissionEnum[]): Promise<TMWorkspace[]> {
if(permissions.includes(PermissionEnum.VIEW_ALL_WORKSPACES)) { if(permissions.includes(PermissionEnum.WORKSPACE_READ)) {
return await this.workspaceRepository.find(); return await this.workspaceRepository.find();
} }
return await this.workspaceRepository.findByUser(userId); return await this.workspaceRepository.findByUser(userId);
@@ -2,6 +2,7 @@ import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm"; import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm"; import { Repository } from "typeorm";
import { TMTask } from "../entities/task.entity"; import { TMTask } from "../entities/task.entity";
import { TMTime } from "../entities/time.entity";
import { CursorDirection, CursorPaginationDto } from "../../../common/DTO/cursor-pagination.dto"; import { CursorDirection, CursorPaginationDto } from "../../../common/DTO/cursor-pagination.dto";
import { decodeCursor } from "../../utils/providers/cursor-pagination.utils"; import { decodeCursor } from "../../utils/providers/cursor-pagination.utils";
@@ -12,11 +13,13 @@ export class TaskRepository extends Repository<TMTask> {
} }
async getTaskDetail(taskId: string): Promise<TMTask | null> { async getTaskDetail(taskId: string): Promise<TMTask | null> {
return this.createQueryBuilder("task") const task = await this.createQueryBuilder("task")
.leftJoinAndSelect("task.remarks", "remark") .leftJoinAndSelect("task.remarks", "remark")
.leftJoinAndSelect("task.attachments", "attachment") .leftJoinAndSelect("task.attachments", "attachment")
.leftJoinAndSelect("task.checkListItems", "checkListItem") .leftJoinAndSelect("task.checkListItems", "checkListItem")
.leftJoinAndSelect("task.users", "user") .leftJoinAndSelect("task.users", "user")
.leftJoinAndSelect("task.times", "time")
.leftJoinAndSelect("time.admin", "timeAdmin")
.loadRelationCountAndMap("task.checkListItemCount", "task.checkListItems") .loadRelationCountAndMap("task.checkListItemCount", "task.checkListItems")
@@ -41,34 +44,45 @@ export class TaskRepository extends Repository<TMTask> {
"user.id", "user.id",
"user.firstName", "user.firstName",
"user.lastName", "user.lastName",
"time.id",
"time.startedAt",
"time.endedAt",
"time.duration",
"time.adminId",
"timeAdmin.id",
"timeAdmin.firstName",
"timeAdmin.lastName",
]) ])
.where("task.id = :taskId", { taskId }) .where("task.id = :taskId", { taskId })
.orderBy("checkListItem.createdAt", "ASC") .orderBy("checkListItem.createdAt", "ASC")
.addOrderBy("time.createdAt", "ASC")
.getOne(); .getOne();
if (task) {
task.time = task.times?.reduce((sum, entry) => sum + (entry.duration ?? 0), 0) ?? 0;
}
return task;
} }
async findTasksByTaskPhase( async findTasksByTaskPhase(taskPhaseId: string, pagination: CursorPaginationDto): Promise<{ items: TMTask[]; hasMore: boolean }> {
taskPhaseId: string,
pagination: CursorPaginationDto,
): Promise<{ items: TMTask[]; hasMore: boolean }> {
const limit = pagination.limit || 10; const limit = pagination.limit || 10;
const isBackward = pagination.direction === CursorDirection.PREV; const isBackward = pagination.direction === CursorDirection.PREV;
// truncated to milliseconds because a JS Date (and therefore the encoded cursor) only
// has millisecond precision, while Postgres timestamptz stores microseconds - comparing
// the raw column against the cursor would otherwise re-match the boundary row itself.
const createdAtExpr = `date_trunc('milliseconds', task.createdAt)`; const createdAtExpr = `date_trunc('milliseconds', task.createdAt)`;
const queryBuilder = this.createQueryBuilder("task") const seekQuery = this.createQueryBuilder("task")
.select(["task.id", "task.priority", "task.createdAt"])
.where("task.taskPhaseId = :taskPhaseId", { taskPhaseId }) .where("task.taskPhaseId = :taskPhaseId", { taskPhaseId })
.limit(limit + 1); // fetch one extra to check whether there's a further page .limit(limit + 1); // fetch one extra to check whether there's a further page
if (isBackward) { if (isBackward) {
queryBuilder.orderBy("task.priority", "ASC").addOrderBy(createdAtExpr, "DESC").addOrderBy("task.id", "DESC"); seekQuery.orderBy("task.priority", "ASC").addOrderBy(createdAtExpr, "DESC").addOrderBy("task.id", "DESC");
} else { } else {
queryBuilder.orderBy("task.priority", "DESC").addOrderBy(createdAtExpr, "ASC").addOrderBy("task.id", "ASC"); seekQuery.orderBy("task.priority", "DESC").addOrderBy(createdAtExpr, "ASC").addOrderBy("task.id", "ASC");
} }
if (pagination.cursor) { if (pagination.cursor) {
@@ -76,7 +90,7 @@ export class TaskRepository extends Repository<TMTask> {
const priorityOp = isBackward ? ">" : "<"; const priorityOp = isBackward ? ">" : "<";
const seekOp = isBackward ? "<" : ">"; const seekOp = isBackward ? "<" : ">";
queryBuilder.andWhere( seekQuery.andWhere(
`(task.priority ${priorityOp} :cursorPriority `(task.priority ${priorityOp} :cursorPriority
OR (task.priority = :cursorPriority AND ${createdAtExpr} ${seekOp} :cursorCreatedAt) OR (task.priority = :cursorPriority AND ${createdAtExpr} ${seekOp} :cursorCreatedAt)
OR (task.priority = :cursorPriority AND ${createdAtExpr} = :cursorCreatedAt AND task.id ${seekOp} :cursorId))`, OR (task.priority = :cursorPriority AND ${createdAtExpr} = :cursorCreatedAt AND task.id ${seekOp} :cursorId))`,
@@ -84,13 +98,47 @@ export class TaskRepository extends Repository<TMTask> {
); );
} }
const rows = await queryBuilder.getMany(); const seekRows = await seekQuery.getMany();
const hasMore = rows.length > limit; const hasMore = seekRows.length > limit;
if (hasMore) rows.pop(); if (hasMore) seekRows.pop();
// backward queries fetch in reverse order to seek from the cursor, so flip back to // backward queries fetch in reverse order to seek from the cursor, so flip back to
// the normal display order before returning // the normal display order before returning
const items = isBackward ? rows.reverse() : rows; const orderedRows = isBackward ? seekRows.reverse() : seekRows;
const ids = orderedRows.map((row) => row.id);
if (!ids.length) return { items: [], hasMore };
// Detail query: hydrates exactly the ids picked above with the relations/counts the
// response needs. IN (:...ids) doesn't preserve order, so re-order to match seekQuery.
const detailRows = await this.createQueryBuilder("task")
.leftJoinAndSelect("task.remarks", "remark")
.loadRelationCountAndMap("task.attachmentCount", "task.attachments")
.loadRelationCountAndMap("task.checkListItemCount", "task.checkListItems")
.loadRelationCountAndMap("task.completedCheckListItemCount", "task.checkListItems", "completedCheckListItems", (qb) =>
qb.where("completedCheckListItems.isDone = :isDone", { isDone: true }),
)
.select(["task", "remark.id", "remark.title", "remark.color"])
.where("task.id IN (:...ids)", { ids })
.getMany();
const timeSums = await this.manager
.createQueryBuilder(TMTime, "time")
.select("time.taskId", "taskId")
.addSelect("COALESCE(SUM(time.duration), 0)", "totalTime")
.where("time.taskId IN (:...ids)", { ids })
.groupBy("time.taskId")
.getRawMany<{ taskId: string; totalTime: string }>();
const timeByTaskId = new Map(timeSums.map((row) => [row.taskId, Number(row.totalTime)]));
const detailById = new Map(
detailRows.map((task) => {
task.time = timeByTaskId.get(task.id) ?? 0;
return [task.id, task];
}),
);
const items = ids.map((id) => detailById.get(id)).filter((task): task is TMTask => task !== undefined);
return { items, hasMore }; return { items, hasMore };
} }
@@ -0,0 +1,11 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { TMTime } from "../entities/time.entity";
@Injectable()
export class TimeRepository extends Repository<TMTime> {
constructor(@InjectRepository(TMTime) timeRepository: Repository<TMTime>) {
super(timeRepository.target, timeRepository.manager, timeRepository.queryRunner);
}
}
@@ -8,6 +8,7 @@ import { TMTask } from "./entities/task.entity";
import { TMRemark } from "./entities/remark.entity"; import { TMRemark } from "./entities/remark.entity";
import { TMAttachment } from "./entities/attachment.entity"; import { TMAttachment } from "./entities/attachment.entity";
import { TMCheckListItem } from "./entities/check-list-item.entity"; import { TMCheckListItem } from "./entities/check-list-item.entity";
import { TMTime } from "./entities/time.entity";
import { WorkspaceRepository } from "./repositories/workspace.repository"; import { WorkspaceRepository } from "./repositories/workspace.repository";
import { WorkspaceController } from "./controllers/workspace.controller"; import { WorkspaceController } from "./controllers/workspace.controller";
import { WorkspaceService } from "./providers/workspace.service"; import { WorkspaceService } from "./providers/workspace.service";
@@ -30,10 +31,13 @@ import { RemarkService } from "./providers/remark.service";
import { AttachmentController } from "./controllers/attachment.controller"; import { AttachmentController } from "./controllers/attachment.controller";
import { AttachmentRepository } from "./repositories/attachment.repository"; import { AttachmentRepository } from "./repositories/attachment.repository";
import { AttachmentService } from "./providers/attachment.service"; import { AttachmentService } from "./providers/attachment.service";
import { TimeController } from "./controllers/time.controller";
import { TimeRepository } from "./repositories/time.repository";
import { TimeService } from "./providers/time.service";
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([TMWorkspace, TMProject, TMTaskPhase, TMTask, TMRemark, TMAttachment, TMCheckListItem, User]), TypeOrmModule.forFeature([TMWorkspace, TMProject, TMTaskPhase, TMTask, TMRemark, TMAttachment, TMCheckListItem, TMTime, User]),
], ],
controllers: [ controllers: [
WorkspaceController, WorkspaceController,
@@ -42,7 +46,8 @@ import { AttachmentService } from "./providers/attachment.service";
TaskController, TaskController,
CheckListItemController, CheckListItemController,
RemarkController, RemarkController,
AttachmentController AttachmentController,
TimeController,
], ],
providers: [ providers: [
WorkspaceRepository, WorkspaceRepository,
@@ -58,7 +63,9 @@ import { AttachmentService } from "./providers/attachment.service";
RemarkRepository, RemarkRepository,
RemarkService, RemarkService,
AttachmentRepository, AttachmentRepository,
AttachmentService AttachmentService,
TimeRepository,
TimeService,
] ]
}) })
export class TaskManagerModule {} export class TaskManagerModule {}
+8 -8
View File
@@ -24,14 +24,14 @@ export class TicketsController {
//----------------- ticket categories ------------------- //----------------- ticket categories -------------------
@ApiOperation({ summary: "Create ticket category => admin route" }) @ApiOperation({ summary: "Create ticket category => admin route" })
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_CREATE)
@Post("category") @Post("category")
createTicketCategory(@Body() createDto: CreateTicketCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createTicketCategory(@Body() createDto: CreateTicketCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.ticketsService.createTicketCategory(createDto, userIpAndHeaders); return this.ticketsService.createTicketCategory(createDto, userIpAndHeaders);
} }
@ApiOperation({ summary: "Update ticket category => admin route" }) @ApiOperation({ summary: "Update ticket category => admin route" })
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_UPDATE)
@Patch("category/:id") @Patch("category/:id")
updateCategory( updateCategory(
@Param() paramDto: ParamDto, @Param() paramDto: ParamDto,
@@ -49,7 +49,7 @@ export class TicketsController {
@ApiOperation({ summary: "Get ticket categories list => admin route" }) @ApiOperation({ summary: "Get ticket categories list => admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_READ)
@Get("categories-list") @Get("categories-list")
getCategoriesList(@Query() queryDto: SearchTicketCategoryDto) { getCategoriesList(@Query() queryDto: SearchTicketCategoryDto) {
return this.ticketsService.getCategoriesList(queryDto); return this.ticketsService.getCategoriesList(queryDto);
@@ -58,7 +58,7 @@ export class TicketsController {
@ApiOperation({ summary: "toggle status of categories => admin route" }) @ApiOperation({ summary: "toggle status of categories => admin route" })
@AdminRoute() @AdminRoute()
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_UPDATE)
@Post("category/toggle-status/:id") @Post("category/toggle-status/:id")
toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders); return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders);
@@ -74,7 +74,7 @@ export class TicketsController {
@ApiOperation({ summary: "create ticket by admin" }) @ApiOperation({ summary: "create ticket by admin" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_CREATE)
@Post("admin") @Post("admin")
createTicketByAdmin(@Body() createDto: CreateTicketByAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createTicketByAdmin(@Body() createDto: CreateTicketByAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.ticketsService.createTicketByAdmin(createDto, userIpAndHeaders); return this.ticketsService.createTicketByAdmin(createDto, userIpAndHeaders);
@@ -88,7 +88,7 @@ export class TicketsController {
@ApiOperation({ summary: "Get all tickets ==> admin route" }) @ApiOperation({ summary: "Get all tickets ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_READ)
@Get("admin") @Get("admin")
getAllTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") adminId: string) { getAllTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") adminId: string) {
return this.ticketsService.getTicketForAdmin(queryDto, adminId); return this.ticketsService.getTicketForAdmin(queryDto, adminId);
@@ -124,7 +124,7 @@ export class TicketsController {
@ApiOperation({ summary: "open ticket by admin" }) @ApiOperation({ summary: "open ticket by admin" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_UPDATE)
@Post(":id/open") @Post(":id/open")
openTicketByAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { openTicketByAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.ticketsService.openTicketByAdmin(paramDto.id, userIpAndHeaders); return this.ticketsService.openTicketByAdmin(paramDto.id, userIpAndHeaders);
@@ -132,7 +132,7 @@ export class TicketsController {
@ApiOperation({ summary: "referer ticket ==> admin route" }) @ApiOperation({ summary: "referer ticket ==> admin route" })
@AdminRoute() @AdminRoute()
@PermissionsDec(PermissionEnum.TICKETS) @PermissionsDec(PermissionEnum.TICKETS_UPDATE)
@Post(":id/refer") @Post(":id/refer")
referTicket(@Param() paramDto: ParamDto, @Body() referDto: ReferTicketDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { referTicket(@Param() paramDto: ParamDto, @Body() referDto: ReferTicketDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.ticketsService.referTicket(paramDto.id, referDto, userIpAndHeaders); return this.ticketsService.referTicket(paramDto.id, referDto, userIpAndHeaders);
@@ -12,6 +12,6 @@ export class SearchAdminQueryDto extends PaginationDto {
@IsOptional() @IsOptional()
@IsEnum(PermissionEnum) @IsEnum(PermissionEnum)
@ApiPropertyOptional({ description: "permission", example: PermissionEnum.SERVICES }) @ApiPropertyOptional({ description: "permission", example: PermissionEnum.SERVICES_READ })
permission?: PermissionEnum; permission?: PermissionEnum;
} }
@@ -0,0 +1,138 @@
import { PermissionEnum } from "../enums/permission.enum";
import { PermissionGroupEnum } from "../enums/permission-group.enum";
export type PermissionMeta = {
title: string;
group: PermissionGroupEnum;
};
export const permissionMeta: Record<PermissionEnum, PermissionMeta> = {
[PermissionEnum.SERVICES_CREATE]: { title: "ایجاد سرویس‌ها", group: PermissionGroupEnum.SERVICES },
[PermissionEnum.SERVICES_READ]: { title: "مشاهده سرویس‌ها", group: PermissionGroupEnum.SERVICES },
[PermissionEnum.SERVICES_UPDATE]: { title: "ویرایش سرویس‌ها", group: PermissionGroupEnum.SERVICES },
[PermissionEnum.SERVICES_DELETE]: { title: "حذف سرویس‌ها", group: PermissionGroupEnum.SERVICES },
[PermissionEnum.CUSTOMERS_CREATE]: { title: "ایجاد مشتریان", group: PermissionGroupEnum.CUSTOMERS },
[PermissionEnum.CUSTOMERS_READ]: { title: "مشاهده مشتریان", group: PermissionGroupEnum.CUSTOMERS },
[PermissionEnum.CUSTOMERS_UPDATE]: { title: "ویرایش مشتریان", group: PermissionGroupEnum.CUSTOMERS },
[PermissionEnum.CUSTOMERS_DELETE]: { title: "حذف مشتریان", group: PermissionGroupEnum.CUSTOMERS },
[PermissionEnum.AGENTS_CREATE]: { title: "ایجاد نمایندگان", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.AGENTS_READ]: { title: "مشاهده نمایندگان", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.AGENTS_UPDATE]: { title: "ویرایش نمایندگان", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.AGENTS_DELETE]: { title: "حذف نمایندگان", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.DEVELOPERS_CREATE]: { title: "ایجاد توسعه‌دهندگان", group: PermissionGroupEnum.USERS },
[PermissionEnum.DEVELOPERS_READ]: { title: "مشاهده توسعه‌دهندگان", group: PermissionGroupEnum.USERS },
[PermissionEnum.DEVELOPERS_UPDATE]: { title: "ویرایش توسعه‌دهندگان", group: PermissionGroupEnum.USERS },
[PermissionEnum.DEVELOPERS_DELETE]: { title: "حذف توسعه‌دهندگان", group: PermissionGroupEnum.USERS },
[PermissionEnum.INVOICES_CREATE]: { title: "ایجاد صورتحساب‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.INVOICES_READ]: { title: "مشاهده صورتحساب‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.INVOICES_UPDATE]: { title: "ویرایش صورتحساب‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.INVOICES_DELETE]: { title: "حذف صورتحساب‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.TRANSACTIONS_CREATE]: { title: "ایجاد تراکنش‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.TRANSACTIONS_READ]: { title: "مشاهده تراکنش‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.TRANSACTIONS_UPDATE]: { title: "ویرایش تراکنش‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.TRANSACTIONS_DELETE]: { title: "حذف تراکنش‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.DISCOUNTS_CREATE]: { title: "ایجاد تخفیف‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.DISCOUNTS_READ]: { title: "مشاهده تخفیف‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.DISCOUNTS_UPDATE]: { title: "ویرایش تخفیف‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.DISCOUNTS_DELETE]: { title: "حذف تخفیف‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.ADMINS_CREATE]: { title: "ایجاد ادمین‌ها", group: PermissionGroupEnum.USERS },
[PermissionEnum.ADMINS_READ]: { title: "مشاهده ادمین‌ها", group: PermissionGroupEnum.USERS },
[PermissionEnum.ADMINS_UPDATE]: { title: "ویرایش ادمین‌ها", group: PermissionGroupEnum.USERS },
[PermissionEnum.ADMINS_DELETE]: { title: "حذف ادمین‌ها", group: PermissionGroupEnum.USERS },
[PermissionEnum.TICKETS_CREATE]: { title: "ایجاد تیکت‌ها", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.TICKETS_READ]: { title: "مشاهده تیکت‌ها", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.TICKETS_UPDATE]: { title: "ویرایش تیکت‌ها", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.TICKETS_DELETE]: { title: "حذف تیکت‌ها", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.CRITICISMS_CREATE]: { title: "ایجاد انتقادات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CRITICISMS_READ]: { title: "مشاهده انتقادات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CRITICISMS_UPDATE]: { title: "ویرایش انتقادات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CRITICISMS_DELETE]: { title: "حذف انتقادات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CONTACTS_US_CREATE]: { title: "ایجاد تماس با ما", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CONTACTS_US_READ]: { title: "مشاهده تماس با ما", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CONTACTS_US_UPDATE]: { title: "ویرایش تماس با ما", group: PermissionGroupEnum.OTHER },
[PermissionEnum.CONTACTS_US_DELETE]: { title: "حذف تماس با ما", group: PermissionGroupEnum.OTHER },
[PermissionEnum.ADVERTISEMENTS_CREATE]: { title: "ایجاد تبلیغات", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ADVERTISEMENTS_READ]: { title: "مشاهده تبلیغات", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ADVERTISEMENTS_UPDATE]: { title: "ویرایش تبلیغات", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ADVERTISEMENTS_DELETE]: { title: "حذف تبلیغات", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ANNOUNCEMENTS_CREATE]: { title: "ایجاد اطلاعیه‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ANNOUNCEMENTS_READ]: { title: "مشاهده اطلاعیه‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ANNOUNCEMENTS_UPDATE]: { title: "ویرایش اطلاعیه‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.ANNOUNCEMENTS_DELETE]: { title: "حذف اطلاعیه‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.BLOGS_CREATE]: { title: "ایجاد بلاگ‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.BLOGS_READ]: { title: "مشاهده بلاگ‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.BLOGS_UPDATE]: { title: "ویرایش بلاگ‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.BLOGS_DELETE]: { title: "حذف بلاگ‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.LEARNINGS_CREATE]: { title: "ایجاد آموزش‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.LEARNINGS_READ]: { title: "مشاهده آموزش‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.LEARNINGS_UPDATE]: { title: "ویرایش آموزش‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.LEARNINGS_DELETE]: { title: "حذف آموزش‌ها", group: PermissionGroupEnum.CONTENT },
[PermissionEnum.SETTINGS_CREATE]: { title: "ایجاد تنظیمات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.SETTINGS_READ]: { title: "مشاهده تنظیمات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.SETTINGS_UPDATE]: { title: "ویرایش تنظیمات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.SETTINGS_DELETE]: { title: "حذف تنظیمات", group: PermissionGroupEnum.OTHER },
[PermissionEnum.BANK_ACCOUNTS_CREATE]: { title: "ایجاد حساب‌های بانکی", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.BANK_ACCOUNTS_READ]: { title: "مشاهده حساب‌های بانکی", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.BANK_ACCOUNTS_UPDATE]: { title: "ویرایش حساب‌های بانکی", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.BANK_ACCOUNTS_DELETE]: { title: "حذف حساب‌های بانکی", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.PAYMENTS_CREATE]: { title: "ایجاد پرداخت‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.PAYMENTS_READ]: { title: "مشاهده پرداخت‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.PAYMENTS_UPDATE]: { title: "ویرایش پرداخت‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.PAYMENTS_DELETE]: { title: "حذف پرداخت‌ها", group: PermissionGroupEnum.FINANCIAL },
[PermissionEnum.SUPPORT_PLAN_CREATE]: { title: "ایجاد پلن پشتیبانی", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.SUPPORT_PLAN_READ]: { title: "مشاهده پلن پشتیبانی", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.SUPPORT_PLAN_UPDATE]: { title: "ویرایش پلن پشتیبانی", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.SUPPORT_PLAN_DELETE]: { title: "حذف پلن پشتیبانی", group: PermissionGroupEnum.SUPPORT },
[PermissionEnum.RESELLER_CREATE]: { title: "ایجاد نمایندگی فروش", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.RESELLER_READ]: { title: "مشاهده نمایندگی فروش", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.RESELLER_UPDATE]: { title: "ویرایش نمایندگی فروش", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.RESELLER_DELETE]: { title: "حذف نمایندگی فروش", group: PermissionGroupEnum.REPRESENTATIVES },
[PermissionEnum.WORKSPACE_CREATE]: { title: "ایجاد فضای کار", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.WORKSPACE_READ]: { title: "مشاهده فضای کار", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.WORKSPACE_UPDATE]: { title: "ویرایش فضای کار", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.WORKSPACE_DELETE]: { title: "حذف فضای کار", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.PROJECT_CREATE]: { title: "ایجاد پروژه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.PROJECT_READ]: { title: "مشاهده پروژه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.PROJECT_UPDATE]: { title: "ویرایش پروژه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.PROJECT_DELETE]: { title: "حذف پروژه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_CREATE]: { title: "ایجاد وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_READ]: { title: "مشاهده وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_UPDATE]: { title: "ویرایش وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_DELETE]: { title: "حذف وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_PHASE_CREATE]: { title: "ایجاد فاز وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_PHASE_READ]: { title: "مشاهده فاز وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_PHASE_UPDATE]: { title: "ویرایش فاز وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.TASK_PHASE_DELETE]: { title: "حذف فاز وظیفه", group: PermissionGroupEnum.TASK_MANAGER },
[PermissionEnum.LOGS]: { title: "لاگ‌ها", group: PermissionGroupEnum.OTHER },
[PermissionEnum.MANAGE_SSO_CLIENTS]: { title: "مدیریت کلاینت‌های SSO", group: PermissionGroupEnum.OTHER },
[PermissionEnum.DMENU]: { title: "دی‌منو", group: PermissionGroupEnum.PRODUCTS },
[PermissionEnum.DKALA]: { title: "دی‌کالا", group: PermissionGroupEnum.PRODUCTS },
[PermissionEnum.DPAGE]: { title: "دی‌پیج", group: PermissionGroupEnum.PRODUCTS },
[PermissionEnum.DMAIL]: { title: "دی‌میل", group: PermissionGroupEnum.PRODUCTS },
// [PermissionEnum.VIEW_ALL_WORKSPACES]: { title: "مشاهده همه فضاهای کار", group: PermissionGroupEnum.TASK_MANAGER },
// [PermissionEnum.VIEW_ALL_PROJECTS]: { title: "مشاهده همه پروژه‌ها", group: PermissionGroupEnum.TASK_MANAGER },
};
@@ -3,12 +3,19 @@ import { Column, Entity, ManyToMany } from "typeorm";
import { Role } from "./role.entity"; import { Role } from "./role.entity";
import { BaseEntity } from "../../../common/entities/base.entity"; import { BaseEntity } from "../../../common/entities/base.entity";
import { PermissionEnum } from "../enums/permission.enum"; import { PermissionEnum } from "../enums/permission.enum";
import { PermissionGroupEnum } from "../enums/permission-group.enum";
@Entity() @Entity()
export class Permission extends BaseEntity { export class Permission extends BaseEntity {
@Column({ type: "enum", enum: PermissionEnum, nullable: false, unique: true }) @Column({ type: "enum", enum: PermissionEnum, nullable: false, unique: true })
name: PermissionEnum; name: PermissionEnum;
@Column({ type: "varchar", length: 150, nullable: false })
title: string;
@Column({ type: "enum", enum: PermissionGroupEnum, nullable: false })
group: PermissionGroupEnum;
@ManyToMany(() => Role, (role) => role.permissions) @ManyToMany(() => Role, (role) => role.permissions)
roles: Role[]; roles: Role[];
} }
@@ -0,0 +1,12 @@
export enum PermissionGroupEnum {
SERVICES = "services",
CUSTOMERS = "customers",
USERS = "users",
FINANCIAL = "financial",
CONTENT = "content",
SUPPORT = "support",
OTHER = "other",
PRODUCTS = "products",
REPRESENTATIVES = "representatives",
TASK_MANAGER = "task_manager",
}
+148 -27
View File
@@ -1,34 +1,155 @@
export enum PermissionEnum { export enum PermissionEnum {
SERVICES = "services", // services
CUSTOMERS = "customers", SERVICES_CREATE = "services_create",
AGENTS = "agents", SERVICES_READ = "services_read",
DEVELOPERS = "developers", SERVICES_UPDATE = "services_update",
INVOICES = "invoices", SERVICES_DELETE = "services_delete",
TRANSACTIONS = "transactions",
DISCOUNTS = "discounts", // customers
ADMINS = "admins", CUSTOMERS_CREATE = "customers_create",
TICKETS = "tickets", CUSTOMERS_READ = "customers_read",
CRITICISMS = "criticisms", CUSTOMERS_UPDATE = "customers_update",
CONTACTS_US = "contacts_us", CUSTOMERS_DELETE = "customers_delete",
ADVERTISEMENTS = "advertisements",
ANNOUNCEMENTS = "announcements", // agents
BLOGS = "blogs", AGENTS_CREATE = "agents_create",
LEARNINGS = "learnings", AGENTS_READ = "agents_read",
AGENTS_UPDATE = "agents_update",
AGENTS_DELETE = "agents_delete",
// developers
DEVELOPERS_CREATE = "developers_create",
DEVELOPERS_READ = "developers_read",
DEVELOPERS_UPDATE = "developers_update",
DEVELOPERS_DELETE = "developers_delete",
// invoices
INVOICES_CREATE = "invoices_create",
INVOICES_READ = "invoices_read",
INVOICES_UPDATE = "invoices_update",
INVOICES_DELETE = "invoices_delete",
// transactions
TRANSACTIONS_CREATE = "transactions_create",
TRANSACTIONS_READ = "transactions_read",
TRANSACTIONS_UPDATE = "transactions_update",
TRANSACTIONS_DELETE = "transactions_delete",
// discounts
DISCOUNTS_CREATE = "discounts_create",
DISCOUNTS_READ = "discounts_read",
DISCOUNTS_UPDATE = "discounts_update",
DISCOUNTS_DELETE = "discounts_delete",
// admins
ADMINS_CREATE = "admins_create",
ADMINS_READ = "admins_read",
ADMINS_UPDATE = "admins_update",
ADMINS_DELETE = "admins_delete",
// tickets
TICKETS_CREATE = "tickets_create",
TICKETS_READ = "tickets_read",
TICKETS_UPDATE = "tickets_update",
TICKETS_DELETE = "tickets_delete",
// criticisms
CRITICISMS_CREATE = "criticisms_create",
CRITICISMS_READ = "criticisms_read",
CRITICISMS_UPDATE = "criticisms_update",
CRITICISMS_DELETE = "criticisms_delete",
// contacts_us
CONTACTS_US_CREATE = "contacts_us_create",
CONTACTS_US_READ = "contacts_us_read",
CONTACTS_US_UPDATE = "contacts_us_update",
CONTACTS_US_DELETE = "contacts_us_delete",
// advertisements
ADVERTISEMENTS_CREATE = "advertisements_create",
ADVERTISEMENTS_READ = "advertisements_read",
ADVERTISEMENTS_UPDATE = "advertisements_update",
ADVERTISEMENTS_DELETE = "advertisements_delete",
// announcements
ANNOUNCEMENTS_CREATE = "announcements_create",
ANNOUNCEMENTS_READ = "announcements_read",
ANNOUNCEMENTS_UPDATE = "announcements_update",
ANNOUNCEMENTS_DELETE = "announcements_delete",
// blogs
BLOGS_CREATE = "blogs_create",
BLOGS_READ = "blogs_read",
BLOGS_UPDATE = "blogs_update",
BLOGS_DELETE = "blogs_delete",
// learnings
LEARNINGS_CREATE = "learnings_create",
LEARNINGS_READ = "learnings_read",
LEARNINGS_UPDATE = "learnings_update",
LEARNINGS_DELETE = "learnings_delete",
// settings
SETTINGS_CREATE = "settings_create",
SETTINGS_READ = "settings_read",
SETTINGS_UPDATE = "settings_update",
SETTINGS_DELETE = "settings_delete",
// bank_accounts
BANK_ACCOUNTS_CREATE = "bank_accounts_create",
BANK_ACCOUNTS_READ = "bank_accounts_read",
BANK_ACCOUNTS_UPDATE = "bank_accounts_update",
BANK_ACCOUNTS_DELETE = "bank_accounts_delete",
// payments
PAYMENTS_CREATE = "payments_create",
PAYMENTS_READ = "payments_read",
PAYMENTS_UPDATE = "payments_update",
PAYMENTS_DELETE = "payments_delete",
// support_plan
SUPPORT_PLAN_CREATE = "support_plan_create",
SUPPORT_PLAN_READ = "support_plan_read",
SUPPORT_PLAN_UPDATE = "support_plan_update",
SUPPORT_PLAN_DELETE = "support_plan_delete",
// reseller
RESELLER_CREATE = "reseller_create",
RESELLER_READ = "reseller_read",
RESELLER_UPDATE = "reseller_update",
RESELLER_DELETE = "reseller_delete",
// workspace
WORKSPACE_CREATE = "workspace_create",
WORKSPACE_READ = "workspace_read",
WORKSPACE_UPDATE = "workspace_update",
WORKSPACE_DELETE = "workspace_delete",
// project
PROJECT_CREATE = "project_create",
PROJECT_READ = "project_read",
PROJECT_UPDATE = "project_update",
PROJECT_DELETE = "project_delete",
// task
TASK_CREATE = "task_create",
TASK_READ = "task_read",
TASK_UPDATE = "task_update",
TASK_DELETE = "task_delete",
// task_phase
TASK_PHASE_CREATE = "task_phase_create",
TASK_PHASE_READ = "task_phase_read",
TASK_PHASE_UPDATE = "task_phase_update",
TASK_PHASE_DELETE = "task_phase_delete",
// single permissions (no CRUD split)
LOGS = "logs", LOGS = "logs",
SETTINGS = "settings",
BANK_ACCOUNTS = "bank_accounts",
PAYMENTS = "payments",
MANAGE_SSO_CLIENTS = "manage_sso_clients", MANAGE_SSO_CLIENTS = "manage_sso_clients",
SUPPORT_PLAN = "support_plan",
DMENU = "dmenu", DMENU = "dmenu",
DKALA = "dkala", DKALA = "dkala",
DPAGE = "dpage", DPAGE = "dpage",
DMAIL = 'dmail', DMAIL = "dmail",
RESELLER="reseller", // VIEW_ALL_WORKSPACES = "view_all_workspaces",
WORKSPACE="workspace", // create, update, remove, read-one(for update purposes) // VIEW_ALL_PROJECTS = "view_all_projects",
VIEW_ALL_WORKSPACES="view_all_workspaces",
PROJECT="project", // create, update, remove
VIEW_ALL_PROJECTS="view_all_projects",
TASK="task", // read, create, update, remove
TASK_PHASE="task_phase",
} }
@@ -288,7 +288,10 @@ export class AdminsService {
/************************************************************ */ /************************************************************ */
async getPermissions() { async getPermissions() {
const permissions = await this.permissionsRepository.find({ select: { id: true, name: true } }); const permissions = await this.permissionsRepository.find({
select: { id: true, name: true, title: true, group: true },
order: { group: "ASC", name: "ASC" },
});
return { return {
permissions, permissions,
}; };
@@ -188,7 +188,7 @@ export class UserRepository extends Repository<User> {
.leftJoinAndSelect("role.permissions", "permissions") .leftJoinAndSelect("role.permissions", "permissions")
.andWhere("user.deletedAt IS NULL"); .andWhere("user.deletedAt IS NULL");
// .where("permissions.name IN (:...adminPermissions)", { // .where("permissions.name IN (:...adminPermissions)", {
// adminPermissions: [PermissionEnum.ADMINS], // adminPermissions: [PermissionEnum.ADMINS_READ],
// }); // });
// .addSelect(["permissions.id", "permissions.name"]); // .addSelect(["permissions.id", "permissions.name"]);
+18 -16
View File
@@ -113,21 +113,21 @@ export class UsersController {
} }
@ApiOperation({ summary: "Create user group ==> admin route" }) @ApiOperation({ summary: "Create user group ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE)
@Post("user-group") @Post("user-group")
createUserGroup(@Body() createDto: CreateUserGroupDto) { createUserGroup(@Body() createDto: CreateUserGroupDto) {
return this.usersService.createUserGroup(createDto); return this.usersService.createUserGroup(createDto);
} }
@ApiOperation({ summary: "get all user group ==> admin route" }) @ApiOperation({ summary: "get all user group ==> admin route" })
@PermissionsDec(PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.CUSTOMERS_READ)
@Get("user-group") @Get("user-group")
UserGroups() { UserGroups() {
return this.usersService.getUserGroups(); return this.usersService.getUserGroups();
} }
@ApiOperation({ summary: "get all users ==> admin route" }) @ApiOperation({ summary: "get all users ==> admin route" })
@PermissionsDec(PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.CUSTOMERS_READ)
@Get() @Get()
getUsers() { getUsers() {
return this.usersService.findAllUsers(); return this.usersService.findAllUsers();
@@ -136,12 +136,14 @@ export class UsersController {
@ApiOperation({ summary: "Create customer" }) @ApiOperation({ summary: "Create customer" })
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@PermissionsDec(PermissionEnum.CUSTOMERS_CREATE)
@Post("customers") @Post("customers")
createCustomer(@Body() createDto: CreateCustomerDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createCustomer(@Body() createDto: CreateCustomerDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.customersService.createCustomer(createDto, userIpAndHeaders); return this.customersService.createCustomer(createDto, userIpAndHeaders);
} }
@ApiOperation({ summary: "Update customer" }) @ApiOperation({ summary: "Update customer" })
@PermissionsDec(PermissionEnum.CUSTOMERS_UPDATE)
@Patch("customers/:id") @Patch("customers/:id")
updateCustomer( updateCustomer(
@Param() paramDto: ParamDto, @Param() paramDto: ParamDto,
@@ -152,14 +154,14 @@ export class UsersController {
} }
@ApiOperation({ summary: "get customers ==> admin route" }) @ApiOperation({ summary: "get customers ==> admin route" })
@PermissionsDec(PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.CUSTOMERS_READ)
@Get("customers") @Get("customers")
getCustomers(@Query() queryDto: SearchCustomersDto) { getCustomers(@Query() queryDto: SearchCustomersDto) {
return this.customersService.getCustomers(queryDto); return this.customersService.getCustomers(queryDto);
} }
@ApiOperation({ summary: "get customers by id ==> admin route" }) @ApiOperation({ summary: "get customers by id ==> admin route" })
@PermissionsDec(PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.CUSTOMERS_READ)
@Get("customers/:id") @Get("customers/:id")
getCustomerById(@Param() paramDto: ParamDto) { getCustomerById(@Param() paramDto: ParamDto) {
return this.customersService.getCustomerById(paramDto.id); return this.customersService.getCustomerById(paramDto.id);
@@ -169,35 +171,35 @@ export class UsersController {
@ApiOperation({ summary: "get all admins ==> admin route" }) @ApiOperation({ summary: "get all admins ==> admin route" })
@AdminRoute() @AdminRoute()
// @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) // @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 admin by id ==> admin route" }) @ApiOperation({ summary: "get admin by id ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
@Get("admins/:id") @Get("admins/:id")
getAdminById(@Param() paramDto: ParamDto) { getAdminById(@Param() paramDto: ParamDto) {
return this.adminsService.getAdminById(paramDto.id); return this.adminsService.getAdminById(paramDto.id);
} }
@ApiOperation({ summary: "update admin ==> admin route" }) @ApiOperation({ summary: "update admin ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_UPDATE, PermissionEnum.CUSTOMERS_UPDATE)
@Patch("admins/:id") @Patch("admins/:id")
updateAdmin(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { updateAdmin(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.adminsService.updateAdmin(paramDto.id, updateDto, userIpAndHeaders); return this.adminsService.updateAdmin(paramDto.id, updateDto, userIpAndHeaders);
} }
@ApiOperation({ summary: "delete admin ==> admin route" }) @ApiOperation({ summary: "delete admin ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_DELETE, PermissionEnum.CUSTOMERS_DELETE)
@Delete("admins/:id") @Delete("admins/:id")
deleteAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { deleteAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.adminsService.deleteAdmin(paramDto.id, userIpAndHeaders); return this.adminsService.deleteAdmin(paramDto.id, userIpAndHeaders);
} }
@ApiOperation({ summary: "create admin ==> admin route" }) @ApiOperation({ summary: "create admin ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE)
@Post("admins") @Post("admins")
createAdmin(@Body() createDto: CreateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { createAdmin(@Body() createDto: CreateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
return this.adminsService.createAdmin(createDto, userIpAndHeaders); return this.adminsService.createAdmin(createDto, userIpAndHeaders);
@@ -210,42 +212,42 @@ export class UsersController {
} }
@ApiOperation({ summary: "get all permissions ==> admin route" }) @ApiOperation({ summary: "get all permissions ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
@Get("permissions") @Get("permissions")
getPermissions() { getPermissions() {
return this.adminsService.getPermissions(); return this.adminsService.getPermissions();
} }
@ApiOperation({ summary: "get all roles ==> admin route" }) @ApiOperation({ summary: "get all roles ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
@Get("roles") @Get("roles")
getRoles(@Query() queryDto: SearchRolesQueryDto) { getRoles(@Query() queryDto: SearchRolesQueryDto) {
return this.adminsService.getRoles(queryDto); return this.adminsService.getRoles(queryDto);
} }
@ApiOperation({ summary: "get role by id ==> admin route" }) @ApiOperation({ summary: "get role by id ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ)
@Get("roles/:id") @Get("roles/:id")
getRoleById(@Param() paramDto: ParamDto) { getRoleById(@Param() paramDto: ParamDto) {
return this.adminsService.getRoleById(paramDto.id); return this.adminsService.getRoleById(paramDto.id);
} }
@ApiOperation({ summary: "create role ==> admin route" }) @ApiOperation({ summary: "create role ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE)
@Post("roles") @Post("roles")
createRole(@Body() createDto: CreateRoleDto) { createRole(@Body() createDto: CreateRoleDto) {
return this.adminsService.createRole(createDto); return this.adminsService.createRole(createDto);
} }
@ApiOperation({ summary: "update role ==> admin route" }) @ApiOperation({ summary: "update role ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_UPDATE, PermissionEnum.CUSTOMERS_UPDATE)
@Patch("roles/:id") @Patch("roles/:id")
updateRole(@Param() paramDto: ParamDto, @Body() updateDto: UpdateRoleDto) { updateRole(@Param() paramDto: ParamDto, @Body() updateDto: UpdateRoleDto) {
return this.adminsService.updateRole(paramDto.id, updateDto); return this.adminsService.updateRole(paramDto.id, updateDto);
} }
@ApiOperation({ summary: "delete role ==> admin route" }) @ApiOperation({ summary: "delete role ==> admin route" })
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @PermissionsDec(PermissionEnum.ADMINS_DELETE, PermissionEnum.CUSTOMERS_DELETE)
@Delete("roles/:id") @Delete("roles/:id")
deleteRole(@Param() paramDto: ParamDto) { deleteRole(@Param() paramDto: ParamDto) {
return this.adminsService.deleteRole(paramDto.id); return this.adminsService.deleteRole(paramDto.id);