UNPKG

webhandle-calendar

Version:

Calendar tools for node webhandle

218 lines (183 loc) 4.6 kB
const Dreck = require('dreck') let wh = global.webhandle const moment = require('moment') const addCallbackToPromise = require('dreck/add-callback-to-promise') const priceTypes = require('../data/price-types') class EventsDreck extends Dreck { constructor(options) { super(options) options.timeZone = options.timeZone || '-06:00' this.templatePrefix = options.templatePrefix || 'webhandle-calendar/events/' this.bannedInjectMembers.push("startDate") this.bannedInjectMembers.push("startTime") this.bannedInjectMembers.push("durationHours") this.bannedInjectMembers.push("durationMinutes") let self = this this.eventTypesCollection = options.eventTypesCollection this.programsCollection = options.programsCollection this.injectors.unshift((req, focus, next) => { delete focus.ticketedEvent next() }) this.injectors.push((req, focus, next) => { let day if(req.body.startDate && req.body.startTime) { day = moment(req.body.startDate + ' ' + req.body.startTime) } else if(req.body.startDate) { day = moment(req.body.startDate + ' 00:00:00') } else { day = moment(new Date()) } focus.start = day.toDate() let end = moment(day) end.add(req.body.durationHours, 'H') end.add(req.body.durationMinutes, 'm') focus.end = end.toDate() this.deleteTemporary(focus) if(!req.body.tag) { focus.tags = [] } else { focus.tags = [req.body.tag] } if(!req.body.allDayEvent) { delete focus.allDayEvent } if(focus.ticketedEvent) { for(let priceType of priceTypes) { if(!focus[priceType + 'Price']) { focus[priceType + 'Price'] = "0" } } } next() } ) } deleteTemporary(focus) { delete focus.startDate delete focus.startTime delete focus.durationHours delete focus.durationMinutes delete focus.tag } save(focus, callback) { this.deleteTemporary(focus) let p = new Promise((resolve, reject) => { this.mongoCollection.save(focus, (err, result) => { if(!err) { if(wh.events && wh.events.global) { let obj = result.ops ? result.ops[0] : focus wh.events.global.emit('object-change', obj, null, 'event') } return resolve(result) } this.log.error(err) return reject(err) }) }) return addCallbackToPromise(p, callback) } synchronousPostProcessor(obj) { try { if(obj.start) { let m = moment(obj.start) // obj.startDate = m.format('YYYY-MM-DD') // obj.startTime = m.format('HH:mm') obj.startDate = obj.start obj.startTime = obj.start let diff = moment(obj.end).diff(obj.start) obj.durationHours = parseInt(diff / (1000 * 60 * 60)) obj.durationMinutes = parseInt(diff / (1000 * 60)) - (obj.durationHours * 60) } if(obj.tags && obj.tags.length > 0) { obj.tag = obj.tags[0] } } catch(e) { } return obj } loadReferencedData(res, callback) { let promises = [] if(this.eventTypesCollection) { promises.push(new Promise((resolve, reject) => { this.eventTypesCollection.find({}).toArray((err, types) => { res.locals.eventTypes = types if(err) { reject(err) } resolve() }) })) } if(this.programsCollection) { promises.push(new Promise((resolve, reject) => { this.programsCollection.find({}).toArray((err, types) => { res.locals.programs = types if(err) { reject(err) } resolve() }) })) } if(promises.length > 0) { Promise.all(promises).then(() => { callback() }) } else { callback() } } newGET(req, res, next) { this.loadReferencedData(res, () => { return super.newGET(req, res, next) }) } editGET(req, res, next) { this.loadReferencedData(res, () => { return super.editGET(req, res, next) }) } createTitle(focus) { return 'Create Event' } editTitle(focus) { return 'Edit Event' } listTitle(items) { return 'List Events' } showTitle(items) { return 'View Event' } sort(req, res, focus, callback) { let p = new Promise((resolve, reject) => { if(focus && Array.isArray(focus)) { focus = focus.sort((one, two) => { try { if(!one.start || !two.start) { return 0 } if (one.start > two.start) { return -1 } if (one.start < two.start) { return 1 } } catch(e) {} return 0 }) } resolve(focus) }) let returnPromise = addCallbackToPromise(p, callback) return returnPromise } } module.exports = EventsDreck