From 37342eaee51445a42a9ca69037b4dfff7d7780f2 Mon Sep 17 00:00:00 2001 From: GRZ4NA Date: Sat, 27 May 2023 00:53:19 +0200 Subject: [PATCH] refactor the main controller + add reactions --- apps/backend/src/app.controller.ts | 78 +++++++++++++++++++ apps/backend/src/app.module.ts | 2 + .../src/issues/dto/update-issue.dto.ts | 6 -- .../src/issues/entities/issue.entity.ts | 24 ++++-- apps/backend/src/issues/issues.controller.ts | 60 -------------- apps/backend/src/issues/issues.module.ts | 2 - apps/backend/src/issues/issues.service.ts | 23 +++--- 7 files changed, 113 insertions(+), 82 deletions(-) create mode 100644 apps/backend/src/app.controller.ts delete mode 100644 apps/backend/src/issues/dto/update-issue.dto.ts delete mode 100644 apps/backend/src/issues/issues.controller.ts diff --git a/apps/backend/src/app.controller.ts b/apps/backend/src/app.controller.ts new file mode 100644 index 0000000..cd9ac38 --- /dev/null +++ b/apps/backend/src/app.controller.ts @@ -0,0 +1,78 @@ +import { + Body, + Controller, + Delete, + Get, + HttpCode, + HttpStatus, + Param, + ParseUUIDPipe, + Post, +} from '@nestjs/common'; +import { IssuesService } from './issues/issues.service'; +import { IssueType } from './issues/entities/issue-type.enum'; +import { CreateIssueDto } from './issues/dto/create-issue.dto'; +import { CreateIssueCommentDto } from './issues/dto/create-issue-comment.dto'; + +@Controller() +export class AppController { + constructor(private readonly issues: IssuesService) {} + + @Get('/issues/problems') + listProblems() { + return this.issues + .findAll(IssueType.problem) + .then((r) => r.map((i) => i.toList())); + } + + @Get('/issues/suggestions') + listSuggestions() { + return this.issues + .findAll(IssueType.suggestion) + .then((r) => r.map((i) => i.toList())); + } + + @Get('/issues/:id') + async getIssue(@Param('id', ParseUUIDPipe) id: string) { + const data = await this.issues.findOne(id).then((i) => i.toDto()); + const comments = await this.issues.getCommentsForIssue(id); + return { data, comments }; + } + + @Post('/issues') + createIssue(@Body() dto: CreateIssueDto) { + return this.issues.create(dto); + } + + @Post('/issues/:id/comments') + addComment( + @Body() dto: CreateIssueCommentDto, + @Param('id', ParseUUIDPipe) id: string, + ) { + return this.issues.addComment(id, dto).then((c) => c.toDto()); + } + + @Post('/issues/:id/like') + @HttpCode(HttpStatus.ACCEPTED) + async addLike(@Param('id', ParseUUIDPipe) id: string) { + await this.issues.like(id); + } + + @Post('/issues/:id/dislike') + @HttpCode(HttpStatus.ACCEPTED) + async addDislike(@Param('id', ParseUUIDPipe) id: string) { + await this.issues.dislike(id); + } + + @Delete('/issues/:id/like') + @HttpCode(HttpStatus.ACCEPTED) + async removeLike(@Param('id', ParseUUIDPipe) id: string) { + await this.issues.like(id, true); + } + + @Delete('/issues/:id/dislike') + @HttpCode(HttpStatus.ACCEPTED) + async removeDislike(@Param('id', ParseUUIDPipe) id: string) { + await this.issues.dislike(id, true); + } +} diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 636de6b..fbe3c89 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { IssuesModule } from './issues/issues.module'; +import { AppController } from './app.controller'; @Module({ + controllers: [AppController], imports: [ TypeOrmModule.forRoot({ type: 'postgres', diff --git a/apps/backend/src/issues/dto/update-issue.dto.ts b/apps/backend/src/issues/dto/update-issue.dto.ts deleted file mode 100644 index d179d27..0000000 --- a/apps/backend/src/issues/dto/update-issue.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { OmitType, PartialType } from '@nestjs/mapped-types'; -import { CreateIssueDto } from './create-issue.dto'; - -export class UpdateIssueDto extends PartialType( - OmitType(CreateIssueDto, ['type', 'username']), -) {} diff --git a/apps/backend/src/issues/entities/issue.entity.ts b/apps/backend/src/issues/entities/issue.entity.ts index c830287..2f8c1f0 100644 --- a/apps/backend/src/issues/entities/issue.entity.ts +++ b/apps/backend/src/issues/entities/issue.entity.ts @@ -36,17 +36,31 @@ export class Issue { @CreateDateColumn() createdAt: Date; + @Column({ default: 0 }) + likes: number; + + @Column({ default: 0 }) + dislikes: number; + toDto() { + return { + ...this.toList(), + type: this.type, + description: this.description, + latitude: this.latitude, + longitude: this.longitude, + }; + } + + toList() { return { id: this.id, username: this.username, title: this.title, - type: this.type, status: this.status, - description: this.description, - latitude: this.latitude, - longitude: this.longitude, - createdAt: this.createdAt, + createdAt: this.createdAt.toISOString(), + likes: this.likes, + dislikes: this.dislikes, }; } } diff --git a/apps/backend/src/issues/issues.controller.ts b/apps/backend/src/issues/issues.controller.ts deleted file mode 100644 index 83ac9fc..0000000 --- a/apps/backend/src/issues/issues.controller.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - 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 { - constructor(private readonly issuesService: IssuesService) {} - - @Post() - create(@Body() createIssueDto: CreateIssueDto) { - 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 - .findAll( - direction?.toLowerCase() === 'desc' || - direction?.toLowerCase() === 'descending', - ) - .then((r) => r.map((i) => i.toDto())); - } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.issuesService.findOne(id).then((i) => i.toDto()); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() updateIssueDto: UpdateIssueDto) { - return this.issuesService.update(id, updateIssueDto).then((i) => i.toDto()); - } - - @Delete(':id') - @HttpCode(HttpStatus.NO_CONTENT) - remove(@Param('id') id: string) { - return this.issuesService.remove(id); - } -} diff --git a/apps/backend/src/issues/issues.module.ts b/apps/backend/src/issues/issues.module.ts index 157c0be..adf8ef2 100644 --- a/apps/backend/src/issues/issues.module.ts +++ b/apps/backend/src/issues/issues.module.ts @@ -1,13 +1,11 @@ import { Module } from '@nestjs/common'; 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, 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 f72c4cf..39066f5 100644 --- a/apps/backend/src/issues/issues.service.ts +++ b/apps/backend/src/issues/issues.service.ts @@ -1,11 +1,11 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { CreateIssueDto } from './dto/create-issue.dto'; -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'; +import { IssueType } from './entities/issue-type.enum'; @Injectable() export class IssuesService { @@ -27,28 +27,33 @@ export class IssuesService { return this.comments.save(comment); } - async findAll(descending: boolean) { - return this.repository.find({ - order: { createdAt: descending ? 'DESC' : 'ASC' }, + async getCommentsForIssue(id: string) { + return this.comments.findBy({ issue: { id } }); + } + + async findAll(type?: IssueType) { + return this.repository.findBy({ + type, }); } async findOne(id: string) { - const ent = this.repository.findOneBy({ id }); + const ent = await this.repository.findOneBy({ id }); if (ent === null) { throw new NotFoundException('Issue not found'); } return ent; } - async update(id: string, updateIssueDto: UpdateIssueDto) { + async like(id: string, remove?: boolean) { const ent = await this.findOne(id); - this.repository.merge(ent, updateIssueDto); + ent.likes = remove ? ent.likes - 1 : ent.likes + 1; return this.repository.save(ent); } - async remove(id: string) { + async dislike(id: string, remove?: boolean) { const ent = await this.findOne(id); - return this.repository.remove(ent); + ent.dislikes = remove ? ent.dislikes - 1 : ent.dislikes + 1; + return this.repository.save(ent); } }