@driveflux/api-functions 1.0.25 → 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 +1 -22
- 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 +7 -7
|
@@ -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
|
package/dist/validation.js
CHANGED
|
@@ -1,32 +1,34 @@
|
|
|
1
1
|
import { makeProblem } from '@driveflux/problem';
|
|
2
2
|
import { Err } from '@driveflux/result';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
export const makeValidationErrorResult = (zodError)=>{
|
|
5
|
-
const validation = zodError.flatten((i)=>({
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { z, } from 'zod';
|
|
4
|
+
export const makeValidationErrorResult = (zodError) => {
|
|
5
|
+
const validation = zodError.flatten((i) => ({
|
|
6
|
+
message: i.message,
|
|
7
|
+
code: i.code,
|
|
8
|
+
path: i.path,
|
|
9
|
+
}));
|
|
10
10
|
return new Err(makeProblem({
|
|
11
11
|
object: 'validation-issues',
|
|
12
|
-
...validation
|
|
12
|
+
...validation,
|
|
13
13
|
}));
|
|
14
14
|
};
|
|
15
|
-
export const getIdOrObjectValidation = (object, extendObjectValidation)=>z.union([
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
export const getIdOrObjectValidation = (object, extendObjectValidation) => z.union([
|
|
16
|
+
z.string(),
|
|
17
|
+
z
|
|
18
|
+
.object({ object: z.literal(object), ...extendObjectValidation })
|
|
19
|
+
.passthrough()
|
|
20
|
+
.catchall(z.any()),
|
|
21
|
+
], {
|
|
22
|
+
error: () => {
|
|
23
|
+
return {
|
|
24
|
+
message: `Invalid details. Please provide an id as a string or an object of type ${object}`,
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
28
|
export const nonEmptyStringValidator = z.string().min(1);
|
|
29
|
-
export const metadataValidation = z
|
|
29
|
+
export const metadataValidation = z
|
|
30
|
+
.object({})
|
|
31
|
+
.catchall(z.union([
|
|
30
32
|
z.string(),
|
|
31
33
|
z.number(),
|
|
32
34
|
z.boolean(),
|
|
@@ -34,33 +36,36 @@ export const metadataValidation = z.object({}).catchall(z.union([
|
|
|
34
36
|
z.array(z.number()),
|
|
35
37
|
z.array(z.boolean()),
|
|
36
38
|
z.null(),
|
|
37
|
-
z.undefined()
|
|
39
|
+
z.undefined(),
|
|
38
40
|
]));
|
|
39
41
|
export const addressValidation = z.object({
|
|
40
42
|
name: z.string().optional().nullable(),
|
|
41
|
-
coordinates: z
|
|
43
|
+
coordinates: z
|
|
44
|
+
.object({
|
|
42
45
|
lat: z.number().min(-90).max(90),
|
|
43
|
-
lng: z.number().min(-180).max(180)
|
|
44
|
-
})
|
|
46
|
+
lng: z.number().min(-180).max(180),
|
|
47
|
+
})
|
|
48
|
+
.nullable()
|
|
49
|
+
.optional(),
|
|
45
50
|
street1: nonEmptyStringValidator,
|
|
46
51
|
street2: z.string().nullable().optional(),
|
|
47
52
|
city: nonEmptyStringValidator,
|
|
48
53
|
state: nonEmptyStringValidator,
|
|
49
54
|
postalCode: z.string().min(3).max(11),
|
|
50
|
-
country: nonEmptyStringValidator
|
|
55
|
+
country: nonEmptyStringValidator,
|
|
56
|
+
});
|
|
57
|
+
export const getIsoDatetimeToDate = (dateValidation) => z
|
|
58
|
+
.codec(z.string(), dateValidation ?? z.date(), {
|
|
59
|
+
decode: (isoString) => new Date(isoString),
|
|
60
|
+
encode: (date) => date.toISOString(),
|
|
61
|
+
})
|
|
62
|
+
.refine((d) => {
|
|
63
|
+
const date = new Date(d);
|
|
64
|
+
return !Number.isNaN(date.getTime());
|
|
65
|
+
}, {
|
|
66
|
+
message: 'Invalid date',
|
|
67
|
+
path: ['date'],
|
|
51
68
|
});
|
|
52
|
-
export const getIsoDatetimeToDate = (dateValidation)=>z.codec(z.string(), dateValidation ?? z.date(), {
|
|
53
|
-
decode: (isoString)=>new Date(isoString),
|
|
54
|
-
encode: (date)=>date.toISOString()
|
|
55
|
-
}).refine((d)=>{
|
|
56
|
-
const date = new Date(d);
|
|
57
|
-
return !Number.isNaN(date.getTime());
|
|
58
|
-
}, {
|
|
59
|
-
message: 'Invalid date',
|
|
60
|
-
path: [
|
|
61
|
-
'date'
|
|
62
|
-
]
|
|
63
|
-
});
|
|
64
69
|
export const dateValidation = getIsoDatetimeToDate();
|
|
65
70
|
export const enhancedImageValidation = z.object({
|
|
66
71
|
default: z.string(),
|
|
@@ -69,67 +74,64 @@ export const enhancedImageValidation = z.object({
|
|
|
69
74
|
small: z.string().optional(),
|
|
70
75
|
medium: z.string().optional(),
|
|
71
76
|
large: z.string().optional(),
|
|
72
|
-
description: z.string().optional()
|
|
77
|
+
description: z.string().optional(),
|
|
73
78
|
});
|
|
74
|
-
export const getObjectValidation = (o)=>z.enum([
|
|
75
|
-
o
|
|
76
|
-
]).optional();
|
|
79
|
+
export const getObjectValidation = (o) => z.enum([o]).optional();
|
|
77
80
|
export const contactValidation = z.object({
|
|
78
81
|
id: z.string().optional(),
|
|
79
82
|
firstName: z.string(),
|
|
80
83
|
lastName: z.string(),
|
|
81
84
|
jobTitle: z.string().optional(),
|
|
82
|
-
email: z
|
|
85
|
+
email: z
|
|
86
|
+
.string()
|
|
87
|
+
.email()
|
|
88
|
+
.optional()
|
|
89
|
+
.transform((email) => email?.toLowerCase().trim()),
|
|
83
90
|
phoneNumber: z.string().optional(),
|
|
84
|
-
remarks: z.string().default('')
|
|
91
|
+
remarks: z.string().default(''),
|
|
85
92
|
});
|
|
86
93
|
export const documentFileValidation = z.object({
|
|
87
94
|
id: z.string().optional(),
|
|
88
95
|
name: z.string(),
|
|
89
96
|
description: z.string().nullable().optional(),
|
|
90
97
|
url: z.string(),
|
|
91
|
-
fileType: z.preprocess((f)=>typeof f === 'string' ? f.toLowerCase() : f, z.enum([
|
|
92
|
-
'jpg',
|
|
93
|
-
'jpeg',
|
|
94
|
-
'png',
|
|
95
|
-
'pdf',
|
|
96
|
-
'image'
|
|
97
|
-
]).optional()),
|
|
98
|
+
fileType: z.preprocess((f) => (typeof f === 'string' ? f.toLowerCase() : f), z.enum(['jpg', 'jpeg', 'png', 'pdf', 'image']).optional()),
|
|
98
99
|
mimeType: z.string().optional(),
|
|
99
100
|
uploaded: z.boolean().default(true),
|
|
100
101
|
createdAt: dateValidation.nullable().optional(),
|
|
101
102
|
updatedAt: dateValidation.nullable().optional(),
|
|
102
|
-
metadata: metadataValidation.nullable().optional()
|
|
103
|
+
metadata: metadataValidation.nullable().optional(),
|
|
103
104
|
});
|
|
104
105
|
export const queryBooleanValidator = z.stringbool({
|
|
105
|
-
truthy: [
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
'0',
|
|
112
|
-
'false',
|
|
113
|
-
'no'
|
|
114
|
-
]
|
|
106
|
+
truthy: ['1', 'true', 'yes'],
|
|
107
|
+
falsy: ['0', 'false', 'no'],
|
|
108
|
+
});
|
|
109
|
+
const getStringToNumber = (numberValidation) => z.codec(z.string().regex(z.regexes.number), numberValidation ?? z.number(), {
|
|
110
|
+
decode: (str) => Number.parseFloat(str),
|
|
111
|
+
encode: (num) => num.toString(),
|
|
115
112
|
});
|
|
116
|
-
const getStringToNumber = (numberValidation)=>z.codec(z.string().regex(z.regexes.number), numberValidation ?? z.number(), {
|
|
117
|
-
decode: (str)=>Number.parseFloat(str),
|
|
118
|
-
encode: (num)=>num.toString()
|
|
119
|
-
});
|
|
120
113
|
export const queryNumberValidator = getStringToNumber();
|
|
121
114
|
export function queryEnumArrayValidator(enumOrValidation) {
|
|
122
115
|
// Handle ZodEnum case
|
|
123
|
-
if (enumOrValidation &&
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
116
|
+
if (enumOrValidation &&
|
|
117
|
+
typeof enumOrValidation === 'object' &&
|
|
118
|
+
'_zod' in enumOrValidation) {
|
|
119
|
+
return z
|
|
120
|
+
.codec(z.string(), z.array(enumOrValidation), {
|
|
121
|
+
encode: (value) => value.join(','),
|
|
122
|
+
decode: (value) => value.split(','),
|
|
123
|
+
})
|
|
124
|
+
.or(z.array(enumOrValidation));
|
|
128
125
|
}
|
|
129
126
|
// Handle array or enum-like object case
|
|
130
|
-
const enumSchema = Array.isArray(enumOrValidation)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
127
|
+
const enumSchema = Array.isArray(enumOrValidation)
|
|
128
|
+
? z.enum(enumOrValidation)
|
|
129
|
+
: z.enum(Object.values(enumOrValidation));
|
|
130
|
+
return z
|
|
131
|
+
.codec(z.string(), z.array(enumSchema), {
|
|
132
|
+
encode: (value) => value.join(','),
|
|
133
|
+
decode: (value) => value.split(','),
|
|
134
|
+
})
|
|
135
|
+
.or(z.array(enumSchema));
|
|
135
136
|
}
|
|
137
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
const DEFAUALT_MILEAGE_MATRIX = {
|
|
2
|
-
lite: 0,
|
|
3
|
-
standard: 0,
|
|
4
|
-
plus: 0,
|
|
5
|
-
unlimited: 0
|
|
6
|
-
};
|
|
1
|
+
const DEFAUALT_MILEAGE_MATRIX = { lite: 0, standard: 0, plus: 0, unlimited: 0 };
|
|
7
2
|
export const DEFAULT_MATRIX = {
|
|
8
3
|
plan1: DEFAUALT_MILEAGE_MATRIX,
|
|
9
4
|
plan12: DEFAUALT_MILEAGE_MATRIX,
|
|
10
5
|
plan24: DEFAUALT_MILEAGE_MATRIX,
|
|
11
6
|
plan36: DEFAUALT_MILEAGE_MATRIX,
|
|
12
7
|
plan60: DEFAUALT_MILEAGE_MATRIX,
|
|
13
|
-
planWeekly: DEFAUALT_MILEAGE_MATRIX
|
|
8
|
+
planWeekly: DEFAUALT_MILEAGE_MATRIX,
|
|
14
9
|
};
|
|
15
10
|
export const FLUX_MIN_TAKE = 200;
|
|
16
11
|
const EMPTY_MILEAGE_PACKAGES = {
|
|
17
12
|
lite: 0,
|
|
18
13
|
standard: 0,
|
|
19
14
|
plus: 0,
|
|
20
|
-
unlimited: 0
|
|
15
|
+
unlimited: 0,
|
|
21
16
|
};
|
|
22
17
|
export const EMPTY_FLUX_PRICING_MATRIX_CONTROLLER = {
|
|
23
18
|
plan60: 0,
|
|
@@ -27,7 +22,7 @@ export const EMPTY_FLUX_PRICING_MATRIX_CONTROLLER = {
|
|
|
27
22
|
plan1: 0,
|
|
28
23
|
planWeekly: 0,
|
|
29
24
|
add: EMPTY_MILEAGE_PACKAGES,
|
|
30
|
-
excessMileage: 0
|
|
25
|
+
excessMileage: 0,
|
|
31
26
|
};
|
|
32
27
|
export const EMPTY_FLUX_START_FEE_MATRIX_CONTROLLER = {
|
|
33
28
|
plan60: EMPTY_MILEAGE_PACKAGES,
|
|
@@ -35,7 +30,7 @@ export const EMPTY_FLUX_START_FEE_MATRIX_CONTROLLER = {
|
|
|
35
30
|
plan24: EMPTY_MILEAGE_PACKAGES,
|
|
36
31
|
plan12: EMPTY_MILEAGE_PACKAGES,
|
|
37
32
|
plan1: EMPTY_MILEAGE_PACKAGES,
|
|
38
|
-
planWeekly: EMPTY_MILEAGE_PACKAGES
|
|
33
|
+
planWeekly: EMPTY_MILEAGE_PACKAGES,
|
|
39
34
|
};
|
|
40
35
|
export const EMPTY_ULTRA_TIERS = {
|
|
41
36
|
tier1: 0,
|
|
@@ -52,7 +47,7 @@ export const EMPTY_ULTRA_TIERS = {
|
|
|
52
47
|
tier12: 0,
|
|
53
48
|
tier13: 0,
|
|
54
49
|
tier14: 0,
|
|
55
|
-
tier15: 0
|
|
50
|
+
tier15: 0,
|
|
56
51
|
};
|
|
57
52
|
export const EMPTY_MATRIX = {
|
|
58
53
|
plan60: EMPTY_MILEAGE_PACKAGES,
|
|
@@ -60,49 +55,50 @@ export const EMPTY_MATRIX = {
|
|
|
60
55
|
plan24: EMPTY_MILEAGE_PACKAGES,
|
|
61
56
|
plan12: EMPTY_MILEAGE_PACKAGES,
|
|
62
57
|
plan1: EMPTY_MILEAGE_PACKAGES,
|
|
63
|
-
planWeekly: EMPTY_MILEAGE_PACKAGES
|
|
58
|
+
planWeekly: EMPTY_MILEAGE_PACKAGES,
|
|
64
59
|
};
|
|
65
60
|
/**
|
|
66
61
|
* Matrix representing the dealership's take in percentages
|
|
67
62
|
*
|
|
68
63
|
* @see https://docs.google.com/spreadsheets/d/1lYYMdQgnzG53lCGf_dKJY9pEue5suJuo3O3-zegIOT0/edit#gid=819271234
|
|
69
|
-
*/
|
|
64
|
+
*/
|
|
65
|
+
export const HOST_MATRIX_COEFFICIENTS = {
|
|
70
66
|
plan60: {
|
|
71
67
|
lite: 0.8,
|
|
72
68
|
standard: 0.9,
|
|
73
69
|
plus: 1,
|
|
74
|
-
unlimited: 1.25
|
|
70
|
+
unlimited: 1.25,
|
|
75
71
|
},
|
|
76
72
|
plan36: {
|
|
77
73
|
lite: 1,
|
|
78
74
|
standard: 1.1,
|
|
79
75
|
plus: 1.2,
|
|
80
|
-
unlimited: 1.45
|
|
76
|
+
unlimited: 1.45,
|
|
81
77
|
},
|
|
82
78
|
plan24: {
|
|
83
79
|
lite: 1.1,
|
|
84
80
|
standard: 1.2,
|
|
85
81
|
plus: 1.3,
|
|
86
|
-
unlimited: 1.55
|
|
82
|
+
unlimited: 1.55,
|
|
87
83
|
},
|
|
88
84
|
plan12: {
|
|
89
85
|
lite: 1.2,
|
|
90
86
|
standard: 1.3,
|
|
91
87
|
plus: 1.4,
|
|
92
|
-
unlimited: 1.65
|
|
88
|
+
unlimited: 1.65,
|
|
93
89
|
},
|
|
94
90
|
plan1: {
|
|
95
91
|
lite: 0,
|
|
96
92
|
standard: 0,
|
|
97
93
|
plus: 0,
|
|
98
|
-
unlimited: 0
|
|
94
|
+
unlimited: 0,
|
|
99
95
|
},
|
|
100
96
|
planWeekly: {
|
|
101
97
|
lite: 0,
|
|
102
98
|
standard: 0,
|
|
103
99
|
plus: 0,
|
|
104
|
-
unlimited: 0
|
|
105
|
-
}
|
|
100
|
+
unlimited: 0,
|
|
101
|
+
},
|
|
106
102
|
};
|
|
107
103
|
export const ULTRA_HOST_TIERS_PRICING = {
|
|
108
104
|
tier1: 800,
|
|
@@ -119,7 +115,7 @@ export const ULTRA_HOST_TIERS_PRICING = {
|
|
|
119
115
|
tier12: 8500,
|
|
120
116
|
tier13: 10500,
|
|
121
117
|
tier14: 12800,
|
|
122
|
-
tier15: 15000
|
|
118
|
+
tier15: 15000,
|
|
123
119
|
};
|
|
124
120
|
export const ULTRA_FLUX_TIERS_PRICING = {
|
|
125
121
|
tier1: 999,
|
|
@@ -136,10 +132,11 @@ export const ULTRA_FLUX_TIERS_PRICING = {
|
|
|
136
132
|
tier12: 9999,
|
|
137
133
|
tier13: 12599,
|
|
138
134
|
tier14: 14999,
|
|
139
|
-
tier15: 17999
|
|
135
|
+
tier15: 17999,
|
|
140
136
|
};
|
|
141
137
|
export const HOST_EXCESS_MILEAGE_COEFFICIENT = 0.00048;
|
|
142
138
|
export const MAX_HOST_EXCESS_MILEAGE = 4;
|
|
143
139
|
export const MIN_HOST_EXCESS_MILEAGE = 0.52;
|
|
144
140
|
export const MAX_FLUX_EXCESS_MILEAGE = 5;
|
|
145
141
|
export const MIN_FLUX_EXCESS_MILEAGE = 0.65;
|
|
142
|
+
//# sourceMappingURL=constants.js.map
|