UNPKG

webhandle-calendar

Version:

Calendar tools for node webhandle

182 lines (157 loc) 4.18 kB
const addCallbackToPromise = require('dreck/add-callback-to-promise') const filog = require('filter-log') const sortEvents = require('./event-sort') /** * options: { * products: a mongo collection object which stores the information * } * */ function createFetch(collectionName) { return function(query, callback) { query = query || {} let p = new Promise((resolve, reject) => { this[collectionName].find(query).toArray((err, result) => { if(err) { this.log.error(err) return reject(err) } if(result && this.postFetchesProcessor) { this.postFetchesProcessor(result, collectionName).then((processed) => { resolve(processed) }) } else { resolve(result) } }) }) return addCallbackToPromise(p, callback) } } function createIdFetch(fetchFunction) { return function(id, callback) { return fetchFunction.apply(this, [this.createIdQuery(id), callback]) } } function createSave(collectionName) { return function(focus, callback) { let p = new Promise((resolve, reject) => { this[collectionName].save(focus, (err, result) => { if(!err) { return resolve(result) } this.log.error(err) return reject(err) }) }) return addCallbackToPromise(p, callback) } } class CalendarService { constructor(options) { Object.assign(this, { log: filog('CalendarData:') }, options) this.fetchEvents = createFetch('webhandle-calendar-events') this.fetchEventsById = createIdFetch(this.fetchEvents) this.saveEvent = createSave('webhandle-calendar-events') this.fetchEventTypes = createFetch('webhandle-calendar-event-types') this.fetchOrderById = createIdFetch(this.fetchEventTypes) this.saveEventType = createSave('webhandle-calendar-event-types') this.fetchPrograms = createFetch('webhandle-calendar-programs') this.fetchProgramById = createIdFetch(this.fetchPrograms) this.saveProgaram = createSave('webhandle-calendar-programs') this.fetchProgramTypes = createFetch('webhandle-calendar-program-types') this.fetchProgramTypeById = createIdFetch(this.fetchProgramTypes) this.saveProgaramType = createSave('webhandle-calendar-program-types') } createIdQuery(id) { if(Array.isArray(id)) { let ids = id.map(item => { return { id: Buffer.from(item, "hex"), _bsontype: "ObjectID" } }) return {_id: {$in: ids}} } else { return { id: Buffer.from(id, "hex"), _bsontype: "ObjectID" } } } postFetchesProcessor(result, collectionName) { return new Promise((resolve, reject) => { resolve(result) }) } sortPrograms(programs) { programs = programs.sort((one, two) => { try { let o1 = parseInt(one.sortOrder) || 0 let o2 = parseInt(two.sortOrder) || 0 if(o1 < o2) { return -1 } if(o1 > o2) { return 1 } return 0 } catch(e) { return 0 } }) return programs } materializeProgramsTree(callback) { let p = new Promise((resolve, reject) => { let promises = [] promises.push(this.fetchProgramTypes()) promises.push(this.fetchPrograms()) promises.push(this.fetchEvents()) Promise.all(promises).then(results => { let types = results[0] let programs = results[1] let events = results[2] let typesById = {} let eventsByProgram = events.reduce((acc, event) => { if(event.programType) { let el = acc[event.programType] if(!el) { el = [] acc[event.programType] = el } el.push(event) } return acc }, {}) types.forEach(type => { type.programs = [] typesById[type._id] = type }) programs.forEach(program => { if(program.programType && typesById[program.programType]) { typesById[program.programType].programs.push(program) } let el = eventsByProgram[program._id] if(el) { program.events = el } }) types.forEach(type => { type.programs = this.sortPrograms(type.programs) for(let p of type.programs) { // p.events.sort(sortEvents) } }) resolve(types) }) }) return addCallbackToPromise(p, callback) } } module.exports = CalendarService