import prisma from "../prisma/client.js"; import { sendEmail } from "../utils/sendEmail.js"; import { getEmailsByType } from "../utils/getEmailByTypes.js"; export const createAppointment = async (req, res) => { try { const { name, mobileNumber, email, message, date, doctorId, departmentId } = req.body; if (!name || !mobileNumber || !doctorId || !departmentId || !date) { return res.status(400).json({ success: false, message: "Required fields missing", }); } const appointment = await prisma.appointment.create({ data: { name, mobileNumber, email, message, date: new Date(date), doctorId, departmentId, }, include: { doctor: true, department: true, }, }); try { const emailList = await getEmailsByType("APPOINTMENT"); if (emailList) { await sendEmail({ to: emailList, subject: "New Appointment Booked", html: `

GG Hospital

New Appointment Booked

Patient Details

Name: ${name}
Phone: ${mobileNumber}
Email: ${email || "-"}

Appointment Details

Doctor: ${appointment.doctor?.name || "-"}
Department: ${appointment.department?.name || "-"}
Date: ${new Date(date).toLocaleDateString("en-GB", { day: "2-digit", month: "long", year: "numeric", })}

Message

${message ? message.replace(/\n/g, "
") : "-"}
This appointment was booked via the GG Hospital website.
`, }); } } catch (err) { console.error("Email failed:", err); } res.status(201).json({ success: true, message: "Appointment booked successfully", data: appointment, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to create appointment", }); } }; // GET ALL APPOINTMENTS export const getAppointments = async (req, res) => { try { const page = parseInt(req.query.page) || 1; const limit = parseInt(req.query.limit) || 10; const skip = (page - 1) * limit; const { date, startDate, endDate, search } = req.query; const where = {}; const hasSingleDate = date && date.trim() !== ""; const hasRange = (startDate && startDate.trim() !== "") || (endDate && endDate.trim() !== ""); if (hasSingleDate) { const start = new Date(date); start.setHours(0, 0, 0, 0); const end = new Date(date); end.setHours(23, 59, 59, 999); where.date = { gte: start, lte: end, }; } if (!hasSingleDate && hasRange) { const dateFilter = {}; if (startDate && startDate.trim() !== "") { const start = new Date(startDate); start.setHours(0, 0, 0, 0); dateFilter.gte = start; } if (endDate && endDate.trim() !== "") { const end = new Date(endDate); end.setHours(23, 59, 59, 999); dateFilter.lte = end; } where.date = dateFilter; } if (search && search.trim() !== "") { where.OR = [ { name: { contains: search, mode: "insensitive" } }, { mobileNumber: { contains: search } }, { email: { contains: search, mode: "insensitive" } }, ]; } const [appointments, total] = await Promise.all([ prisma.appointment.findMany({ where, include: { doctor: true, department: true, }, orderBy: { createdAt: "desc", }, skip, take: limit, }), prisma.appointment.count({ where, }), ]); res.status(200).json({ success: true, data: appointments, pagination: { total, page, limit, totalPages: Math.ceil(total / limit), }, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to fetch appointments", }); } }; // GET SINGLE APPOINTMENT export const getAppointment = async (req, res) => { try { const { id } = req.params; const appointment = await prisma.appointment.findUnique({ where: { id: Number(id), }, include: { doctor: true, department: true, }, }); if (!appointment) { return res.status(404).json({ success: false, message: "Appointment not found", }); } res.status(200).json({ success: true, data: appointment, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to fetch appointment", }); } }; // GET APPOINTMENTS BY DOCTOR export const getAppointmentsByDoctor = async (req, res) => { try { const { doctorId } = req.params; const appointments = await prisma.appointment.findMany({ where: { doctorId, }, include: { doctor: true, department: true, }, orderBy: { date: "asc", }, }); res.status(200).json({ success: true, data: appointments, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to fetch doctor appointments", }); } }; // GET APPOINTMENTS BY DEPARTMENT export const getAppointmentsByDepartment = async (req, res) => { try { const { departmentId } = req.params; const appointments = await prisma.appointment.findMany({ where: { departmentId, }, include: { doctor: true, department: true, }, }); res.status(200).json({ success: true, data: appointments, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to fetch department appointments", }); } }; // UPDATE APPOINTMENT export const updateAppointment = async (req, res) => { try { const { id } = req.params; const appointment = await prisma.appointment.update({ where: { id: Number(id), }, data: req.body, include: { doctor: true, department: true, }, }); res.status(200).json({ success: true, message: "Appointment updated successfully", data: appointment, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to update appointment", }); } }; //DELETE APPOINTMENT export const deleteAppointment = async (req, res) => { try { const { id } = req.params; await prisma.appointment.delete({ where: { id: Number(id), }, }); res.status(200).json({ success: true, message: "Appointment deleted successfully", }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Failed to delete appointment", }); } };