From 8c66fa8c856713f2ad0369a834f83d0ab42a1b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Sat, 9 Jul 2022 15:24:14 -0300 Subject: [PATCH] add project update route --- server/src/controller/project.controller.ts | 83 ++++++++++++++------- server/src/dto/updateProject.dto.ts | 1 - server/src/entity/project.entity.ts | 12 ++- server/src/service/project.service.ts | 20 ++++- 4 files changed, 83 insertions(+), 33 deletions(-) diff --git a/server/src/controller/project.controller.ts b/server/src/controller/project.controller.ts index beb7964..be84de2 100644 --- a/server/src/controller/project.controller.ts +++ b/server/src/controller/project.controller.ts @@ -7,14 +7,14 @@ const router = Router(); export const apiNamespace = "/projects"; router.get(apiNamespace, async (req, res) => { - const projects = await ProjectService.listAllByUserId(req.userId) + const projects = await ProjectService.listAllByUserId(req.userId); - const response: ProjectDto[] = projects.map(project => ({ + const response: ProjectDto[] = projects.map((project) => ({ id: project.id, - name: project.name - })) + name: project.name, + })); - res.json(response) + res.json(response); }); router.post(apiNamespace, (req, res) => { @@ -22,42 +22,73 @@ router.post(apiNamespace, (req, res) => { ProjectService.create({ name, - userId: req.userId - }).then(project => { - const respose: ProjectDto = { - id: project.id, - name: project.name - } - - res.json(respose); - }).catch(err => { - res.status(422).json({ - error: err.message - }); + userId: req.userId, }) + .then((project) => { + const respose: ProjectDto = { + id: project.id, + name: project.name, + }; + + res.json(respose); + }) + .catch((err) => { + res.status(422).json({ + error: err.message, + }); + }); +}); + +router.put(`${apiNamespace}/:id`, async (req, res) => { + const { id } = req.params; + const { name } = req.body; + const projectId = parseInt(id); + + const userProjects = await ProjectService.listAllByUserId(req.userId); + const projectToBeUpdated = userProjects.find( + (project) => project.id === projectId + ); + + if (projectToBeUpdated) { + ProjectService.update(projectToBeUpdated, { + name, + }).then((success) => { + if (success) { + res.status(204).json(); + } else { + res.status(402).json(); + } + }); + } else { + res.status(404).json({ + error: "Project not found", + }); + } }); router.delete(`${apiNamespace}/:id`, async (req, res, next) => { const { id } = req.params; - const projectId = parseInt(id) + const projectId = parseInt(id); - const userProjects = await ProjectService.listAllByUserId(req.userId) - const projecToBeDeleted = userProjects.find(project => project.id === projectId) + const userProjects = await ProjectService.listAllByUserId(req.userId); + const projecToBeDeleted = userProjects.find( + (project) => project.id === projectId + ); if (projecToBeDeleted) { - const success = await ProjectService.destroy(projecToBeDeleted) + const success = await ProjectService.destroy(projecToBeDeleted); if (success) { - res.json({ success }) + res.json({ success }); } else { res.status(422).json({ - error: "Could not delete project" - }) + error: "Could not delete project", + }); } } else { res.status(404).json({ - error: "Project not found" - }) + error: "Project not found", + }); } }); diff --git a/server/src/dto/updateProject.dto.ts b/server/src/dto/updateProject.dto.ts index 4dad3bd..9f09a39 100644 --- a/server/src/dto/updateProject.dto.ts +++ b/server/src/dto/updateProject.dto.ts @@ -1,4 +1,3 @@ export type UpdateProjectDto = { - id: string name: string } \ No newline at end of file diff --git a/server/src/entity/project.entity.ts b/server/src/entity/project.entity.ts index adcab87..512c6cb 100644 --- a/server/src/entity/project.entity.ts +++ b/server/src/entity/project.entity.ts @@ -1,6 +1,11 @@ import { IsNotEmpty } from "class-validator"; import { - Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn + Column, + Entity, + JoinColumn, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, } from "typeorm"; import { Task } from "./task.entity"; import { User } from "./user.entity"; @@ -14,7 +19,10 @@ export class Project { @IsNotEmpty() name: string; - @ManyToOne((_type) => User, (user) => user.projects) + @ManyToOne((_type) => User, (user) => user.projects, { + onUpdate: "CASCADE", + onDelete: "CASCADE", + }) @JoinColumn() @IsNotEmpty() user: User; diff --git a/server/src/service/project.service.ts b/server/src/service/project.service.ts index fec5161..6e655fb 100644 --- a/server/src/service/project.service.ts +++ b/server/src/service/project.service.ts @@ -1,5 +1,6 @@ import { validate } from "class-validator"; import { NewProjectDto } from "../dto/newProject.dto"; +import { UpdateProjectDto } from "../dto/updateProject.dto"; import { Project } from "../entity/project.entity"; import { User } from "../entity/user.entity"; import { projectRepository } from "../repository/project.repository"; @@ -10,7 +11,7 @@ async function create(newProject: NewProjectDto): Promise { const user = await UserService.findUserById(newProject.userId); project.name = newProject.name; - project.user = user + project.user = user; const errors = await validate(project); @@ -28,17 +29,28 @@ async function listAllByUserId(userId: User["id"]): Promise { return query.getMany(); } -async function destroy(project: Project): Promise{ +async function destroy(project: Project): Promise { const query = projectRepository.createQueryBuilder(); query.where('"id" = :projectId', { projectId: project.id }); - const result = await query.delete().execute() + const result = await query.delete().execute(); return result.affected > 0; } +async function update( + project: Project, + updateProjectDto: UpdateProjectDto +): Promise { + projectRepository.merge(project, updateProjectDto); + const updateResult = await projectRepository.save(project); + + return !!updateResult; +} + export const ProjectService = { create, listAllByUserId, - destroy + destroy, + update, };