UNPKG

alphascript-server

Version:

CRUD operations for mongo and other functionalities to get started quickly in any CMS project

139 lines (119 loc) 4.48 kB
var api = require('../../../../'); var main = module.exports = { collection: function () { return api.common.User; }, populate: function (req, id) { return [{ path: "role", select: api.entityMap.role.select(req) }, { path: "owner", select: main.select }]; }, sort: { "username": 1 }, select: '-activation -token -password', query: function (req, pageId, pageAction) { if (req.user.role.admin) { return {}; } else if (req.user.owner._id.toString() !== req.user._id.toString()) { return { _id: req.user._id }; } else { return { $or: [ { owner: req.user._id.toString() }, { _id: req.user } ] }; } }, validate: function (data, callback, req) { var validUsername = new RegExp('^[a-zA-Z0-9.\-_$@*!]{3,30}$'); if (!validUsername.test(data.username)) { return callback("Nome de utilizador inválido, use apenas (a-z, 0-9, _, .)"); } if (data._id === (data.owner || {})._id) { if (typeof data.name !== "string") return callback("Indique o nome do representante"); if (typeof data.company !== "string") return callback("Indique o nome da empresa"); if (!api.validate.nif(data.nif)) return callback("NIF inválido"); if (typeof data.landline !== "string") return callback("Indique o seu contacto telefonico"); if (typeof data.addressDetails !== "string") return callback("Indique a sua morada completa"); if (typeof data.address !== "string") return callback("Indique a sua morada completa"); if (typeof data.postalCode !== "string") return callback("Indique o seu código postal"); if (typeof data.city !== "string") return callback("Indique a localidade"); if (!data.country) return callback("Indique o país"); } callback(); }, beforeAdd: function (data, callback, req) { api.common.User.findOne({ username: data.username }).select("_id").lean().exec(function (err, user) { if (err) { api.error.log(err); return callback(api.error.DB_GENERIC); } if (!!user) return callback('Nome de utilizador já existe'); if (!!data.role) return callback(null, data); var level = req.user ? 0 : 1; api.common.Role.findOne({ approvalLevel: level }, function (err, role) { if (err) { api.error.log(err); return callback(api.error.DB_GENERIC); } if (!role) return callback('Impossível criar utilizador sem perfil de utilização definido'); data.role = role._id; callback(null, data); }); }); }, afterAdd: function (data, callback, req) { var owner = (req.user ? req.user._id : data._id).toString(); data.owner = owner; api.common.User.findOneAndUpdate({ username: data.username }, { $set: { owner: owner } }, { new: true, lean: true }, function (err, result) { if (err) { api.error.log(err); return callback(api.error.DB_GENERIC); } api.message.send('signup', { user: data }, function (err) { if (err) return callback(err); callback(null, data); }); }); }, beforeEdit: function (data, callback, req) { callback(null, data); }, afterEdit: function (data, callback) { callback(null, data); }, remove: function (id, callback, req) { api.common.User.findOne({ _id: id }).populate('role').lean().exec(function (err, user) { if (err) { api.error.log(err); return callback(api.error.DB_GENERIC); } if (user.role.approvalLevel >= req.user.role.approvalLevel) { return callback("Não tem nível de permissão necessário para apagar esta conta de utilizador"); } if (req.user.role.admin) { if (user.role.admin) return callback("Não tem nível de permissão necessário para apagar esta conta de utilizador"); return callback(); } if (user.owner !== req.user.owner._id) { return callback("Não tem nível de permissão necessário para apagar esta conta de utilizador"); } callback(); }); }, getOwners: function (req, res) { api.common.User.find({ $where: "this._id.equals(this.owner)" }).select(main.select).sort(main.sort).lean().exec(function (err, owners) { if (err) { api.error.log(err); return res.status(500).send(api.error.DB_GENERIC); } res.json(owners); }); } };