From c5b2cb93f0b2dd10e0fedce4a59fa87c25151840 Mon Sep 17 00:00:00 2001 From: realrafi Date: Sat, 4 Jul 2026 17:32:02 +0330 Subject: [PATCH] feat: added get workspaces by user and some refactors --- src/common/enums/message.enum.ts | 4 ++ .../controllers/workspace.controller.ts | 23 ++++++++++- .../task-manager/entities/workspace.entity.ts | 2 +- .../providers/workspace.service.ts | 18 +++++++-- .../repositories/workspace.repository.ts | 39 ++++--------------- src/modules/users/enums/permission.enum.ts | 3 +- 6 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index 1b28777..c9f2f19 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -915,3 +915,7 @@ export const enum UploaderMessage { export const enum AccessLogMessage { ACCESS_LOG_NOT_FOUND = "لاگ دسترسی مورد نظر یافت نشد", } + +export const enum WorkSpaceMessage { + WORKSPACE_EXISTS = "فضای کار با این اسم وجود دارد!" +} \ No newline at end of file diff --git a/src/modules/task-manager/controllers/workspace.controller.ts b/src/modules/task-manager/controllers/workspace.controller.ts index bb9fcc5..ed8a810 100644 --- a/src/modules/task-manager/controllers/workspace.controller.ts +++ b/src/modules/task-manager/controllers/workspace.controller.ts @@ -4,13 +4,22 @@ import { WorkspaceService } from '../providers/workspace.service'; import { CreateWorkspaceDto } from '../dto/workspace/create-workspace.dto'; import { UpdateWorkspaceDto } from '../dto/workspace/update-workspace.dto'; import { TMWorkspace } from '../entities/workspace.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'; +import { UserDec } from '../../../common/decorators/user.decorator'; +import { AuthGuards } from '../../../common/decorators/auth-guard.decorator'; -@ApiTags('Task Manager') +@AuthGuards() +@AdminRoute() +@ApiTags('Task Manager - Workspaces') @Controller('task-manager/workspaces') export class WorkspaceController { constructor(private readonly workspaceService: WorkspaceService) {} @Get() + @PermissionsDec(PermissionEnum.WORKSPACE) @ApiOperation({ summary: 'Get all workspaces' }) @ApiResponse({ status: 200, description: 'List of workspaces', type: [TMWorkspace] }) findAll(): Promise { @@ -18,6 +27,7 @@ export class WorkspaceController { } @Get(':id') + @PermissionsDec(PermissionEnum.WORKSPACE) @ApiOperation({ summary: 'Get a workspace by ID' }) @ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiResponse({ status: 200, description: 'Workspace found', type: TMWorkspace }) @@ -27,6 +37,7 @@ export class WorkspaceController { } @Post() + @PermissionsDec(PermissionEnum.WORKSPACE) @ApiOperation({ summary: 'Create a new workspace' }) @ApiResponse({ status: 201, description: 'Workspace created', type: TMWorkspace }) create(@Body() body: CreateWorkspaceDto): Promise { @@ -34,6 +45,7 @@ export class WorkspaceController { } @Patch(':id') + @PermissionsDec(PermissionEnum.WORKSPACE) @ApiOperation({ summary: 'Update a workspace' }) @ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiResponse({ status: 200, description: 'Workspace updated', type: TMWorkspace }) @@ -43,6 +55,7 @@ export class WorkspaceController { } @Delete(':id') + @PermissionsDec(PermissionEnum.WORKSPACE) @ApiOperation({ summary: 'Delete a workspace' }) @ApiParam({ name: 'id', description: 'Workspace ID' }) @ApiResponse({ status: 200, description: 'Workspace deleted' }) @@ -50,4 +63,12 @@ export class WorkspaceController { remove(@Param('id') id: string): Promise { return this.workspaceService.remove(id); } + + @Get('/byuser') + @ApiOperation({summary: 'Get User WorkSpaces'}) + @ApiResponse({ status: 200, description: 'Got Workspaces successfully!' }) + @ApiResponse({ status: 404, description: 'Bad Request!' }) + findByUser(@UserDec('id') userId: string) { + return this.workspaceService.findByUser(userId); + } } \ No newline at end of file diff --git a/src/modules/task-manager/entities/workspace.entity.ts b/src/modules/task-manager/entities/workspace.entity.ts index 417c1fd..c2feb0c 100644 --- a/src/modules/task-manager/entities/workspace.entity.ts +++ b/src/modules/task-manager/entities/workspace.entity.ts @@ -5,7 +5,7 @@ import { User } from "../../users/entities/user.entity"; @Entity("tm_workspaces") export class TMWorkspace extends BaseEntity { - @Column({ type: "varchar", length: 100 }) + @Column({ type: "varchar", length: 100, unique: true }) name: string; @Column({ type: "text", nullable: true }) diff --git a/src/modules/task-manager/providers/workspace.service.ts b/src/modules/task-manager/providers/workspace.service.ts index 5e90079..8ea8257 100644 --- a/src/modules/task-manager/providers/workspace.service.ts +++ b/src/modules/task-manager/providers/workspace.service.ts @@ -1,4 +1,4 @@ -import { Injectable, NotFoundException } from "@nestjs/common"; +import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { In, Repository } from "typeorm"; import { WorkspaceRepository } from "../repositories/workspace.repository"; @@ -6,6 +6,7 @@ import { TMWorkspace } from "../entities/workspace.entity"; import { CreateWorkspaceDto } from "../dto/workspace/create-workspace.dto"; import { UpdateWorkspaceDto } from "../dto/workspace/update-workspace.dto"; import { User } from "../../users/entities/user.entity"; +import { WorkSpaceMessage } from "../../../common/enums/message.enum"; @Injectable() export class WorkspaceService { @@ -16,11 +17,13 @@ export class WorkspaceService { ) {} findAll(): Promise { - return this.workspaceRepository.findAll(); + return this.workspaceRepository.find({ + relations: ["projects", "users"], + }); } async findOneOrFail(id: string): Promise { - const workspace = await this.workspaceRepository.findOneById(id); + const workspace = await this.workspaceRepository.findOne({ where: { id } }); if (!workspace) throw new NotFoundException(`Workspace #${id} not found`); return workspace; } @@ -28,6 +31,11 @@ export class WorkspaceService { async create(dto: CreateWorkspaceDto): Promise { const { userIds, ...rest } = dto; + const existingWorkspace = await this.workspaceRepository.findOne({where: {name: rest.name}}); + if(existingWorkspace) { + throw new BadRequestException(WorkSpaceMessage.WORKSPACE_EXISTS); + } + const workspace = this.workspaceRepository.create(rest); if (userIds?.length) { @@ -56,4 +64,8 @@ export class WorkspaceService { return workspace; } + + async findByUser(userId: string): Promise { + return await this.workspaceRepository.findByUser(userId); + } } diff --git a/src/modules/task-manager/repositories/workspace.repository.ts b/src/modules/task-manager/repositories/workspace.repository.ts index 175678a..aa8eb3f 100644 --- a/src/modules/task-manager/repositories/workspace.repository.ts +++ b/src/modules/task-manager/repositories/workspace.repository.ts @@ -4,38 +4,15 @@ import { Repository } from "typeorm"; import { TMWorkspace } from "../entities/workspace.entity"; @Injectable() -export class WorkspaceRepository { - constructor( - @InjectRepository(TMWorkspace) - private readonly repository: Repository, - ) {} - - findAll() { - return this.repository.find({ - relations: ["projects", "users"], - }); +export class WorkspaceRepository extends Repository { + constructor(@InjectRepository(TMWorkspace) workspaceRepository: Repository) { + super(workspaceRepository.target, workspaceRepository.manager, workspaceRepository.queryRunner); } - findOneById(id: string) { - return this.repository.findOne({ - where: { id }, - relations: ["projects", "users"], - }); - } - - create(data: Partial) { - return this.repository.create(data); - } - - save(workspace: TMWorkspace) { - return this.repository.save(workspace); - } - - update(id: string, data: Partial) { - return this.repository.update(id, data); - } - - delete(id: string) { - return this.repository.delete(id); + async findByUser(userId: string): Promise { + return this.createQueryBuilder("workspace") + .innerJoin("workspace.users", "users") + .where("user.id = :userId", { userId }) + .getMany(); } } diff --git a/src/modules/users/enums/permission.enum.ts b/src/modules/users/enums/permission.enum.ts index 5a42f37..fd8f92a 100755 --- a/src/modules/users/enums/permission.enum.ts +++ b/src/modules/users/enums/permission.enum.ts @@ -24,5 +24,6 @@ export enum PermissionEnum { DKALA = "dkala", DPAGE = "dpage", DMAIL = 'dmail', - RESELLER="reseller" + RESELLER="reseller", + WORKSPACE="workspace" }