@universis/candidates
Version:
Universis api server plugin for study program candidates, internship selection etc
257 lines (152 loc) • 9.92 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });exports.StudyProgramReplacer = void 0;var _common = require("@themost/common");
var _data = require("@themost/data");
var _path = _interopRequireDefault(require("path"));
var _fs = _interopRequireDefault(require("fs"));var _dec, _dec2, _class;function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}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 _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {var desc = {};Object.keys(descriptor).forEach(function (key) {desc[key] = descriptor[key];});desc.enumerable = !!desc.enumerable;desc.configurable = !!desc.configurable;if ('value' in desc || desc.initializer) {desc.writable = true;}desc = decorators.slice().reverse().reduce(function (desc, decorator) {return decorator(target, property, desc) || desc;}, desc);if (context && desc.initializer !== void 0) {desc.value = desc.initializer ? desc.initializer.call(context) : void 0;desc.initializer = undefined;}if (desc.initializer === void 0) {Object.defineProperty(target, property, desc);desc = null;}return desc;}
const EventStatusTypes = {
EventOpened: 'EventOpened' };
const ActionStatusTypes = {
CancelledActionStatus: 'CancelledActionStatus' };let
StudyProgram = (_dec =
_data.EdmMapping.func(
'availableForEnrollment',
_data.EdmType.CollectionOf('StudyProgram')), _dec2 =
_data.EdmMapping.func(
'availableEnrollmentSpecialties',
_data.EdmType.CollectionOf('StudyProgramSpecialty')), (_class = class StudyProgram extends _data.DataObject {static getAvailableProgramsForEnrollment(context) {return _asyncToGenerator(function* () {var _yield$availableStudy;if (context == null) {throw new _common.DataError('E_CONTEXT', 'An error occured while getting the application context.');}const availableStudyProgramsQuery = context.model('StudyProgramEnrollmentEvent') // open enrollment events
.where('eventStatus/alternateName').equal(EventStatusTypes.EventOpened) // that accept self registration
.and('isAccessibleForFree').equal(true) // of active study programs
.and('studyProgram/isActive').equal(true); // get user from context
const contextUser = context.user;if (contextUser && contextUser.name) {var _yield$context$model$; // get user's id (candidate user may have been renamed)
const user = yield context.model('User').where('name').equal(contextUser.name).select('id').silent().getItem(); // fetch all events that the candidate has already tried to enroll in
const alreadyEnrolledInEvents = (_yield$context$model$ = yield context.model('StudyProgramRegisterAction').where('owner').equal(user && user.id).and('actionStatus/alternateName').notEqual(ActionStatusTypes.CancelledActionStatus).and('studyProgram/specialtySelectionSemester').notEqual(1).select('studyProgramEnrollmentEvent').silent().getAllItems()) === null || _yield$context$model$ === void 0 ? void 0 : _yield$context$model$.map(studyProgramRegisterAction => {return studyProgramRegisterAction.studyProgramEnrollmentEvent;}); // and exclude them from available events
if (Array.isArray(alreadyEnrolledInEvents) && alreadyEnrolledInEvents.length) {availableStudyProgramsQuery.and('id').notIn(alreadyEnrolledInEvents);}}const availableStudyPrograms = (_yield$availableStudy = yield availableStudyProgramsQuery.select('studyProgram').getAllItems()) === null || _yield$availableStudy === void 0 ? void 0 : _yield$availableStudy.map(enrollmentEvent => {return enrollmentEvent.studyProgram;}); // return a prepared queryable of active StudyPrograms
return context.model('StudyProgram').where('id').in(availableStudyPrograms || []).prepare(); /*
Note: Maybe investigate how to achieve
this using QueryExpression, QueryEntity etc.
*/})();}getAvailableEnrollmentSpecialties() {var _this = this;return _asyncToGenerator(function* () {var _yield$context$model$2;const context = _this.context;const self = yield (yield StudyProgram.getAvailableProgramsForEnrollment(context)).where('id').equal(_this.getId()).select('id').getItem();if (self == null) {
throw new _common.DataNotFoundError(
'The specified study program is not available for enrollment, or cannot be found, or is inaccessible.');
}
// get context user
const user = yield context.
model('User').
find(context.user).
select('id').
value();
if (user == null) {
throw new _common.DataNotFoundError(
'The user cannot be found or is inaccessible.');
}
const availableSpecialties = context.
model('StudyProgramSpecialty').
where('studyProgram').
equal(self.id);
// find if user has already enrolled in any specialty
const alreadyEnrolledInSpecialties = (_yield$context$model$2 = yield (
context.
model('StudyProgramRegisterAction').
where('owner').
equal(user).
and('studyProgram').
equal(self.id).
and('actionStatus/alternateName').
notEqual(ActionStatusTypes.CancelledActionStatus).
select('specialization').
flatten().
getAllItems())) === null || _yield$context$model$2 === void 0 ? void 0 : _yield$context$model$2.
map(action => {
return action.specialization;
});
if (
Array.isArray(alreadyEnrolledInSpecialties) &&
alreadyEnrolledInSpecialties.length)
{
availableSpecialties.and('id').notIn(alreadyEnrolledInSpecialties);
}
return availableSpecialties.prepare();})();
}}, (_applyDecoratedDescriptor(_class, "getAvailableProgramsForEnrollment", [_dec], Object.getOwnPropertyDescriptor(_class, "getAvailableProgramsForEnrollment"), _class), _applyDecoratedDescriptor(_class.prototype, "getAvailableEnrollmentSpecialties", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "getAvailableEnrollmentSpecialties"), _class.prototype)), _class));
class StudyProgramReplacer extends _common.ApplicationService {
constructor(app) {
super(app);
}
apply() {
// get schema loader
const schemaLoader = this.getApplication().
getConfiguration().
getStrategy(_data.SchemaLoaderStrategy);
if (schemaLoader == null) {
return;
}
// get model definition
const model = schemaLoader.getModelDefinition('StudyProgram');
if (model == null) {
return;
}
// get model class
const loader = this.getApplication().
getConfiguration().
getStrategy(_data.ModelClassLoaderStrategy);
if (loader == null) {
return;
}
const StudyProgramBase = loader.resolve(model);
// extend class
StudyProgramBase.getAvailableProgramsForEnrollment =
StudyProgram.getAvailableProgramsForEnrollment;
StudyProgramBase.prototype.getAvailableEnrollmentSpecialties =
StudyProgram.prototype.getAvailableEnrollmentSpecialties;
const listeners = [
{
model: 'StudyProgramRegisterActionAttachments',
listenerPath: 'listeners/request-attachment-event-listener' },
{
model: 'StudyProgramRegisterAction',
listenerPath: 'listeners/student-request-action-attachments-listener',
insertBefore: 'listeners/send-mail-after-status-change' }];
const context = this.getApplication().createContext();
const StudyProgramRegisterActions = context.model('StudyProgramRegisterAction');
const association = new _data.DataObjectJunction(StudyProgramRegisterActions.convert({}), StudyProgramRegisterActions.inferMapping('attachments'));
association.getBaseModel();
context.finalize();
for (const listener of listeners) {
const modelDefinition = schemaLoader.getModelDefinition(listener.model);
if (modelDefinition == null) {
continue;
}
// ensure listeners array
modelDefinition.eventListeners = modelDefinition.eventListeners || [];
const listenerDefinition = _path.default.resolve(
this.getApplication().getConfiguration().getExecutionPath(),
listener.listenerPath);
const stat = _fs.default.statSync(`${listenerDefinition}.js`);
if (!stat.isFile()) {
return;
}
const findListener = modelDefinition.eventListeners.find(
listener => {
return listener.type === listenerDefinition;
});
if (findListener) {
return;
}
// Handle optional `insertBefore`
if (listener.insertBefore) {
const insertBeforeIndex = modelDefinition.eventListeners.findIndex(
(existingListener) =>
existingListener.type.replace(/\\/g, '/').endsWith(listener.insertBefore));
if (insertBeforeIndex >= 0) {
modelDefinition.eventListeners.splice(insertBeforeIndex, 0, {
type: listenerDefinition });
} else {
modelDefinition.eventListeners.push({
type: listenerDefinition });
}
} else {
modelDefinition.eventListeners.push({
type: listenerDefinition });
}
// and set model definition
schemaLoader.setModelDefinition(modelDefinition);
}
}}exports.StudyProgramReplacer = StudyProgramReplacer;
//# sourceMappingURL=StudyProgramReplacer.js.map