diff --git a/package.json b/package.json index fcf20f2..a3dd237 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", + "@nestjs/mapped-types": "*", "@nestjs/platform-express": "^11.0.1", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/app.controller.ts b/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/src/app.module.ts b/src/app.module.ts index 8662803..edc9cc4 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,10 +1,9 @@ import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import { TaskModule } from './task/task.module'; @Module({ - imports: [], - controllers: [AppController], - providers: [AppService], + imports: [TaskModule], + controllers: [], + providers: [], }) export class AppModule {} diff --git a/src/app.service.ts b/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/src/app.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/src/task/dto/create-task.dto.ts b/src/task/dto/create-task.dto.ts new file mode 100644 index 0000000..7db2652 --- /dev/null +++ b/src/task/dto/create-task.dto.ts @@ -0,0 +1,3 @@ +export class CreateTaskDto { + title: string; +} diff --git a/src/task/dto/update-task.dto.ts b/src/task/dto/update-task.dto.ts new file mode 100644 index 0000000..3acda63 --- /dev/null +++ b/src/task/dto/update-task.dto.ts @@ -0,0 +1,4 @@ +export class UpdateTaskDto { + title: string; + isCompleted: boolean; +} diff --git a/src/task/task.controller.ts b/src/task/task.controller.ts new file mode 100644 index 0000000..8bdb09e --- /dev/null +++ b/src/task/task.controller.ts @@ -0,0 +1,51 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + Patch, + Post, + Put, +} from '@nestjs/common'; +import { CreateTaskDto } from './dto/create-task.dto'; +import { UpdateTaskDto } from './dto/update-task.dto'; +import { TaskService } from './task.service'; + +@Controller('task') +export class TaskController { + constructor(private readonly taskService: TaskService) {} + + @Get('all') + findAll() { + return this.taskService.findAll(); + } + + @Get('by-id/:id') + findById( + @Param('id') + id: string, + ) { + return this.taskService.findById(Number(id)); + } + + @Post() + create(@Body() dto: CreateTaskDto) { + return this.taskService.create(dto); + } + + @Put(':id') + update(@Param('id') id: string, @Body() dto: UpdateTaskDto) { + return this.taskService.update(Number(id), dto); + } + + @Patch(':id') + patchUpdate(@Param('id') id: string, @Body() dto: Partial) { + return this.taskService.patchTask(Number(id), dto); + } + + @Delete(':id') + delete(@Param('id') id: string) { + return this.taskService.delete(Number(id)); + } +} diff --git a/src/task/task.module.ts b/src/task/task.module.ts new file mode 100644 index 0000000..e7c4c1d --- /dev/null +++ b/src/task/task.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TaskService } from './task.service'; +import { TaskController } from './task.controller'; + +@Module({ + controllers: [TaskController], + providers: [TaskService], +}) +export class TaskModule {} diff --git a/src/task/task.service.ts b/src/task/task.service.ts new file mode 100644 index 0000000..fb95a41 --- /dev/null +++ b/src/task/task.service.ts @@ -0,0 +1,70 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { CreateTaskDto } from './dto/create-task.dto'; +import { UpdateTaskDto } from './dto/update-task.dto'; + +@Injectable() +export class TaskService { + private tasks = [ + { + id: 1, + title: 'Learn Nestjs', + isCompleted: false, + }, + { + id: 2, + title: 'Build API', + isCompleted: true, + }, + ]; + + findAll() { + return this.tasks; + } + + findById(id: number) { + const task = this.tasks.find((task) => task.id === id); + + if (!task) { + throw new NotFoundException(`Not found task with id ${id}`); + } + + return task; + } + + create(dto: CreateTaskDto) { + const { title } = dto; + const newTask = { + id: this.tasks.length + 1, + title, + isCompleted: false, + }; + + this.tasks.push(newTask); + + return newTask; + } + + update(id: number, dto: UpdateTaskDto) { + const task = this.findById(id); + const { isCompleted, title } = dto; + + task.isCompleted = isCompleted; + task.title = title; + + return task; + } + + patchTask(id: number, dto: Partial) { + const task = this.findById(id); + + Object.assign(task, dto); + + return task; + } + + delete(id: number) { + const task = this.findById(id); + this.tasks = this.tasks.filter((t) => t !== task); + return task; + } +} diff --git a/yarn.lock b/yarn.lock index aa76a6a..dd112d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1008,6 +1008,11 @@ path-to-regexp "8.2.0" tslib "2.8.1" +"@nestjs/mapped-types@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz#b9b536b7c3571567aa1d0223db8baa1a51505a19" + integrity sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw== + "@nestjs/platform-express@^11.0.1": version "11.1.2" resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.2.tgz#e4b2671c74876ff399f50b7a7f36cb4b4c9e35ec"