UNPKG

oils-plugin-braziw-cms

Version:

Content and document management system plugin for oils js

215 lines (168 loc) 6.8 kB
module.exports = function(pluginConf, web) { let Document = web.includeModel(pluginConf.models.Document); const context = pluginConf.context; const mongoose = web.require('mongoose'); const dmsUtils = web.cms.utils; let getModelEditables = function(docType) { let modelEditables = null; if (docType && docType != 'file' && docType != 'folder') { modelEditables = web.cms.getCmsModel(docType).getModelDictionary().editables; } else { modelEditables = web.cms.getCmsModel('Document').getModelDictionary().editables; } //console.log('!!!!' + docType + ' :::: ' + modelEditables); return modelEditables; } let myRoutes = { get: function(req, res) { dmsUtils.handleFolder(req.query.folderId, req, res, function(err, folder, folderId, parentFolders) { folderId = folderId || ''; let docTypeMap = web.cms.getDocTypeMap(); let fileId = req.params.FILE_ID; if (fileId) { fileId = dmsUtils.toObjectId(fileId); let docType = req.query.docType; if (docType && docType != 'file' && docType != 'folder') { Document = web.cms.getCmsModel(docType); } Document.findOne({_id:fileId}, function(err, doc) { if (!doc) { req.flash('error', 'File not found.'); res.redirect(context + '/document/list?folderId=' + folderId); return; } let docType = doc.docType; if (doc.parentFolderId) { folderId = doc.parentFolderId.toString(); } doc.route = doc.route || ''; let modelEditables = getModelEditables(docType); let cmMode = null; if (doc.mimeType) { if (doc.mimeType.indexOf("html") !== -1 || doc.mimeType.indexOf("xml") !== -1) { cmMode = "xml"; } else if (doc.mimeType.indexOf("javascript") !== -1) { cmMode = "javascript" } else if (doc.mimeType.indexOf("css") !== -1) { cmMode = "css" } } res.render(pluginConf.views.addDocument, {context: context, mimeType: doc.mimeType, cmMode: cmMode, folderId: folderId, isFolder: doc.isFolder, doc: doc, modelEditables: modelEditables, docTypeMap: docTypeMap}); }) } else { let doc = new Object(); doc.docType = req.query.docType || web.cms.constants.file; doc.route = doc.route || ''; doc.controller = doc.controller || ''; let modelEditables = getModelEditables(doc.docType); res.render(pluginConf.views.addDocument, {context: context, folderId: folderId, isFolder: req.query.isFolder, doc: doc, customDocType: doc.docType, modelEditables: modelEditables, docTypeMap: docTypeMap}); } }) }, post: function(req, res) { dmsUtils.handleFolder(req.body.folderId, req, res, function(err, folder, folderId) { let docType = req.body.docType; if (docType && docType != 'file' && docType != 'folder') { Document = web.cms.getCmsModel(docType); } if (req.body._id) { //updateMode = true; let id = mongoose.Types.ObjectId(req.body._id); Document.findOne({_id: id}, function(err, doc) { if (doc) { handleDocSave(req, res, doc, folder, true); } }) } else { let doc = new Document(); handleDocSave(req, res, doc, folder, false); } }) }/*, onError: function(req, res, err, app) { req.flash('error', err.message); res.redirect('/dms'); }*/ } let handleDocSave = function(req, res, doc, folder, updateMode) { let docType = req.body.docType; let name = req.body.name; if (docType == web.cms.constants.folder) { doc.isFolder = true; } let editables = getModelEditables(docType); //console.log('!!!' + JSON.stringify(editables)); for (let i in editables) { let editable = editables[i]; let name = editable.name; let content = req.body[name]; if (content) { if (editable.type == "file") { doc[name] = Buffer.from(content, "utf8"); //console.log('SAVEF BUFFER: ' + req.body[name]) } else if (editable.type == "date") { doc[name] = new Date(content); } else { doc[name] = content; if (console.isDebug) { console.debug('Applying %s to %s', content, name); } } } else { if (editable.required) { req.flash('error', editable.name + ' is required.'); if (updateMode) { res.redirect(context + '/document/edit/' + req.body._id); } else { let isFolder = ''; if (doc.isFolder) { isFolder = 'y'; } res.redirect(context + '/document/add?isFolder=' + isFolder + '&docType=' + docType); } return; } if (name == "content") { if (content == "") { //only empty content when control exists doc[name] = null } } else { //check if these needs same logic as above doc[name] = null; } //console.log('!!!' + name + ' :: ' + doc[name]); } //console.log('!!!'+ i); } doc.docType = docType; if (folder) { doc.parentFolderId = folder._id; } doc.updateDt = new Date(); if (req.user && req.user.username) { doc.updateBy = req.user.username; if (!updateMode) { doc.createBy = req.user.username; } } doc.save(function(err) { if (err) { console.error('Error saving doc', err); req.flash('error', 'Error saving document.'); } else { req.flash('info', doc.name + ' saved successfully.'); if (updateMode) { web.callEvent('cms.afterDocumentUpdate', [doc]); } else { web.callEvent('cms.afterDocumentInsert', [doc]); } } let folderId = doc.parentFolderId || ''; res.redirect(context + '/document/list?folderId=' + folderId); }) } return myRoutes; }