import prisma from "../prisma/client.js"; import { sendEmail } from "../utils/sendEmail.js"; import { getEmailsByType } from "../utils/getEmailByTypes.js"; export const getAllCategories = async (req, res) => { try { const { admin } = req.query; const categories = await prisma.healthCheckCategory.findMany({ where: admin === "true" ? {} : { isActive: true }, orderBy: { sortOrder: "asc" }, include: { _count: { select: { packages: true } }, }, }); return res.status(200).json({ success: true, data: categories }); } catch (error) { return res .status(500) .json({ success: false, message: "Failed to fetch categories" }); } }; export const createCategory = async (req, res) => { try { const { name, slug, description, isActive, sortOrder } = req.body; const category = await prisma.healthCheckCategory.create({ data: { name, slug: slug || null, description, isActive: isActive ?? true, sortOrder: sortOrder ? Number(sortOrder) : 1000, }, }); return res .status(201) .json({ success: true, message: "Category created", data: category }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to create category" }); } }; export const updateCategory = async (req, res) => { try { const { id } = req.params; const data = { ...req.body }; delete data.id; delete data._count; delete data.createdAt; delete data.updatedAt; if (data.sortOrder !== undefined) data.sortOrder = Number(data.sortOrder); if (data.slug === "") data.slug = null; const updatedCategory = await prisma.$transaction(async (tx) => { const category = await tx.healthCheckCategory.update({ where: { id: Number(id) }, data, }); if (data.isActive === false) { await tx.healthPackage.updateMany({ where: { categoryId: Number(id) }, data: { isActive: false }, }); } return category; }); return res.status(200).json({ success: true, message: "Category updated", data: updatedCategory, }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to update category" }); } }; export const deleteCategory = async (req, res) => { try { const { id } = req.params; await prisma.healthCheckCategory.delete({ where: { id: Number(id) }, }); return res .status(200) .json({ success: true, message: "Category deleted successfully" }); } catch (error) { console.error(error); return res.status(500).json({ success: false, message: "Failed to delete category. Ensure no packages are linked to it.", }); } }; export const getAllPackages = async (req, res) => { try { const { admin, categorySlug } = req.query; const packages = await prisma.healthPackage.findMany({ where: { AND: [ admin === "true" ? {} : { isActive: true }, categorySlug ? { category: { slug: categorySlug } } : {}, ], }, include: { category: true, seo: true, }, orderBy: [{ sortOrder: "asc" }, { createdAt: "desc" }], }); return res.status(200).json({ success: true, data: packages }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to fetch packages" }); } }; export const createPackage = async (req, res) => { try { const { name, slug, description, price, image, discountedPrice, inclusions, categoryId, isActive, isFeatured, sortOrder, seo, } = req.body; const healthPackage = await prisma.healthPackage.create({ data: { name, slug, description, price, image, discountedPrice, inclusions, categoryId: Number(categoryId), isActive: isActive ?? true, isFeatured: isFeatured ?? false, sortOrder: sortOrder ? Number(sortOrder) : 1000, ...(seo && { seo: { create: { seoTitle: seo.seoTitle, metaDescription: seo.metaDescription, focusKeyphrase: seo.focusKeyphrase, slug: slug, tags: seo.tags || [], ogTitle: seo.ogTitle, ogDescription: seo.ogDescription, ogImage: seo.ogImage, }, }, }), }, include: { category: true, seo: true, }, }); return res .status(201) .json({ success: true, message: "Package created", data: healthPackage }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to create package" }); } }; export const updatePackage = async (req, res) => { try { const { id } = req.params; const data = { ...req.body }; delete data.id; delete data.category; delete data.createdAt; delete data.updatedAt; delete data.seoId; if (data.categoryId) data.categoryId = Number(data.categoryId); if (data.sortOrder) data.sortOrder = Number(data.sortOrder); const existingPackage = await prisma.healthPackage.findUnique({ where: { id: Number(id) }, select: { slug: true }, }); const seoSlug = data.slug || existingPackage.slug; const updated = await prisma.healthPackage.update({ where: { id: Number(id) }, data: { ...data, seo: data.seo ? { upsert: { create: { seoTitle: data.seo.seoTitle, metaDescription: data.seo.metaDescription, focusKeyphrase: data.seo.focusKeyphrase, slug: seoSlug, tags: data.seo.tags || [], ogTitle: data.seo.ogTitle, ogDescription: data.seo.ogDescription, ogImage: data.seo.ogImage, }, update: { seoTitle: data.seo.seoTitle, metaDescription: data.seo.metaDescription, focusKeyphrase: data.seo.focusKeyphrase, slug: seoSlug, tags: data.seo.tags || [], ogTitle: data.seo.ogTitle, ogDescription: data.seo.ogDescription, ogImage: data.seo.ogImage, }, }, } : undefined, }, include: { category: true, seo: true, }, }); return res .status(200) .json({ success: true, message: "Package updated", data: updated }); } catch (error) { console.error(error); return res.status(500).json({ success: false, message: "Update failed" }); } }; export const deletePackage = async (req, res) => { try { const { id } = req.params; await prisma.healthPackage.delete({ where: { id: Number(id) }, }); return res.status(200).json({ success: true, message: "Package deleted", }); } catch (error) { console.error(error); return res.status(500).json({ success: false, message: "Delete failed", }); } }; export const createPackageInquiry = async (req, res) => { try { const { fullName, mobileNumber, email, age, gender, preferredDate, packageId, message, } = req.body; const inquiry = await prisma.healthPackageInquiry.create({ data: { fullName, mobileNumber, email, age: age ? Number(age) : null, gender, preferredDate: preferredDate ? new Date(preferredDate) : null, message, packageId: Number(packageId), }, include: { healthPackage: true, }, }); try { const emailList = await getEmailsByType("HCINQUIRY"); if (emailList) { await sendEmail({ to: emailList, subject: "New Health Checkup Package Inquiry", html: `

GG Hospital

New Health Checkup Package Inquiry

Inquirer Details

Name: ${fullName}
Phone: ${mobileNumber}
Email: ${email || "-"}
Age: ${age || "-"}
Gender: ${gender || "-"}

Package Details

Package Name: ${inquiry.healthPackage?.name || "Unknown Package"}
Preferred Date: ${ preferredDate ? new Date(preferredDate).toLocaleDateString("en-GB", { day: "2-digit", month: "long", year: "numeric", }) : "Not specified" }

Message

${message ? message.replace(/\n/g, "
") : "-"}
This inquiry was submitted via the GG Hospital website.
`, }); } } catch (err) { console.error("Email failed:", err); } return res.status(201).json({ success: true, message: "Booking inquiry sent successfully", data: inquiry, }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to submit inquiry" }); } }; export const getPackageBySlug = async (req, res) => { try { const { slug } = req.params; const healthPackage = await prisma.healthPackage.findFirst({ where: { slug, isActive: true }, include: { category: true, seo: true, }, }); if (!healthPackage) { return res .status(404) .json({ success: false, message: "Package not found" }); } return res.status(200).json({ success: true, data: healthPackage, }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to fetch package" }); } }; export const getAllInquiries = async (req, res) => { try { const { page = 1, limit = 10, filterDate, startDate, endDate } = req.query; const queryPage = parseInt(page); const queryLimit = parseInt(limit); const skip = (queryPage - 1) * queryLimit; let where = {}; if (filterDate) { where.preferredDate = { gte: new Date(`${filterDate}T00:00:00.000Z`), lte: new Date(`${filterDate}T23:59:59.999Z`), }; } else if (startDate || endDate) { where.preferredDate = {}; if (startDate) { where.preferredDate.gte = new Date(`${startDate}T00:00:00.000Z`); } if (endDate) { where.preferredDate.lte = new Date(`${endDate}T23:59:59.999Z`); } } const [total, inquiries] = await prisma.$transaction([ prisma.healthPackageInquiry.count({ where }), prisma.healthPackageInquiry.findMany({ where, skip, take: queryLimit, include: { healthPackage: { include: { category: true, }, }, }, orderBy: { createdAt: "desc" }, }), ]); return res.status(200).json({ success: true, data: inquiries, pagination: { total, page: queryPage, limit: queryLimit, totalPages: Math.ceil(total / queryLimit), }, }); } catch (error) { console.error(error); return res .status(500) .json({ success: false, message: "Failed to fetch inquiries" }); } };