80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
const mongoose = require("mongoose");
|
|
|
|
function autoPopulateSubs(next) {
|
|
this.populate({
|
|
path: "childs",
|
|
select:
|
|
"title childs navIndex url modelType treeCat parent defaultPageType",
|
|
options: {
|
|
sort: "navIndex",
|
|
},
|
|
// sort: {navIndex: -1},
|
|
});
|
|
next();
|
|
}
|
|
|
|
function file(file) {
|
|
return "/uploads/files/terms/" + file;
|
|
}
|
|
|
|
function image(img) {
|
|
if (img) return "/uploads/images/category/" + img;
|
|
else return "/img/no-cover.jpg";
|
|
}
|
|
|
|
const CategoryTermsFile = mongoose.Schema({
|
|
file: { type: String, get: file },
|
|
title: String,
|
|
});
|
|
|
|
const CategorySchema = mongoose.Schema({
|
|
title: String,
|
|
parent: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: "Category",
|
|
default: null,
|
|
},
|
|
childs: [{ type: mongoose.Schema.Types.ObjectId, ref: "Category" }],
|
|
treeCat: [{ type: mongoose.Schema.Types.ObjectId, ref: "Category" }],
|
|
rootParent: { type: mongoose.Schema.Types.ObjectId, ref: "Category" },
|
|
priority: { type: Number, default: 0 },
|
|
showInMenu: Boolean,
|
|
navIndex: { type: Number, default: null },
|
|
news: { type: Boolean, default: true },
|
|
child: { type: Boolean, default: true },
|
|
special: { type: Boolean, default: false },
|
|
allowComment: { type: Boolean, default: false },
|
|
level: { type: Number, default: 1 },
|
|
siteMap: { type: Boolean, default: true },
|
|
modelType: String,
|
|
_creator: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
|
|
_updatedBy: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
|
|
haveNews: { type: Boolean, default: false },
|
|
///// for client
|
|
hasNewsTab: { type: Boolean, default: true },
|
|
hasContentTab: { type: Boolean, default: true },
|
|
hasMediaTab: { type: Boolean, default: true },
|
|
hasSubMenusTab: { type: Boolean, default: true },
|
|
hasTermsTab: { type: Boolean, default: true },
|
|
hasNotificationsTab: { type: Boolean, default: true },
|
|
hasSpecNewsTab: { type: Boolean, default: true },
|
|
hasNazarTab: { type: Boolean, default: true },
|
|
hasNewsFileTab: { type: Boolean, default: true },
|
|
defaultPageType: { type: String, default: "news" },
|
|
/** page */
|
|
showInFooter: { type: Number, enum: [0, 1, 2, 3], default: 0 },
|
|
url: { type: String, default: null },
|
|
pageContent: String,
|
|
terms: [CategoryTermsFile],
|
|
hasManagerInfo: { type: Boolean, default: true },
|
|
managerCover: { type: String, get: image },
|
|
managerName: String,
|
|
managerDescription: String,
|
|
});
|
|
|
|
CategorySchema.index({ parent: 1, childs: 1 });
|
|
|
|
CategorySchema.pre("findOne", autoPopulateSubs).pre("find", autoPopulateSubs);
|
|
|
|
module.exports = mongoose.model("Category", CategorySchema);
|