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', }); } };