@universis/dining
Version:
Universis api for dining
410 lines (360 loc) • 15.3 kB
JavaScript
;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