Custom backend for Purrform.
1// helpers
2import type { DbResult } from '../lib/database.types';
3import slotsPerDay from '../lib/slotsPerDay';
4import supabase from '../lib/supabase';
5import { validOrderStatuses } from '../lib/utils';
6import getBcOrderFromSandbox from './getBcOrderFromSandbox';
7
8export default async function testOrderAddedWebhookInSandbox(
9 orderId: number
10): Promise<boolean> {
11 console.log('Starting order added webhook (delivery slots adjustment),');
12
13 console.log('Getting order from BC API');
14 const order = await getBcOrderFromSandbox(orderId);
15 if (!order) {
16 return false;
17 }
18 if (order.customer_message === '') {
19 console.log('No customer message - missing delivery date');
20 return true;
21 }
22
23 console.log('Order status:', order.status);
24 if (!validOrderStatuses.includes(order.status)) {
25 console.log('Order status is not valid');
26 return true;
27 }
28
29 const customerMessage = order.customer_message;
30
31 const [deliveryMsg, _instructions] = customerMessage.split(' | ');
32 if (deliveryMsg == null) {
33 console.log('No delivery message found');
34 return true;
35 }
36
37 // March 1, 2022
38 const date = new Date(deliveryMsg);
39 const timeOffset = date.getTimezoneOffset();
40 date.setMinutes(date.getMinutes() - timeOffset);
41 const deliveryDate = date.toISOString().split('T')[0];
42 if (deliveryDate == null) {
43 console.log('Invalid delivery date');
44 return true;
45 }
46
47 const query = supabase
48 .from('delivery_dates')
49 .select(`id, delivery_date, delivery_slots`);
50 const deliveryDatesDbResult: DbResult<typeof query> = await query;
51
52 if (deliveryDatesDbResult.error) {
53 console.error(deliveryDatesDbResult.error.message);
54 return false;
55 }
56
57 const matchingDate = deliveryDatesDbResult.data.find(
58 (row) => row.delivery_date === deliveryDate
59 );
60
61 if (matchingDate) {
62 const numSlots = matchingDate.delivery_slots;
63 const newNumSlots = Math.max(numSlots - 1, 0);
64 const updateQuery = supabase
65 .from('delivery_dates')
66 .update({ delivery_slots: newNumSlots })
67 .eq('id', matchingDate.id);
68
69 const updateResult = await updateQuery;
70 if (updateResult.error) {
71 console.error(updateResult.error.message);
72 return false;
73 }
74 } else {
75 console.log('No matching date found');
76 const numSlots = await slotsPerDay();
77 if (numSlots == null) {
78 console.error('Error getting slots per day');
79 return false;
80 }
81
82 // const insertQuery = supabase
83 // .from('delivery_dates')
84 // .insert([
85 // { delivery_date: deliveryDate, delivery_slots: numSlots - 1 },
86 // ]);
87 // const insertResult = await insertQuery;
88 // if (insertResult.error) {
89 // console.error(insertResult.error.message);
90 // return false;
91 // }
92 }
93
94 return true;
95}