const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { const validateTin = require('vn-loopback/util/validateTin'); require('../methods/worker/filter')(Self); require('../methods/worker/mySubordinates')(Self); require('../methods/worker/isSubordinate')(Self); require('../methods/worker/getWorkedHours')(Self); require('../methods/worker/uploadFile')(Self); require('../methods/worker/createAbsence')(Self); require('../methods/worker/deleteAbsence')(Self); require('../methods/worker/updateAbsence')(Self); require('../methods/worker/active')(Self); require('../methods/worker/activeWithRole')(Self); require('../methods/worker/activeWithInheritedRole')(Self); require('../methods/worker/contracts')(Self); require('../methods/worker/holidays')(Self); require('../methods/worker/activeContract')(Self); require('../methods/worker/new')(Self); require('../methods/worker/deallocatePDA')(Self); require('../methods/worker/allocatePDA')(Self); require('../methods/worker/search')(Self); require('../methods/worker/isAuthorized')(Self); require('../methods/worker/setPassword')(Self); Self.validatesUniquenessOf('locker', { message: 'This locker has already been assigned' }); // Self.validateAsync('fi', tinIsValid, { // message: 'Invalid TIN' // }); async function tinIsValid(err, done) { const filter = { fields: ['code'], where: {id: this.countryFk} }; const country = await Self.app.models.Country.findOne(filter); const code = country ? country.code.toLowerCase() : null; if (!this.fi || !validateTin(this.fi, code)) err(); done(); } Self.observe('before save', async function(ctx, next) { if (ctx.isNewInstance) return; const isOwner = await checkModifyPermission(ctx); const phoneHasChanged = !!ctx.data.user?.recoveryPhone; const {models} = Self.app; if (!isOwner) { if (phoneHasChanged) throw new UserError('Phone can\'t be updated'); else { const {recoveryPhone} = ctx.data.user; const {id} = ctx.currentInstance; await models.VnUser.updateAll({id}, {recoveryPhone}); ctx.data.code = ctx.currentInstance.code; } } delete ctx.data.user; }); async function checkModifyPermission(ctx) { const instanceId = ctx.currentInstance.id; const userId = ctx.options.accessToken.userId; try { return (instanceId == userId); } catch (error) { throw new UserError(error); } } };