172 lines
3.5 KiB
TypeScript
172 lines
3.5 KiB
TypeScript
import { Router } from "express";
|
|
import { ProjectDto } from "../dto/poject.dto";
|
|
import { ProjectService } from "../service/project.service";
|
|
import { TaskService } from "../service/task.service";
|
|
|
|
const router = Router();
|
|
export const TaskRoutes = router;
|
|
|
|
export const apiNamespace = "/projects/:projectId";
|
|
|
|
router.get(`${apiNamespace}/tasks`, async (req, res) => {
|
|
let { projectId } = req.params;
|
|
const parsedProjctId = parseInt(projectId);
|
|
|
|
const project = await ProjectService.findProjectFromUserById(
|
|
req.userId,
|
|
parsedProjctId
|
|
);
|
|
|
|
if (!project) {
|
|
res.status(404).json({
|
|
error: "Project not found",
|
|
});
|
|
return;
|
|
}
|
|
|
|
const tasks: TaskDto[] = (
|
|
await TaskService.findByProjectId(parsedProjctId)
|
|
).map((task) => ({
|
|
id: task.id,
|
|
description: task.description,
|
|
createdAt: task.createdAt,
|
|
finishedAt: task.finishedAt,
|
|
}));
|
|
|
|
res.json({
|
|
data: tasks,
|
|
});
|
|
});
|
|
|
|
router.post(`${apiNamespace}/tasks`, async (req, res) => {
|
|
let { projectId } = req.params;
|
|
const parsedProjctId = parseInt(projectId);
|
|
|
|
const project = await ProjectService.findProjectFromUserById(
|
|
req.userId,
|
|
parsedProjctId
|
|
);
|
|
|
|
if (!project) {
|
|
res.status(404).json();
|
|
return;
|
|
}
|
|
|
|
const task = await TaskService.create(project, {
|
|
description: req.body.description,
|
|
});
|
|
|
|
const taskDto: TaskDto = {
|
|
id: task.id,
|
|
createdAt: task.createdAt,
|
|
description: task.description,
|
|
finishedAt: task.finishedAt,
|
|
};
|
|
|
|
res.json({
|
|
data: taskDto,
|
|
});
|
|
});
|
|
|
|
router.put(`${apiNamespace}/tasks/:id`, async (req, res) => {
|
|
let { projectId, id } = req.params;
|
|
const { description }: UpdateTaskDto = req.body;
|
|
|
|
const parsedProjctId = parseInt(projectId);
|
|
|
|
const project = await ProjectService.findProjectFromUserById(
|
|
req.userId,
|
|
parsedProjctId
|
|
);
|
|
|
|
if (!project) {
|
|
res.status(404).json();
|
|
return;
|
|
}
|
|
|
|
const task = await TaskService.findByProjectIdAndTaskId(
|
|
parsedProjctId,
|
|
parseInt(id)
|
|
);
|
|
|
|
await TaskService.update(task, { description });
|
|
|
|
const taskDto: TaskDto = {
|
|
id: task.id,
|
|
createdAt: task.createdAt,
|
|
description: task.description,
|
|
finishedAt: task.finishedAt,
|
|
};
|
|
|
|
res.json({
|
|
data: taskDto,
|
|
});
|
|
});
|
|
|
|
router.delete(`${apiNamespace}/tasks/:id`, async (req, res) => {
|
|
let { projectId, id } = req.params;
|
|
const parsedProjctId = parseInt(projectId);
|
|
|
|
const project = await ProjectService.findProjectFromUserById(
|
|
req.userId,
|
|
parsedProjctId
|
|
);
|
|
|
|
if (!project) {
|
|
res.status(404).json();
|
|
return;
|
|
}
|
|
|
|
const task = await TaskService.findByProjectIdAndTaskId(
|
|
parsedProjctId,
|
|
parseInt(id)
|
|
);
|
|
|
|
if (!task) {
|
|
res.status(404).json();
|
|
return;
|
|
}
|
|
|
|
const success = await TaskService.destroy(task);
|
|
|
|
if (success) {
|
|
res.status(204).json();
|
|
} else {
|
|
res.status(504).json();
|
|
}
|
|
});
|
|
|
|
router.get(`${apiNamespace}/tasks/:id/finish`, async (req, res) => {
|
|
const { projectId, id } = req.params;
|
|
const parsedProjctId = parseInt(projectId);
|
|
|
|
const project = await ProjectService.findProjectFromUserById(
|
|
req.userId,
|
|
parsedProjctId
|
|
);
|
|
|
|
|
|
const task = await TaskService.findByProjectIdAndTaskId(
|
|
parsedProjctId,
|
|
parseInt(id)
|
|
);
|
|
|
|
if (!project || !task) {
|
|
res.status(404).json();
|
|
return;
|
|
}
|
|
|
|
const result = await TaskService.finish(task);
|
|
|
|
const resultDto: TaskDto = {
|
|
id: result.id,
|
|
createdAt: result.createdAt,
|
|
description: result.description,
|
|
finishedAt: result.finishedAt,
|
|
};
|
|
|
|
res.json({
|
|
data: resultDto,
|
|
});
|
|
});
|