diff --git a/database/migrations/1783335279945-TMAddingTaskPhasePermissionToPermissionEnumType.ts b/database/migrations/1783335279945-TMAddingTaskPhasePermissionToPermissionEnumType.ts new file mode 100644 index 0000000..c1191db --- /dev/null +++ b/database/migrations/1783335279945-TMAddingTaskPhasePermissionToPermissionEnumType.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class TMAddingTaskPhasePermissionToPermissionEnumType1783335279945 implements MigrationInterface { + name = 'TMAddingTaskPhasePermissionToPermissionEnumType1783335279945' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TYPE "public"."permission_name_enum" RENAME TO "permission_name_enum_old"`); + await queryRunner.query(`CREATE TYPE "public"."permission_name_enum" AS ENUM('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', 'project', 'task_phase')`); + await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "name" TYPE "public"."permission_name_enum" USING "name"::"text"::"public"."permission_name_enum"`); + await queryRunner.query(`DROP TYPE "public"."permission_name_enum_old"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TYPE "public"."permission_name_enum_old" AS ENUM('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', 'project')`); + await queryRunner.query(`ALTER TABLE "permission" ALTER COLUMN "name" TYPE "public"."permission_name_enum_old" USING "name"::"text"::"public"."permission_name_enum_old"`); + await queryRunner.query(`DROP TYPE "public"."permission_name_enum"`); + await queryRunner.query(`ALTER TYPE "public"."permission_name_enum_old" RENAME TO "permission_name_enum"`); + } + +} diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index 9489ec2..e992f6f 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -930,4 +930,8 @@ export const enum ProjectMessage { PROJECT_NOT_FOUND = "پروژه مورد نظر شما وجود ندارد!", PROJECT_CONTAINS_TASK_PHASES = "پروژه شامل فاز تسک است. لطفا ابتدا فاز تسک های این پروژه را حذف کنید.", NOT_MEMBER_OF_PROJECT = "شما عضو این پروژه نیستید!" +} + +export const enum TaskPhaseMessage { + TASK_PHASE_NOT_FOUND = "فاز تسک مورد نظر پیدا نشد!" } \ No newline at end of file diff --git a/src/modules/task-manager/controllers/task-phase.controller.ts b/src/modules/task-manager/controllers/task-phase.controller.ts index e38c41c..32f83c9 100644 --- a/src/modules/task-manager/controllers/task-phase.controller.ts +++ b/src/modules/task-manager/controllers/task-phase.controller.ts @@ -4,7 +4,14 @@ import { TaskPhaseService } from "../providers/task-phase.service"; import { CreateTaskPhaseDto } from "../dto/task-phase/create-task-phase.dto"; import { UpdateTaskPhaseDto } from "../dto/task-phase/update-task-phase.dto"; import { TMTaskPhase } from "../entities/task-phase.entity"; +import { AuthGuards } from "../../../common/decorators/auth-guard.decorator"; +import { AdminRoute } from "../../../common/decorators/admin.decorator"; +import { PermissionsDec } from "../../../common/decorators/permission.decorator"; +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 { diff --git a/src/modules/task-manager/providers/task-phase.service.ts b/src/modules/task-manager/providers/task-phase.service.ts index 570ac19..00bcf63 100644 --- a/src/modules/task-manager/providers/task-phase.service.ts +++ b/src/modules/task-manager/providers/task-phase.service.ts @@ -1,35 +1,36 @@ import { Injectable, NotFoundException } from "@nestjs/common"; import { TaskPhaseRepository } from "../repositories/task-phase.repository"; -import { ProjectRepository } from "../repositories/project.repository"; import { TMTaskPhase } from "../entities/task-phase.entity"; import { CreateTaskPhaseDto } from "../dto/task-phase/create-task-phase.dto"; import { UpdateTaskPhaseDto } from "../dto/task-phase/update-task-phase.dto"; +import { TaskPhaseMessage } from "../../../common/enums/message.enum"; +import { ProjectService } from "./project.service"; @Injectable() export class TaskPhaseService { constructor( private readonly taskPhaseRepository: TaskPhaseRepository, - private readonly projectRepository: ProjectRepository, + private readonly projectService: ProjectService ) {} findAll(): Promise { - return this.taskPhaseRepository.findAll(); + return this.taskPhaseRepository.find(); } findByProject(projectId: string): Promise { - return this.taskPhaseRepository.findByProject(projectId); + return this.taskPhaseRepository.find({ + where: {projectId} + }); } async findOne(id: string): Promise { - const taskPhase = await this.taskPhaseRepository.findOneById(id); - if (!taskPhase) throw new NotFoundException(`TaskPhase #${id} not found`); + const taskPhase = await this.taskPhaseRepository.findOne({where: {id}}); + if (!taskPhase) throw new NotFoundException(TaskPhaseMessage.TASK_PHASE_NOT_FOUND); return taskPhase; } async create(dto: CreateTaskPhaseDto): Promise { - const project = await this.projectRepository.findOneById(dto.projectId); - if (!project) throw new NotFoundException(`Project #${dto.projectId} not found`); - + await this.projectService.findOneOrFail(dto.projectId); const taskPhase = this.taskPhaseRepository.create(dto); return this.taskPhaseRepository.save(taskPhase); } @@ -38,8 +39,7 @@ export class TaskPhaseService { const taskPhase = await this.findOne(id); if (dto.projectId) { - const project = await this.projectRepository.findOneById(dto.projectId); - if (!project) throw new NotFoundException(`Project #${dto.projectId} not found`); + await this.projectService.findOneOrFail(dto.projectId); } Object.assign(taskPhase, dto); diff --git a/src/modules/task-manager/repositories/task-phase.repository.ts b/src/modules/task-manager/repositories/task-phase.repository.ts index 1023f9a..b283229 100644 --- a/src/modules/task-manager/repositories/task-phase.repository.ts +++ b/src/modules/task-manager/repositories/task-phase.repository.ts @@ -4,47 +4,10 @@ import { Repository } from "typeorm"; import { TMTaskPhase } from "../entities/task-phase.entity"; @Injectable() -export class TaskPhaseRepository { +export class TaskPhaseRepository extends Repository { constructor( - @InjectRepository(TMTaskPhase) - private readonly repository: Repository, - ) {} - - findAll() { - return this.repository.find({ - relations: ["project", "tasks"], - order: { order: "ASC" }, - }); - } - - findByProject(projectId: string) { - return this.repository.find({ - where: { projectId }, - relations: ["tasks"], - order: { order: "ASC" }, - }); - } - - findOneById(id: string) { - return this.repository.findOne({ - where: { id }, - relations: ["project", "tasks"], - }); - } - - create(data: Partial) { - return this.repository.create(data); - } - - save(taskPhase: TMTaskPhase) { - return this.repository.save(taskPhase); - } - - update(id: string, data: Partial) { - return this.repository.update(id, data); - } - - delete(id: string) { - return this.repository.delete(id); + @InjectRepository(TMTaskPhase) taskPhaseRepository: Repository, + ) { + super(taskPhaseRepository.target, taskPhaseRepository.manager, taskPhaseRepository.queryRunner); } } diff --git a/src/modules/users/enums/permission.enum.ts b/src/modules/users/enums/permission.enum.ts index 1748c29..363e730 100755 --- a/src/modules/users/enums/permission.enum.ts +++ b/src/modules/users/enums/permission.enum.ts @@ -26,5 +26,6 @@ export enum PermissionEnum { DMAIL = 'dmail', RESELLER="reseller", WORKSPACE="workspace", - PROJECT="project" + PROJECT="project", + TASK_PHASE="task_phase" }