@driveflux/api-functions 1.0.26 → 1.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/confirm.js +29 -24
- package/dist/auth/emails.js +13 -12
- package/dist/auth/formatter.js +5 -5
- package/dist/auth/otp.js +50 -66
- package/dist/auth/register.js +34 -42
- package/dist/auth/tokens.js +55 -58
- package/dist/auth/verifications.js +52 -53
- package/dist/constants.js +1 -0
- package/dist/create-logger.js +2 -1
- package/dist/mailjet/calls/manage-contacts-in-list.js +6 -5
- package/dist/mailjet/calls/manage-subscription-status.js +5 -4
- package/dist/mailjet/calls/request-service.js +6 -7
- package/dist/mailjet/refresh-email-preferences.js +12 -11
- package/dist/mailjet/set-contact.js +12 -11
- package/dist/mailjet/types.js +2 -1
- package/dist/mailjet/utils/convert-to-array.js +6 -8
- package/dist/mailjet/utils/extract-email-preferences.js +15 -14
- package/dist/mailjet/utils/lists.js +8 -7
- package/dist/mailjet/utils/update-email-references.js +15 -16
- package/dist/notion/client.js +19 -22
- package/dist/notion/helpful.js +9 -6
- package/dist/notion/schemas/block.js +48 -42
- package/dist/notion/schemas/common.js +14 -9
- package/dist/notion/schemas/database.js +60 -62
- package/dist/notion/schemas/emoji.js +2 -1
- package/dist/notion/schemas/file.js +9 -9
- package/dist/notion/schemas/kb.js +6 -5
- package/dist/notion/schemas/page.js +61 -72
- package/dist/notion/schemas/parent.js +5 -4
- package/dist/notion/schemas/user.js +19 -18
- package/dist/reservation/agree.js +7 -6
- package/dist/reservation/checks.js +4 -3
- package/dist/reservation/display-vehicle.js +71 -65
- package/dist/reservation/fetch-or-create.d.ts +4 -2
- package/dist/reservation/fetch-or-create.d.ts.map +1 -1
- package/dist/reservation/fetch-or-create.js +58 -60
- package/dist/reservation/fetch-or-create.js.map +1 -1
- package/dist/reservation/invoice.d.ts.map +1 -1
- package/dist/reservation/invoice.js +77 -85
- package/dist/reservation/invoice.js.map +1 -1
- package/dist/reservation/payer.js +6 -5
- package/dist/reservation/payment-intent-sync.d.ts +4 -0
- package/dist/reservation/payment-intent-sync.d.ts.map +1 -0
- package/dist/reservation/payment-intent-sync.js +22 -0
- package/dist/reservation/payment-intent-sync.js.map +1 -0
- package/dist/reservation/reserve.d.ts.map +1 -1
- package/dist/reservation/reserve.js +13 -3
- package/dist/reservation/reserve.js.map +1 -1
- package/dist/reservation/types.js +2 -1
- package/dist/reservation/vehicle.js +16 -13
- package/dist/slack.js +29 -24
- package/dist/validation.js +79 -77
- package/dist/vehicle/vehicle-pricing/constants.js +19 -22
- package/dist/vehicle/vehicle-pricing/index.js +42 -28
- package/dist/vehicle/vehicle-pricing/types.js +2 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { config } from '@driveflux/config/backend';
|
|
2
2
|
import { loadCoupon, PROBLEM_APPLICABLE_NOT_FOUND } from '@driveflux/coupon';
|
|
3
|
-
import { prisma } from '@driveflux/db';
|
|
3
|
+
import { prisma, } from '@driveflux/db';
|
|
4
4
|
import { generateId } from '@driveflux/db/id';
|
|
5
5
|
import { EMPTY_BILLING_ADDRESS } from '@driveflux/db/models/other';
|
|
6
6
|
import { PURPOSE_RESERVATION } from '@driveflux/db/models/subscription';
|
|
@@ -13,16 +13,17 @@ import { format } from '@driveflux/time';
|
|
|
13
13
|
import { isAfter } from 'date-fns/isAfter';
|
|
14
14
|
import { subMinutes } from 'date-fns/subMinutes';
|
|
15
15
|
import { createScopedLogger } from '../create-logger.js';
|
|
16
|
-
const
|
|
17
|
-
export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams)=>{
|
|
16
|
+
const _log = createScopedLogger('reservation:invoice');
|
|
17
|
+
export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams) => {
|
|
18
18
|
const couponIsDifferent = oldReservationInvoice.couponCode !== newParams.couponCode;
|
|
19
|
-
if (!couponIsDifferent &&
|
|
19
|
+
if (!couponIsDifferent &&
|
|
20
|
+
oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
|
|
20
21
|
return new Ok(oldReservationInvoice);
|
|
21
22
|
}
|
|
22
23
|
// If the coupon or payment intent are differnt we should update the invoice
|
|
23
24
|
let update = {
|
|
24
25
|
stripePaymentIntentId: newParams.paymentIntentId,
|
|
25
|
-
couponCode: newParams.couponCode
|
|
26
|
+
couponCode: newParams.couponCode,
|
|
26
27
|
};
|
|
27
28
|
// If the coupon is different, we need to apply the coupon to the invoice
|
|
28
29
|
if (couponIsDifferent) {
|
|
@@ -30,56 +31,63 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
|
|
|
30
31
|
const result = await coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice);
|
|
31
32
|
if (result.ok) {
|
|
32
33
|
const { discounts, ...rest } = result.val;
|
|
33
|
-
const toDisconnect = discounts
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
const toDisconnect = discounts
|
|
35
|
+
? oldReservationInvoice.discountIds?.filter((id) => !discounts.connect?.some((d) => d.id === id))
|
|
36
|
+
: undefined;
|
|
37
|
+
const disconnectClauses = toDisconnect?.length
|
|
38
|
+
? {
|
|
39
|
+
disconnect: toDisconnect.map((id) => ({ id })),
|
|
40
|
+
}
|
|
41
|
+
: undefined;
|
|
39
42
|
update = {
|
|
40
43
|
...update,
|
|
41
44
|
...rest,
|
|
42
|
-
...discounts || disconnectClauses
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
...(discounts || disconnectClauses
|
|
46
|
+
? {
|
|
47
|
+
discounts: {
|
|
48
|
+
...(discounts || {}),
|
|
49
|
+
...(disconnectClauses || {}),
|
|
50
|
+
},
|
|
46
51
|
}
|
|
47
|
-
|
|
52
|
+
: {}),
|
|
48
53
|
metadata: {
|
|
49
54
|
...update.metadata,
|
|
50
|
-
couponCode: newParams.couponCode
|
|
55
|
+
couponCode: newParams.couponCode,
|
|
51
56
|
},
|
|
52
57
|
providerMetadata: {
|
|
53
58
|
...update.providerMetadata,
|
|
54
|
-
couponCode: newParams.couponCode
|
|
55
|
-
}
|
|
59
|
+
couponCode: newParams.couponCode,
|
|
60
|
+
},
|
|
56
61
|
};
|
|
57
62
|
}
|
|
58
63
|
if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
|
|
59
64
|
return result;
|
|
60
65
|
}
|
|
61
|
-
}
|
|
66
|
+
}
|
|
67
|
+
else if (oldReservationInvoice.discountIds.length) {
|
|
62
68
|
// No discounts, so we disconnect all of them
|
|
63
69
|
update = {
|
|
64
70
|
discounts: {
|
|
65
|
-
disconnect: oldReservationInvoice.discountIds.map((id)=>({
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
71
|
+
disconnect: oldReservationInvoice.discountIds.map((id) => ({
|
|
72
|
+
id,
|
|
73
|
+
})),
|
|
74
|
+
},
|
|
69
75
|
};
|
|
70
76
|
}
|
|
71
77
|
}
|
|
72
78
|
let updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update));
|
|
73
79
|
// If the invoice was locked due to pending status and we're more than 1 minute old, we unlock it
|
|
74
80
|
if (updated.err && updated.val.code === 'invoice_pending') {
|
|
75
|
-
if (oldReservationInvoice.lockedAt &&
|
|
81
|
+
if ((oldReservationInvoice.lockedAt &&
|
|
82
|
+
isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1))) ||
|
|
83
|
+
!oldReservationInvoice.lockedAt) {
|
|
76
84
|
updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, {
|
|
77
85
|
...update,
|
|
78
86
|
locked: false,
|
|
79
87
|
lockedAt: null,
|
|
80
88
|
lockReason: null,
|
|
81
89
|
unlockAt: null,
|
|
82
|
-
status: 'draft'
|
|
90
|
+
status: 'draft',
|
|
83
91
|
}));
|
|
84
92
|
}
|
|
85
93
|
}
|
|
@@ -88,7 +96,7 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
|
|
|
88
96
|
}
|
|
89
97
|
return new Ok(updated.val);
|
|
90
98
|
};
|
|
91
|
-
export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser })=>{
|
|
99
|
+
export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser, }) => {
|
|
92
100
|
if (freeReservation) {
|
|
93
101
|
// It's a free reservation, so we don't need to add a coupon code
|
|
94
102
|
return await wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
|
|
@@ -101,17 +109,21 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
101
109
|
freeReservation,
|
|
102
110
|
freeReservationReason,
|
|
103
111
|
analytics,
|
|
104
|
-
reservationId
|
|
112
|
+
reservationId,
|
|
105
113
|
})));
|
|
106
114
|
}
|
|
107
115
|
let finalCouponCode = couponCode;
|
|
108
116
|
// If we don't have a reservation coupon ID, we apply the referral discount if any
|
|
109
|
-
const referral = referralCode &&
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
const referral = referralCode &&
|
|
118
|
+
(await prisma.referral.findUnique({
|
|
119
|
+
where: {
|
|
120
|
+
id: referralCode,
|
|
121
|
+
},
|
|
122
|
+
}));
|
|
123
|
+
if (!finalCouponCode &&
|
|
124
|
+
referral &&
|
|
125
|
+
referral.discountToReceiverCouponId &&
|
|
126
|
+
referral.discountToReceiverCouponApplicationName === 'reservationFee') {
|
|
115
127
|
const referralCoupon = await loadCoupon(referral.discountToReceiverCouponId);
|
|
116
128
|
if (referralCoupon) {
|
|
117
129
|
finalCouponCode = referralCoupon.code;
|
|
@@ -130,17 +142,16 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
130
142
|
freeReservation,
|
|
131
143
|
freeReservationReason,
|
|
132
144
|
analytics,
|
|
133
|
-
reservationId
|
|
145
|
+
reservationId,
|
|
134
146
|
}),
|
|
135
147
|
lines: [
|
|
136
148
|
{
|
|
137
149
|
amount: reservationAmount,
|
|
138
150
|
description: `Reservation fee for ${vehicleName(vehicle)}`,
|
|
139
|
-
chargingFor: 'reservationFee'
|
|
140
|
-
}
|
|
141
|
-
]
|
|
151
|
+
chargingFor: 'reservationFee',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
142
154
|
};
|
|
143
|
-
console.log('invoiceCreateDetails', invoiceCreateDetails);
|
|
144
155
|
if (finalCouponCode) {
|
|
145
156
|
const withCoupon = await coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
|
|
146
157
|
subscriptionPlans: plan,
|
|
@@ -149,9 +160,10 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
149
160
|
vehicleMake: vehicle.make,
|
|
150
161
|
userId: subscribingUser.id,
|
|
151
162
|
businessId: payer.object === 'business' ? payer.id : undefined,
|
|
152
|
-
vehicleType: vehicle.type
|
|
163
|
+
vehicleType: vehicle.type,
|
|
153
164
|
});
|
|
154
|
-
if (withCoupon.err &&
|
|
165
|
+
if (withCoupon.err &&
|
|
166
|
+
withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
|
|
155
167
|
return withCoupon;
|
|
156
168
|
}
|
|
157
169
|
if (withCoupon.ok) {
|
|
@@ -159,47 +171,28 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
159
171
|
...withCoupon.val,
|
|
160
172
|
metadata: {
|
|
161
173
|
...withCoupon.val.metadata,
|
|
162
|
-
couponCode: finalCouponCode
|
|
174
|
+
couponCode: finalCouponCode,
|
|
163
175
|
},
|
|
164
176
|
providerMetadata: {
|
|
165
177
|
...withCoupon.val.providerMetadata,
|
|
166
|
-
couponCode: finalCouponCode
|
|
167
|
-
}
|
|
178
|
+
couponCode: finalCouponCode,
|
|
179
|
+
},
|
|
168
180
|
};
|
|
169
181
|
}
|
|
170
182
|
}
|
|
171
|
-
console.log('invoiceCreateDetails after coupon', invoiceCreateDetails);
|
|
172
183
|
const result = await wrapInResult(biller.createInvoice({
|
|
173
184
|
...invoiceCreateDetails,
|
|
174
185
|
providerMetadata: {
|
|
175
186
|
...invoiceCreateDetails.providerMetadata,
|
|
176
|
-
invoiceId: invoiceCreateDetails.id
|
|
177
|
-
}
|
|
187
|
+
invoiceId: invoiceCreateDetails.id,
|
|
188
|
+
},
|
|
178
189
|
}));
|
|
179
190
|
if (result.err) {
|
|
180
191
|
return result;
|
|
181
192
|
}
|
|
182
|
-
// Let's make sure the payment intent, if provided, has the invoiceId set in the metadata
|
|
183
|
-
if (paymentIntentId) {
|
|
184
|
-
log.warn({
|
|
185
|
-
paymentIntentId,
|
|
186
|
-
invoiceId: result.val.id
|
|
187
|
-
}, 'Payment intent provided but invoice ID is not set in the provider metadata');
|
|
188
|
-
const stripe = biller.getPaymentProvider('stripe').getStripe();
|
|
189
|
-
try {
|
|
190
|
-
await stripe.paymentIntents.update(paymentIntentId, {
|
|
191
|
-
metadata: {
|
|
192
|
-
...result.val.providerMetadata,
|
|
193
|
-
invoiceId: result.val.id
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
} catch (error) {
|
|
197
|
-
log.error(error, 'Error updating payment intent metadata');
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
193
|
return new Ok(result.val);
|
|
201
194
|
};
|
|
202
|
-
const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId })=>{
|
|
195
|
+
const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId, }) => {
|
|
203
196
|
return {
|
|
204
197
|
id: invoiceId || generateId('Invoice'),
|
|
205
198
|
taxPercentage: 0,
|
|
@@ -215,13 +208,15 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
215
208
|
description: 'Reservation fee for a FLUX subscription',
|
|
216
209
|
footer: `Invoice for a FLUX subscription reservation. Due by ${format(date ?? new Date())}`,
|
|
217
210
|
invoiceUrl: `${config.appUrl}/invoice-preview/${invoiceId}`,
|
|
218
|
-
...reservationDiscountId
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
211
|
+
...(reservationDiscountId
|
|
212
|
+
? {
|
|
213
|
+
discounts: {
|
|
214
|
+
connect: {
|
|
215
|
+
id: reservationDiscountId,
|
|
216
|
+
},
|
|
217
|
+
},
|
|
223
218
|
}
|
|
224
|
-
|
|
219
|
+
: {}),
|
|
225
220
|
lines: [],
|
|
226
221
|
subscriptionDetails: {
|
|
227
222
|
vehicleId: vehicle.id,
|
|
@@ -230,7 +225,7 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
230
225
|
variant: vehicle.variant,
|
|
231
226
|
year: vehicle.year,
|
|
232
227
|
plan: plan,
|
|
233
|
-
mileagePackage: mileagePackage
|
|
228
|
+
mileagePackage: mileagePackage,
|
|
234
229
|
},
|
|
235
230
|
// Legacy field:
|
|
236
231
|
stripePaymentIntentId: paymentIntentId,
|
|
@@ -240,18 +235,14 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
240
235
|
mileagePackage,
|
|
241
236
|
vehicleId: vehicle.id,
|
|
242
237
|
vehicleName: vehicleName(vehicle),
|
|
243
|
-
...reservationId ? {
|
|
244
|
-
|
|
245
|
-
} : {},
|
|
246
|
-
...couponCode ? {
|
|
247
|
-
couponCode
|
|
248
|
-
} : {}
|
|
238
|
+
...(reservationId ? { reservationId } : {}),
|
|
239
|
+
...(couponCode ? { couponCode } : {}),
|
|
249
240
|
},
|
|
250
241
|
autoRetry: {
|
|
251
242
|
enabled: false,
|
|
252
243
|
interval: 0,
|
|
253
244
|
maxAttempts: 0,
|
|
254
|
-
attempts: 0
|
|
245
|
+
attempts: 0,
|
|
255
246
|
},
|
|
256
247
|
metadata: {
|
|
257
248
|
purpose: PURPOSE_RESERVATION,
|
|
@@ -260,10 +251,11 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
260
251
|
plan,
|
|
261
252
|
mileagePackage,
|
|
262
253
|
couponCode,
|
|
263
|
-
...freeReservation && freeReservationReason
|
|
264
|
-
freeReservationReason
|
|
265
|
-
|
|
266
|
-
analytics
|
|
267
|
-
}
|
|
254
|
+
...(freeReservation && freeReservationReason
|
|
255
|
+
? { freeReservationReason }
|
|
256
|
+
: {}),
|
|
257
|
+
analytics,
|
|
258
|
+
},
|
|
268
259
|
};
|
|
269
260
|
};
|
|
261
|
+
//# sourceMappingURL=invoice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../src/reservation/invoice.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAGN,MAAM,GAGN,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,EAAE,EAAuB,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAwBxD,MAAM,
|
|
1
|
+
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../src/reservation/invoice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { prisma } from '@driveflux/db';
|
|
2
|
-
import { makeProblem, PROBLEM_CONDITION_FAILED, PROBLEM_NOT_FOUND } from '@driveflux/problem';
|
|
2
|
+
import { makeProblem, PROBLEM_CONDITION_FAILED, PROBLEM_NOT_FOUND, } from '@driveflux/problem';
|
|
3
3
|
import { Err, Ok } from '@driveflux/result';
|
|
4
|
-
export const getPayer = async ({ subscribingUser, asBusiness })=>{
|
|
4
|
+
export const getPayer = async ({ subscribingUser, asBusiness, }) => {
|
|
5
5
|
let business = null;
|
|
6
6
|
let payer = subscribingUser;
|
|
7
7
|
if (asBusiness) {
|
|
@@ -11,8 +11,8 @@ export const getPayer = async ({ subscribingUser, asBusiness })=>{
|
|
|
11
11
|
// load business
|
|
12
12
|
business = await prisma.business.findUnique({
|
|
13
13
|
where: {
|
|
14
|
-
id: subscribingUser.businessId
|
|
15
|
-
}
|
|
14
|
+
id: subscribingUser.businessId,
|
|
15
|
+
},
|
|
16
16
|
});
|
|
17
17
|
if (!business) {
|
|
18
18
|
return new Err(makeProblem(PROBLEM_NOT_FOUND, `The business ${subscribingUser.businessId} was not found.`));
|
|
@@ -26,7 +26,7 @@ export const getPayer = async ({ subscribingUser, asBusiness })=>{
|
|
|
26
26
|
}
|
|
27
27
|
return new Ok(payer);
|
|
28
28
|
};
|
|
29
|
-
const checkPayerObjectSanity = (subscriber)=>{
|
|
29
|
+
const checkPayerObjectSanity = (subscriber) => {
|
|
30
30
|
if (!subscriber.email) {
|
|
31
31
|
return new Err(makeProblem(PROBLEM_CONDITION_FAILED, `Subscriber ${subscriber.id} has no email. Please add a verified email first.`));
|
|
32
32
|
}
|
|
@@ -35,3 +35,4 @@ const checkPayerObjectSanity = (subscriber)=>{
|
|
|
35
35
|
}
|
|
36
36
|
return new Ok(true);
|
|
37
37
|
};
|
|
38
|
+
//# sourceMappingURL=payer.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Invoice } from '@driveflux/db';
|
|
2
|
+
import { Err, Ok } from '@driveflux/result';
|
|
3
|
+
export declare const ensurePaymentIntentIdIsSynced: (invoice: Invoice, paymentIntentId: string) => Promise<Err<import("@driveflux/problem").Problem, unknown> | Ok<boolean, unknown>>;
|
|
4
|
+
//# sourceMappingURL=payment-intent-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-intent-sync.d.ts","sourceRoot":"","sources":["../../src/reservation/payment-intent-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAA;AAK3C,eAAO,MAAM,6BAA6B,GACzC,SAAS,OAAO,EAChB,iBAAiB,MAAM,uFAkBvB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { biller } from '@driveflux/engine';
|
|
2
|
+
import { makeProblem, PROBLEM_EXTERNAL } from '@driveflux/problem';
|
|
3
|
+
import { Err, Ok } from '@driveflux/result';
|
|
4
|
+
import { createScopedLogger } from '../create-logger.js';
|
|
5
|
+
const log = createScopedLogger('reservation:payment-intent-sync');
|
|
6
|
+
export const ensurePaymentIntentIdIsSynced = async (invoice, paymentIntentId) => {
|
|
7
|
+
const stripe = biller.getPaymentProvider('stripe').getStripe();
|
|
8
|
+
try {
|
|
9
|
+
await stripe.paymentIntents.update(paymentIntentId, {
|
|
10
|
+
metadata: {
|
|
11
|
+
...invoice.providerMetadata,
|
|
12
|
+
invoiceId: invoice.id,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
return new Ok(true);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
log.error(error, 'Error updating payment intent metadata');
|
|
19
|
+
return new Err(makeProblem(PROBLEM_EXTERNAL, 'Error updating payment intent metadata'));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=payment-intent-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-intent-sync.js","sourceRoot":"","sources":["../../src/reservation/payment-intent-sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,GAAG,GAAG,kBAAkB,CAAC,iCAAiC,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EACjD,OAAgB,EAChB,eAAuB,EACtB,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAA;IAC9D,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE;YACnD,QAAQ,EAAE;gBACT,GAAG,OAAO,CAAC,gBAAgB;gBAC3B,SAAS,EAAE,OAAO,CAAC,EAAE;aACrB;SACD,CAAC,CAAA;QAEF,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,wCAAwC,CAAC,CAAA;QAC1D,OAAO,IAAI,GAAG,CACb,WAAW,CAAC,gBAAgB,EAAE,wCAAwC,CAAC,CACvE,CAAA;IACF,CAAC;AACF,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.d.ts","sourceRoot":"","sources":["../../src/reservation/reserve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"reserve.d.ts","sourceRoot":"","sources":["../../src/reservation/reserve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAM3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAYtD,eAAO,MAAM,cAAc,GAC1B,WAAW,MAAM,EACjB,aAAa,oBAAoB,KAC/B,cAAc,CAAC,uBAAuB,CA8CxC,CAAA"}
|
|
@@ -3,15 +3,16 @@ import { handleAgreeToTerms } from './agree.js';
|
|
|
3
3
|
import { checkIfUserCanReserve } from './checks.js';
|
|
4
4
|
import { fetchOrCreateReservation } from './fetch-or-create.js';
|
|
5
5
|
import { getPayer } from './payer.js';
|
|
6
|
+
import { ensurePaymentIntentIdIsSynced } from './payment-intent-sync.js';
|
|
6
7
|
import { getVehicle } from './vehicle.js';
|
|
7
|
-
const processBody = (body)=>{
|
|
8
|
+
const processBody = (body) => {
|
|
8
9
|
// Switch mileage package
|
|
9
10
|
if (body.plan === 'plan1' || body.plan === 'planWeekly') {
|
|
10
11
|
body.mileagePackage = 'unlimited';
|
|
11
12
|
}
|
|
12
13
|
return body;
|
|
13
14
|
};
|
|
14
|
-
export const reserveVehicle = async (vehicleId, unprocessed)=>{
|
|
15
|
+
export const reserveVehicle = async (vehicleId, unprocessed) => {
|
|
15
16
|
const body = processBody(unprocessed);
|
|
16
17
|
// Agree to terms if not done yet
|
|
17
18
|
await handleAgreeToTerms(body);
|
|
@@ -33,11 +34,20 @@ export const reserveVehicle = async (vehicleId, unprocessed)=>{
|
|
|
33
34
|
const reservationResult = await fetchOrCreateReservation({
|
|
34
35
|
vehicle,
|
|
35
36
|
payer,
|
|
36
|
-
body
|
|
37
|
+
body,
|
|
37
38
|
});
|
|
38
39
|
if (reservationResult.err) {
|
|
39
40
|
return reservationResult;
|
|
40
41
|
}
|
|
41
42
|
const reservation = reservationResult.val;
|
|
43
|
+
// Last measure to make sure that the invoice attached has the payment intent ID and
|
|
44
|
+
// the payment intent ID is set in the metadata
|
|
45
|
+
if (body.paymentIntentId) {
|
|
46
|
+
const updatedInvoiceResult = await ensurePaymentIntentIdIsSynced(reservation.invoice, body.paymentIntentId);
|
|
47
|
+
if (updatedInvoiceResult.err) {
|
|
48
|
+
return updatedInvoiceResult;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
42
51
|
return new Ok(reservation);
|
|
43
52
|
};
|
|
53
|
+
//# sourceMappingURL=reserve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/reservation/reserve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAuB,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/reservation/reserve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAuB,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAA;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,WAAW,GAAG,CAAC,IAA0B,EAAwB,EAAE;IACxE,yBAAyB;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,SAAiB,EACjB,WAAiC,EACS,EAAE;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAErC,iCAAiC;IACjC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAE9B,gCAAgC;IAChC,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAE1D,QAAQ;IACR,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;IACxC,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;QACrB,OAAO,WAAW,CAAA;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAA;IAE7B,UAAU;IACV,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACzE,IAAI,aAAa,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,aAAa,CAAA;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAA;IACjC,gCAAgC;IAChC,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,CAAC;QACxD,OAAO;QACP,KAAK;QACL,IAAI;KACJ,CAAC,CAAA;IACF,IAAI,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAA;IACzB,CAAC;IACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAA;IAEzC,oFAAoF;IACpF,+CAA+C;IAC/C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,oBAAoB,GAAG,MAAM,6BAA6B,CAC/D,WAAW,CAAC,OAAO,EACnB,IAAI,CAAC,eAAe,CACpB,CAAA;QACD,IAAI,oBAAoB,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO,oBAAoB,CAAA;QAC5B,CAAC;IACF,CAAC;IAED,OAAO,IAAI,EAAE,CAAC,WAAW,CAAC,CAAA;AAC3B,CAAC,CAAA"}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -4,19 +4,21 @@ import { makeProblem, PROBLEM_NOT_FOUND } from '@driveflux/problem';
|
|
|
4
4
|
import { Err, Ok } from '@driveflux/result';
|
|
5
5
|
import { checkIfVehicleIsAvailableForReservation } from './checks.js';
|
|
6
6
|
import { createVehicleFromDisplayVehicle } from './display-vehicle.js';
|
|
7
|
-
export const getVehicle = async (id, { selectedColor, plan, requestUser }, requesterAbility)=>{
|
|
8
|
-
const vehicle = id.startsWith('DV_')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
export const getVehicle = async (id, { selectedColor, plan, requestUser, }, requesterAbility) => {
|
|
8
|
+
const vehicle = id.startsWith('DV_')
|
|
9
|
+
? await createVehicleFromDisplayVehicle(id, selectedColor || undefined)
|
|
10
|
+
: await prisma.vehicle.findUnique({
|
|
11
|
+
where: {
|
|
12
|
+
id,
|
|
13
|
+
},
|
|
14
|
+
include: {
|
|
15
|
+
host: {
|
|
16
|
+
select: {
|
|
17
|
+
id: true,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
});
|
|
20
22
|
if (!vehicle) {
|
|
21
23
|
return new Err(makeProblem(PROBLEM_NOT_FOUND, 'Vehicle not found'));
|
|
22
24
|
}
|
|
@@ -27,3 +29,4 @@ export const getVehicle = async (id, { selectedColor, plan, requestUser }, reque
|
|
|
27
29
|
}
|
|
28
30
|
return new Ok(vehicle);
|
|
29
31
|
};
|
|
32
|
+
//# sourceMappingURL=vehicle.js.map
|
package/dist/slack.js
CHANGED
|
@@ -10,11 +10,12 @@ const slackBlocks = global.__slackBlocks;
|
|
|
10
10
|
/**
|
|
11
11
|
*
|
|
12
12
|
* @deprecated Use slackLater instead and commitSlack to commit
|
|
13
|
-
*/
|
|
13
|
+
*/
|
|
14
|
+
export const slack = async (message, channel = config.slack.defaultChannelId) => {
|
|
14
15
|
return await enhancedFetch('https://slack.com/api/chat.postMessage', {
|
|
15
16
|
method: 'POST',
|
|
16
17
|
headers: {
|
|
17
|
-
Authorization: `Bearer ${config.slack.token}
|
|
18
|
+
Authorization: `Bearer ${config.slack.token}`,
|
|
18
19
|
},
|
|
19
20
|
body: JSON.stringify({
|
|
20
21
|
channel,
|
|
@@ -23,20 +24,23 @@ const slackBlocks = global.__slackBlocks;
|
|
|
23
24
|
type: 'section',
|
|
24
25
|
text: {
|
|
25
26
|
type: 'mrkdwn',
|
|
26
|
-
text: message
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
})
|
|
27
|
+
text: message,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
}),
|
|
31
32
|
});
|
|
32
33
|
};
|
|
33
|
-
export const getSlackBlocks = (channel)=>channel ? slackBlocks.get(channel) : slackBlocks;
|
|
34
|
+
export const getSlackBlocks = (channel) => channel ? slackBlocks.get(channel) : slackBlocks;
|
|
34
35
|
/**
|
|
35
36
|
* Naive implementation, however, for now (uncrowded serverless env), this works
|
|
36
37
|
* @param blocks
|
|
37
38
|
* @param channel
|
|
38
|
-
*/
|
|
39
|
-
|
|
39
|
+
*/
|
|
40
|
+
export function slackLater(blocks, channel) {
|
|
41
|
+
const targetChannel = (config.appEnv === 'production'
|
|
42
|
+
? channel
|
|
43
|
+
: config.slack.defaultChannelId) || config.slack.defaultChannelId;
|
|
40
44
|
if (!targetChannel || !blocks) {
|
|
41
45
|
return;
|
|
42
46
|
}
|
|
@@ -46,13 +50,15 @@ export const getSlackBlocks = (channel)=>channel ? slackBlocks.get(channel) : sl
|
|
|
46
50
|
type: 'section',
|
|
47
51
|
text: {
|
|
48
52
|
type: 'mrkdwn',
|
|
49
|
-
text: blocks
|
|
50
|
-
}
|
|
53
|
+
text: blocks,
|
|
54
|
+
},
|
|
51
55
|
});
|
|
52
|
-
}
|
|
56
|
+
}
|
|
57
|
+
else if (!Array.isArray(blocks)) {
|
|
53
58
|
messages.add(blocks);
|
|
54
|
-
}
|
|
55
|
-
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
for (const b of blocks) {
|
|
56
62
|
messages.add(b);
|
|
57
63
|
}
|
|
58
64
|
}
|
|
@@ -63,22 +69,22 @@ export async function sendSlackMessages(channel, blocks) {
|
|
|
63
69
|
return await enhancedFetch('https://slack.com/api/chat.postMessage', {
|
|
64
70
|
method: 'POST',
|
|
65
71
|
headers: {
|
|
66
|
-
Authorization: `Bearer ${config.slack.token}
|
|
72
|
+
Authorization: `Bearer ${config.slack.token}`,
|
|
67
73
|
},
|
|
68
74
|
body: JSON.stringify({
|
|
69
75
|
channel: targetChannel,
|
|
70
|
-
blocks: Array.from(blocks)
|
|
71
|
-
})
|
|
76
|
+
blocks: Array.from(blocks),
|
|
77
|
+
}),
|
|
72
78
|
});
|
|
73
79
|
}
|
|
74
|
-
export const commitSlack = ()=>{
|
|
80
|
+
export const commitSlack = () => {
|
|
75
81
|
if (!slackBlocks.size) {
|
|
76
82
|
return;
|
|
77
83
|
}
|
|
78
84
|
const channels = slackBlocks.keys();
|
|
79
85
|
let i = 1;
|
|
80
86
|
const baseUrl = config.appEnv === 'development' ? config.tunnelUrl : config.appUrl;
|
|
81
|
-
for (const channel of channels){
|
|
87
|
+
for (const channel of channels) {
|
|
82
88
|
const blocks = slackBlocks.get(channel);
|
|
83
89
|
if (!blocks?.size) {
|
|
84
90
|
continue;
|
|
@@ -88,13 +94,12 @@ export const commitSlack = ()=>{
|
|
|
88
94
|
name: TASK_COMMIT_SLACK_CHANNEL,
|
|
89
95
|
metadata: {
|
|
90
96
|
channel,
|
|
91
|
-
blocks: [
|
|
92
|
-
...blocks
|
|
93
|
-
]
|
|
97
|
+
blocks: [...blocks],
|
|
94
98
|
},
|
|
95
99
|
taskHandlerUrl: `${baseUrl || config.appUrl}/api/hooks/slack-pipeline`,
|
|
96
|
-
scheduledAt: addSeconds(new Date(), i++)
|
|
100
|
+
scheduledAt: addSeconds(new Date(), i++),
|
|
97
101
|
});
|
|
98
102
|
}
|
|
99
103
|
slackBlocks.clear();
|
|
100
104
|
};
|
|
105
|
+
//# sourceMappingURL=slack.js.map
|