forked from UKSOURCE/cms.hailearning.edu.vn
207 lines
5.5 KiB
JavaScript
207 lines
5.5 KiB
JavaScript
const mongoose = require("mongoose");
|
|
|
|
// Clear cache
|
|
if (mongoose.models.Appointment) {
|
|
delete mongoose.models.Appointment;
|
|
}
|
|
if (mongoose.connection.models.Appointment) {
|
|
delete mongoose.connection.models.Appointment;
|
|
}
|
|
|
|
// Schema cho hero section
|
|
const heroSchema = new mongoose.Schema(
|
|
{
|
|
title: {
|
|
type: String,
|
|
trim: true,
|
|
default: "Make Appointment",
|
|
},
|
|
backgroundImage: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
subtitle: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
heading: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
description: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
// Schema cho form field
|
|
const formFieldSchema = new mongoose.Schema(
|
|
{
|
|
name: {
|
|
type: String,
|
|
required: true,
|
|
trim: true,
|
|
},
|
|
label: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
type: {
|
|
type: String,
|
|
required: true,
|
|
trim: true,
|
|
enum: ["text", "email", "tel", "textarea", "date", "select"],
|
|
},
|
|
placeholder: {
|
|
type: String,
|
|
trim: true,
|
|
default: "",
|
|
},
|
|
required: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
colClass: {
|
|
type: String,
|
|
trim: true,
|
|
default: "col-lg-12",
|
|
},
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
// Schema cho submit button
|
|
const submitButtonSchema = new mongoose.Schema(
|
|
{
|
|
text: {
|
|
type: String,
|
|
required: true,
|
|
trim: true,
|
|
default: "Request Appointment",
|
|
},
|
|
icon: {
|
|
type: String,
|
|
trim: true,
|
|
default: "fa-solid fa-arrow-right",
|
|
},
|
|
buttonClass: {
|
|
type: String,
|
|
trim: true,
|
|
default: "theme-btn",
|
|
},
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
// Schema cho form
|
|
const formSchema = new mongoose.Schema(
|
|
{
|
|
heading: {
|
|
type: String,
|
|
trim: true,
|
|
default: "Request Appointment",
|
|
},
|
|
fields: {
|
|
type: [formFieldSchema],
|
|
default: [],
|
|
},
|
|
submitButton: {
|
|
type: submitButtonSchema,
|
|
default: () => ({}),
|
|
},
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
// Main Appointment Schema
|
|
const appointmentSchema = new mongoose.Schema(
|
|
{
|
|
name: {
|
|
type: String,
|
|
default: "default",
|
|
unique: true,
|
|
},
|
|
hero: {
|
|
type: heroSchema,
|
|
default: () => ({}),
|
|
},
|
|
visaOptions: {
|
|
type: [String],
|
|
default: [],
|
|
},
|
|
form: {
|
|
type: formSchema,
|
|
default: () => ({}),
|
|
},
|
|
},
|
|
{
|
|
timestamps: true,
|
|
}
|
|
);
|
|
|
|
// Migration method to import data from JSON
|
|
appointmentSchema.statics.migrateFromJson = async function (jsonData) {
|
|
try {
|
|
// Check if default appointment exists
|
|
const existingAppointment = await this.findOne({ name: "default" });
|
|
|
|
// Process data from JSON
|
|
const processedData = {
|
|
hero: {
|
|
title: jsonData.hero?.title || "Make Appointment",
|
|
backgroundImage: jsonData.hero?.backgroundImage || "",
|
|
subtitle: jsonData.hero?.subtitle || "",
|
|
heading: jsonData.hero?.heading || "",
|
|
description: jsonData.hero?.description || "",
|
|
},
|
|
visaOptions: Array.isArray(jsonData.visaOptions) ? jsonData.visaOptions : [],
|
|
form: {
|
|
heading: jsonData.form?.heading || "Request Appointment",
|
|
fields: (jsonData.form?.fields || []).map((field) => ({
|
|
name: field.name || "",
|
|
label: field.label || "",
|
|
type: field.type || "text",
|
|
placeholder: field.placeholder || "",
|
|
required: field.required || false,
|
|
colClass: field.colClass || "col-lg-12",
|
|
})),
|
|
submitButton: {
|
|
text: jsonData.form?.submitButton?.text || "Request Appointment",
|
|
icon: jsonData.form?.submitButton?.icon || "fa-solid fa-arrow-right",
|
|
buttonClass: jsonData.form?.submitButton?.buttonClass || "theme-btn",
|
|
},
|
|
},
|
|
};
|
|
|
|
if (existingAppointment) {
|
|
// Update existing appointment
|
|
existingAppointment.hero = processedData.hero;
|
|
existingAppointment.visaOptions = processedData.visaOptions;
|
|
existingAppointment.form = processedData.form;
|
|
await existingAppointment.save();
|
|
console.log("Appointment data updated successfully");
|
|
return existingAppointment;
|
|
} else {
|
|
// Create new appointment
|
|
const newAppointment = await this.create({
|
|
name: "default",
|
|
...processedData,
|
|
});
|
|
console.log("Appointment data imported successfully");
|
|
return newAppointment;
|
|
}
|
|
} catch (error) {
|
|
console.error("Error migrating appointment data:", error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
module.exports = mongoose.model("Appointment", appointmentSchema);
|