UNPKG

magister.js

Version:

A JavaScript implementation of the Magister 6 API

127 lines (112 loc) 3.31 kB
import _ from 'lodash' import MagisterThing from './magisterThing' import Message from './message' import { toString } from './util' const MAX_LIMIT = 250 class MessageFolder extends MagisterThing { /** * @private * @param {Magister} magister * @param {Object} raw */ constructor(magister, raw) { super(magister) /** * @type {String} * @readonly */ this.id = toString(raw.Id) /** * @type {String} * @readonly */ this.name = raw.Naam /** * @type {Number} * @readonly */ this.unreadCount = raw.OngelezenBerichten /** * @type {String} * @readonly */ this.parentId = raw.ParentId /** * @type {String} * @readonly */ this.type = ({ 'postvak in': 'inbox', 'verzonden items': 'sent', 'verwijderde items': 'bin', 'mededelingen': 'alerts', })[this.name.toLowerCase()] || 'unknown' } /** * @param {Object} [options={}] * @param {number} [options.count=10] The limit of the amount of Messages to fetch. If `null`, all messages will be downloaded form the server. * @param {number} [options.skip=0] The amount of messages in front of the * MessageFolder to skip. * @param {string} [options.readState='all'] One of: 'all', 'read', 'unread'. * @param {boolean} [options.fill=true] Whether or not to call `fill` on every message. * @param {boolean} [options.fillPersons=false] Whether or not to download the users from the server. `options.fill` has to be true for this option to take effect. * @returns {Promise<Object>} { messages: Message[], totalCount: Number } */ messages({ count = 10, skip = 0, readState = 'all', fill = true, fillPersons = false } = {}) { if (![ 'all', 'read', 'unread' ].includes(readState)) { return Promise.reject(new Error('Invalid option to readState')) } let url = `${this._magister._personUrl}/berichten?mapId=${this.id}&top=${count}&skip=${skip}` if ([ 'read', 'unread' ].includes(readState)) { url += `&gelezen=${readState === 'read'}` } count = count === null ? Infinity : count if (count === 0) { return Promise.resolve([]) } else if (count > MAX_LIMIT) { url += '&count=true' return this._magister._privileges.needs('berichten', 'read') .then(() => this._magister.http.get(url)) .then(res => res.json()) .then(res => res.TotalCount) .then(totalCount => { count = Math.min(count, totalCount) const promises = _.chain(count / MAX_LIMIT) .range() .map(n => this.messages({ count: MAX_LIMIT, skip: n * MAX_LIMIT, readState, fill, fillPersons, })) .value() return Promise.all(promises).then(objects => ({ messages: _(objects).map('messages').flatten().value(), totalCount, })) }) } return this._magister._privileges.needs('berichten', 'read') .then(() => this._magister.http.get(url)) .then(res => res.json()) .then(res => { const messages = res.Items.map(m => new Message(this._magister, m)) const promise = fill ? Promise.all(messages.map(m => m.fill(fillPersons))) : Promise.resolve(messages) return promise.then(messages => ({ messages, totalCount: res.TotalCount, })) }) } /** * @override * @returns {Object} */ toJSON() { return _.omit(super.toJSON(), 'type') } } export default MessageFolder