'use strict'; const db = require('../../models/index'); const moment = require('moment-timezone'); const Op = require('sequelize').Op; const { API } = require('../../helpers/api'); const { officeRnDAPIErrors } = require('../../constants/constants'); const fetchAllBookings = () => { return new Promise((resolve, reject) => { API.get('/bookings') .then((result) => { const cleanedBookingReservations = []; const bookingData = result && result.data ? result.data : []; bookingData.forEach((fullBookingEntry) => { cleanedBookingReservations.push({ reservationId: fullBookingEntry['_id'], memberId: fullBookingEntry.member, officeId: fullBookingEntry.office, resourceId: fullBookingEntry.resourceId, start: fullBookingEntry.start.dateTime, end: fullBookingEntry.end.dateTime, timezone: fullBookingEntry.timezone, canceled: fullBookingEntry.canceled || false, }); }); resolve(cleanedBookingReservations); }) .catch((error) => { console.log(officeRnDAPIErrors.FAILED_TO_FETCH_BOOKINGS); console.log('Details : ', error); reject(officeRnDAPIErrors.FAILED_TO_FETCH_BOOKINGS); }); }); }; const getAllFinishedBookings = () => { const attributes = ['reservationId', 'memberId', 'resourceId', 'start', 'end', 'timezone']; const filters = { canceled: false, end: { [Op.lt]: moment().toISOString() } }; return db.bookingReservation.findAll({ attributes, where: filters, order: [ ['start', 'ASC'], ] }) }; const getFirstNextBooking = (reservation) => { return new Promise ((resolve, reject) => { const {resourceId, start, timezone} = reservation; const endOfTheDay = moment.tz(start, timezone).endOf('Day').toISOString(); const attributes = ['reservationId', 'memberId', 'resourceId', 'start', 'end', 'timezone']; const filters = { canceled: false, start: { [Op.gt]: start }, end: { [Op.lte]: endOfTheDay }, resourceId, }; const order = [['start', 'ASC']]; db.bookingReservation.findAll({ attributes, where: filters, order, }) .then((reservations) => { if (reservations && reservations[0]){ resolve(reservations[0]); }else{ resolve(undefined); } }) .catch((error) => reject(error)); }); }; const getFirstPreviousBooking = (reservation) => { return new Promise ((resolve, reject) => { const {resourceId, start, timezone} = reservation; const startOfTheDay = moment.tz(start, timezone).startOf('Day').toISOString(); const attributes = ['reservationId', 'memberId', 'resourceId', 'start', 'end', 'timezone']; const filters = { canceled: false, start: { [Op.gte]: startOfTheDay }, end: { [Op.lte]: start }, resourceId, }; const order = [['end', 'DESC']]; db.bookingReservation.findAll({ attributes, where: filters, order, }) .then((reservations) => { if (reservations && reservations[0]){ resolve(reservations[0]); }else{ resolve(undefined); } }) .catch((error) => reject(error)); }); }; const writeBookingReservation = (bookingReservation) => { return db.bookingReservation.findOrCreate({where: {...bookingReservation}, defaults: {...bookingReservation}}); }; module.exports = { fetchAllBookings, writeBookingReservation, getAllFinishedBookings, getFirstNextBooking, getFirstPreviousBooking, };