import * as mongoose from 'mongoose' import BookerModel, { Booker } from './booker' import BookingModel, { Booking } from './booking' import BillModel, { Bill } from './bill' import { BOOKING_STATUS } from './enums' let connectedPromise: Promise function connect() { if (connectedPromise) { return } connectedPromise = mongoose.connect(process.env.MONGO_URI, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true, }) return connectedPromise } export async function getBookedDays() { await connect() return BookingModel.findBookedDays() } export async function getBookingByUUID(uuid: string) { await connect() return BookingModel.findOne({ uuid }) } export async function getBookings({ status = [BOOKING_STATUS.CONFIRMED, BOOKING_STATUS.REQUESTED], startDateGreaterThan = '2000-01-01T00:00:00Z', }: { status?: BOOKING_STATUS[]; startDateGreaterThan?: string } = {}) { await connect() return await BookingModel.find({ status: { $in: status }, startDate: { $gte: startDateGreaterThan }, }) .populate('booker') .exec() } export async function createBooking({ startDate, endDate, purpose, org, destination, name, email, phone, street, zip, city, }: Booking & Booker): Promise { await connect() const booking = new BookingModel({ startDate, endDate, purpose, org, destination, }) let booker = await BookerModel.findOne({ email }).exec() if (!booker) { booker = new BookerModel({ name, email, phone, street, zip, city }) await booker.save() } booking.booker = booker._id await booking.save() await booking.populate('booker').execPopulate() return booking.toJSON() } export async function createBill( bookingUUID: string, billData: Bill ): Promise { await connect() const booking = await getBookingByUUID(bookingUUID) const bill = new BillModel() bill.set(billData) await bill.save() booking.bill = bill._id await booking.save() return bill.toJSON() } export async function patchBill( bookingUUID: string, billData: Bill ): Promise { await connect() const booking = await getBookingByUUID(bookingUUID) const bill = (booking.bill && (await BillModel.findById(booking.bill))) || (await BillModel.create()) bill.set(billData) await bill.save() if (booking.bill !== bill._id) { booking.bill = bill._id await booking.save() } return bill.toJSON() } export async function getMilageMax(): Promise { const billMaxMilageEnd = await BillModel.findOne({}) .sort('-milageEnd') .select('milageEnd') .exec() return billMaxMilageEnd?.milageEnd || 0 }