В моем приложении у меня есть пользователи и документы, которые находятся во взаимосвязи «многие ко многим» (каждый документ будет иметь сотни пользователей, а каждый пользователь несколько, может быть, до двадцати документов). Кроме того, в каждом документе есть определенные пользователем c данные. А у пользователей разные роли в документах, которые нужно аутентифицировать в маршрутах и в шаблоне .e js. Я не уверен, что мне нужна отдельная модель пользовательского документа? Или сохранить данные пользовательского документа внутри пользователя в виде массива объектов? А где хранить пользовательские роли и как получить к ним доступ? Что было бы лучше всего для этого? Я использую mon goose и mongoDB, паспорт для аутентификации.
модели / пользователь. js
const mongoose = require("mongoose");
const passportLocaleMongoose = require("passport-local-mongoose");
const userSchema = new mongoose.Schema({
username: String,
password: String
});
userSchema.plugin(passportLocaleMongoose);
module.exports = mongoose.model("User", userSchema);
модели / документ. js
const mongoose = require("mongoose");
const documentSchema = new mongoose.Schema({
name: {type:String, required: true},
url: {type: String, required: true, unique: true},
description: String,
someData: String
});
module.exports = mongoose.model("Document", documentSchema);
маршруты / документы. js
router.put("/:id", middleware.checkDocumentAuthorization, function(req, res) {
let editedDocument = req.body.document;
Document.findOneAndUpdate({id: req.params.id}, editedDocument, {new: true}, function(err, updatedDocument) {
if(err) {
console.log(err);
} else {
res.redirect("/c/" + updatedDocument.id);
}
});
});
промежуточное ПО / аутентификация js
const Document = require("../models/document");
const User = require("../models/user");
let middlewareObj = {};
middlewareObj.checkDocumentAuthorization = function (req, res, next) {
req.session.returnTo = req.originalUrl;
if(req.isAuthenticated()) {
Document.findOne({id: req.params.id}, function(err, foundDocument) {
if(err) {
console.log(err);
res.redirect("back");
} else {
//used to check just for author of document, but now I have different roles for different documents
if(foundDocument.author.id.equals(req.user._id)) {
next();
} else {
req.flash("error", "You are not authorized to do that");
res.redirect("back");
}
}
});
} else {
req.flash("error", "Please, log in first");
res.redirect("/login");
}
}
module.exports = middlewareObj;