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: `