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 }, 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, discountedPrice, inclusions, categoryId, isActive, isFeatured, sortOrder, } = req.body; const healthPackage = await prisma.healthPackage.create({ data: { name, slug, description, price, discountedPrice, inclusions, categoryId: Number(categoryId), isActive: isActive ?? true, isFeatured: isFeatured ?? false, sortOrder: sortOrder ? Number(sortOrder) : 1000, }, }); 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; if (data.categoryId) data.categoryId = Number(data.categoryId); if (data.sortOrder) data.sortOrder = Number(data.sortOrder); const updated = await prisma.healthPackage.update({ where: { id: Number(id) }, data, }); 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: `