UNPKG

@universis/dining

Version:

Universis api for dining

410 lines (360 loc) 15.3 kB
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.beforeSave = beforeSave;exports.afterSave = afterSave;exports.afterRemove = afterRemove;exports.beforeRemove = beforeRemove;var _common = require("@themost/common"); var _errors = require("@themost/common/errors"); var _data = require("@themost/data"); // eslint-disable-next-line no-unused-vars async function beforeSaveAsync(event) { let runAllRules = false; const user = event.model.context.user; const target = event.model.convert(event.target); const context = event.model.context; let studentId = target.student; let action; let eventHasConsent; if (!Object.prototype.hasOwnProperty.call(target, 'student')) { const actionID = event.target || event.target.id; action = await context.model('DiningRequestAction'). where('id'). equal(actionID). select('student', 'diningRequestEvent/hasConsent as hasConsent', 'studentConsent'). getItem(); studentId = action.student; } if (!studentId) { throw new _common.DataError('E_STUDENT', 'The student cannot be empty at this context.'); } const student = event.model.context.model('Student').convert(studentId); const isMe = await student.is(':me'); if (isMe) { const isActive = await student.is(':active'); if (!isActive) { throw new _errors.HttpForbiddenError(); } const diningRequestEvent = target.diningRequestEvent || target.diningRequestEvent.id; eventHasConsent = await context.model('DiningRequestEvent'). where('id'). equal(diningRequestEvent). select('hasConsent'). silent(). value(); } if (event.state === 2) { if (isMe === true) { //check studentConsent if (event.target && eventHasConsent === true && Object.prototype.hasOwnProperty.call(target, 'studentConsent') === false) { const translateService = context.application.getStrategy(function TranslateService() {}); throw new _common.DataError('E_STUDENT_CONSENT', translateService.translate('The application cannot be saved without consent about personal data.'), null, 'DiningRequestAction', 'studentConsent'); } else if (event.target && eventHasConsent === true && Object.prototype.hasOwnProperty.call(target, 'studentConsent') === true && target.studentConsent === false) { const translateService = context.application.getStrategy(function TranslateService() {}); throw new _common.DataError('E_STUDENT_CONSENT', translateService.translate('The application cannot be saved without consent about personal data.'), null, 'DiningRequestAction', 'studentConsent'); } //check category if (target && Object.prototype.hasOwnProperty.call(target, 'category') && target.category == null) { throw new _errors.HttpForbiddenError( context.__( 'The dining request creation failed because no request category has been set.')); } } //UPDATE //Load current status const actionStatus = await event.model.where('id').equal(event.target.id).select('actionStatus/alternateName').value(); //Action is not submitted yet. Run again all rules if (actionStatus === 'PotentialActionStatus') { runAllRules = true; } else if (actionStatus === 'ActiveActionStatus' || actionStatus === 'CompletedActionStatus') { //Dining request already submitted. Do not allow to update any property removeAllInformationExceptStatus(event.target); } else if (actionStatus === 'CancelledActionStatus' && event.target.actionStatus && event.target.actionStatus.alternateName !== actionStatus && event.target.actionStatus.alternateName != 'ActiveActionStatus') { //Dining request already cancelled. throw new _common.DataError('E_VALUE', 'Cannot update cancelled action.', null, 'DiningRequestAction', 'actionStatus'); } // allow agent to change request's status when target request status = 'ActiveActionStatus' example: to reconsider a cancelled request else if (actionStatus === 'CancelledActionStatus' && event.target.actionStatus && event.target.actionStatus.alternateName !== actionStatus && event.target.actionStatus.alternateName === 'ActiveActionStatus') { let model = event.target; // set loggedIn user as request's agent if (event.previous.agent != user.id) { model.agent = user.id; } } } else if (event.state === 1) { // check studentConsent if (isMe === true && eventHasConsent === true) { if (Object.prototype.hasOwnProperty.call(target, 'studentConsent') === false) { const translateService = context.application.getStrategy(function TranslateService() {}); throw new _common.DataError('E_STUDENT_CONSENT', translateService.translate('The application cannot be saved without consent about personal data.'), null, 'DiningRequestAction', 'studentConsent'); } else if (eventHasConsent === true && target.studentConsent === false) { const translateService = context.application.getStrategy(function TranslateService() {}); throw new _common.DataError('E_STUDENT_CONSENT', translateService.translate('The application cannot be saved without consent about personal data.'), null, 'DiningRequestAction', 'studentConsent'); } } if (target && (Object.prototype.hasOwnProperty.call(target, 'category') === false || target.category == null)) { throw new _errors.HttpForbiddenError( context.__( 'The dining request creation failed because no request category has been set.')); } runAllRules = true; } if (runAllRules) { // set nullable fields to null when they don't need to have a value let model = event.target; if (Object.prototype.hasOwnProperty.call(model, 'militaryActive')) { if (model.militaryActive == true) { applyRulesForPrerequisites(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'militarySchool')) { if (model.militarySchool == true) { applyRulesForPrerequisites(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'studentHouseResident')) { if (model.studentHouseResident == true) { applyRulesForPrerequisites(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'sameDegreeHolder')) { if (model.sameDegreeHolder == true) { applyRulesForPrerequisites(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'foreignScholarStudent')) { if (model.foreignScholarStudent == true) { applyRulesForPrerequisites(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'cyprusStudent')) { if (model.cyprusStudent == true) { applyRulesForCyprusStudentOrForeignStudentOrChildOfGreekExpatriate(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'foreignStudentOrChildOfGreekExpatriate')) { if (model.foreignStudentOrChildOfGreekExpatriate == true) { applyRulesForCyprusStudentOrForeignStudentOrChildOfGreekExpatriate(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'studentReceivesUnemploymentBenefit')) { if (model.studentReceivesUnemploymentBenefit == true) { model.institutionOrClubLocationSameAsStudentPermanentResidence = null; model.studentSubmitsTaxReportInGreece = null; nullifyFamilyInformation(model); nullifyGuardianFinancialInformation(model); nullifySpouseFinancialInformation(model); nullifyStudentFinancialInformation(model); return; } } if (Object.prototype.hasOwnProperty.call(model, 'maritalStatus')) { if (model.maritalStatus && model.maritalStatus.alternateName == 'single') { model.noOfChildren = null; nullifySpouseFinancialInformation(model); if (model.guardianType.alternateName == 'nobody') { model.institutionOrClubLocationSameAsGuardianPermanentResidence = null; model.guardianNoOfChildren = null; model.numberOfStudyingSiblings = null; nullifyGuardianFinancialInformation(model); } } else { model.guardianType = null; model.institutionOrClubLocationSameAsGuardianPermanentResidence = null; model.guardianNoOfChildren = null; model.numberOfStudyingSiblings = null; nullifyGuardianFinancialInformation(model); if (model.maritalStatus && model.maritalStatus.alternateName != 'married') { nullifySpouseFinancialInformation(model); } } } } } function applyRulesForPrerequisites(model) { //nullify all other properties except foreignScholarStudent, inscriptionModeTag, lessThan25yrs and allInformationSubmittedIsTrueConfirmation nullifyPersonalInformation(model); nullifyFamilyInformation(model); nullifyGuardianFinancialInformation(model); nullifySpouseFinancialInformation(model); nullifyStudentFinancialInformation(model); } function applyRulesForCyprusStudentOrForeignStudentOrChildOfGreekExpatriate(model) { //Only these from personal information // model.studentReceivesUnemploymentBenefit = null; // model.institutionOrClubLocationSameAsStudentPermanentResidence = null; // model.studentSubmitsTaxReportInGreece = null; // nullifyFamilyInformation(model); // nullifyGuardianFinancialInformation(model); // nullifySpouseFinancialInformation(model); //Only this from personal financial information model.studentAfm = null; } function nullifyPersonalInformation(model) { model.foreignStudentOrChildOfGreekExpatriate = null; model.cyprusStudent = null; model.studentDisabledPerson = null; model.studentOrphan = null; model.childOfVictimOfTerrorism = null; model.studentReceivesUnemploymentBenefit = null; model.studentSubmitsTaxReportInGreece = null; model.institutionOrClubLocationSameAsStudentPermanentResidence = null; } function nullifyFamilyInformation(model) { model.noOfChildren = null; model.maritalStatus = null; model.numberOfStudyingSiblings = null; model.guardianNoOfChildren = null; model.guardianType = null; model.institutionOrClubLocationSameAsGuadianPermanentResidence = null; } function nullifyGuardianFinancialInformation(model) { model.studentGuardianTotalIncome = null; model.studentGuardianAfm = null; model.studentGuardianReceivesUnemploymentBenefit = null; model.studentGuardianSubmitsTaxReportInGreece = null; } function nullifySpouseFinancialInformation(model) { model.studentSpouseTotalIncome = null; model.studentSpouseAfm = null; model.studentSpouseReceivesUnemploymentBenefit = null; } function nullifyStudentFinancialInformation(model) { model.studentTotalIncome = null; model.studentAfm = null; } function removeAllInformationExceptStatus(model) { delete model.militaryActive; delete model.militarySchool; delete model.studentHouseResident; delete model.sameDegreeHolder; delete model.foreignScholarStudent; delete model.lessThan25yrs; delete model.institutionOrClubLocationSameAsStudentPermanentResidence; delete model.studentDisabledPerson; delete model.studentOrphan; delete model.numberOfStudyingSiblings; delete model.maritalStatus; delete model.noOfChildren; delete model.guardianType; delete model.institutionOrClubLocationSameAsGuadianPermanentResidence; delete model.guardianNoOfChildren; delete model.studentReceivesUnemploymentBenefit; delete model.childOfVictimOfTerrorism; delete model.studentSubmitsTaxReportInGreece; delete model.studentGuardianSubmitsTaxReportInGreece; delete model.studentAfm; delete model.studentTotalIncome; delete model.studentSpouseReceivesUnemploymentBenefit; delete model.studentSpouseAfm; delete model.studentSpouseTotalIncome; delete model.studentGuardianReceivesUnemploymentBenefit; delete model.cyprusStudent; delete model.foreignStudentOrChildOfGreekExpatriate; delete model.studentGuardianAfm; delete model.studentGuardianTotalIncome; delete model.allInformationSubmittedIsTrueConfirmation; } async function afterSaveAsync(event) { // on insert if (event.state === _data.DataObjectState.Insert && event.target.diningRequestEvent) { const context = event.model.context; // try to find if the student has declared a preference on the event const diningRequestPreference = await context.model('DiningRequestPreference'). where('student').equal(event.target.student.id || event.target.student). and('diningRequestEvent').equal(event.target.diningRequestEvent.id || event.target.diningRequestEvent). select('id'). silent(). getItem(); if (diningRequestPreference == null) { return; } // link request to preference diningRequestPreference.action = event.target.id; // and update preference await context.model('DiningRequestPreference').silent().save(diningRequestPreference); } } async function beforeRemoveAsync(event) { const model = event.model; const getReferenceMappings = _data.DataModel.prototype.getReferenceMappings; model.getReferenceMappings = async function () { const res = await getReferenceMappings.bind(this)(); // remove dining request preference mappings before remove // to prevent an unnecessary save here // note: after remove also nullifies the preference "action" link const mappings = ['DiningRequestPreference']; return res.filter(mapping => { return mappings.indexOf(mapping.childModel) < 0; }); }; } async function afterRemoveAsync(event) { const context = event.model.context; // try to find if a preference exists for that event const diningRequestPreference = await context.model('DiningRequestPreference'). where('student').equal(event.previous.student). and('diningRequestEvent').equal(event.previous.diningRequestEvent). select('id'). silent(). getItem(); if (diningRequestPreference == null) { return; } // alter the preference to false diningRequestPreference.preference = false; // nullify linked action diningRequestPreference.action = null; // and update preference await context.model('DiningRequestPreference').silent().save(diningRequestPreference); } /** * @param {DataEventArgs} event * @param {Function} callback */ function beforeSave(event, callback) { return beforeSaveAsync(event).then(() => { return callback(); }).catch(err => { return callback(err); }); } /** * @param {DataEventArgs} event * @param {Function} callback */ function afterSave(event, callback) { return afterSaveAsync(event).then(() => { return callback(); }).catch(err => { return callback(err); }); } /** * @param {DataEventArgs} event * @param {Function} callback */ function afterRemove(event, callback) { return afterRemoveAsync(event).then(() => { return callback(); }).catch(err => { return callback(err); }); } /** * @param {DataEventArgs} event * @param {Function} callback */ function beforeRemove(event, callback) { return beforeRemoveAsync(event).then(() => { return callback(); }).catch(err => { return callback(err); }); } //# sourceMappingURL=ValidateActionListener.js.map