import { NextApiRequest, NextApiResponse } from 'next' import { Prisma, BookingStatus } from '@prisma/client'; import { patchBooking } from '../../../../db/index' import { sendBookingConfirmed, sendBookingRejected, sendBookingCanceled, } from '../../../../helpers/mail' import { log } from '../../../../helpers/log' function changedStatus( previous: Prisma.BookingUpdateInput, current: Prisma.BookingUpdateInput, status: BookingStatus ): boolean { return ( BookingStatus.REQUESTED === previous.status && current.status === status ) } function wasRejected(previous: Prisma.BookingUpdateInput, current: Prisma.BookingUpdateInput): boolean { return changedStatus(previous, current, BookingStatus.REJECTED) } function wasConfirmed(previous: Prisma.BookingUpdateInput, current: Prisma.BookingUpdateInput): boolean { return changedStatus(previous, current, BookingStatus.CONFIRMED) } function wasCanceled(previous: Prisma.BookingUpdateInput, current: Prisma.BookingUpdateInput): boolean { return ( [BookingStatus.REQUESTED, BookingStatus.CONFIRMED].find(s => s === previous.status) && current.status === BookingStatus.CANCELED ) } export default async function userHandler( req: NextApiRequest, res: NextApiResponse ): Promise { const { method, query: { uuid: uuids }, } = req const uuid = Array.isArray(uuids) ? uuids[0] : uuids switch (method) { case 'PATCH': if (!Object.values(BookingStatus).includes(req.body.status)) { res .status(400) .end( `The attribute status can only be: ${Object.values( BookingStatus ).join(', ')}` ) break } try { const { current, previous } = await patchBooking(uuid, req.body) // TODO: this should really go into the schema if (wasRejected(previous, current)) { sendBookingRejected(current) } else if (wasConfirmed(previous, current)) { sendBookingConfirmed(current) } else if (wasCanceled(previous, current)) { sendBookingCanceled(current) } res.status(200).json(current) } catch (error) { log.error('failed patch booking', error) res.status(400).end(`Failed to save booking: ${error.message}`) } break default: res.setHeader('Allow', ['PATCH']) res.status(405).end(`Method ${method} Not Allowed`) } }