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
JavaScript
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);
});
}
};