From 1e101a67d693a8a87da6e5991d1cf59f11c38ffc Mon Sep 17 00:00:00 2001 From: GRZ4NA Date: Fri, 26 May 2023 20:53:41 +0100 Subject: [PATCH] add issue type and comments --- .../issues/dto/create-issue-comment.dto.ts | 8 +++++ .../src/issues/dto/create-issue.dto.ts | 12 +++++++- .../src/issues/dto/update-issue.dto.ts | 6 ++-- .../issues/entities/issue-comment.entity.ts | 30 +++++++++++++++++++ .../src/issues/entities/issue-type.enum.ts | 4 +++ .../src/issues/entities/issue.entity.ts | 5 ++++ apps/backend/src/issues/issues.controller.ts | 10 +++++++ apps/backend/src/issues/issues.module.ts | 3 +- apps/backend/src/issues/issues.service.ts | 11 +++++++ 9 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 apps/backend/src/issues/dto/create-issue-comment.dto.ts create mode 100644 apps/backend/src/issues/entities/issue-comment.entity.ts create mode 100644 apps/backend/src/issues/entities/issue-type.enum.ts diff --git a/apps/backend/src/issues/dto/create-issue-comment.dto.ts b/apps/backend/src/issues/dto/create-issue-comment.dto.ts new file mode 100644 index 0000000..a124656 --- /dev/null +++ b/apps/backend/src/issues/dto/create-issue-comment.dto.ts @@ -0,0 +1,8 @@ +import { IsString, MaxLength, MinLength } from 'class-validator'; + +export class CreateIssueCommentDto { + @IsString() + @MinLength(1) + @MaxLength(255) + content: string; +} diff --git a/apps/backend/src/issues/dto/create-issue.dto.ts b/apps/backend/src/issues/dto/create-issue.dto.ts index 180c8c4..45401c3 100644 --- a/apps/backend/src/issues/dto/create-issue.dto.ts +++ b/apps/backend/src/issues/dto/create-issue.dto.ts @@ -1,4 +1,11 @@ -import { IsNumber, IsString, MaxLength, MinLength } from 'class-validator'; +import { + IsEnum, + IsNumber, + IsString, + MaxLength, + MinLength, +} from 'class-validator'; +import { IssueType } from '../entities/issue-type.enum'; export class CreateIssueDto { @IsString() @@ -11,6 +18,9 @@ export class CreateIssueDto { @MaxLength(255) description: string; + @IsEnum(IssueType) + type: IssueType; + @IsNumber() latitude: number; diff --git a/apps/backend/src/issues/dto/update-issue.dto.ts b/apps/backend/src/issues/dto/update-issue.dto.ts index d329c38..e4e242d 100644 --- a/apps/backend/src/issues/dto/update-issue.dto.ts +++ b/apps/backend/src/issues/dto/update-issue.dto.ts @@ -1,4 +1,6 @@ -import { PartialType } from '@nestjs/mapped-types'; +import { OmitType, PartialType } from '@nestjs/mapped-types'; import { CreateIssueDto } from './create-issue.dto'; -export class UpdateIssueDto extends PartialType(CreateIssueDto) {} +export class UpdateIssueDto extends PartialType( + OmitType(CreateIssueDto, ['type']), +) {} diff --git a/apps/backend/src/issues/entities/issue-comment.entity.ts b/apps/backend/src/issues/entities/issue-comment.entity.ts new file mode 100644 index 0000000..62c3fac --- /dev/null +++ b/apps/backend/src/issues/entities/issue-comment.entity.ts @@ -0,0 +1,30 @@ +import { + Column, + CreateDateColumn, + Entity, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { Issue } from './issue.entity'; + +@Entity('issue_comments') +export class IssueComment { + @PrimaryGeneratedColumn('uuid') + id: string; + + @ManyToOne(() => Issue, { onDelete: 'CASCADE', lazy: true }) + issue: Promise; + + @Column() + content: string; + + @CreateDateColumn() + createdAt: Date; + + toDto() { + return { + content: this.content, + createdAt: this.createdAt.toISOString(), + }; + } +} diff --git a/apps/backend/src/issues/entities/issue-type.enum.ts b/apps/backend/src/issues/entities/issue-type.enum.ts new file mode 100644 index 0000000..5618534 --- /dev/null +++ b/apps/backend/src/issues/entities/issue-type.enum.ts @@ -0,0 +1,4 @@ +export enum IssueType { + problem = 'PROBLEM', + suggestion = 'SUGGESTION', +} diff --git a/apps/backend/src/issues/entities/issue.entity.ts b/apps/backend/src/issues/entities/issue.entity.ts index 105455c..556b94e 100644 --- a/apps/backend/src/issues/entities/issue.entity.ts +++ b/apps/backend/src/issues/entities/issue.entity.ts @@ -5,6 +5,7 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; import { IssueStatus } from './issue-status.enum'; +import { IssueType } from './issue-type.enum'; @Entity('issues') export class Issue { @@ -23,6 +24,9 @@ export class Issue { @Column() longitude: string; + @Column({ type: 'enum', enum: IssueType }) + type: IssueType; + @Column({ type: 'enum', enum: IssueStatus, default: IssueStatus.new }) status: IssueStatus; @@ -33,6 +37,7 @@ export class Issue { return { id: this.id, title: this.title, + type: this.type, status: this.status, description: this.description, latitude: this.latitude, diff --git a/apps/backend/src/issues/issues.controller.ts b/apps/backend/src/issues/issues.controller.ts index d93d9d9..5f4f6b1 100644 --- a/apps/backend/src/issues/issues.controller.ts +++ b/apps/backend/src/issues/issues.controller.ts @@ -8,10 +8,12 @@ import { Delete, HttpCode, HttpStatus, + ParseUUIDPipe, } from '@nestjs/common'; import { IssuesService } from './issues.service'; import { CreateIssueDto } from './dto/create-issue.dto'; import { UpdateIssueDto } from './dto/update-issue.dto'; +import { CreateIssueCommentDto } from './dto/create-issue-comment.dto'; @Controller('issues') export class IssuesController { @@ -22,6 +24,14 @@ export class IssuesController { return this.issuesService.create(createIssueDto).then((i) => i.toDto()); } + @Post(':id/comments') + createComment( + @Param('id', ParseUUIDPipe) id: string, + @Body() dto: CreateIssueCommentDto, + ) { + return this.issuesService.addComment(id, dto).then((c) => c.toDto()); + } + @Get() findAll(@Param('direction') direction: string) { return this.issuesService diff --git a/apps/backend/src/issues/issues.module.ts b/apps/backend/src/issues/issues.module.ts index 9ee3124..157c0be 100644 --- a/apps/backend/src/issues/issues.module.ts +++ b/apps/backend/src/issues/issues.module.ts @@ -3,9 +3,10 @@ import { IssuesService } from './issues.service'; import { IssuesController } from './issues.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Issue } from './entities/issue.entity'; +import { IssueComment } from './entities/issue-comment.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Issue])], + imports: [TypeOrmModule.forFeature([Issue, IssueComment])], controllers: [IssuesController], providers: [IssuesService], exports: [IssuesService], diff --git a/apps/backend/src/issues/issues.service.ts b/apps/backend/src/issues/issues.service.ts index ab63e18..f72c4cf 100644 --- a/apps/backend/src/issues/issues.service.ts +++ b/apps/backend/src/issues/issues.service.ts @@ -4,11 +4,15 @@ import { UpdateIssueDto } from './dto/update-issue.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Issue } from './entities/issue.entity'; import { Repository } from 'typeorm'; +import { CreateIssueCommentDto } from './dto/create-issue-comment.dto'; +import { IssueComment } from './entities/issue-comment.entity'; @Injectable() export class IssuesService { constructor( @InjectRepository(Issue) private readonly repository: Repository, + @InjectRepository(IssueComment) + private readonly comments: Repository, ) {} async create(createIssueDto: CreateIssueDto) { @@ -16,6 +20,13 @@ export class IssuesService { return this.repository.save(issue); } + async addComment(id: string, { content }: CreateIssueCommentDto) { + const issue = await this.findOne(id); + const comment = this.comments.create({ content }); + comment.issue = Promise.resolve(issue); + return this.comments.save(comment); + } + async findAll(descending: boolean) { return this.repository.find({ order: { createdAt: descending ? 'DESC' : 'ASC' },