magister.js
Version:
A JavaScript implementation of the Magister 6 API
133 lines (108 loc) • 3.7 kB
JavaScript
;
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;