@driveflux/api-functions 1.0.29 → 1.0.31
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 +24 -29
- package/dist/auth/emails.js +12 -13
- package/dist/auth/formatter.js +5 -5
- package/dist/auth/otp.js +66 -50
- package/dist/auth/register.js +42 -34
- package/dist/auth/tokens.js +58 -55
- package/dist/auth/verifications.js +53 -52
- package/dist/constants.js +0 -1
- package/dist/create-logger.js +1 -2
- package/dist/mailjet/calls/manage-contacts-in-list.js +5 -6
- package/dist/mailjet/calls/manage-subscription-status.js +4 -5
- package/dist/mailjet/calls/request-service.js +7 -6
- package/dist/mailjet/refresh-email-preferences.js +11 -12
- package/dist/mailjet/set-contact.js +11 -12
- package/dist/mailjet/types.js +1 -2
- package/dist/mailjet/utils/convert-to-array.js +8 -6
- package/dist/mailjet/utils/extract-email-preferences.js +14 -15
- package/dist/mailjet/utils/lists.js +7 -8
- package/dist/mailjet/utils/update-email-references.js +16 -15
- package/dist/notion/client.js +22 -19
- package/dist/notion/helpful.js +6 -9
- package/dist/notion/schemas/block.js +42 -48
- package/dist/notion/schemas/common.js +9 -14
- package/dist/notion/schemas/database.js +62 -60
- package/dist/notion/schemas/emoji.js +1 -2
- package/dist/notion/schemas/file.js +9 -9
- package/dist/notion/schemas/kb.js +5 -6
- package/dist/notion/schemas/page.js +72 -61
- package/dist/notion/schemas/parent.js +4 -5
- package/dist/notion/schemas/user.js +18 -19
- package/dist/reservation/agree.js +6 -7
- package/dist/reservation/checks.js +3 -4
- package/dist/reservation/display-vehicle.js +65 -71
- package/dist/reservation/fetch-or-create.js +48 -54
- package/dist/reservation/invoice.js +64 -76
- package/dist/reservation/payer.js +5 -6
- package/dist/reservation/payment-intent-sync.js +4 -6
- package/dist/reservation/reserve.js +3 -4
- package/dist/reservation/types.js +1 -2
- package/dist/reservation/vehicle.js +13 -16
- package/dist/slack.js +24 -29
- package/dist/validation.js +77 -79
- package/dist/vehicle/vehicle-pricing/constants.js +22 -19
- package/dist/vehicle/vehicle-pricing/index.js +28 -42
- package/dist/vehicle/vehicle-pricing/types.js +1 -2
- package/package.json +9 -9
|
@@ -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
|
|
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';
|
|
@@ -14,16 +14,15 @@ import { isAfter } from 'date-fns/isAfter';
|
|
|
14
14
|
import { subMinutes } from 'date-fns/subMinutes';
|
|
15
15
|
import { createScopedLogger } from '../create-logger.js';
|
|
16
16
|
const _log = createScopedLogger('reservation:invoice');
|
|
17
|
-
export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams)
|
|
17
|
+
export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams)=>{
|
|
18
18
|
const couponIsDifferent = oldReservationInvoice.couponCode !== newParams.couponCode;
|
|
19
|
-
if (!couponIsDifferent &&
|
|
20
|
-
oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
|
|
19
|
+
if (!couponIsDifferent && oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
|
|
21
20
|
return new Ok(oldReservationInvoice);
|
|
22
21
|
}
|
|
23
22
|
// If the coupon or payment intent are differnt we should update the invoice
|
|
24
23
|
let update = {
|
|
25
24
|
stripePaymentIntentId: newParams.paymentIntentId,
|
|
26
|
-
couponCode: newParams.couponCode
|
|
25
|
+
couponCode: newParams.couponCode
|
|
27
26
|
};
|
|
28
27
|
// If the coupon is different, we need to apply the coupon to the invoice
|
|
29
28
|
if (couponIsDifferent) {
|
|
@@ -31,63 +30,56 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
|
|
|
31
30
|
const result = await coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice);
|
|
32
31
|
if (result.ok) {
|
|
33
32
|
const { discounts, ...rest } = result.val;
|
|
34
|
-
const toDisconnect = discounts
|
|
35
|
-
|
|
36
|
-
:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
: undefined;
|
|
33
|
+
const toDisconnect = discounts ? oldReservationInvoice.discountIds?.filter((id)=>!discounts.connect?.some((d)=>d.id === id)) : undefined;
|
|
34
|
+
const disconnectClauses = toDisconnect?.length ? {
|
|
35
|
+
disconnect: toDisconnect.map((id)=>({
|
|
36
|
+
id
|
|
37
|
+
}))
|
|
38
|
+
} : undefined;
|
|
42
39
|
update = {
|
|
43
40
|
...update,
|
|
44
41
|
...rest,
|
|
45
|
-
...
|
|
46
|
-
|
|
47
|
-
discounts
|
|
48
|
-
|
|
49
|
-
...(disconnectClauses || {}),
|
|
50
|
-
},
|
|
42
|
+
...discounts || disconnectClauses ? {
|
|
43
|
+
discounts: {
|
|
44
|
+
...discounts || {},
|
|
45
|
+
...disconnectClauses || {}
|
|
51
46
|
}
|
|
52
|
-
|
|
47
|
+
} : {},
|
|
53
48
|
metadata: {
|
|
54
49
|
...update.metadata,
|
|
55
|
-
couponCode: newParams.couponCode
|
|
50
|
+
couponCode: newParams.couponCode
|
|
56
51
|
},
|
|
57
52
|
providerMetadata: {
|
|
58
53
|
...update.providerMetadata,
|
|
59
|
-
couponCode: newParams.couponCode
|
|
60
|
-
}
|
|
54
|
+
couponCode: newParams.couponCode
|
|
55
|
+
}
|
|
61
56
|
};
|
|
62
57
|
}
|
|
63
58
|
if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
|
|
64
59
|
return result;
|
|
65
60
|
}
|
|
66
|
-
}
|
|
67
|
-
else if (oldReservationInvoice.discountIds.length) {
|
|
61
|
+
} else if (oldReservationInvoice.discountIds.length) {
|
|
68
62
|
// No discounts, so we disconnect all of them
|
|
69
63
|
update = {
|
|
70
64
|
discounts: {
|
|
71
|
-
disconnect: oldReservationInvoice.discountIds.map((id)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
65
|
+
disconnect: oldReservationInvoice.discountIds.map((id)=>({
|
|
66
|
+
id
|
|
67
|
+
}))
|
|
68
|
+
}
|
|
75
69
|
};
|
|
76
70
|
}
|
|
77
71
|
}
|
|
78
72
|
let updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update));
|
|
79
73
|
// If the invoice was locked due to pending status and we're more than 1 minute old, we unlock it
|
|
80
74
|
if (updated.err && updated.val.code === 'invoice_pending') {
|
|
81
|
-
if ((oldReservationInvoice.lockedAt
|
|
82
|
-
isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1))) ||
|
|
83
|
-
!oldReservationInvoice.lockedAt) {
|
|
75
|
+
if (oldReservationInvoice.lockedAt && isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1)) || !oldReservationInvoice.lockedAt) {
|
|
84
76
|
updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, {
|
|
85
77
|
...update,
|
|
86
78
|
locked: false,
|
|
87
79
|
lockedAt: null,
|
|
88
80
|
lockReason: null,
|
|
89
81
|
unlockAt: null,
|
|
90
|
-
status: 'draft'
|
|
82
|
+
status: 'draft'
|
|
91
83
|
}));
|
|
92
84
|
}
|
|
93
85
|
}
|
|
@@ -96,7 +88,7 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
|
|
|
96
88
|
}
|
|
97
89
|
return new Ok(updated.val);
|
|
98
90
|
};
|
|
99
|
-
export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser
|
|
91
|
+
export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser })=>{
|
|
100
92
|
if (freeReservation) {
|
|
101
93
|
// It's a free reservation, so we don't need to add a coupon code
|
|
102
94
|
return await wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
|
|
@@ -109,21 +101,17 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
109
101
|
freeReservation,
|
|
110
102
|
freeReservationReason,
|
|
111
103
|
analytics,
|
|
112
|
-
reservationId
|
|
104
|
+
reservationId
|
|
113
105
|
})));
|
|
114
106
|
}
|
|
115
107
|
let finalCouponCode = couponCode;
|
|
116
108
|
// If we don't have a reservation coupon ID, we apply the referral discount if any
|
|
117
|
-
const referral = referralCode &&
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (!finalCouponCode &&
|
|
124
|
-
referral &&
|
|
125
|
-
referral.discountToReceiverCouponId &&
|
|
126
|
-
referral.discountToReceiverCouponApplicationName === 'reservationFee') {
|
|
109
|
+
const referral = referralCode && await prisma.referral.findUnique({
|
|
110
|
+
where: {
|
|
111
|
+
id: referralCode
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
if (!finalCouponCode && referral && referral.discountToReceiverCouponId && referral.discountToReceiverCouponApplicationName === 'reservationFee') {
|
|
127
115
|
const referralCoupon = await loadCoupon(referral.discountToReceiverCouponId);
|
|
128
116
|
if (referralCoupon) {
|
|
129
117
|
finalCouponCode = referralCoupon.code;
|
|
@@ -142,15 +130,15 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
142
130
|
freeReservation,
|
|
143
131
|
freeReservationReason,
|
|
144
132
|
analytics,
|
|
145
|
-
reservationId
|
|
133
|
+
reservationId
|
|
146
134
|
}),
|
|
147
135
|
lines: [
|
|
148
136
|
{
|
|
149
137
|
amount: reservationAmount,
|
|
150
138
|
description: `Reservation fee for ${vehicleName(vehicle)}`,
|
|
151
|
-
chargingFor: 'reservationFee'
|
|
152
|
-
}
|
|
153
|
-
]
|
|
139
|
+
chargingFor: 'reservationFee'
|
|
140
|
+
}
|
|
141
|
+
]
|
|
154
142
|
};
|
|
155
143
|
if (finalCouponCode) {
|
|
156
144
|
const withCoupon = await coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
|
|
@@ -160,10 +148,9 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
160
148
|
vehicleMake: vehicle.make,
|
|
161
149
|
userId: subscribingUser.id,
|
|
162
150
|
businessId: payer.object === 'business' ? payer.id : undefined,
|
|
163
|
-
vehicleType: vehicle.type
|
|
151
|
+
vehicleType: vehicle.type
|
|
164
152
|
});
|
|
165
|
-
if (withCoupon.err &&
|
|
166
|
-
withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
|
|
153
|
+
if (withCoupon.err && withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
|
|
167
154
|
return withCoupon;
|
|
168
155
|
}
|
|
169
156
|
if (withCoupon.ok) {
|
|
@@ -171,12 +158,12 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
171
158
|
...withCoupon.val,
|
|
172
159
|
metadata: {
|
|
173
160
|
...withCoupon.val.metadata,
|
|
174
|
-
couponCode: finalCouponCode
|
|
161
|
+
couponCode: finalCouponCode
|
|
175
162
|
},
|
|
176
163
|
providerMetadata: {
|
|
177
164
|
...withCoupon.val.providerMetadata,
|
|
178
|
-
couponCode: finalCouponCode
|
|
179
|
-
}
|
|
165
|
+
couponCode: finalCouponCode
|
|
166
|
+
}
|
|
180
167
|
};
|
|
181
168
|
}
|
|
182
169
|
}
|
|
@@ -184,15 +171,15 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
|
|
|
184
171
|
...invoiceCreateDetails,
|
|
185
172
|
providerMetadata: {
|
|
186
173
|
...invoiceCreateDetails.providerMetadata,
|
|
187
|
-
invoiceId: invoiceCreateDetails.id
|
|
188
|
-
}
|
|
174
|
+
invoiceId: invoiceCreateDetails.id
|
|
175
|
+
}
|
|
189
176
|
}));
|
|
190
177
|
if (result.err) {
|
|
191
178
|
return result;
|
|
192
179
|
}
|
|
193
180
|
return new Ok(result.val);
|
|
194
181
|
};
|
|
195
|
-
const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId
|
|
182
|
+
const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId })=>{
|
|
196
183
|
return {
|
|
197
184
|
id: invoiceId || generateId('Invoice'),
|
|
198
185
|
taxPercentage: 0,
|
|
@@ -208,15 +195,13 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
208
195
|
description: 'Reservation fee for a FLUX subscription',
|
|
209
196
|
footer: `Invoice for a FLUX subscription reservation. Due by ${format(date ?? new Date())}`,
|
|
210
197
|
invoiceUrl: `${config.appUrl}/invoice-preview/${invoiceId}`,
|
|
211
|
-
...
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
},
|
|
217
|
-
},
|
|
198
|
+
...reservationDiscountId ? {
|
|
199
|
+
discounts: {
|
|
200
|
+
connect: {
|
|
201
|
+
id: reservationDiscountId
|
|
202
|
+
}
|
|
218
203
|
}
|
|
219
|
-
|
|
204
|
+
} : {},
|
|
220
205
|
lines: [],
|
|
221
206
|
subscriptionDetails: {
|
|
222
207
|
vehicleId: vehicle.id,
|
|
@@ -225,7 +210,7 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
225
210
|
variant: vehicle.variant,
|
|
226
211
|
year: vehicle.year,
|
|
227
212
|
plan: plan,
|
|
228
|
-
mileagePackage: mileagePackage
|
|
213
|
+
mileagePackage: mileagePackage
|
|
229
214
|
},
|
|
230
215
|
// Legacy field:
|
|
231
216
|
stripePaymentIntentId: paymentIntentId,
|
|
@@ -235,14 +220,18 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
235
220
|
mileagePackage,
|
|
236
221
|
vehicleId: vehicle.id,
|
|
237
222
|
vehicleName: vehicleName(vehicle),
|
|
238
|
-
...
|
|
239
|
-
|
|
223
|
+
...reservationId ? {
|
|
224
|
+
reservationId
|
|
225
|
+
} : {},
|
|
226
|
+
...couponCode ? {
|
|
227
|
+
couponCode
|
|
228
|
+
} : {}
|
|
240
229
|
},
|
|
241
230
|
autoRetry: {
|
|
242
231
|
enabled: false,
|
|
243
232
|
interval: 0,
|
|
244
233
|
maxAttempts: 0,
|
|
245
|
-
attempts: 0
|
|
234
|
+
attempts: 0
|
|
246
235
|
},
|
|
247
236
|
metadata: {
|
|
248
237
|
purpose: PURPOSE_RESERVATION,
|
|
@@ -251,11 +240,10 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
|
|
|
251
240
|
plan,
|
|
252
241
|
mileagePackage,
|
|
253
242
|
couponCode,
|
|
254
|
-
...
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
analytics
|
|
258
|
-
}
|
|
243
|
+
...freeReservation && freeReservationReason ? {
|
|
244
|
+
freeReservationReason
|
|
245
|
+
} : {},
|
|
246
|
+
analytics
|
|
247
|
+
}
|
|
259
248
|
};
|
|
260
249
|
};
|
|
261
|
-
//# sourceMappingURL=invoice.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { prisma } from '@driveflux/db';
|
|
2
|
-
import { makeProblem, PROBLEM_CONDITION_FAILED, PROBLEM_NOT_FOUND
|
|
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,4 +35,3 @@ const checkPayerObjectSanity = (subscriber) => {
|
|
|
35
35
|
}
|
|
36
36
|
return new Ok(true);
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=payer.js.map
|
|
@@ -3,20 +3,18 @@ import { makeProblem, PROBLEM_EXTERNAL } from '@driveflux/problem';
|
|
|
3
3
|
import { Err, Ok } from '@driveflux/result';
|
|
4
4
|
import { createScopedLogger } from '../create-logger.js';
|
|
5
5
|
const log = createScopedLogger('reservation:payment-intent-sync');
|
|
6
|
-
export const ensurePaymentIntentIdIsSynced = async (invoice, paymentIntentId)
|
|
6
|
+
export const ensurePaymentIntentIdIsSynced = async (invoice, paymentIntentId)=>{
|
|
7
7
|
const stripe = biller.getPaymentProvider('stripe').getStripe();
|
|
8
8
|
try {
|
|
9
9
|
await stripe.paymentIntents.update(paymentIntentId, {
|
|
10
10
|
metadata: {
|
|
11
11
|
...invoice.providerMetadata,
|
|
12
|
-
invoiceId: invoice.id
|
|
13
|
-
}
|
|
12
|
+
invoiceId: invoice.id
|
|
13
|
+
}
|
|
14
14
|
});
|
|
15
15
|
return new Ok(true);
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
16
|
+
} catch (error) {
|
|
18
17
|
log.error(error, 'Error updating payment intent metadata');
|
|
19
18
|
return new Err(makeProblem(PROBLEM_EXTERNAL, 'Error updating payment intent metadata'));
|
|
20
19
|
}
|
|
21
20
|
};
|
|
22
|
-
//# sourceMappingURL=payment-intent-sync.js.map
|
|
@@ -5,14 +5,14 @@ import { fetchOrCreateReservation } from './fetch-or-create.js';
|
|
|
5
5
|
import { getPayer } from './payer.js';
|
|
6
6
|
import { ensurePaymentIntentIdIsSynced } from './payment-intent-sync.js';
|
|
7
7
|
import { getVehicle } from './vehicle.js';
|
|
8
|
-
const processBody = (body)
|
|
8
|
+
const processBody = (body)=>{
|
|
9
9
|
// Switch mileage package
|
|
10
10
|
if (body.plan === 'plan1' || body.plan === 'planWeekly') {
|
|
11
11
|
body.mileagePackage = 'unlimited';
|
|
12
12
|
}
|
|
13
13
|
return body;
|
|
14
14
|
};
|
|
15
|
-
export const reserveVehicle = async (vehicleId, unprocessed)
|
|
15
|
+
export const reserveVehicle = async (vehicleId, unprocessed)=>{
|
|
16
16
|
const body = processBody(unprocessed);
|
|
17
17
|
// Agree to terms if not done yet
|
|
18
18
|
await handleAgreeToTerms(body);
|
|
@@ -34,7 +34,7 @@ export const reserveVehicle = async (vehicleId, unprocessed) => {
|
|
|
34
34
|
const reservationResult = await fetchOrCreateReservation({
|
|
35
35
|
vehicle,
|
|
36
36
|
payer,
|
|
37
|
-
body
|
|
37
|
+
body
|
|
38
38
|
});
|
|
39
39
|
if (reservationResult.err) {
|
|
40
40
|
return reservationResult;
|
|
@@ -50,4 +50,3 @@ export const reserveVehicle = async (vehicleId, unprocessed) => {
|
|
|
50
50
|
}
|
|
51
51
|
return new Ok(reservation);
|
|
52
52
|
};
|
|
53
|
-
//# sourceMappingURL=reserve.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=types.js.map
|
|
1
|
+
export { };
|
|
@@ -4,21 +4,19 @@ 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
|
|
8
|
-
const vehicle = id.startsWith('DV_')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
-
});
|
|
7
|
+
export const getVehicle = async (id, { selectedColor, plan, requestUser }, requesterAbility)=>{
|
|
8
|
+
const vehicle = id.startsWith('DV_') ? await createVehicleFromDisplayVehicle(id, selectedColor || undefined) : await prisma.vehicle.findUnique({
|
|
9
|
+
where: {
|
|
10
|
+
id
|
|
11
|
+
},
|
|
12
|
+
include: {
|
|
13
|
+
host: {
|
|
14
|
+
select: {
|
|
15
|
+
id: true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
});
|
|
22
20
|
if (!vehicle) {
|
|
23
21
|
return new Err(makeProblem(PROBLEM_NOT_FOUND, 'Vehicle not found'));
|
|
24
22
|
}
|
|
@@ -29,4 +27,3 @@ export const getVehicle = async (id, { selectedColor, plan, requestUser, }, requ
|
|
|
29
27
|
}
|
|
30
28
|
return new Ok(vehicle);
|
|
31
29
|
};
|
|
32
|
-
//# sourceMappingURL=vehicle.js.map
|
package/dist/slack.js
CHANGED
|
@@ -10,12 +10,11 @@ const slackBlocks = global.__slackBlocks;
|
|
|
10
10
|
/**
|
|
11
11
|
*
|
|
12
12
|
* @deprecated Use slackLater instead and commitSlack to commit
|
|
13
|
-
*/
|
|
14
|
-
export const slack = async (message, channel = config.slack.defaultChannelId) => {
|
|
13
|
+
*/ export const slack = async (message, channel = config.slack.defaultChannelId)=>{
|
|
15
14
|
return await enhancedFetch('https://slack.com/api/chat.postMessage', {
|
|
16
15
|
method: 'POST',
|
|
17
16
|
headers: {
|
|
18
|
-
Authorization: `Bearer ${config.slack.token}
|
|
17
|
+
Authorization: `Bearer ${config.slack.token}`
|
|
19
18
|
},
|
|
20
19
|
body: JSON.stringify({
|
|
21
20
|
channel,
|
|
@@ -24,23 +23,20 @@ export const slack = async (message, channel = config.slack.defaultChannelId) =>
|
|
|
24
23
|
type: 'section',
|
|
25
24
|
text: {
|
|
26
25
|
type: 'mrkdwn',
|
|
27
|
-
text: message
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
})
|
|
26
|
+
text: message
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
})
|
|
32
31
|
});
|
|
33
32
|
};
|
|
34
|
-
export const getSlackBlocks = (channel)
|
|
33
|
+
export const getSlackBlocks = (channel)=>channel ? slackBlocks.get(channel) : slackBlocks;
|
|
35
34
|
/**
|
|
36
35
|
* Naive implementation, however, for now (uncrowded serverless env), this works
|
|
37
36
|
* @param blocks
|
|
38
37
|
* @param channel
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
const targetChannel = (config.appEnv === 'production'
|
|
42
|
-
? channel
|
|
43
|
-
: config.slack.defaultChannelId) || config.slack.defaultChannelId;
|
|
38
|
+
*/ export function slackLater(blocks, channel) {
|
|
39
|
+
const targetChannel = (config.appEnv === 'production' ? channel : config.slack.defaultChannelId) || config.slack.defaultChannelId;
|
|
44
40
|
if (!targetChannel || !blocks) {
|
|
45
41
|
return;
|
|
46
42
|
}
|
|
@@ -50,15 +46,13 @@ export function slackLater(blocks, channel) {
|
|
|
50
46
|
type: 'section',
|
|
51
47
|
text: {
|
|
52
48
|
type: 'mrkdwn',
|
|
53
|
-
text: blocks
|
|
54
|
-
}
|
|
49
|
+
text: blocks
|
|
50
|
+
}
|
|
55
51
|
});
|
|
56
|
-
}
|
|
57
|
-
else if (!Array.isArray(blocks)) {
|
|
52
|
+
} else if (!Array.isArray(blocks)) {
|
|
58
53
|
messages.add(blocks);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
for (const b of blocks) {
|
|
54
|
+
} else {
|
|
55
|
+
for (const b of blocks){
|
|
62
56
|
messages.add(b);
|
|
63
57
|
}
|
|
64
58
|
}
|
|
@@ -69,22 +63,22 @@ export async function sendSlackMessages(channel, blocks) {
|
|
|
69
63
|
return await enhancedFetch('https://slack.com/api/chat.postMessage', {
|
|
70
64
|
method: 'POST',
|
|
71
65
|
headers: {
|
|
72
|
-
Authorization: `Bearer ${config.slack.token}
|
|
66
|
+
Authorization: `Bearer ${config.slack.token}`
|
|
73
67
|
},
|
|
74
68
|
body: JSON.stringify({
|
|
75
69
|
channel: targetChannel,
|
|
76
|
-
blocks: Array.from(blocks)
|
|
77
|
-
})
|
|
70
|
+
blocks: Array.from(blocks)
|
|
71
|
+
})
|
|
78
72
|
});
|
|
79
73
|
}
|
|
80
|
-
export const commitSlack = ()
|
|
74
|
+
export const commitSlack = ()=>{
|
|
81
75
|
if (!slackBlocks.size) {
|
|
82
76
|
return;
|
|
83
77
|
}
|
|
84
78
|
const channels = slackBlocks.keys();
|
|
85
79
|
let i = 1;
|
|
86
80
|
const baseUrl = config.appEnv === 'development' ? config.tunnelUrl : config.appUrl;
|
|
87
|
-
for (const channel of channels)
|
|
81
|
+
for (const channel of channels){
|
|
88
82
|
const blocks = slackBlocks.get(channel);
|
|
89
83
|
if (!blocks?.size) {
|
|
90
84
|
continue;
|
|
@@ -94,12 +88,13 @@ export const commitSlack = () => {
|
|
|
94
88
|
name: TASK_COMMIT_SLACK_CHANNEL,
|
|
95
89
|
metadata: {
|
|
96
90
|
channel,
|
|
97
|
-
blocks: [
|
|
91
|
+
blocks: [
|
|
92
|
+
...blocks
|
|
93
|
+
]
|
|
98
94
|
},
|
|
99
95
|
taskHandlerUrl: `${baseUrl || config.appUrl}/api/hooks/slack-pipeline`,
|
|
100
|
-
scheduledAt: addSeconds(new Date(), i++)
|
|
96
|
+
scheduledAt: addSeconds(new Date(), i++)
|
|
101
97
|
});
|
|
102
98
|
}
|
|
103
99
|
slackBlocks.clear();
|
|
104
100
|
};
|
|
105
|
-
//# sourceMappingURL=slack.js.map
|