Home Reference Source

src/person.js

import _ from 'lodash'
import MagisterThing from './magisterThing'
import { toString } from './util'

class Person extends MagisterThing {
	/**
	 * @private
	 * @param {Magister} magister
	 * @param {Object} raw
	 * @param {number} type
	 */
	constructor(magister, raw, type) {
		super(magister)
		if (raw == null) {
			return
		}

		/**
		 * @type {Boolean}
		 * @private
		 * @default false
		 */
		this._filled = false

		/**
		 * @type {String}
		 * @readonly
		 */
		this.id = toString(raw.Id)
		/**
		 * @type {Number}
		 * @private
		 * @readonly
		 */
		this._type = type || raw.Type
		/**
		 * @type {String}
		 * @readonly
		 */
		this.firstName = raw.Voornaam
		/**
		 * @type {String}
		 * @readonly
		 */
		this.lastName = raw.Achternaam
		/**
		 * @type {String}
		 * @readonly
		 */
		this.namePrefix = raw.Tussenvoegsel
		/**
		 * @type {String}
		 * @readonly
		 */
		this.fullName = raw.Naam
		/**
		 * @type {String}
		 * @readonly
		 */
		this.description = raw.Omschrijving || raw.Naam || raw.naam
		/**
		 * @type {String}
		 * @readonly
		 */
		this.group = raw.Groep
		/**
		 * @type {String}
		 * @readonly
		 */
		this.teacherCode = raw.Docentcode
		/**
		 * @type {String}
		 * @readonly
		 */
		this.emailAddress = raw.Emailadres
	}

	get type() {
		switch (this._type) {
		case 1: return 'group'
		case 2: return 'study'
		case 3: return 'person'
		case 6: return 'location'
		case 8: return 'project'

		default: return 'unknown'
		}
	}

	set type(val) {
		if (!Number.isInteger(val)) {
			val = ({
				'group': 1,
				'study': 2,
				'person': 3,
				'location': 6,
				'project': 8,
			})[val]
		}

		if (![ 1, 2, 3, 6, 8 ].includes(val)) {
			throw new Error(`${val} is an invalid type value`)
		}

		this._type = val
	}

	/**
	 * @param {string} [type]
	 * @returns {Promise<User>}
	 */
	getFilled(type) {
		if (this._filled) {
			return Promise.resolve(this)
		}

		return this._magister.persons(this.fullName, type)
		.then(persons => persons[0] || this)
	}

	/**
	 * @override
	 * @returns {Object}
	 */
	toJSON() {
		const obj = _.omit(super.toJSON(), '_filled')
		delete obj._type
		return obj
	}

	/**
	 * @private
	 * @returns {Object}
	 */
	_toMagister() {
		const obj = {}

		obj.Id = this.id
		obj.Type = this._type
		obj.Voornaam = this.firstName
		obj.Achternaam = this.lastName
		obj.Tussenvoegsel = this.namePrefix
		obj.Naam = this.fullName
		obj.Omschrijving = this.description
		obj.Groep = this.group
		obj.Docentcode = this.teacherCode
		obj.Emailadres = this.emailAddress

		return obj
	}
}

export default Person