diff --git a/server/src/controller/project.controller.ts b/server/src/controller/project.controller.ts index 9e86081..4413845 100644 --- a/server/src/controller/project.controller.ts +++ b/server/src/controller/project.controller.ts @@ -1,90 +1,113 @@ import { Router } from "express"; import { ProjectDto } from "../dto/poject.dto"; +import { NewProjectDto } from "../dto/project.new.dto"; +import { UpdateProjectDto } from "../dto/project.update.dto"; import { ProjectService } from "../service/project.service"; +import { + CreateResponse, DeleteResponse, IndexResponse, + UpdateResponse +} from "./typings/responses"; const router = Router(); export const ProjectRoutes = router; export const apiNamespace = "/projects"; -router.get(apiNamespace, async (req, res) => { - const projects = await ProjectService.listAllByUserId(req.userId); +router.get>( + apiNamespace, + async (req, res) => { + const projects = await ProjectService.listAllByUserId(req.userId); - const response: ProjectDto[] = projects.map((project) => ({ - id: project.id, - name: project.name, - })); - - res.json({ - data: response - }); -}); - -router.post(apiNamespace, (req, res) => { - const { name } = req.body; - - ProjectService.create({ - name, - userId: req.userId, - }) - .then((project) => { - const respose: ProjectDto = { + res.json({ + data: projects.map((project) => ({ 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 projectToBeUpdated = await ProjectService.findProjectFromUserById(req.userId, 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) => { - const { id } = req.params; - const projectId = parseInt(id); +router.post, NewProjectDto>( + apiNamespace, + (req, res) => { + const { name } = req.body; - const projecToBeDeleted = await ProjectService.findProjectFromUserById(req.userId, projectId); + ProjectService.create(req.userId, { + name, + }) + .then((project) => { + res.json({ + data: { + id: project.id, + name: project.name, + }, + }); + }) + .catch((err) => { + res.status(422).json({ + errors: [err.message], + }); + }); + } +); - if (projecToBeDeleted) { - const success = await ProjectService.destroy(projecToBeDeleted); +const putPath = `${apiNamespace}/:taskId`; +router.put, UpdateProjectDto>( + putPath, + async (req, res) => { + const { taskId } = req.params; + const { name } = req.body; + const projectId = parseInt(taskId); - if (success) { - res.json({ success }); + const projectToBeUpdated = await ProjectService.findProjectFromUserById( + req.userId, + projectId + ); + + if (projectToBeUpdated) { + ProjectService.update(projectToBeUpdated, { + name, + }).then((success) => { + if (success) { + res.status(204).json(); + } else { + res.status(402).json(); + } + }); } else { - res.status(422).json({ - error: "Could not delete project", + res.status(404).json({ + errors: ["Project not found"], }); } - } else { - res.status(404).json({ - error: "Project not found", - }); } -}); +); + +const deletePath = `${apiNamespace}/:taskId`; +router.delete( + deletePath, + async (req, res) => { + const { taskId } = req.params; + const projectId = parseInt(taskId); + + const projecToBeDeleted = await ProjectService.findProjectFromUserById( + req.userId, + projectId + ); + + if (projecToBeDeleted) { + const success = await ProjectService.destroy(projecToBeDeleted); + + if (success) { + res.json({ success }); + } else { + res.status(422).json({ + errors: ["Could not delete project"], + }); + } + } else { + res.status(404).json({ + errors: ["Project not found"], + }); + } + } +); diff --git a/server/src/controller/typings/responses.d.ts b/server/src/controller/typings/responses.d.ts new file mode 100644 index 0000000..9ce4be5 --- /dev/null +++ b/server/src/controller/typings/responses.d.ts @@ -0,0 +1,25 @@ +export type ErrorResponse = { + errors: string[]; +}; + +export type IndexResponse = { + data: TData[]; +}; + +export type CreateResponse = + | { + data: TData; + } + | ErrorResponse; + +export type UpdateResponse = + | { + data: TData; + } + | ErrorResponse; + +export type DeleteResponse = + | { + success: boolean; + } + | ErrorResponse; diff --git a/server/src/dto/newProject.dto.ts b/server/src/dto/project.new.dto.ts similarity index 73% rename from server/src/dto/newProject.dto.ts rename to server/src/dto/project.new.dto.ts index 00d077a..d329dc9 100644 --- a/server/src/dto/newProject.dto.ts +++ b/server/src/dto/project.new.dto.ts @@ -1,4 +1,3 @@ export type NewProjectDto = { name: string - userId: number } \ No newline at end of file diff --git a/server/src/dto/updateProject.dto.ts b/server/src/dto/project.update.dto.ts similarity index 68% rename from server/src/dto/updateProject.dto.ts rename to server/src/dto/project.update.dto.ts index 9f09a39..ab90efd 100644 --- a/server/src/dto/updateProject.dto.ts +++ b/server/src/dto/project.update.dto.ts @@ -1,3 +1,3 @@ export type UpdateProjectDto = { - name: string + name?: string } \ No newline at end of file diff --git a/server/src/dto/newTask.dto.ts b/server/src/dto/task.new.dto.ts similarity index 100% rename from server/src/dto/newTask.dto.ts rename to server/src/dto/task.new.dto.ts diff --git a/server/src/dto/updateTask.dto.ts b/server/src/dto/task.update.dto.ts similarity index 100% rename from server/src/dto/updateTask.dto.ts rename to server/src/dto/task.update.dto.ts diff --git a/server/src/dto/newUser.dto.ts b/server/src/dto/user.new.dto.ts similarity index 100% rename from server/src/dto/newUser.dto.ts rename to server/src/dto/user.new.dto.ts diff --git a/server/src/dto/session.dto.ts b/server/src/dto/user.session.dto.ts similarity index 100% rename from server/src/dto/session.dto.ts rename to server/src/dto/user.session.dto.ts diff --git a/server/src/service/project.service.ts b/server/src/service/project.service.ts index c97eb9a..0bb8ef6 100644 --- a/server/src/service/project.service.ts +++ b/server/src/service/project.service.ts @@ -1,14 +1,17 @@ import { validate } from "class-validator"; -import { NewProjectDto } from "../dto/newProject.dto"; -import { UpdateProjectDto } from "../dto/updateProject.dto"; +import { NewProjectDto } from "../dto/project.new.dto"; +import { UpdateProjectDto } from "../dto/project.update.dto"; import { Project } from "../entity/project.entity"; import { User } from "../entity/user.entity"; import { projectRepository } from "../repository/project.repository"; import { UserService } from "./user.service"; -async function create(newProject: NewProjectDto): Promise { +async function create( + userId: User["id"], + newProject: NewProjectDto +): Promise { const project = new Project(); - const user = await UserService.findUserById(newProject.userId); + const user = await UserService.findUserById(userId); project.name = newProject.name; project.user = user; @@ -40,9 +43,9 @@ async function destroy(project: Project): Promise { async function update( project: Project, - updateProjectDto: UpdateProjectDto + data: UpdateProjectDto ): Promise { - projectRepository.merge(project, updateProjectDto); + projectRepository.merge(project, data); const updateResult = await projectRepository.save(project); return !!updateResult; @@ -64,5 +67,5 @@ export const ProjectService = { listAllByUserId, destroy, update, - findProjectFromUserById + findProjectFromUserById, }; diff --git a/server/src/service/task.service.ts b/server/src/service/task.service.ts index 27cf9ea..c75d258 100644 --- a/server/src/service/task.service.ts +++ b/server/src/service/task.service.ts @@ -1,4 +1,4 @@ -import { NewTaskDto } from "../dto/newTask.dto"; +import { NewTaskDto } from "../dto/task.new.dto"; import { Project } from "../entity/project.entity"; import { Task } from "../entity/task.entity"; import { taskRepository } from "../repository/task.repository"; diff --git a/server/src/service/user.service.ts b/server/src/service/user.service.ts index deb267e..110be2d 100644 --- a/server/src/service/user.service.ts +++ b/server/src/service/user.service.ts @@ -1,5 +1,5 @@ import { validate } from "class-validator" -import { NewUserDto } from "../dto/newUser.dto" +import { NewUserDto } from "../dto/user.new.dto" import { User } from "../entity/user.entity" import { userRepository } from "../repository/user.repository" import { AuthService } from "./auth.service"