add project update route
This commit is contained in:
@@ -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<ProjectDto>(project => ({
|
||||
const response: ProjectDto[] = projects.map<ProjectDto>((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",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
export type UpdateProjectDto = {
|
||||
id: string
|
||||
name: string
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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<Project> {
|
||||
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<Project[]> {
|
||||
return query.getMany();
|
||||
}
|
||||
|
||||
async function destroy(project: Project): Promise<boolean>{
|
||||
async function destroy(project: Project): Promise<boolean> {
|
||||
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<boolean> {
|
||||
projectRepository.merge(project, updateProjectDto);
|
||||
const updateResult = await projectRepository.save(project);
|
||||
|
||||
return !!updateResult;
|
||||
}
|
||||
|
||||
export const ProjectService = {
|
||||
create,
|
||||
listAllByUserId,
|
||||
destroy
|
||||
destroy,
|
||||
update,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user