import { Router } from "@oak/oak"; import { db } from "../config/database.ts"; import { authenticateToken } from "../middleware/auth.ts"; const router = new Router(); interface Activity { id: number; sub_department_id: number; name: string; unit_of_measurement: string; created_at: string; sub_department_name?: string; department_id?: number; department_name?: string; } // Get all activities (with optional filters) router.get("/", authenticateToken, async (ctx) => { try { const params = ctx.request.url.searchParams; const subDepartmentId = params.get("subDepartmentId"); const departmentId = params.get("departmentId"); let query = ` SELECT a.id, a.sub_department_id, a.name, a.unit_of_measurement, a.created_at, sd.name as sub_department_name, sd.department_id, d.name as department_name FROM activities a JOIN sub_departments sd ON a.sub_department_id = sd.id JOIN departments d ON sd.department_id = d.id WHERE 1=1 `; const queryParams: unknown[] = []; if (subDepartmentId) { query += " AND a.sub_department_id = ?"; queryParams.push(subDepartmentId); } if (departmentId) { query += " AND sd.department_id = ?"; queryParams.push(departmentId); } query += " ORDER BY d.name, sd.name, a.name"; const activities = await db.query(query, queryParams); ctx.response.body = activities; } catch (error) { console.error("Get activities error:", error); ctx.response.status = 500; ctx.response.body = { error: "Internal server error" }; } }); // Get activity by ID router.get("/:id", authenticateToken, async (ctx) => { try { const activityId = ctx.params.id; const activities = await db.query( `SELECT a.id, a.sub_department_id, a.name, a.unit_of_measurement, a.created_at, sd.name as sub_department_name, sd.department_id, d.name as department_name FROM activities a JOIN sub_departments sd ON a.sub_department_id = sd.id JOIN departments d ON sd.department_id = d.id WHERE a.id = ?`, [activityId] ); if (activities.length === 0) { ctx.response.status = 404; ctx.response.body = { error: "Activity not found" }; return; } ctx.response.body = activities[0]; } catch (error) { console.error("Get activity error:", error); ctx.response.status = 500; ctx.response.body = { error: "Internal server error" }; } }); // Create activity (SuperAdmin only) router.post("/", authenticateToken, async (ctx) => { try { const body = await ctx.request.body.json(); const { sub_department_id, name, unit_of_measurement } = body; if (!sub_department_id || !name) { ctx.response.status = 400; ctx.response.body = { error: "Sub-department ID and name are required" }; return; } const result = await db.execute( "INSERT INTO activities (sub_department_id, name, unit_of_measurement) VALUES (?, ?, ?)", [sub_department_id, name, unit_of_measurement || "Per Bag"] ); ctx.response.status = 201; ctx.response.body = { id: result.lastInsertId, message: "Activity created successfully" }; } catch (error) { console.error("Create activity error:", error); ctx.response.status = 500; ctx.response.body = { error: "Internal server error" }; } }); // Update activity router.put("/:id", authenticateToken, async (ctx) => { try { const activityId = ctx.params.id; const body = await ctx.request.body.json(); const { name, unit_of_measurement } = body; await db.execute( "UPDATE activities SET name = ?, unit_of_measurement = ? WHERE id = ?", [name, unit_of_measurement, activityId] ); ctx.response.body = { message: "Activity updated successfully" }; } catch (error) { console.error("Update activity error:", error); ctx.response.status = 500; ctx.response.body = { error: "Internal server error" }; } }); // Delete activity router.delete("/:id", authenticateToken, async (ctx) => { try { const activityId = ctx.params.id; await db.execute("DELETE FROM activities WHERE id = ?", [activityId]); ctx.response.body = { message: "Activity deleted successfully" }; } catch (error) { console.error("Delete activity error:", error); ctx.response.status = 500; ctx.response.body = { error: "Internal server error" }; } }); export default router;