330 lines
11 KiB
TypeScript
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;
|