diff --git a/apps/server/package.json b/apps/server/package.json index 7641489..51ef898 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -23,6 +23,7 @@ "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.3.0", "@nestjs/core": "^10.0.0", + "@nestjs/event-emitter": "^2.1.1", "@nestjs/jwt": "^10.2.0", "@nestjs/passport": "^10.0.3", "@nestjs/platform-express": "^10.0.0", @@ -43,8 +44,8 @@ "@nestjs/cli": "^10.0.0", "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", - "@types/express": "^4.17.17", "@types/bcrypt": "^5.0.2", + "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/passport-jwt": "^4.0.1", diff --git a/apps/server/src/app.module.ts b/apps/server/src/app.module.ts index f9cc4d8..d75551e 100644 --- a/apps/server/src/app.module.ts +++ b/apps/server/src/app.module.ts @@ -11,6 +11,7 @@ import { HttpLoggingInterceptor } from '@/common/httpLog.Interceptor'; import { AllExceptionsFilter } from '@/common/allException.filter'; import { AccountModule } from '@/account/account.module'; import { ProjectModule } from '@/project/project.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ @@ -23,6 +24,7 @@ import { ProjectModule } from '@/project/project.module'; return new DataSource(options).initialize(); }, }), + EventEmitterModule.forRoot(), TaskModule, AccountModule, ProjectModule, diff --git a/apps/server/src/project/controller/project.controller.ts b/apps/server/src/project/controller/project.controller.ts index f0b9f8f..66bccac 100644 --- a/apps/server/src/project/controller/project.controller.ts +++ b/apps/server/src/project/controller/project.controller.ts @@ -1,4 +1,13 @@ -import { Body, Controller, Get, Param, Patch, Post, UseGuards } from '@nestjs/common'; +import { + BadRequestException, + Body, + Controller, + Get, + Param, + Patch, + Post, + UseGuards, +} from '@nestjs/common'; import { ProjectService } from '@/project/service/project.service'; import { AccessTokenGuard } from '@/account/guard/accessToken.guard'; import { CreateProjectRequest } from '@/project/dto/create-project-request.dto'; @@ -6,11 +15,17 @@ import { AuthUser } from '@/account/decorator/authUser.decorator'; import { Account } from '@/account/entity/account.entity'; import { InviteUserRequest } from '@/project/dto/invite-user-request.dto'; import { UpdateContributorRequest } from '@/project/dto/update-contributor-request.dts'; +import { TaskEvent } from '@/task/dto/task-event.dto'; +import { TaskService } from '@/task/service/task.service'; +import { EventType } from '@/task/domain/eventType.enum'; @UseGuards(AccessTokenGuard) @Controller('project') export class ProjectController { - constructor(private projectService: ProjectService) {} + constructor( + private projectService: ProjectService, + private taskService: TaskService + ) {} @Get(':id/members') getMembers(@AuthUser() user: Account, @Param('id') projectId: number) { @@ -38,4 +53,28 @@ export class ProjectController { await this.projectService.updateInvitation(user.id, body.contributorId, body.status); return { message: 'Successfully update invitation', success: true }; } + + @Post(':id/update') + async handleEvent(@AuthUser() user: Account, @Body() taskEvent: TaskEvent) { + const event = taskEvent.event; + let response; + switch (event) { + case EventType.CREATE_TASK: + // response = await this.taskService.create(user.id, taskEvent); + break; + case EventType.DELETE_TASK: + // response = await this.taskService.delete(user.id, taskEvent); + break; + case EventType.UPDATE_POSITION: + // response = await this.taskService.move(user.id, taskEvent); + break; + case EventType.INSERT_TITLE: + case EventType.DELETE_TITLE: + // response = await this.taskService.update(user.id, taskEvent); + break; + default: + throw new BadRequestException('올바르지 않은 이벤트 타입입니다.'); + } + return response; + } } diff --git a/apps/server/src/project/project.module.ts b/apps/server/src/project/project.module.ts index d0b5292..80f968f 100644 --- a/apps/server/src/project/project.module.ts +++ b/apps/server/src/project/project.module.ts @@ -8,9 +8,10 @@ import { Account } from '@/account/entity/account.entity'; import { Task } from '@/task/domain/task.entity'; import { ProjectsController } from '@/project/controller/projects.controller'; import { Section } from '@/task/domain/section.entity'; +import { TaskService } from '@/task/service/task.service'; @Module({ - imports: [TypeOrmModule.forFeature([Project, Contributor, Account, Task, Section])], + imports: [TypeOrmModule.forFeature([Project, Contributor, Account, Task, Section]), TaskService], controllers: [ProjectController, ProjectsController], providers: [ProjectService], }) diff --git a/apps/server/src/task/domain/eventType.enum.ts b/apps/server/src/task/domain/eventType.enum.ts new file mode 100644 index 0000000..79882cd --- /dev/null +++ b/apps/server/src/task/domain/eventType.enum.ts @@ -0,0 +1,7 @@ +export enum EventType { + 'CREATE_TASK' = 'CREATE_TASK', + 'DELETE_TASK' = 'DELETE_TASK', + 'INSERT_TITLE' = 'INSERT_TITLE', + 'DELETE_TITLE' = 'DELETE_TITLE', + 'UPDATE_POSITION' = 'UPDATE_POSITION', +} diff --git a/apps/server/src/task/domain/update-information.type.ts b/apps/server/src/task/domain/update-information.type.ts new file mode 100644 index 0000000..5efa744 --- /dev/null +++ b/apps/server/src/task/domain/update-information.type.ts @@ -0,0 +1,7 @@ +type UpdateInformation = { + position: number; + + content: string; + + length: number; +}; diff --git a/apps/server/src/task/dto/task-event.dto.ts b/apps/server/src/task/dto/task-event.dto.ts new file mode 100644 index 0000000..20752d3 --- /dev/null +++ b/apps/server/src/task/dto/task-event.dto.ts @@ -0,0 +1,19 @@ +import { IsNumber, IsNotEmpty, IsString, IsEnum } from 'class-validator'; +import { EventType } from '../domain/eventType.enum'; + +export class TaskEvent { + @IsNumber() + taskId: number; + + @IsNumber() + sectionId: number; + + @IsString() + position: string; + + @IsNotEmpty() + @IsEnum(EventType) + event: EventType; + + title: UpdateInformation; +} diff --git a/apps/server/src/task/service/task.service.ts b/apps/server/src/task/service/task.service.ts index 51b734c..c003466 100644 --- a/apps/server/src/task/service/task.service.ts +++ b/apps/server/src/task/service/task.service.ts @@ -13,13 +13,14 @@ import { DeleteTaskResponse } from '@/task/dto/delete-task-response.dto'; import { CreateTaskResponse } from '@/task/dto/create-task-response.dto'; import { Project } from '@/project/entity/project.entity'; import { CreateTaskRequest } from '@/task/dto/create-task-request.dto'; -import { Snapshot } from '@/task/domain/snapshot'; import { CustomResponse } from '@/task/domain/custom-response.interface'; +import { Snapshot } from '../domain/snapshot'; +import { EventEmitter2 } from '@nestjs/event-emitter'; @Injectable() export class TaskService { private snapshots: Map = new Map(); - + private operations: Map = new Map(); private connections: Map = new Map(); constructor( @@ -28,7 +29,8 @@ export class TaskService { @InjectRepository(Section) private sectionRepository: Repository
, @InjectRepository(Project) - private projectRepository: Repository + private projectRepository: Repository, + private eventEmitter: EventEmitter2 ) {} addConnection(projectId: number, res: CustomResponse) { diff --git a/apps/server/src/task/task.module.ts b/apps/server/src/task/task.module.ts index 9433aa8..4e0c5df 100644 --- a/apps/server/src/task/task.module.ts +++ b/apps/server/src/task/task.module.ts @@ -11,5 +11,6 @@ import { SnapshotController } from '@/task/controller/snapshot.controller'; imports: [TypeOrmModule.forFeature([Task, Section, Project])], controllers: [TaskController, SnapshotController], providers: [TaskService], + exports: [TaskService], }) export class TaskModule {}