425 lines
10 KiB
JavaScript
425 lines
10 KiB
JavaScript
import prisma from '../prisma/client.js';
|
|
|
|
export const getAllFacilities = async (req, res) => {
|
|
try {
|
|
const { admin } = req.query;
|
|
|
|
const facilities = await prisma.facility.findMany({
|
|
where: admin === 'true' ? {} : { isActive: true },
|
|
include: {
|
|
seo: true,
|
|
department: true,
|
|
images: true,
|
|
},
|
|
orderBy: [{ sortOrder: 'asc' }, { name: 'asc' }],
|
|
});
|
|
|
|
const formatted = facilities.map((fac, index) => ({
|
|
SL_NO: String(index + 1),
|
|
id: fac.id,
|
|
facilityId: fac.facilityId,
|
|
name: fac.name,
|
|
slug: fac.slug,
|
|
shortDescription: fac.shortDescription,
|
|
description: fac.description,
|
|
videoUrl: fac.videoUrl ?? '',
|
|
isActive: fac.isActive,
|
|
isFeatured: fac.isFeatured,
|
|
sortOrder: fac.sortOrder,
|
|
department: fac.department
|
|
? {
|
|
id: fac.department.id,
|
|
departmentId: fac.department.departmentId,
|
|
name: fac.department.name,
|
|
}
|
|
: null,
|
|
images: fac.images.map((img) => ({
|
|
id: img.id,
|
|
url: img.url,
|
|
altText: img.altText ?? '',
|
|
description: img.description ?? '',
|
|
})),
|
|
seo: {
|
|
seoTitle: fac.seo?.seoTitle ?? '',
|
|
metaDescription: fac.seo?.metaDescription ?? '',
|
|
focusKeyphrase: fac.seo?.focusKeyphrase ?? '',
|
|
slug: fac.seo?.slug ?? '',
|
|
tags: fac.seo?.tags ?? [],
|
|
ogTitle: fac.seo?.ogTitle ?? '',
|
|
ogDescription: fac.seo?.ogDescription ?? '',
|
|
ogImage: fac.seo?.ogImage ?? '',
|
|
},
|
|
}));
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: formatted,
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Failed to fetch facilities',
|
|
});
|
|
}
|
|
};
|
|
|
|
export const getFacilityByFacilityId = async (req, res) => {
|
|
try {
|
|
const { facilityId } = req.params;
|
|
const { admin } = req.query;
|
|
|
|
const facility = await prisma.facility.findFirst({
|
|
where: {
|
|
facilityId,
|
|
...(admin === 'true' ? {} : { isActive: true }),
|
|
},
|
|
include: {
|
|
seo: true,
|
|
department: true,
|
|
images: true,
|
|
},
|
|
});
|
|
|
|
if (!facility) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: 'Facility not found',
|
|
});
|
|
}
|
|
|
|
const response = {
|
|
facilityId: facility.facilityId,
|
|
name: facility.name,
|
|
slug: facility.slug,
|
|
shortDescription: facility.shortDescription,
|
|
description: facility.description,
|
|
videoUrl: facility.videoUrl ?? '',
|
|
isActive: facility.isActive,
|
|
isFeatured: facility.isFeatured,
|
|
sortOrder: facility.sortOrder,
|
|
department: facility.department
|
|
? {
|
|
departmentId: facility.department.departmentId,
|
|
name: facility.department.name,
|
|
}
|
|
: null,
|
|
images: facility.images.map((img) => ({
|
|
id: img.id,
|
|
url: img.url,
|
|
altText: img.altText ?? '',
|
|
description: img.description ?? '',
|
|
})),
|
|
seo: {
|
|
seoTitle: facility.seo?.seoTitle ?? '',
|
|
metaDescription: facility.seo?.metaDescription ?? '',
|
|
focusKeyphrase: facility.seo?.focusKeyphrase ?? '',
|
|
slug: facility.seo?.slug ?? '',
|
|
tags: facility.seo?.tags ?? [],
|
|
ogTitle: facility.seo?.ogTitle ?? '',
|
|
ogDescription: facility.seo?.ogDescription ?? '',
|
|
ogImage: facility.seo?.ogImage ?? '',
|
|
},
|
|
};
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: response,
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Failed to fetch facility',
|
|
});
|
|
}
|
|
};
|
|
|
|
export const createFacility = async (req, res) => {
|
|
try {
|
|
const {
|
|
facilityId,
|
|
name,
|
|
slug,
|
|
shortDescription,
|
|
description,
|
|
videoUrl,
|
|
isActive,
|
|
isFeatured,
|
|
sortOrder,
|
|
departmentId,
|
|
images,
|
|
seoTitle,
|
|
metaDescription,
|
|
focusKeyphrase,
|
|
tags,
|
|
ogTitle,
|
|
ogDescription,
|
|
ogImage,
|
|
} = req.body;
|
|
|
|
const messages = [];
|
|
if (!facilityId) messages.push('Facility ID is required');
|
|
if (!name?.trim()) messages.push('Facility name is required');
|
|
if (!slug?.trim()) messages.push('Slug is required');
|
|
|
|
if (messages.length > 0) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: messages.join(', '),
|
|
});
|
|
}
|
|
|
|
let dbDepartmentId = null;
|
|
if (departmentId) {
|
|
const targetDept = await prisma.department.findUnique({
|
|
where: { departmentId: departmentId },
|
|
});
|
|
if (targetDept) {
|
|
dbDepartmentId = targetDept.id;
|
|
}
|
|
}
|
|
|
|
const seo = await prisma.seo.create({
|
|
data: {
|
|
seoTitle,
|
|
metaDescription,
|
|
focusKeyphrase,
|
|
slug: slug ? slug : null,
|
|
tags: tags || [],
|
|
ogTitle,
|
|
ogDescription,
|
|
ogImage,
|
|
},
|
|
});
|
|
|
|
const facility = await prisma.facility.create({
|
|
data: {
|
|
facilityId,
|
|
name,
|
|
slug,
|
|
shortDescription,
|
|
description,
|
|
videoUrl,
|
|
isActive: isActive !== undefined ? isActive : true,
|
|
isFeatured: isFeatured !== undefined ? isFeatured : false,
|
|
sortOrder: sortOrder !== undefined ? Number(sortOrder) : 1000,
|
|
departmentId: dbDepartmentId,
|
|
seoId: seo.id,
|
|
},
|
|
});
|
|
|
|
if (images && images.length > 0) {
|
|
await prisma.facilityImage.createMany({
|
|
data: images.map((img) => ({
|
|
url: img.url,
|
|
altText: img.altText || null,
|
|
description: img.description || null,
|
|
facilityId: facility.id,
|
|
})),
|
|
});
|
|
}
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: 'Facility created successfully',
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Failed to create facility',
|
|
});
|
|
}
|
|
};
|
|
|
|
export const updateFacility = async (req, res) => {
|
|
try {
|
|
const { facilityId, action } = req.params;
|
|
const {
|
|
name,
|
|
slug,
|
|
shortDescription,
|
|
description,
|
|
videoUrl,
|
|
isActive,
|
|
isFeatured,
|
|
sortOrder,
|
|
departmentId,
|
|
images,
|
|
seoTitle,
|
|
metaDescription,
|
|
focusKeyphrase,
|
|
tags,
|
|
ogTitle,
|
|
ogDescription,
|
|
ogImage,
|
|
} = req.body;
|
|
|
|
if (!facilityId) {
|
|
return res.status(400).json({ success: false, message: 'Facility ID is required' });
|
|
}
|
|
|
|
const facility = await prisma.facility.findUnique({ where: { facilityId } });
|
|
if (!facility) return res.status(404).json({ success: false, message: 'Facility not found' });
|
|
|
|
if (action === 'toggleStatus') {
|
|
await prisma.facility.update({
|
|
where: { id: facility.id },
|
|
data: { isActive: !facility.isActive },
|
|
});
|
|
return res.status(200).json({
|
|
success: true,
|
|
message: `Facility has been ${facility.isActive ? 'deactivated' : 'activated'} successfully`,
|
|
});
|
|
}
|
|
|
|
if (action === 'toggleFeatured') {
|
|
await prisma.facility.update({
|
|
where: { id: facility.id },
|
|
data: { isFeatured: !facility.isFeatured },
|
|
});
|
|
return res.status(200).json({
|
|
success: true,
|
|
message: `Facility has been ${facility.isFeatured ? 'removed from featured' : 'marked as featured'} successfully`,
|
|
});
|
|
}
|
|
|
|
const messages = [];
|
|
if (!name?.trim()) messages.push('Facility name is required');
|
|
if (!slug?.trim()) messages.push('Slug is required');
|
|
|
|
if (messages.length > 0) {
|
|
return res.status(400).json({ success: false, message: messages.join(', ') });
|
|
}
|
|
|
|
let dbDepartmentId = undefined;
|
|
if (departmentId !== undefined) {
|
|
if (departmentId) {
|
|
const targetDept = await prisma.department.findUnique({
|
|
where: { departmentId: departmentId },
|
|
});
|
|
dbDepartmentId = targetDept ? targetDept.id : null;
|
|
} else {
|
|
dbDepartmentId = null;
|
|
}
|
|
}
|
|
|
|
await prisma.facility.update({
|
|
where: { id: facility.id },
|
|
data: {
|
|
name,
|
|
slug,
|
|
shortDescription,
|
|
description,
|
|
videoUrl,
|
|
isActive: isActive !== undefined ? isActive : undefined,
|
|
isFeatured: isFeatured !== undefined ? isFeatured : undefined,
|
|
sortOrder: sortOrder !== undefined ? Number(sortOrder) : undefined,
|
|
departmentId: dbDepartmentId,
|
|
},
|
|
});
|
|
|
|
if (facility.seoId) {
|
|
await prisma.seo.update({
|
|
where: { id: facility.seoId },
|
|
data: {
|
|
seoTitle,
|
|
metaDescription,
|
|
focusKeyphrase,
|
|
slug: slug ? slug : null,
|
|
tags: tags || [],
|
|
ogTitle,
|
|
ogDescription,
|
|
ogImage,
|
|
},
|
|
});
|
|
} else {
|
|
const seo = await prisma.seo.create({
|
|
data: {
|
|
seoTitle,
|
|
metaDescription,
|
|
focusKeyphrase,
|
|
slug: slug ? slug : null,
|
|
tags: tags || [],
|
|
ogTitle,
|
|
ogDescription,
|
|
ogImage,
|
|
},
|
|
});
|
|
await prisma.facility.update({ where: { id: facility.id }, data: { seoId: seo.id } });
|
|
}
|
|
|
|
if (Array.isArray(images)) {
|
|
await prisma.facilityImage.deleteMany({ where: { facilityId: facility.id } });
|
|
if (images.length > 0) {
|
|
await prisma.facilityImage.createMany({
|
|
data: images.map((img) => ({
|
|
url: img.url,
|
|
altText: img.altText || null,
|
|
description: img.description || null,
|
|
facilityId: facility.id,
|
|
})),
|
|
});
|
|
}
|
|
}
|
|
|
|
res.status(200).json({ success: true, message: 'Facility updated successfully' });
|
|
} catch (error) {
|
|
console.error('Update Error:', error);
|
|
res.status(500).json({ success: false, message: 'Failed to update facility' });
|
|
}
|
|
};
|
|
|
|
export const deleteFacility = async (req, res) => {
|
|
try {
|
|
const { facilityId } = req.params;
|
|
|
|
const facility = await prisma.facility.findUnique({ where: { facilityId } });
|
|
if (!facility) {
|
|
return res.status(404).json({ success: false, message: 'Facility not found' });
|
|
}
|
|
|
|
await prisma.facilityImage.deleteMany({ where: { facilityId: facility.id } });
|
|
await prisma.facility.delete({ where: { id: facility.id } });
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: 'Facility deleted successfully',
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ success: false, message: 'Failed to delete facility' });
|
|
}
|
|
};
|
|
|
|
export const getFeaturedFacilities = async (req, res) => {
|
|
try {
|
|
const facilities = await prisma.facility.findMany({
|
|
where: { isActive: true, isFeatured: true },
|
|
include: {
|
|
images: true,
|
|
department: true,
|
|
},
|
|
orderBy: [{ sortOrder: 'asc' }, { name: 'asc' }],
|
|
});
|
|
|
|
const data = facilities.map((fac) => ({
|
|
facilityId: fac.facilityId,
|
|
name: fac.name,
|
|
slug: fac.slug,
|
|
shortDescription: fac.shortDescription,
|
|
images: fac.images.map((img) => ({
|
|
id: img.id,
|
|
url: img.url,
|
|
})),
|
|
departmentName: fac.department?.name ?? '',
|
|
}));
|
|
|
|
res.status(200).json({ success: true, data });
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ success: false, message: 'Failed to fetch featured facilities' });
|
|
}
|
|
};
|