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