@universis/candidates
Version:
Universis api server plugin for study program candidates, internship selection etc
138 lines (42 loc) • 6.13 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });exports.beforeSave = beforeSave;var _common = require("@themost/common");function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {try {var info = gen[key](arg);var value = info.value;} catch (error) {reject(error);return;}if (info.done) {resolve(value);} else {Promise.resolve(value).then(_next, _throw);}}function _asyncToGenerator(fn) {return function () {var self = this,args = arguments;return new Promise(function (resolve, reject) {var gen = fn.apply(self, args);function _next(value) {asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);}function _throw(err) {asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);}_next(undefined);});};}
function validateEnrollmentPeriod(enrollmentPeriod) {
const currentDate = new Date().setHours(0, 0, 0, 0);
let valid = false;
if (enrollmentPeriod.validFrom instanceof Date) {
const validFrom = enrollmentPeriod.validFrom.setHours(0, 0, 0, 0);
if (enrollmentPeriod.validThrough instanceof Date) {
const validThrough = enrollmentPeriod.validThrough.setHours(0, 0, 0, 0);
valid = validFrom <= currentDate && validThrough >= currentDate;
} else {
valid = validFrom <= currentDate;
}
} else if (enrollmentPeriod.validThrough instanceof Date) {
const validThrough = enrollmentPeriod.validThrough.setHours(0, 0, 0, 0);
valid = validThrough >= currentDate;
}
return valid;
}
/**
* @param {DataEventArgs} event
*/function
beforeSaveAsync(_x) {return _beforeSaveAsync.apply(this, arguments);}
/**
* @param {DataEventArgs} event
* @param {Function} callback
*/function _beforeSaveAsync() {_beforeSaveAsync = _asyncToGenerator(function* (event) {// check if current user is the owner of this object
let owner;let enrollmentPeriod;const context = event.model.context;if (event.state === 2) {if (Object.prototype.hasOwnProperty.call(event.target, 'owner')) {// get owner
owner = yield context.model('User').find(event.target.owner).select('name').silent().value();} else {owner = yield context.model('User').find(event.previous.owner).select('name').silent().value();} // get enrollment event
const item = yield context.model('StudyProgramRegisterAction').where('id').equal(event.target.id).select('id', 'studyProgramEnrollmentEvent').expand('studyProgramEnrollmentEvent').silent().getItem();enrollmentPeriod = item.studyProgramEnrollmentEvent;} else if (event.state === 1) {// get owner
owner = yield context.model('User').find(event.target.owner).select('name').silent().value();const inscriptionMode = event.target.inscriptionMode && (event.target.inscriptionMode.id || event.target.inscriptionMode); // on insert, if the enrollment event is provided in target payload
if (event.target.studyProgramEnrollmentEvent) {const targetEnrollmentEvent = event.target.studyProgramEnrollmentEvent.id || event.target.studyProgramEnrollmentEvent; // validate event against studyProgram, year, period, mode and eventStatus
enrollmentPeriod = yield context.model('StudyProgramEnrollmentEvent').where('id').equal(targetEnrollmentEvent).and('studyProgram').equal(event.target.studyProgram).and('inscriptionYear').equal(event.target.inscriptionYear).and('inscriptionPeriod').equal(event.target.inscriptionPeriod).and('eventStatus/alternateName').equal('EventOpened').expand('inscriptionModes').silent().getItem(); // only if inscriptionModes are defined
// and the candidate's inscription mode is not included
if (enrollmentPeriod && Array.isArray(enrollmentPeriod.inscriptionModes) && enrollmentPeriod.inscriptionModes.length > 0 && !enrollmentPeriod.inscriptionModes.find(item => item.id === inscriptionMode)) {// nullify enrollmentPeriod (not valid)
enrollmentPeriod = null;}} else {// auto-assign event
// fetch open events, for the specified studyProgram, year and period
const enrollmentPeriods = yield context.model('StudyProgramEnrollmentEvent').where('studyProgram').equal(event.target.studyProgram).and('inscriptionYear').equal(event.target.inscriptionYear).and('inscriptionPeriod').equal(event.target.inscriptionPeriod).and('eventStatus/alternateName').equal('EventOpened').expand('inscriptionModes').orderByDescending('id').silent().getAllItems();enrollmentPeriod = Array.isArray(enrollmentPeriods) ? enrollmentPeriods.find(enrollmentEvent => {// assign the first event that either has empty inscription modes
// or includes the candidate's inscription mode
return Array.isArray(enrollmentEvent.inscriptionModes) && (enrollmentEvent.inscriptionModes.length === 0 || enrollmentEvent.inscriptionModes.find(item => item.id === inscriptionMode));}) : null;}if (enrollmentPeriod) {// set enrollment event
event.target.studyProgramEnrollmentEvent = enrollmentPeriod.id;} else {throw Object.assign(new _common.DataError('ERR_ENROLLMENT_EVENT', 'There is no StudyProgramEnrollmentEvent that the candidate is elligible for.', null, 'StudyProgramEnrollmentEvent'), { statusCode: 409 });}}if (owner == null) {throw new _common.DataNotFoundError('Action owner cannot be found or is inaccessible', null, event.model.name, event.target.id);}if (owner === context.user.name) {// validate period
if (enrollmentPeriod == null) {throw Object.assign(new _common.DataError('ERR_MISSING_PERIOD', 'The enrollment period of the specified study program cannot be found', null, 'StudyProgramEnrollmentEvent'), { statusCode: 409 });}const valid = validateEnrollmentPeriod(enrollmentPeriod);if (valid === false) {throw Object.assign(new _common.DataError('ERR_EXPIRED_PERIOD', 'The enrollment period has expired', null, 'StudyProgramEnrollmentEvent'), { statusCode: 409 });}}});return _beforeSaveAsync.apply(this, arguments);}function beforeSave(event, callback) {return beforeSaveAsync(event).then(() => {return callback();}).catch(err => {return callback(err);});}
//# sourceMappingURL=validate-enrollment-period-listener.js.map