166 lines
4.5 KiB
TypeScript
Executable File
166 lines
4.5 KiB
TypeScript
Executable File
import { Router, Request, Response } from "express";
|
|
import { storage } from "../storage";
|
|
import { prisma } from "@repo/db/client";
|
|
import {
|
|
insertAppointmentProcedureSchema,
|
|
updateAppointmentProcedureSchema,
|
|
} from "@repo/db/types";
|
|
|
|
const router = Router();
|
|
|
|
/**
|
|
* GET /api/appointment-procedures/:appointmentId
|
|
* Get all procedures for an appointment
|
|
*/
|
|
router.get("/:appointmentId", async (req: Request, res: Response) => {
|
|
try {
|
|
const appointmentId = Number(req.params.appointmentId);
|
|
if (isNaN(appointmentId)) {
|
|
return res.status(400).json({ message: "Invalid appointmentId" });
|
|
}
|
|
|
|
const rows = await storage.getByAppointmentId(appointmentId);
|
|
|
|
return res.json(rows);
|
|
} catch (err: any) {
|
|
console.error("GET appointment procedures error", err);
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
router.get(
|
|
"/prefill-from-appointment/:appointmentId",
|
|
async (req: Request, res: Response) => {
|
|
try {
|
|
const appointmentId = Number(req.params.appointmentId);
|
|
|
|
if (!appointmentId || isNaN(appointmentId)) {
|
|
return res.status(400).json({ error: "Invalid appointmentId" });
|
|
}
|
|
|
|
const data = await storage.getPrefillDataByAppointmentId(appointmentId);
|
|
|
|
if (!data) {
|
|
return res.status(404).json({ error: "Appointment not found" });
|
|
}
|
|
|
|
return res.json(data);
|
|
} catch (err: any) {
|
|
console.error("prefill-from-appointment error", err);
|
|
return res
|
|
.status(500)
|
|
.json({ error: err.message ?? "Failed to prefill claim data" });
|
|
}
|
|
}
|
|
);
|
|
|
|
/**
|
|
* POST /api/appointment-procedures
|
|
* Add single manual procedure
|
|
*/
|
|
router.post("/", async (req: Request, res: Response) => {
|
|
try {
|
|
const parsed = insertAppointmentProcedureSchema.parse(req.body);
|
|
|
|
const created = await storage.createProcedure(parsed);
|
|
|
|
return res.json(created);
|
|
} catch (err: any) {
|
|
console.error("POST appointment procedure error", err);
|
|
if (err.name === "ZodError") {
|
|
return res.status(400).json({ message: err.errors });
|
|
}
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* POST /api/appointment-procedures/bulk
|
|
* Add multiple procedures (combos)
|
|
*/
|
|
router.post("/bulk", async (req: Request, res: Response) => {
|
|
try {
|
|
const rows = req.body;
|
|
|
|
if (!Array.isArray(rows) || rows.length === 0) {
|
|
return res.status(400).json({ message: "Invalid payload" });
|
|
}
|
|
|
|
const count = await storage.createProceduresBulk(rows);
|
|
|
|
return res.json({ success: true, count });
|
|
} catch (err: any) {
|
|
console.error("POST bulk appointment procedures error", err);
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/appointment-procedures/:id
|
|
* Update a procedure
|
|
*/
|
|
router.put("/:id", async (req: Request, res: Response) => {
|
|
try {
|
|
const id = Number(req.params.id);
|
|
if (isNaN(id)) {
|
|
return res.status(400).json({ message: "Invalid id" });
|
|
}
|
|
|
|
const parsed = updateAppointmentProcedureSchema.parse(req.body);
|
|
|
|
const updated = await storage.updateProcedure(id, parsed);
|
|
|
|
return res.json(updated);
|
|
} catch (err: any) {
|
|
console.error("PUT appointment procedure error", err);
|
|
|
|
if (err.name === "ZodError") {
|
|
return res.status(400).json({ message: err.errors });
|
|
}
|
|
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* DELETE /api/appointment-procedures/:id
|
|
* Delete single procedure
|
|
*/
|
|
router.delete("/:id", async (req: Request, res: Response) => {
|
|
try {
|
|
const id = Number(req.params.id);
|
|
if (isNaN(id)) {
|
|
return res.status(400).json({ message: "Invalid id" });
|
|
}
|
|
|
|
await storage.deleteProcedure(id);
|
|
|
|
return res.json({ success: true });
|
|
} catch (err: any) {
|
|
console.error("DELETE appointment procedure error", err);
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* DELETE /api/appointment-procedures/clear/:appointmentId
|
|
* Clear all procedures for appointment
|
|
*/
|
|
router.delete("/clear/:appointmentId", async (req: Request, res: Response) => {
|
|
try {
|
|
const appointmentId = Number(req.params.appointmentId);
|
|
if (isNaN(appointmentId)) {
|
|
return res.status(400).json({ message: "Invalid appointmentId" });
|
|
}
|
|
|
|
await storage.clearByAppointmentId(appointmentId);
|
|
|
|
return res.json({ success: true });
|
|
} catch (err: any) {
|
|
console.error("CLEAR appointment procedures error", err);
|
|
return res.status(500).json({ message: err.message ?? "Server error" });
|
|
}
|
|
});
|
|
|
|
export default router;
|