From 6b222db890cafce4ff8063b61cb36dfe91ec2686 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 20 Jul 2026 10:16:45 +0330 Subject: [PATCH] refactor permissions --- ...00000-RefactorPermissionsToCrudAndGroup.ts | 300 ++++++++++++++++++ src/modules/ads/ads.controller.ts | 12 +- .../announcements/announcement.controller.ts | 10 +- src/modules/blogs/blogs.controller.ts | 26 +- .../contact-us/contact-us.controller.ts | 4 +- .../criticisms/criticisms.controller.ts | 6 +- .../danak-services.controller.ts | 44 +-- src/modules/discounts/discounts.controller.ts | 12 +- src/modules/dmail/dmail.controller.ts | 4 + src/modules/invoices/invoices.controller.ts | 8 +- src/modules/learnings/learning.controller.ts | 12 +- src/modules/payments/payments.controller.ts | 14 +- src/modules/reseller/reseller.controller.ts | 8 +- src/modules/sliders/sliders.controller.ts | 10 +- .../subscriptions/subscriptions.controller.ts | 14 +- .../support-plans/support-plans.controller.ts | 12 +- .../controllers/project.controller.ts | 6 +- .../controllers/task-phase.controller.ts | 4 +- .../controllers/task.controller.ts | 15 +- .../controllers/workspace.controller.ts | 8 +- .../task-manager/providers/project.service.ts | 4 +- .../task-manager/providers/task.service.ts | 14 +- .../providers/workspace.service.ts | 2 +- src/modules/tickets/tickets.controller.ts | 16 +- .../users/DTO/search-admins-query.dto.ts | 2 +- .../users/constants/permission-meta.ts | 138 ++++++++ .../users/entities/permission.entity.ts | 4 + .../users/enums/permission-group.enum.ts | 12 + src/modules/users/enums/permission.enum.ts | 175 ++++++++-- src/modules/users/providers/admins.service.ts | 5 +- .../users/repositories/users.repository.ts | 2 +- src/modules/users/users.controller.ts | 34 +- 32 files changed, 765 insertions(+), 172 deletions(-) create mode 100644 database/migrations/1784500000000-RefactorPermissionsToCrudAndGroup.ts create mode 100644 src/modules/users/constants/permission-meta.ts create mode 100644 src/modules/users/enums/permission-group.enum.ts diff --git a/database/migrations/1784500000000-RefactorPermissionsToCrudAndGroup.ts b/database/migrations/1784500000000-RefactorPermissionsToCrudAndGroup.ts new file mode 100644 index 0000000..814a180 --- /dev/null +++ b/database/migrations/1784500000000-RefactorPermissionsToCrudAndGroup.ts @@ -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 { + 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 { + 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"`); + } +} diff --git a/src/modules/ads/ads.controller.ts b/src/modules/ads/ads.controller.ts index 6faf828..068a35c 100755 --- a/src/modules/ads/ads.controller.ts +++ b/src/modules/ads/ads.controller.ts @@ -19,41 +19,41 @@ export class AdsController { @ApiOperation({ summary: "Create new ads" }) @Post() - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_CREATE) createAds(@Body() createDto: CreateAdsDto) { return this.adsService.createAds(createDto); } @ApiOperation({ summary: "Get all ads" }) - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_READ) @Get("list") getAdsList(@Query() queryDto: AdsSearchQueryDto) { return this.adsService.getAdsList(queryDto); } @ApiOperation({ summary: "Get ads by id" }) - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_READ) @Get(":id") getAdsById(@Param() paramDto: ParamDto) { return this.adsService.getAdsById(paramDto.id); } @ApiOperation({ summary: "Update ads by id" }) - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_UPDATE) @Patch(":id") updateAdsById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdsDto) { return this.adsService.updateAdsById(paramDto.id, updateDto); } @ApiOperation({ summary: "Delete ads by id" }) - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_DELETE) @Delete(":id") deleteAdsById(@Param() paramDto: ParamDto) { return this.adsService.deleteAdsById(paramDto.id); } @ApiOperation({ summary: "Toggle ads status" }) - @PermissionsDec(PermissionEnum.ADVERTISEMENTS) + @PermissionsDec(PermissionEnum.ADVERTISEMENTS_UPDATE) @Patch("toggle-status/:id") toggleAdsStatus(@Param() paramDto: ParamDto) { return this.adsService.toggleAdsStatus(paramDto.id); diff --git a/src/modules/announcements/announcement.controller.ts b/src/modules/announcements/announcement.controller.ts index 32f0d5d..8201255 100755 --- a/src/modules/announcements/announcement.controller.ts +++ b/src/modules/announcements/announcement.controller.ts @@ -16,14 +16,14 @@ import { PermissionEnum } from "../users/enums/permission.enum"; export class AnnouncementController { constructor(private readonly announcementService: AnnouncementService) {} - @PermissionsDec(PermissionEnum.ANNOUNCEMENTS) + @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_CREATE) @ApiProperty({ description: "Create a new announcement (admin route)" }) @Post() create(@Body() createAnnouncementDto: CreateAnnouncementDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.announcementService.createAnnouncement(createAnnouncementDto, userIpAndHeaders); } - @PermissionsDec(PermissionEnum.ANNOUNCEMENTS) + @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_UPDATE) @ApiProperty({ description: "Update an announcement (admin route)" }) @Patch(":id") update( @@ -34,7 +34,7 @@ export class AnnouncementController { return this.announcementService.updateAnnouncement(paramDto.id, updateAnnouncementDto, userIpAndHeaders); } - @PermissionsDec(PermissionEnum.ANNOUNCEMENTS) + @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_DELETE) @ApiProperty({ description: "Delete an announcement (admin route)" }) @Delete(":id") delete(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { @@ -42,7 +42,7 @@ export class AnnouncementController { } @ApiProperty({ description: "Get all announcements (admin route)" }) - @PermissionsDec(PermissionEnum.ANNOUNCEMENTS) + @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_READ) @Get() getAnnouncements(@Query() queryDto: SearchAnnouncementQueryDto) { return this.announcementService.getAnnouncements(queryDto); @@ -61,7 +61,7 @@ export class AnnouncementController { } @ApiProperty({ description: "Get one announcements with id (admin route)" }) - @PermissionsDec(PermissionEnum.ANNOUNCEMENTS) + @PermissionsDec(PermissionEnum.ANNOUNCEMENTS_READ) @Get(":id/admin") getAnnouncementByIdAdmin(@Param() paramDto: ParamDto) { return this.announcementService.getAnnouncementByIdAdmin(paramDto.id); diff --git a/src/modules/blogs/blogs.controller.ts b/src/modules/blogs/blogs.controller.ts index 0f024d5..3fae9cf 100755 --- a/src/modules/blogs/blogs.controller.ts +++ b/src/modules/blogs/blogs.controller.ts @@ -51,7 +51,7 @@ export class BlogsController { @ApiOperation({ summary: "Get all blogs (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_READ) @Get("list") getBlogList(@Query() queryDto: BlogListSearchQueryDto) { return this.blogsService.getBlogList(queryDto); @@ -85,7 +85,7 @@ export class BlogsController { } @ApiOperation({ summary: "toggle status of blogs (admin route)" }) - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) @HttpCode(HttpStatus.OK) @Post(":id/toggle-status") toggleBlogStatus(@Param() paramDto: ParamDto) { @@ -103,7 +103,7 @@ export class BlogsController { @ApiOperation({ summary: "Toggle pinned status of a blog (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) @Post(":id/toggle-pinned") togglePinnedStatus(@Param() paramDto: ParamDto) { return this.blogsService.togglePinnedStatus(paramDto.id); @@ -112,7 +112,7 @@ export class BlogsController { @ApiOperation({ summary: "Create a new blog (admin route)" }) @Post() @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) createBlog(@Body() createBlogDto: CreateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.blogsService.createBlog(createBlogDto, userIpAndHeaders); } @@ -120,7 +120,7 @@ export class BlogsController { @ApiOperation({ summary: "Update a blog (admin route)" }) @Patch(":id") @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_UPDATE) updateBlog(@Param() paramDto: ParamDto, @Body() updateBlogDto: UpdateBlogDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.blogsService.updateBlog(paramDto.id, updateBlogDto, userIpAndHeaders); } @@ -128,7 +128,7 @@ export class BlogsController { @ApiOperation({ summary: "Delete a blog (admin route) " }) @Delete(":id") @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_DELETE) deleteBlog(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.blogsService.deleteBlog(paramDto.id, userIpAndHeaders); } @@ -149,7 +149,7 @@ export class BlogsController { @ApiOperation({ summary: "Get all comments for a blog (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_READ) @Get(":id/comments") getBlogCommentsForAdmin(@Param() paramDto: ParamDto) { return this.blogCommentService.getBlogCommentsForAdmin(paramDto.id); @@ -157,7 +157,7 @@ export class BlogsController { @ApiOperation({ summary: "Get all comments for a blog (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_READ) @Get("comments") getAllCommentForAdmin(@Query() queryDto: BlogCommentQueryDto) { return this.blogCommentService.getAllCommentForAdmin(queryDto); @@ -165,7 +165,7 @@ export class BlogsController { @ApiOperation({ summary: "Update the status of a comment (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_UPDATE) @Patch("comments/:id/status") updateCommentStatus(@Param() paramDto: ParamDto, @Body() updateCommentStatusDto: UpdateCommentStatusDto) { return this.blogCommentService.updateCommentStatus(paramDto.id, updateCommentStatusDto); @@ -196,7 +196,7 @@ export class BlogsController { @ApiOperation({ summary: "Create a new category (admin route)" }) @Post("categories") @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) createCategory(@Body() createCategoryDto: CreateBlogCategoryDto) { return this.blogsService.createCategory(createCategoryDto); } @@ -204,7 +204,7 @@ export class BlogsController { @ApiOperation({ summary: "Update a category (admin route)" }) @Patch("categories/:id") @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_UPDATE) updateCategory(@Param() paramDto: ParamDto, @Body() updateCategoryDto: UpdateBlogCategoryDto) { return this.blogsService.updateCategory(paramDto.id, updateCategoryDto); } @@ -212,13 +212,13 @@ export class BlogsController { @ApiOperation({ summary: "Delete a category (admin route)" }) @Delete("categories/:id") @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_DELETE) deleteCategory(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.blogsService.deleteCategory(paramDto.id, userIpAndHeaders); } @ApiOperation({ summary: "toggle status of categories (admin route)" }) - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) @HttpCode(HttpStatus.OK) @Post("categories/toggle-status/:id") toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { diff --git a/src/modules/contact-us/contact-us.controller.ts b/src/modules/contact-us/contact-us.controller.ts index afd5097..243f453 100755 --- a/src/modules/contact-us/contact-us.controller.ts +++ b/src/modules/contact-us/contact-us.controller.ts @@ -25,7 +25,7 @@ export class ContactUsController { //******************** */ - @PermissionsDec(PermissionEnum.CONTACTS_US) + @PermissionsDec(PermissionEnum.CONTACTS_US_READ) @AdminRoute() @ApiOperation({ summary: "Get all contact us (admin route)" }) @Get() @@ -36,7 +36,7 @@ export class ContactUsController { //******************** */ @AdminRoute() - @PermissionsDec(PermissionEnum.CONTACTS_US) + @PermissionsDec(PermissionEnum.CONTACTS_US_READ) @ApiOperation({ summary: "Get one contact us with id (admin route)" }) @Get(":id") getOneContactUs(@Param() paramDto: ParamDto) { diff --git a/src/modules/criticisms/criticisms.controller.ts b/src/modules/criticisms/criticisms.controller.ts index 034fcf4..92cff2d 100755 --- a/src/modules/criticisms/criticisms.controller.ts +++ b/src/modules/criticisms/criticisms.controller.ts @@ -23,7 +23,7 @@ export class CriticismController { } @AuthGuards() - @PermissionsDec(PermissionEnum.CRITICISMS) + @PermissionsDec(PermissionEnum.CRITICISMS_READ) @ApiOperation({ summary: "Get all Criticism ===> login as admin" }) @Get() findAll(@Query() queryDto: SearchCriticismQueryDto) { @@ -31,7 +31,7 @@ export class CriticismController { } @AuthGuards() - @PermissionsDec(PermissionEnum.CRITICISMS) + @PermissionsDec(PermissionEnum.CRITICISMS_READ) @ApiOperation({ summary: "Get one Criticism with id ===> login as admin" }) @Get(":id") fineOne(@Param() paramDto: ParamDto) { @@ -39,7 +39,7 @@ export class CriticismController { } @AuthGuards() - @PermissionsDec(PermissionEnum.CRITICISMS) + @PermissionsDec(PermissionEnum.CRITICISMS_DELETE) @ApiOperation({ summary: "Delete one Criticism with id ===> login as admin" }) @Delete(":id") delete(@Param() paramDto: ParamDto) { diff --git a/src/modules/danak-services/danak-services.controller.ts b/src/modules/danak-services/danak-services.controller.ts index fced3e5..2db8427 100755 --- a/src/modules/danak-services/danak-services.controller.ts +++ b/src/modules/danak-services/danak-services.controller.ts @@ -37,7 +37,7 @@ export class DanakServicesController { //------------------------ service categories ------------------------ @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @ApiOperation({ summary: "Create a new service category => admin route" }) @Post("categories") createCategory(@Body() createDto: CreateDanakServiceCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { @@ -45,7 +45,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @ApiOperation({ summary: "Get all service categories => admin route" }) @Get("categories") getCategories(@Query() queryDto: CategorySearchQueryDto) { @@ -53,7 +53,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @ApiOperation({ summary: "Get all service categories => admin route" }) @Pagination() @Get("categories/list") @@ -69,7 +69,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @ApiOperation({ summary: "Get category by id => admin route" }) @Get("categories/:id") getCategoryById(@Param() paramDto: ParamDto) { @@ -77,7 +77,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_UPDATE) @ApiOperation({ summary: "update category by id => admin route" }) @Patch("categories/:id") updateCategory( @@ -89,7 +89,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_DELETE) @ApiOperation({ summary: "delete category by id => admin route" }) @Delete("categories/:id") deleteCategoryById(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { @@ -97,7 +97,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @ApiOperation({ summary: "toggle status of categories => admin route" }) @HttpCode(HttpStatus.OK) @Post("categories/toggle-status/:id") @@ -106,7 +106,7 @@ export class DanakServicesController { } //-------------------- service management -------------------------- @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @ApiOperation({ summary: "create new danak services => admin route" }) @Post() createService(@Body() createDto: CreateServiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { @@ -114,7 +114,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @ApiOperation({ summary: "get all danak services ==> admin route" }) @Get() getServices(@Query() queryDto: DanakServicesSearchQueryDto) { @@ -136,7 +136,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @ApiOperation({ summary: "toggle status of danak service => admin route" }) @HttpCode(HttpStatus.OK) @Post("toggle-status/:id") @@ -145,7 +145,7 @@ export class DanakServicesController { } @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @ApiOperation({ summary: "toggle status of danak service slider => admin route" }) @HttpCode(HttpStatus.OK) @Post("toggle-slider/:id") @@ -192,7 +192,7 @@ export class DanakServicesController { @ApiOperation({ summary: "update danak service" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_UPDATE) @Patch(":id") updateDanakService( @Param() paramDto: ParamDto, @@ -204,7 +204,7 @@ export class DanakServicesController { @ApiOperation({ summary: "delete danak service" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_DELETE) @Delete(":id") deleteServiceById(@Param() paramDto: ParamDto) { return this.danakServicesService.deleteServiceById(paramDto.id); @@ -212,7 +212,7 @@ export class DanakServicesController { @ApiOperation({ summary: "get service users" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Get(":id/users") getServiceUsers(@Param() paramDto: ParamDto) { return this.danakServicesService.getServiceUsers(paramDto.id); @@ -235,7 +235,7 @@ export class DanakServicesController { @ApiOperation({ summary: "get danak service reviews ==> admin route" }) @AuthGuards() @Pagination() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Get("reviews") getDanakServiceReviews(@Query() queryDto: DanakServiceReviewQueryDto) { return this.danakServiceReviewService.getDanakServiceReviews(queryDto); @@ -243,7 +243,7 @@ export class DanakServicesController { @ApiOperation({ summary: "update danak service review status ==> admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_UPDATE) @Patch("reviews/:id/:status") updateDanakServiceReviewStatus(@Param() updateParamDto: UpdateReviewStatusDto) { return this.danakServiceReviewService.updateDanakServiceReviewStatus(updateParamDto); @@ -252,7 +252,7 @@ export class DanakServicesController { //------------------------ service guides ------------------------ @ApiOperation({ summary: "Create a service guide => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @Post("guides") createServiceGuide(@Body() createDto: CreateServiceGuideDto) { return this.danakServicesService.createServiceGuide(createDto); @@ -266,7 +266,7 @@ export class DanakServicesController { @ApiOperation({ summary: "Update service guide => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_UPDATE) @Patch("guides/:id") updateServiceGuide(@Param() paramDto: ParamDto, @Body() updateDto: UpdateServiceGuideDto) { return this.danakServicesService.updateServiceGuide(paramDto.id, updateDto); @@ -274,7 +274,7 @@ export class DanakServicesController { @ApiOperation({ summary: "Delete service guide => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_DELETE) @Delete("guides/:id") @HttpCode(HttpStatus.NO_CONTENT) deleteServiceGuide(@Param() paramDto: ParamDto) { @@ -283,7 +283,7 @@ export class DanakServicesController { @ApiOperation({ summary: "Get service guide by id => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Get("guides/:id") getServiceGuideById(@Param() paramDto: ParamDto) { return this.danakServicesService.getServiceGuideById(paramDto.id); @@ -299,7 +299,7 @@ export class DanakServicesController { @ApiOperation({ summary: "Get service feedbacks => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Pagination() @Get("feedback") getServiceFeedbacks(@Query() queryDto: ServiceFeedbackQueryDto) { @@ -308,7 +308,7 @@ export class DanakServicesController { @ApiOperation({ summary: "Get service feedback statistics => admin route" }) @AuthGuards() - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Get(":id/feedback") getServiceFeedbackStats(@Param() paramDto: ParamDto) { return this.danakServicesService.getServiceFeedback(paramDto.id); diff --git a/src/modules/discounts/discounts.controller.ts b/src/modules/discounts/discounts.controller.ts index 1cb83f0..fe62bb0 100755 --- a/src/modules/discounts/discounts.controller.ts +++ b/src/modules/discounts/discounts.controller.ts @@ -19,7 +19,7 @@ export class DiscountsController { @ApiOperation({ summary: "Create a new discount" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_CREATE) @Post() @ApiResponse({ status: 201, description: "Discount created successfully" }) create(@Body() createDiscountDto: CreateDiscountDto) { @@ -28,7 +28,7 @@ export class DiscountsController { @ApiOperation({ summary: "Get all discounts for admin" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_READ) @Get() @ApiResponse({ status: 200, description: "Discounts fetched successfully" }) getDiscountsForAdmin(@Query() queryDto: SearchDiscountQueryDto) { @@ -37,7 +37,7 @@ export class DiscountsController { @ApiOperation({ summary: "Get discount by id" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_READ) @Get(":id") @ApiResponse({ status: 200, description: "Discount fetched successfully" }) getDiscountById(@Param() paramDto: ParamDto) { @@ -46,7 +46,7 @@ export class DiscountsController { @ApiOperation({ summary: "Toggle discount status" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_CREATE) @Post(":id/toggle-status") toggleDiscountStatus(@Param() paramDto: ParamDto) { return this.discountsService.toggleDiscountStatus(paramDto.id); @@ -54,7 +54,7 @@ export class DiscountsController { @ApiOperation({ summary: "Delete discount" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_DELETE) @Delete(":id") deleteDiscount(@Param() paramDto: ParamDto) { return this.discountsService.softDeleteDiscount(paramDto.id); @@ -62,7 +62,7 @@ export class DiscountsController { @ApiOperation({ summary: "Update discount" }) @AdminRoute() - @PermissionsDec(PermissionEnum.DISCOUNTS) + @PermissionsDec(PermissionEnum.DISCOUNTS_UPDATE) @Patch(":id") updateDiscount(@Param() paramDto: ParamDto, @Body() updateDiscountDto: UpdateDiscountDto) { return this.discountsService.updateDiscount(paramDto.id, updateDiscountDto); diff --git a/src/modules/dmail/dmail.controller.ts b/src/modules/dmail/dmail.controller.ts index c14a98e..1370445 100644 --- a/src/modules/dmail/dmail.controller.ts +++ b/src/modules/dmail/dmail.controller.ts @@ -5,6 +5,8 @@ import { FindBusinessesDto } from './dto/find-businesses.dto'; import { AuthGuards } from '../../common/decorators/auth-guard.decorator'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { AdminRoute } from '../../common/decorators/admin.decorator'; +import { PermissionsDec } from '../../common/decorators/permission.decorator'; +import { PermissionEnum } from '../users/enums/permission.enum'; @Controller('dmail') @ApiTags('d-mail') @@ -15,6 +17,7 @@ export class DmailController { @Get() @AdminRoute() + @PermissionsDec(PermissionEnum.DMAIL) findAll(@Query() query: FindBusinessesDto) { return this.dmailService.findAllBusinesses(query) } @@ -27,6 +30,7 @@ export class DmailController { @Patch(':id/active') @AdminRoute() + @PermissionsDec(PermissionEnum.DMAIL) update(@Param('id') id: string, @Body() updateDmailDto: UpdateDmailAciveStatusDto) { return this.dmailService.updateDMailActiveStatus(id, updateDmailDto.isActive); } diff --git a/src/modules/invoices/invoices.controller.ts b/src/modules/invoices/invoices.controller.ts index 986b277..5e0b28f 100755 --- a/src/modules/invoices/invoices.controller.ts +++ b/src/modules/invoices/invoices.controller.ts @@ -21,28 +21,28 @@ export class InvoicesController { constructor(private readonly invoiceService: InvoicesService) {} @ApiOperation({ summary: "create an invoice ==> admin route" }) - @PermissionsDec(PermissionEnum.INVOICES) + @PermissionsDec(PermissionEnum.INVOICES_CREATE) @Post() createInvoice(@Body() createDto: CreateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.invoiceService.createInvoiceAdmin(createDto, userIpAndHeaders); } @ApiOperation({ summary: "update an invoice ==> admin route" }) - @PermissionsDec(PermissionEnum.INVOICES) + @PermissionsDec(PermissionEnum.INVOICES_UPDATE) @Patch(":id") updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userIpAndHeaders); } @ApiOperation({ summary: "delete an invoice ==> admin route" }) - @PermissionsDec(PermissionEnum.INVOICES) + @PermissionsDec(PermissionEnum.INVOICES_DELETE) @Delete(":id") deleteInvoice(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userIpAndHeaders); } @ApiOperation({ summary: "get all invoices ==> admin route" }) - @PermissionsDec(PermissionEnum.INVOICES) + @PermissionsDec(PermissionEnum.INVOICES_READ) @Get() getInvoices(@Query() queryDto: InvoicesSearchQueryDto) { return this.invoiceService.getInvoices(queryDto); diff --git a/src/modules/learnings/learning.controller.ts b/src/modules/learnings/learning.controller.ts index 6d8ecdc..7263b40 100755 --- a/src/modules/learnings/learning.controller.ts +++ b/src/modules/learnings/learning.controller.ts @@ -18,7 +18,7 @@ export class LearningController { constructor(private readonly learningService: LearningService) {} @ApiOperation({ summary: "Create learning video" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_CREATE) @Post() createLearningVideo(@Body() createDto: CreateLearningDto) { return this.learningService.createLearningVideo(createDto); @@ -37,14 +37,14 @@ export class LearningController { } @ApiOperation({ summary: "delete learning video by id" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_DELETE) @Delete(":id") deleteLearningVideoById(@Param() paramDto: ParamDto) { return this.learningService.deleteLearningVideoById(paramDto.id); } @ApiOperation({ summary: "update learning video by id" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_UPDATE) @Patch(":id") updateLearningVideoById(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningDto) { return this.learningService.updateLearningVideo(paramDto.id, updateDto); @@ -53,7 +53,7 @@ export class LearningController { //----------------- category management ---------------------- @ApiOperation({ summary: "Create learning category" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_CREATE) @Post("category") createCategory(@Body() createDto: CreateLearningCategoryDto) { return this.learningService.createLearningCategory(createDto); @@ -72,14 +72,14 @@ export class LearningController { } @ApiOperation({ summary: "update learning category ==> admin route" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_UPDATE) @Patch("category/:id") updateLearningCategory(@Param() paramDto: ParamDto, @Body() updateDto: UpdateLearningCategoryDto) { return this.learningService.updateLearningCategory(paramDto.id, updateDto); } @ApiOperation({ summary: "delete category by id" }) - @PermissionsDec(PermissionEnum.LEARNINGS) + @PermissionsDec(PermissionEnum.LEARNINGS_DELETE) @Delete("category/:id") deleteCategoryById(@Param() paramDto: ParamDto) { return this.learningService.deleteCategoryById(paramDto.id); diff --git a/src/modules/payments/payments.controller.ts b/src/modules/payments/payments.controller.ts index 7611ff8..29cddd3 100755 --- a/src/modules/payments/payments.controller.ts +++ b/src/modules/payments/payments.controller.ts @@ -45,7 +45,7 @@ export class PaymentsController { } @ApiOperation({ summary: "get deposit request of users ==> admin route" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_READ) @AuthGuards() @Pagination() @Get("deposit/transfer") @@ -54,7 +54,7 @@ export class PaymentsController { } @ApiOperation({ summary: "get deposit gateway payment ==> admin route" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_READ) @AuthGuards() @Pagination() @Get("deposit/gateway") @@ -63,7 +63,7 @@ export class PaymentsController { } @ApiOperation({ summary: "approve deposit request ==> admin route" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_UPDATE) @AuthGuards() @Post("deposit/transfer/approve/:id") approverDepositRequest(@Param() paramDto: ParamDto) { @@ -71,7 +71,7 @@ export class PaymentsController { } @ApiOperation({ summary: "reject deposit request ==> admin route" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_UPDATE) @AuthGuards() @Post("deposit/transfer/reject/:id") rejectDepositRequest(@Param() paramDto: ParamDto, @Body() rejectDto: RejectDepositRequestDto) { @@ -79,7 +79,7 @@ export class PaymentsController { } @ApiOperation({ summary: "get transaction for admin" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_READ) @AuthGuards() @Pagination() @Get("transactions") @@ -108,7 +108,7 @@ export class PaymentsController { ///------------------- bank account ----------------------------- @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" }) @Post("bank-account") addBankAccount(@Body() createDto: CreateBankAccountDto) { @@ -124,7 +124,7 @@ export class PaymentsController { @AuthGuards() @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") updateBankAccount(@Body() updateDto: UpdateBankAccountDto, @Param() paramDto: ParamDto) { return this.paymentsService.updateBankAccount(updateDto, paramDto.id); diff --git a/src/modules/reseller/reseller.controller.ts b/src/modules/reseller/reseller.controller.ts index 07e71b0..db72014 100644 --- a/src/modules/reseller/reseller.controller.ts +++ b/src/modules/reseller/reseller.controller.ts @@ -34,7 +34,7 @@ export class ResellerController { //***************** DSC Endpoints **************** */ @ApiOperation({ summary: "Create reseller ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.RESELLER) + @PermissionsDec(PermissionEnum.RESELLER_CREATE) @Post() createReseller(@Body() dto: CreateResellerDto) { return this.resellerService.create(dto); @@ -42,7 +42,7 @@ export class ResellerController { @ApiOperation({ summary: "Get resellers ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.RESELLER) + @PermissionsDec(PermissionEnum.RESELLER_READ) @Get() getResellers() { return this.resellerService.findAll(); @@ -52,7 +52,7 @@ export class ResellerController { @ApiOperation({ summary: "Get withdraw requests ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.RESELLER) + @PermissionsDec(PermissionEnum.RESELLER_READ) @Pagination() @Get("withdraw-request/admin") getRewardRequests(@Query() query: SearchWithdrawRequestQueryDto) { @@ -61,7 +61,7 @@ export class ResellerController { @ApiOperation({ summary: "Confirm withdraw request ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.RESELLER) + @PermissionsDec(PermissionEnum.RESELLER_UPDATE) @Patch("withdraw-request/:id") confirmWithdrawRequests(@Param() paramDto: ParamDto, @Body() dto: ConfirmwithdrawRequestDto) { return this.resellerService.confirmWithdrawRequest(paramDto.id, dto.transactionId); diff --git a/src/modules/sliders/sliders.controller.ts b/src/modules/sliders/sliders.controller.ts index af0cf1f..d64eadf 100755 --- a/src/modules/sliders/sliders.controller.ts +++ b/src/modules/sliders/sliders.controller.ts @@ -18,7 +18,7 @@ export class SlidersController { @ApiOperation({ summary: "create slider (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_CREATE) @Post() create(@Body() createSliderDto: CreateSliderDto) { return this.slidersService.create(createSliderDto); @@ -26,7 +26,7 @@ export class SlidersController { @ApiOperation({ summary: "Get all sliders (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_READ) @Get() getSlidersList(@Query() queryDto: PaginationDto) { return this.slidersService.getSlidersList(queryDto); @@ -34,7 +34,7 @@ export class SlidersController { @ApiOperation({ summary: "Get a slider by id (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_READ) @Get(":id") getSliderById(@Param() paramDto: ParamDto) { return this.slidersService.getSliderById(paramDto.id); @@ -42,7 +42,7 @@ export class SlidersController { @ApiOperation({ summary: "Update a slider (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_UPDATE) @Patch(":id") update(@Param() paramDto: ParamDto, @Body() updateSliderDto: UpdateSliderDto) { return this.slidersService.update(paramDto.id, updateSliderDto); @@ -50,7 +50,7 @@ export class SlidersController { @ApiOperation({ summary: "Delete a slider (admin route)" }) @AdminRoute() - @PermissionsDec(PermissionEnum.BLOGS) + @PermissionsDec(PermissionEnum.BLOGS_DELETE) @Delete(":id") remove(@Param() paramDto: ParamDto) { return this.slidersService.remove(paramDto.id); diff --git a/src/modules/subscriptions/subscriptions.controller.ts b/src/modules/subscriptions/subscriptions.controller.ts index c80fc0e..6916ad1 100755 --- a/src/modules/subscriptions/subscriptions.controller.ts +++ b/src/modules/subscriptions/subscriptions.controller.ts @@ -31,7 +31,7 @@ export class SubscriptionsController { ) {} @ApiOperation({ summary: "Delete subscription =. admin route" }) - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_DELETE) @AdminRoute() @Delete(':id') deleteSubscription(@Param('id') id :string) { @@ -39,14 +39,14 @@ export class SubscriptionsController { } @ApiOperation({ summary: "Create a subscription plan" }) - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @Post() createSubscription(@Body() createDto: AddSubscriptionsToServiceDto) { return this.subscriptionService.createSubscriptionsPlan(createDto); } @ApiOperation({ summary: "get all subscription plans" }) - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) @Get("service/:serviceId") getServiceSubscriptions(@Param() paramDto: ServiceIdParamDto, @Query() queryDto: ServiceSubsQueryDto) { return this.subscriptionService.getServiceSubscriptions(paramDto.serviceId, queryDto); @@ -65,7 +65,7 @@ export class SubscriptionsController { } @ApiOperation({ summary: "toggle status of service subs" }) - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_CREATE) @Post("toggle-status/:id") toggleStatusOfServiceSub(@Param() paramDto: ParamDto) { return this.subscriptionService.toggleSubStatus(paramDto.id); @@ -73,14 +73,14 @@ export class SubscriptionsController { @ApiOperation({ summary: "get a subscription plan by id" }) @Get(":id") - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_READ) getSubscription(@Param() paramDto: ParamDto) { return this.subscriptionService.getSubscriptionPlanById(paramDto.id); } @ApiOperation({ summary: "update a subscription plan by id" }) @Patch(":id") - @PermissionsDec(PermissionEnum.SERVICES) + @PermissionsDec(PermissionEnum.SERVICES_UPDATE) updateSubscription(@Param() paramDto: ParamDto, @Body() updateDto: UpdateSubscriptionPlanDto) { 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" }) - @PermissionsDec(PermissionEnum.PAYMENTS) + @PermissionsDec(PermissionEnum.PAYMENTS_READ) @Get("admin/user-subscriptions/all") getAllUserSubscriptions(@Query() queryDto: AdminUserSubscriptionsQueryDto) { return this.subscriptionService.getAllUserSubscriptions(queryDto); diff --git a/src/modules/support-plans/support-plans.controller.ts b/src/modules/support-plans/support-plans.controller.ts index e372770..ac3a03a 100644 --- a/src/modules/support-plans/support-plans.controller.ts +++ b/src/modules/support-plans/support-plans.controller.ts @@ -19,7 +19,7 @@ export class SupportPlansController { constructor(private readonly supportPlansService: SupportPlansService) {} @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_CREATE) @ApiOperation({ summary: "Create a new support plan (admin)" }) @Post() createSupportPlan(@Body() createSupportPlanDto: CreateSupportPlanDto) { @@ -27,7 +27,7 @@ export class SupportPlansController { } @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ) @ApiOperation({ summary: "Get all support plans (admin)" }) @Get("list") getSupportPlansList(@Query() queryDto: GetSupportPlanListQueryDto) { @@ -35,7 +35,7 @@ export class SupportPlansController { } @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ) @ApiOperation({ summary: "Get a support plan by id (admin)" }) @Get(":id") getSupportPlanById(@Param() paramDto: ParamDto) { @@ -43,7 +43,7 @@ export class SupportPlansController { } @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_DELETE) @ApiOperation({ summary: "Delete a support plan by id (admin)" }) @Delete(":id") deleteSupportPlanById(@Param() paramDto: ParamDto) { @@ -51,7 +51,7 @@ export class SupportPlansController { } @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_UPDATE) @ApiOperation({ summary: "Update a support plan by id (admin)" }) @Patch(":id") updateSupportPlanById(@Param() paramDto: ParamDto, @Body() updateSupportPlanDto: UpdateSupportPlanDto) { @@ -71,7 +71,7 @@ export class SupportPlansController { } @AdminRoute() - @PermissionsDec(PermissionEnum.SUPPORT_PLAN) + @PermissionsDec(PermissionEnum.SUPPORT_PLAN_READ) @ApiOperation({ summary: "Get support plan users (admin)" }) @Get(":id/users") getSupportPlanUsers(@Param() paramDto: ParamDto, @Query() queryDto: SearchSupportPlanUsersQueryDto) { diff --git a/src/modules/task-manager/controllers/project.controller.ts b/src/modules/task-manager/controllers/project.controller.ts index d86d58e..aa9f2b7 100644 --- a/src/modules/task-manager/controllers/project.controller.ts +++ b/src/modules/task-manager/controllers/project.controller.ts @@ -30,7 +30,7 @@ export class ProjectController { } @Post() - @PermissionsDec(PermissionEnum.PROJECT) + @PermissionsDec(PermissionEnum.PROJECT_CREATE) @ApiOperation({ summary: "Create a new project" }) @ApiResponse({ status: 201, description: "Project created", type: TMProject }) @ApiResponse({ status: 400, description: "One or more users are not members of the workspace" }) @@ -40,7 +40,7 @@ export class ProjectController { } @Patch(":id") - @PermissionsDec(PermissionEnum.PROJECT) + @PermissionsDec(PermissionEnum.PROJECT_UPDATE) @ApiOperation({ summary: "Update a project" }) @ApiParam({ name: "id", description: "Project ID" }) @ApiResponse({ status: 200, description: "Project updated", type: TMProject }) @@ -51,7 +51,7 @@ export class ProjectController { } @Delete(":id") - @PermissionsDec(PermissionEnum.PROJECT) + @PermissionsDec(PermissionEnum.PROJECT_DELETE) @ApiOperation({ summary: "Delete a project" }) @ApiParam({ name: "id", description: "Project ID" }) @ApiResponse({ status: 200, description: "Project deleted", type: TMProject }) diff --git a/src/modules/task-manager/controllers/task-phase.controller.ts b/src/modules/task-manager/controllers/task-phase.controller.ts index 97ff1ac..991466d 100644 --- a/src/modules/task-manager/controllers/task-phase.controller.ts +++ b/src/modules/task-manager/controllers/task-phase.controller.ts @@ -11,13 +11,13 @@ import { PermissionEnum } from "../../users/enums/permission.enum"; @AuthGuards() @AdminRoute() -@PermissionsDec(PermissionEnum.TASK_PHASE) @ApiTags("Task Manager - Task Phases") @Controller("task-manager/task-phases") export class TaskPhaseController { constructor(private readonly taskPhaseService: TaskPhaseService) {} @Post() + @PermissionsDec(PermissionEnum.TASK_PHASE_CREATE) @ApiOperation({ summary: "Create a new task phase" }) @ApiResponse({ status: 201, description: "TaskPhase created", type: TMTaskPhase }) @ApiResponse({ status: 404, description: "Project not found" }) @@ -26,6 +26,7 @@ export class TaskPhaseController { } @Patch(":id") + @PermissionsDec(PermissionEnum.TASK_PHASE_UPDATE) @ApiOperation({ summary: "Update a task phase" }) @ApiParam({ name: "id", description: "TaskPhase ID" }) @ApiResponse({ status: 200, description: "TaskPhase updated", type: TMTaskPhase }) @@ -35,6 +36,7 @@ export class TaskPhaseController { } @Delete(":id") + @PermissionsDec(PermissionEnum.TASK_PHASE_DELETE) @ApiOperation({ summary: "Delete a task phase" }) @ApiParam({ name: "id", description: "TaskPhase ID" }) @ApiResponse({ status: 200, description: "TaskPhase deleted" }) diff --git a/src/modules/task-manager/controllers/task.controller.ts b/src/modules/task-manager/controllers/task.controller.ts index 943a637..d3d7795 100644 --- a/src/modules/task-manager/controllers/task.controller.ts +++ b/src/modules/task-manager/controllers/task.controller.ts @@ -23,7 +23,7 @@ export class TaskController { constructor(private readonly taskService: TaskService) {} @Post() - @PermissionsDec(PermissionEnum.TASK) + @PermissionsDec(PermissionEnum.TASK_CREATE) @ApiOperation({ summary: "Create a new task" }) @ApiResponse({ status: 201, description: "Task created", type: TMTask }) @ApiResponse({ status: 404, description: "TaskPhase not found" }) @@ -32,7 +32,7 @@ export class TaskController { } @Patch(":id") - @PermissionsDec(PermissionEnum.TASK) + @PermissionsDec(PermissionEnum.TASK_UPDATE) @ApiOperation({ summary: "Update a task" }) @ApiParam({ name: "id", description: "Task ID" }) @ApiResponse({ status: 200, description: "Task updated", type: TMTask }) @@ -42,18 +42,17 @@ export class TaskController { } @Patch(":id/change-phase") - @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: "Move a task to a different phase within the same project" }) @ApiParam({ name: "id", description: "Task ID" }) @ApiResponse({ status: 200, description: "Task phase changed", type: TMTask }) @ApiResponse({ status: 400, description: "Target phase belongs to a different project" }) @ApiResponse({ status: 404, description: "Task or TaskPhase not found" }) - changePhase(@Param("id") id: string, @Body() body: ChangeTaskPhaseDto): Promise { - return this.taskService.changePhase(id, body); + changePhase(@Param("id") id: string,@UserDec() user: ITokenPayload, @Body() body: ChangeTaskPhaseDto): Promise { + return this.taskService.changePhase(id, user.permissions, user.id, body); } @Delete(":id") - @PermissionsDec(PermissionEnum.TASK) + @PermissionsDec(PermissionEnum.TASK_DELETE) @ApiOperation({ summary: "Delete a task" }) @ApiParam({ name: "id", description: "Task ID" }) @ApiResponse({ status: 200, description: "Task deleted" }) @@ -98,7 +97,7 @@ export class TaskController { @ApiResponse({ status: 200, description: "Changed the task priority successfully!" }) @ApiResponse({ status: 400, description: "Bad Request from user." }) @ApiResponse({ status: 404, description: "Task not found!" }) - changePriority(@Param("srcid") srcId: string, @Param("desid") desId: string): Promise { - return this.taskService.changePriority(srcId, desId); + changePriority(@Param("srcid") srcId: string, @Param("desid") desId: string,@UserDec() user: ITokenPayload): Promise { + return this.taskService.changePriority(srcId, user.permissions, user.id, desId); } } diff --git a/src/modules/task-manager/controllers/workspace.controller.ts b/src/modules/task-manager/controllers/workspace.controller.ts index e4bb06c..beabd33 100644 --- a/src/modules/task-manager/controllers/workspace.controller.ts +++ b/src/modules/task-manager/controllers/workspace.controller.ts @@ -19,7 +19,7 @@ export class WorkspaceController { constructor(private readonly workspaceService: WorkspaceService) {} @Get(':id') - @PermissionsDec(PermissionEnum.WORKSPACE) + @PermissionsDec(PermissionEnum.WORKSPACE_READ) @ApiOperation({summary: "Get one workspace by ID"}) @ApiResponse({status: 200, description: 'Received workspace', type: TMWorkspace}) @ApiResponse({status: 404, description: 'Workspace Not Found!'}) @@ -29,7 +29,7 @@ export class WorkspaceController { } @Post() - @PermissionsDec(PermissionEnum.WORKSPACE) + @PermissionsDec(PermissionEnum.WORKSPACE_CREATE) @ApiOperation({ summary: 'Create a new workspace' }) @ApiResponse({ status: 201, description: 'Workspace created', type: TMWorkspace }) create(@Body() body: CreateWorkspaceDto): Promise { @@ -37,7 +37,7 @@ export class WorkspaceController { } @Patch(':id') - @PermissionsDec(PermissionEnum.WORKSPACE) + @PermissionsDec(PermissionEnum.WORKSPACE_UPDATE) @ApiOperation({ summary: 'Update a workspace' }) @ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiResponse({ status: 200, description: 'Workspace updated', type: TMWorkspace }) @@ -47,7 +47,7 @@ export class WorkspaceController { } @Delete(':id') - @PermissionsDec(PermissionEnum.WORKSPACE) + @PermissionsDec(PermissionEnum.WORKSPACE_DELETE) @ApiOperation({ summary: 'Delete a workspace' }) @ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiResponse({ status: 200, description: 'Workspace deleted' }) diff --git a/src/modules/task-manager/providers/project.service.ts b/src/modules/task-manager/providers/project.service.ts index ea72b26..88e01d4 100644 --- a/src/modules/task-manager/providers/project.service.ts +++ b/src/modules/task-manager/providers/project.service.ts @@ -131,7 +131,7 @@ export class ProjectService { const limit = pagination.limit ?? 10; 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); var res: [TMProject[], number]; @@ -158,7 +158,7 @@ export class ProjectService { if (!project) throw new NotFoundException(ProjectMessage.PROJECT_NOT_FOUND); 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); const projectDetail = await this.projectRepository.getProjectDetail(projectId); diff --git a/src/modules/task-manager/providers/task.service.ts b/src/modules/task-manager/providers/task.service.ts index b6369b6..2a2384c 100644 --- a/src/modules/task-manager/providers/task.service.ts +++ b/src/modules/task-manager/providers/task.service.ts @@ -98,9 +98,13 @@ export class TaskService { return this.taskRepository.save(task); } - async changePhase(id: string, dto: ChangeTaskPhaseDto): Promise { + async changePhase(id: string,permissions: PermissionEnum[],userId: string, dto: ChangeTaskPhaseDto): Promise { 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); if (task.taskPhase.projectId !== newPhase.projectId) { @@ -122,7 +126,7 @@ export class TaskService { const task = await this.findOneOrFail(taskId); 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); const taskDetail = await this.taskRepository.getTaskDetail(taskId); @@ -156,9 +160,13 @@ export class TaskService { return { data: items, nextCursor, previousCursor, hasNextPage, hasPreviousPage, cursorPaginate: true }; } - async changePriority(srcTaskId: string, destTaskId: string): Promise { + async changePriority(srcTaskId: string,permissions: PermissionEnum[],userId: string, destTaskId: string): Promise { const srcTask = await this.findOneOrFail(srcTaskId); 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) throw new BadRequestException(TaskMessage.TASKS_NOT_IN_THE_SAME_TASK_PHASE); diff --git a/src/modules/task-manager/providers/workspace.service.ts b/src/modules/task-manager/providers/workspace.service.ts index 08ecf04..7e43db4 100644 --- a/src/modules/task-manager/providers/workspace.service.ts +++ b/src/modules/task-manager/providers/workspace.service.ts @@ -66,7 +66,7 @@ export class WorkspaceService { } async findByUser(userId: string, permissions: PermissionEnum[]): Promise { - if(permissions.includes(PermissionEnum.VIEW_ALL_WORKSPACES)) { + if(permissions.includes(PermissionEnum.WORKSPACE_READ)) { return await this.workspaceRepository.find(); } return await this.workspaceRepository.findByUser(userId); diff --git a/src/modules/tickets/tickets.controller.ts b/src/modules/tickets/tickets.controller.ts index 5b6a50a..7912a6d 100755 --- a/src/modules/tickets/tickets.controller.ts +++ b/src/modules/tickets/tickets.controller.ts @@ -24,14 +24,14 @@ export class TicketsController { //----------------- ticket categories ------------------- @ApiOperation({ summary: "Create ticket category => admin route" }) - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_CREATE) @Post("category") createTicketCategory(@Body() createDto: CreateTicketCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.createTicketCategory(createDto, userIpAndHeaders); } @ApiOperation({ summary: "Update ticket category => admin route" }) - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_UPDATE) @Patch("category/:id") updateCategory( @Param() paramDto: ParamDto, @@ -49,7 +49,7 @@ export class TicketsController { @ApiOperation({ summary: "Get ticket categories list => admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_READ) @Get("categories-list") getCategoriesList(@Query() queryDto: SearchTicketCategoryDto) { return this.ticketsService.getCategoriesList(queryDto); @@ -58,7 +58,7 @@ export class TicketsController { @ApiOperation({ summary: "toggle status of categories => admin route" }) @AdminRoute() @HttpCode(HttpStatus.OK) - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_UPDATE) @Post("category/toggle-status/:id") toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders); @@ -74,7 +74,7 @@ export class TicketsController { @ApiOperation({ summary: "create ticket by admin" }) @AdminRoute() - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_CREATE) @Post("admin") createTicketByAdmin(@Body() createDto: CreateTicketByAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.createTicketByAdmin(createDto, userIpAndHeaders); @@ -88,7 +88,7 @@ export class TicketsController { @ApiOperation({ summary: "Get all tickets ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_READ) @Get("admin") getAllTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") adminId: string) { return this.ticketsService.getTicketForAdmin(queryDto, adminId); @@ -124,7 +124,7 @@ export class TicketsController { @ApiOperation({ summary: "open ticket by admin" }) @AdminRoute() - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_UPDATE) @Post(":id/open") openTicketByAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.openTicketByAdmin(paramDto.id, userIpAndHeaders); @@ -132,7 +132,7 @@ export class TicketsController { @ApiOperation({ summary: "referer ticket ==> admin route" }) @AdminRoute() - @PermissionsDec(PermissionEnum.TICKETS) + @PermissionsDec(PermissionEnum.TICKETS_UPDATE) @Post(":id/refer") referTicket(@Param() paramDto: ParamDto, @Body() referDto: ReferTicketDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.referTicket(paramDto.id, referDto, userIpAndHeaders); diff --git a/src/modules/users/DTO/search-admins-query.dto.ts b/src/modules/users/DTO/search-admins-query.dto.ts index 2087404..a3dedb2 100755 --- a/src/modules/users/DTO/search-admins-query.dto.ts +++ b/src/modules/users/DTO/search-admins-query.dto.ts @@ -12,6 +12,6 @@ export class SearchAdminQueryDto extends PaginationDto { @IsOptional() @IsEnum(PermissionEnum) - @ApiPropertyOptional({ description: "permission", example: PermissionEnum.SERVICES }) + @ApiPropertyOptional({ description: "permission", example: PermissionEnum.SERVICES_READ }) permission?: PermissionEnum; } diff --git a/src/modules/users/constants/permission-meta.ts b/src/modules/users/constants/permission-meta.ts new file mode 100644 index 0000000..04f7fcf --- /dev/null +++ b/src/modules/users/constants/permission-meta.ts @@ -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.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 }, +}; diff --git a/src/modules/users/entities/permission.entity.ts b/src/modules/users/entities/permission.entity.ts index 26d6ab8..b648307 100755 --- a/src/modules/users/entities/permission.entity.ts +++ b/src/modules/users/entities/permission.entity.ts @@ -3,6 +3,7 @@ import { Column, Entity, ManyToMany } from "typeorm"; import { Role } from "./role.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; import { PermissionEnum } from "../enums/permission.enum"; +import { PermissionGroupEnum } from "../enums/permission-group.enum"; @Entity() export class Permission extends BaseEntity { @@ -12,6 +13,9 @@ export class Permission extends BaseEntity { @Column({ type: "varchar", length: 150, nullable: false }) title: string; + @Column({ type: "enum", enum: PermissionGroupEnum, nullable: false }) + group: PermissionGroupEnum; + @ManyToMany(() => Role, (role) => role.permissions) roles: Role[]; } diff --git a/src/modules/users/enums/permission-group.enum.ts b/src/modules/users/enums/permission-group.enum.ts new file mode 100644 index 0000000..6c19c75 --- /dev/null +++ b/src/modules/users/enums/permission-group.enum.ts @@ -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", +} diff --git a/src/modules/users/enums/permission.enum.ts b/src/modules/users/enums/permission.enum.ts index bb8ea4f..79d98d6 100755 --- a/src/modules/users/enums/permission.enum.ts +++ b/src/modules/users/enums/permission.enum.ts @@ -1,34 +1,155 @@ export enum PermissionEnum { - SERVICES = "services", - CUSTOMERS = "customers", - AGENTS = "agents", - DEVELOPERS = "developers", - INVOICES = "invoices", - TRANSACTIONS = "transactions", - DISCOUNTS = "discounts", - ADMINS = "admins", - TICKETS = "tickets", - CRITICISMS = "criticisms", - CONTACTS_US = "contacts_us", - ADVERTISEMENTS = "advertisements", - ANNOUNCEMENTS = "announcements", - BLOGS = "blogs", - LEARNINGS = "learnings", + // services + SERVICES_CREATE = "services_create", + SERVICES_READ = "services_read", + SERVICES_UPDATE = "services_update", + SERVICES_DELETE = "services_delete", + + // customers + CUSTOMERS_CREATE = "customers_create", + CUSTOMERS_READ = "customers_read", + CUSTOMERS_UPDATE = "customers_update", + CUSTOMERS_DELETE = "customers_delete", + + // agents + AGENTS_CREATE = "agents_create", + 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", - SETTINGS = "settings", - BANK_ACCOUNTS = "bank_accounts", - PAYMENTS = "payments", MANAGE_SSO_CLIENTS = "manage_sso_clients", - SUPPORT_PLAN = "support_plan", DMENU = "dmenu", DKALA = "dkala", DPAGE = "dpage", - DMAIL = 'dmail', - RESELLER="reseller", - WORKSPACE="workspace", // create, update, remove, read-one(for update purposes) - 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", + DMAIL = "dmail", + // VIEW_ALL_WORKSPACES = "view_all_workspaces", + // VIEW_ALL_PROJECTS = "view_all_projects", } diff --git a/src/modules/users/providers/admins.service.ts b/src/modules/users/providers/admins.service.ts index 4a4597d..83dfaa8 100755 --- a/src/modules/users/providers/admins.service.ts +++ b/src/modules/users/providers/admins.service.ts @@ -288,7 +288,10 @@ export class AdminsService { /************************************************************ */ async getPermissions() { - const permissions = await this.permissionsRepository.find({ select: { id: true, name: true, title: true } }); + const permissions = await this.permissionsRepository.find({ + select: { id: true, name: true, title: true, group: true }, + order: { group: "ASC", name: "ASC" }, + }); return { permissions, }; diff --git a/src/modules/users/repositories/users.repository.ts b/src/modules/users/repositories/users.repository.ts index 39409a6..8510494 100755 --- a/src/modules/users/repositories/users.repository.ts +++ b/src/modules/users/repositories/users.repository.ts @@ -188,7 +188,7 @@ export class UserRepository extends Repository { .leftJoinAndSelect("role.permissions", "permissions") .andWhere("user.deletedAt IS NULL"); // .where("permissions.name IN (:...adminPermissions)", { - // adminPermissions: [PermissionEnum.ADMINS], + // adminPermissions: [PermissionEnum.ADMINS_READ], // }); // .addSelect(["permissions.id", "permissions.name"]); diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index a577c4c..6db88fd 100755 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -113,21 +113,21 @@ export class UsersController { } @ApiOperation({ summary: "Create user group ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE) @Post("user-group") createUserGroup(@Body() createDto: CreateUserGroupDto) { return this.usersService.createUserGroup(createDto); } @ApiOperation({ summary: "get all user group ==> admin route" }) - @PermissionsDec(PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.CUSTOMERS_READ) @Get("user-group") UserGroups() { return this.usersService.getUserGroups(); } @ApiOperation({ summary: "get all users ==> admin route" }) - @PermissionsDec(PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.CUSTOMERS_READ) @Get() getUsers() { return this.usersService.findAllUsers(); @@ -136,12 +136,14 @@ export class UsersController { @ApiOperation({ summary: "Create customer" }) @HttpCode(HttpStatus.CREATED) + @PermissionsDec(PermissionEnum.CUSTOMERS_CREATE) @Post("customers") createCustomer(@Body() createDto: CreateCustomerDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.customersService.createCustomer(createDto, userIpAndHeaders); } @ApiOperation({ summary: "Update customer" }) + @PermissionsDec(PermissionEnum.CUSTOMERS_UPDATE) @Patch("customers/:id") updateCustomer( @Param() paramDto: ParamDto, @@ -152,14 +154,14 @@ export class UsersController { } @ApiOperation({ summary: "get customers ==> admin route" }) - @PermissionsDec(PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.CUSTOMERS_READ) @Get("customers") getCustomers(@Query() queryDto: SearchCustomersDto) { return this.customersService.getCustomers(queryDto); } @ApiOperation({ summary: "get customers by id ==> admin route" }) - @PermissionsDec(PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.CUSTOMERS_READ) @Get("customers/:id") getCustomerById(@Param() paramDto: ParamDto) { return this.customersService.getCustomerById(paramDto.id); @@ -169,35 +171,35 @@ export class UsersController { @ApiOperation({ summary: "get all admins ==> admin route" }) @AdminRoute() - // @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + // @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ) @Get("admins") getAdmins(@Query() queryDto: SearchAdminQueryDto) { return this.adminsService.getAdmins(queryDto); } @ApiOperation({ summary: "get admin by id ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ) @Get("admins/:id") getAdminById(@Param() paramDto: ParamDto) { return this.adminsService.getAdminById(paramDto.id); } @ApiOperation({ summary: "update admin ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_UPDATE, PermissionEnum.CUSTOMERS_UPDATE) @Patch("admins/:id") updateAdmin(@Param() paramDto: ParamDto, @Body() updateDto: UpdateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.adminsService.updateAdmin(paramDto.id, updateDto, userIpAndHeaders); } @ApiOperation({ summary: "delete admin ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_DELETE, PermissionEnum.CUSTOMERS_DELETE) @Delete("admins/:id") deleteAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.adminsService.deleteAdmin(paramDto.id, userIpAndHeaders); } @ApiOperation({ summary: "create admin ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE) @Post("admins") createAdmin(@Body() createDto: CreateAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.adminsService.createAdmin(createDto, userIpAndHeaders); @@ -210,42 +212,42 @@ export class UsersController { } @ApiOperation({ summary: "get all permissions ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ) @Get("permissions") getPermissions() { return this.adminsService.getPermissions(); } @ApiOperation({ summary: "get all roles ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ) @Get("roles") getRoles(@Query() queryDto: SearchRolesQueryDto) { return this.adminsService.getRoles(queryDto); } @ApiOperation({ summary: "get role by id ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_READ, PermissionEnum.CUSTOMERS_READ) @Get("roles/:id") getRoleById(@Param() paramDto: ParamDto) { return this.adminsService.getRoleById(paramDto.id); } @ApiOperation({ summary: "create role ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_CREATE, PermissionEnum.CUSTOMERS_CREATE) @Post("roles") createRole(@Body() createDto: CreateRoleDto) { return this.adminsService.createRole(createDto); } @ApiOperation({ summary: "update role ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_UPDATE, PermissionEnum.CUSTOMERS_UPDATE) @Patch("roles/:id") updateRole(@Param() paramDto: ParamDto, @Body() updateDto: UpdateRoleDto) { return this.adminsService.updateRole(paramDto.id, updateDto); } @ApiOperation({ summary: "delete role ==> admin route" }) - @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @PermissionsDec(PermissionEnum.ADMINS_DELETE, PermissionEnum.CUSTOMERS_DELETE) @Delete("roles/:id") deleteRole(@Param() paramDto: ParamDto) { return this.adminsService.deleteRole(paramDto.id);