UNPKG

@universis/candidates

Version:

Universis api server plugin for study program candidates, internship selection etc

257 lines (152 loc) 9.92 kB
"use strict";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