forked from UKSOURCE/cms.lams
149 lines
4.0 KiB
JavaScript
149 lines
4.0 KiB
JavaScript
const mongoose = require("mongoose");
|
|
|
|
const ctaButtonSchema = new mongoose.Schema(
|
|
{
|
|
label: { type: String, default: "" },
|
|
href: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const heroSchema = new mongoose.Schema(
|
|
{
|
|
badge: { type: String, default: "" },
|
|
title: { type: String, default: "" },
|
|
description: { type: String, default: "" },
|
|
primaryButton: { type: ctaButtonSchema, default: () => ({}) },
|
|
secondaryButton: { type: ctaButtonSchema, default: () => ({}) },
|
|
image: { type: String, default: "" },
|
|
imageAlt: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const directoryServiceSchema = new mongoose.Schema(
|
|
{
|
|
icon: { type: String, default: "" },
|
|
title: { type: String, default: "" },
|
|
description: { type: String, default: "" },
|
|
hours: { type: String, default: "" },
|
|
hoursIcon: { type: String, default: "" },
|
|
buttonLabel: { type: String, default: "" },
|
|
buttonHref: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const directorySchema = new mongoose.Schema(
|
|
{
|
|
title: { type: String, default: "" },
|
|
subtitle: { type: String, default: "" },
|
|
services: { type: [directoryServiceSchema], default: [] },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const channelSchema = new mongoose.Schema(
|
|
{
|
|
icon: { type: String, default: "" },
|
|
title: { type: String, default: "" },
|
|
detail: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const labelPlaceholderSchema = new mongoose.Schema(
|
|
{
|
|
label: { type: String, default: "" },
|
|
placeholder: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const departmentFieldSchema = new mongoose.Schema(
|
|
{
|
|
label: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const supportFormFieldsSchema = new mongoose.Schema(
|
|
{
|
|
firstName: { type: labelPlaceholderSchema, default: () => ({}) },
|
|
lastName: { type: labelPlaceholderSchema, default: () => ({}) },
|
|
studentId: { type: labelPlaceholderSchema, default: () => ({}) },
|
|
department: { type: departmentFieldSchema, default: () => ({}) },
|
|
message: { type: labelPlaceholderSchema, default: () => ({}) },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const contactFormSchema = new mongoose.Schema(
|
|
{
|
|
heading: { type: String, default: "" },
|
|
fields: { type: supportFormFieldsSchema, default: () => ({}) },
|
|
departments: { type: [String], default: [] },
|
|
submitLabel: { type: String, default: "" },
|
|
successMessage: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const contactSectionSchema = new mongoose.Schema(
|
|
{
|
|
heading: { type: String, default: "" },
|
|
description: { type: String, default: "" },
|
|
channels: { type: [channelSchema], default: [] },
|
|
form: { type: contactFormSchema, default: () => ({}) },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const metadataSchema = new mongoose.Schema(
|
|
{
|
|
title: { type: String, default: "" },
|
|
description: { type: String, default: "" },
|
|
},
|
|
{ _id: false },
|
|
);
|
|
|
|
const studentSupportSchema = new mongoose.Schema(
|
|
{
|
|
slug: {
|
|
type: String,
|
|
required: true,
|
|
unique: true,
|
|
default: "student-support",
|
|
},
|
|
metadata: { type: metadataSchema, default: () => ({}) },
|
|
hero: { type: heroSchema, default: () => ({}) },
|
|
directory: { type: directorySchema, default: () => ({}) },
|
|
contactSection: { type: contactSectionSchema, default: () => ({}) },
|
|
},
|
|
{ timestamps: true },
|
|
);
|
|
|
|
/**
|
|
* Seed / migrate từ file JSON (cùng shape với API frontend).
|
|
*/
|
|
studentSupportSchema.statics.migrateFromJson = async function (jsonData) {
|
|
const slug = "student-support";
|
|
const payload = {
|
|
slug,
|
|
metadata: jsonData.metadata || {},
|
|
hero: jsonData.hero || {},
|
|
directory: jsonData.directory || { services: [] },
|
|
contactSection: jsonData.contactSection || {},
|
|
};
|
|
|
|
const existing = await this.findOne({ slug });
|
|
if (existing) {
|
|
existing.set(payload);
|
|
await existing.save();
|
|
return existing;
|
|
}
|
|
return this.create(payload);
|
|
};
|
|
|
|
module.exports = mongoose.model("StudentSupport", studentSupportSchema);
|