const PartnershipsPage = require("../models/partnerships"); const AUDIT_ACTIONS = require("../constants/auditAction"); const partnershipsConfig = require("../utils/contentEditors/partnershipsConfig"); const createPageContentController = require("./_createPageContentController"); const createRenderSingletonPageView = require("./_renderSingletonPageView"); function toInquiryField(id, field, type, width) { return { id, label: field?.label || "", placeholder: field?.placeholder || "", type, width, required: true, options: Array.isArray(field?.options) ? field.options : [], }; } function normalizeInquiryForm(data) { if (!data?.inquiryForm) { return data; } if (Array.isArray(data.inquiryForm.fields)) { return data; } const legacyFields = data.inquiryForm.fields || {}; return { ...data, inquiryForm: { ...data.inquiryForm, fields: [ toInquiryField("firstName", legacyFields.firstName, "text", "half"), toInquiryField("lastName", legacyFields.lastName, "text", "half"), toInquiryField("organization", legacyFields.organization, "text", "full"), toInquiryField( "partnershipType", legacyFields.partnershipType, "select", "full", ), toInquiryField("message", legacyFields.message, "textarea", "full"), ].filter((field) => field.label || field.placeholder || field.id), }, }; } function prepareInquiryPayload(payload) { const normalized = normalizeInquiryForm(payload); const fields = Array.isArray(normalized?.inquiryForm?.fields) ? normalized.inquiryForm.fields : []; return { ...normalized, inquiryForm: { ...normalized.inquiryForm, fields: fields.map((field, index) => ({ id: String(field.id || `field-${index + 1}`) .trim() .replace(/\s+/g, "") .replace(/[^a-zA-Z0-9_-]/g, "") || `field-${index + 1}`, label: field.label || "", placeholder: field.placeholder || "", type: field.type || "text", width: field.width || "full", required: Boolean(field.required), options: Array.isArray(field.options) ? field.options.filter(Boolean) : [], })), }, }; } const controller = createPageContentController({ model: PartnershipsPage, modelName: "PartnershipsPage", auditAction: AUDIT_ACTIONS.UPDATE_PARTNERSHIPS, editorConfig: partnershipsConfig, normalizeForEditor: normalizeInquiryForm, normalizeForApi: normalizeInquiryForm, preparePayload: prepareInquiryPayload, }); controller.index = async function index(req, res) { try { return await createRenderSingletonPageView({ model: PartnershipsPage, editorConfig: partnershipsConfig, view: "admin/partnerships/index", normalizeForEditor: normalizeInquiryForm, })(req, res); } catch (error) { console.error("partnerships index error:", error); req.flash("error_msg", "Error loading Partnerships Management"); return req.session.save(() => res.redirect("/admin/dashboard")); } }; module.exports = controller;