UNPKG

magister.js

Version:

A JavaScript implementation of the Magister 6 API

133 lines (108 loc) 3.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _lodash = _interopRequireDefault(require("lodash")); var _magisterThing = _interopRequireDefault(require("./magisterThing")); var _class = _interopRequireDefault(require("./class")); var _grade = _interopRequireDefault(require("./grade")); var _util = require("./util"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class Course extends _magisterThing.default { /** * @private * @param {Magister} magister * @param {Object} raw */ constructor(magister, raw) { super(magister); /** * @type {String} * @readonly */ this.id = (0, _util.toString)(raw.Id); /** * @type {Date} * @readonly */ this.start = (0, _util.parseDate)(raw.Start); /** * @type {Date} * @readonly */ this.end = (0, _util.parseDate)(raw.Einde); /** * The school year of this course, e.g: '1617' * @type {String} * @readonly */ this.schoolPeriod = raw.Lesperiode; /** * Basic type information of this course, e.g: { description: "VWO 6", id: 420 } * @type {{ description: String, id: Number }} * @readonly */ this.type = { id: raw.Studie.Id, description: raw.Studie.Omschrijving }; /** * The group of this course, e.g: { description: "Klas 6v3", id: 420, locationId: 0 } * @type {{ description: String, id: Number, LocatieId: Number }} * @readonly */ this.group = { id: raw.Groep.Id, get description() { const group = raw.Groep.Omschrijving; return group != null ? group.split(' ').find(w => /\d/.test(w)) || group : null; }, locationId: raw.Groep.LocatieId }; /** * @type {String[]} * @readonly */ this.curricula = _lodash.default.compact([raw.Profiel, raw.Profiel2]); } /** * @type {boolean} * @readonly */ get current() { const now = new Date(); return this.start <= now && now <= this.end; } /** * @returns {Promise<Class[]>} */ classes() { const url = `${this._magister._personUrl}/aanmeldingen/${this.id}/vakken`; return this._magister.http.get(url).then(res => res.json()).then(res => res.map(c => new _class.default(this._magister, c))); } /** * @param {Object} [options={}] * @param {boolean} [options.fillGrades=true] * @param {boolean} [options.latest=false] * @returns {Promise<Grade[]>} */ grades({ fillGrades = true, latest = false } = {}) { const urlPrefix = `${this._magister._personUrl}/aanmeldingen/${this.id}/cijfers`; const url = latest ? `${this._magister._personUrl}/cijfers/laatste?top=50&skip=0` : `${urlPrefix}/cijferoverzichtvooraanmelding?actievePerioden=false&alleenBerekendeKolommen=false&alleenPTAKolommen=false&peildatum=${this.end.getFullYear()}-${this.end.getMonth() + 1}-${this.end.getDate()}`; return this._magister._privileges.needs('cijfers', 'read').then(() => this._magister.http.get(url)).then(res => res.json()).then(res => res.Items).then(grades => { grades = _lodash.default.reject(grades, raw => raw.CijferId === 0); const promises = grades.map(raw => { const grade = new _grade.default(this._magister, raw); grade._fillUrl = `${urlPrefix}/extracijferkolominfo/${_lodash.default.get(raw, 'CijferKolom.Id')}`; return Promise.resolve(fillGrades ? grade.fill() : grade); }); return Promise.all(promises); }).then(r => _lodash.default.sortBy(r, 'dateFilledIn')); } } var _default = Course; exports.default = _default;