arcadiasuite/server/para/routes.ts

330 lines
11 KiB
TypeScript

import { Router, Request, Response, NextFunction } from "express";
import { paraStorage } from "./storage";
import { insertParaProjectSchema, insertParaAreaSchema, insertParaResourceSchema, insertParaTaskSchema } from "@shared/schema";
const router = Router();
function requireAuth(req: Request, res: Response, next: NextFunction) {
if (!req.isAuthenticated() || !req.user) {
return res.status(401).json({ error: "Não autorizado" });
}
next();
}
router.use(requireAuth);
// ========== DASHBOARD ==========
router.get("/dashboard", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const dashboard = await paraStorage.getDashboard(userId);
res.json(dashboard);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ========== PROJECTS ==========
router.get("/projects", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const status = req.query.status as string | undefined;
const projects = await paraStorage.getProjects(userId, status);
res.json(projects);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.get("/projects/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const project = await paraStorage.getProject(id, userId);
if (!project) return res.status(404).json({ error: "Projeto não encontrado" });
res.json(project);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.post("/projects", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const parsed = insertParaProjectSchema.parse({ ...req.body, userId });
const project = await paraStorage.createProject(parsed);
res.status(201).json(project);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.patch("/projects/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const project = await paraStorage.updateProject(id, userId, req.body);
if (!project) return res.status(404).json({ error: "Projeto não encontrado" });
res.json(project);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.delete("/projects/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const deleted = await paraStorage.deleteProject(id, userId);
if (!deleted) return res.status(404).json({ error: "Projeto não encontrado" });
res.json({ success: true });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ========== AREAS ==========
router.get("/areas", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const status = req.query.status as string | undefined;
const areas = await paraStorage.getAreas(userId, status);
res.json(areas);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.get("/areas/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const area = await paraStorage.getArea(id, userId);
if (!area) return res.status(404).json({ error: "Área não encontrada" });
res.json(area);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.post("/areas", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const parsed = insertParaAreaSchema.parse({ ...req.body, userId });
const area = await paraStorage.createArea(parsed);
res.status(201).json(area);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.patch("/areas/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const area = await paraStorage.updateArea(id, userId, req.body);
if (!area) return res.status(404).json({ error: "Área não encontrada" });
res.json(area);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.delete("/areas/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const deleted = await paraStorage.deleteArea(id, userId);
if (!deleted) return res.status(404).json({ error: "Área não encontrada" });
res.json({ success: true });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ========== RESOURCES ==========
router.get("/resources", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const filters = {
projectId: req.query.projectId ? parseInt(req.query.projectId as string) : undefined,
areaId: req.query.areaId ? parseInt(req.query.areaId as string) : undefined,
status: req.query.status as string | undefined,
};
const resources = await paraStorage.getResources(userId, filters);
res.json(resources);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.get("/resources/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const resource = await paraStorage.getResource(id, userId);
if (!resource) return res.status(404).json({ error: "Recurso não encontrado" });
res.json(resource);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.post("/resources", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const parsed = insertParaResourceSchema.parse({ ...req.body, userId });
const resource = await paraStorage.createResource(parsed);
res.status(201).json(resource);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.patch("/resources/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const resource = await paraStorage.updateResource(id, userId, req.body);
if (!resource) return res.status(404).json({ error: "Recurso não encontrado" });
res.json(resource);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.delete("/resources/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const deleted = await paraStorage.deleteResource(id, userId);
if (!deleted) return res.status(404).json({ error: "Recurso não encontrado" });
res.json({ success: true });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ========== TASKS (Tríade do Tempo) ==========
router.get("/tasks", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const filters = {
projectId: req.query.projectId ? parseInt(req.query.projectId as string) : undefined,
areaId: req.query.areaId ? parseInt(req.query.areaId as string) : undefined,
triadCategory: req.query.triadCategory as string | undefined,
status: req.query.status as string | undefined,
};
const tasks = await paraStorage.getTasks(userId, filters);
res.json(tasks);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.get("/tasks/triad-stats", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const stats = await paraStorage.getTriadStats(userId);
res.json(stats);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.get("/tasks/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const task = await paraStorage.getTask(id, userId);
if (!task) return res.status(404).json({ error: "Tarefa não encontrada" });
res.json(task);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.post("/tasks", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const parsed = insertParaTaskSchema.parse({ ...req.body, userId });
const task = await paraStorage.createTask(parsed);
res.status(201).json(task);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.patch("/tasks/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const task = await paraStorage.updateTask(id, userId, req.body);
if (!task) return res.status(404).json({ error: "Tarefa não encontrada" });
res.json(task);
} catch (error: any) {
res.status(400).json({ error: error.message });
}
});
router.post("/tasks/:id/complete", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const task = await paraStorage.completeTask(id, userId);
if (!task) return res.status(404).json({ error: "Tarefa não encontrada" });
res.json(task);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.delete("/tasks/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const deleted = await paraStorage.deleteTask(id, userId);
if (!deleted) return res.status(404).json({ error: "Tarefa não encontrada" });
res.json({ success: true });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ========== ARCHIVE ==========
router.get("/archive", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const archive = await paraStorage.getArchive(userId);
res.json(archive);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.post("/archive/:id/restore", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const item = await paraStorage.restoreFromArchive(id, userId);
if (!item) return res.status(404).json({ error: "Item não encontrado" });
res.json(item);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
router.delete("/archive/:id", async (req: Request, res: Response) => {
try {
const userId = (req.user as any).id;
const id = parseInt(req.params.id);
const deleted = await paraStorage.deleteFromArchive(id, userId);
if (!deleted) return res.status(404).json({ error: "Item não encontrado" });
res.json({ success: true });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
export default router;