@driveflux/api-functions 0.0.2
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.d.ts +33 -0
- package/dist/auth/confirm.d.ts.map +1 -0
- package/dist/auth/confirm.js +88 -0
- package/dist/auth/confirm.js.map +1 -0
- package/dist/auth/emails.d.ts +4 -0
- package/dist/auth/emails.d.ts.map +1 -0
- package/dist/auth/emails.js +51 -0
- package/dist/auth/emails.js.map +1 -0
- package/dist/auth/formatter.d.ts +2 -0
- package/dist/auth/formatter.d.ts.map +1 -0
- package/dist/auth/formatter.js +249 -0
- package/dist/auth/formatter.js.map +1 -0
- package/dist/auth/otp.d.ts +44 -0
- package/dist/auth/otp.d.ts.map +1 -0
- package/dist/auth/otp.js +154 -0
- package/dist/auth/otp.js.map +1 -0
- package/dist/auth/register.d.ts +31 -0
- package/dist/auth/register.d.ts.map +1 -0
- package/dist/auth/register.js +128 -0
- package/dist/auth/register.js.map +1 -0
- package/dist/auth/tokens.d.ts +62 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +129 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/auth/verifications.d.ts +28 -0
- package/dist/auth/verifications.d.ts.map +1 -0
- package/dist/auth/verifications.js +174 -0
- package/dist/auth/verifications.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/global.d.js +1 -0
- package/dist/mailjet/calls/manage-contacts-in-list.d.ts +21 -0
- package/dist/mailjet/calls/manage-contacts-in-list.d.ts.map +1 -0
- package/dist/mailjet/calls/manage-contacts-in-list.js +28 -0
- package/dist/mailjet/calls/manage-contacts-in-list.js.map +1 -0
- package/dist/mailjet/calls/manage-subscription-status.d.ts +15 -0
- package/dist/mailjet/calls/manage-subscription-status.d.ts.map +1 -0
- package/dist/mailjet/calls/manage-subscription-status.js +16 -0
- package/dist/mailjet/calls/manage-subscription-status.js.map +1 -0
- package/dist/mailjet/calls/request-service.d.ts +7 -0
- package/dist/mailjet/calls/request-service.d.ts.map +1 -0
- package/dist/mailjet/calls/request-service.js +24 -0
- package/dist/mailjet/calls/request-service.js.map +1 -0
- package/dist/mailjet/refresh-email-preferences.d.ts +23 -0
- package/dist/mailjet/refresh-email-preferences.d.ts.map +1 -0
- package/dist/mailjet/refresh-email-preferences.js +43 -0
- package/dist/mailjet/refresh-email-preferences.js.map +1 -0
- package/dist/mailjet/set-contact.d.ts +21 -0
- package/dist/mailjet/set-contact.d.ts.map +1 -0
- package/dist/mailjet/set-contact.js +39 -0
- package/dist/mailjet/set-contact.js.map +1 -0
- package/dist/mailjet/types.d.ts +31 -0
- package/dist/mailjet/types.d.ts.map +1 -0
- package/dist/mailjet/types.js +2 -0
- package/dist/mailjet/types.js.map +1 -0
- package/dist/mailjet/utils/convert-to-array.d.ts +6 -0
- package/dist/mailjet/utils/convert-to-array.d.ts.map +1 -0
- package/dist/mailjet/utils/convert-to-array.js +23 -0
- package/dist/mailjet/utils/convert-to-array.js.map +1 -0
- package/dist/mailjet/utils/extract-email-preferences.d.ts +17 -0
- package/dist/mailjet/utils/extract-email-preferences.d.ts.map +1 -0
- package/dist/mailjet/utils/extract-email-preferences.js +51 -0
- package/dist/mailjet/utils/extract-email-preferences.js.map +1 -0
- package/dist/mailjet/utils/lists.d.ts +13 -0
- package/dist/mailjet/utils/lists.d.ts.map +1 -0
- package/dist/mailjet/utils/lists.js +41 -0
- package/dist/mailjet/utils/lists.js.map +1 -0
- package/dist/mailjet/utils/update-email-references.d.ts +4 -0
- package/dist/mailjet/utils/update-email-references.d.ts.map +1 -0
- package/dist/mailjet/utils/update-email-references.js +31 -0
- package/dist/mailjet/utils/update-email-references.js.map +1 -0
- package/dist/notion/client.d.ts +12 -0
- package/dist/notion/client.d.ts.map +1 -0
- package/dist/notion/client.js +63 -0
- package/dist/notion/client.js.map +1 -0
- package/dist/notion/helpful.d.ts +7 -0
- package/dist/notion/helpful.d.ts.map +1 -0
- package/dist/notion/helpful.js +32 -0
- package/dist/notion/helpful.js.map +1 -0
- package/dist/notion/schemas/block.d.ts +89 -0
- package/dist/notion/schemas/block.d.ts.map +1 -0
- package/dist/notion/schemas/block.js +89 -0
- package/dist/notion/schemas/block.js.map +1 -0
- package/dist/notion/schemas/common.d.ts +25 -0
- package/dist/notion/schemas/common.d.ts.map +1 -0
- package/dist/notion/schemas/common.js +31 -0
- package/dist/notion/schemas/common.js.map +1 -0
- package/dist/notion/schemas/database.d.ts +517 -0
- package/dist/notion/schemas/database.d.ts.map +1 -0
- package/dist/notion/schemas/database.js +222 -0
- package/dist/notion/schemas/database.js.map +1 -0
- package/dist/notion/schemas/emoji.d.ts +12 -0
- package/dist/notion/schemas/emoji.d.ts.map +1 -0
- package/dist/notion/schemas/emoji.js +6 -0
- package/dist/notion/schemas/emoji.js.map +1 -0
- package/dist/notion/schemas/file.d.ts +43 -0
- package/dist/notion/schemas/file.d.ts.map +1 -0
- package/dist/notion/schemas/file.js +18 -0
- package/dist/notion/schemas/file.js.map +1 -0
- package/dist/notion/schemas/kb.d.ts +1526 -0
- package/dist/notion/schemas/kb.d.ts.map +1 -0
- package/dist/notion/schemas/kb.js +74 -0
- package/dist/notion/schemas/kb.js.map +1 -0
- package/dist/notion/schemas/page.d.ts +608 -0
- package/dist/notion/schemas/page.d.ts.map +1 -0
- package/dist/notion/schemas/page.js +181 -0
- package/dist/notion/schemas/page.js.map +1 -0
- package/dist/notion/schemas/parent.d.ts +42 -0
- package/dist/notion/schemas/parent.d.ts.map +1 -0
- package/dist/notion/schemas/parent.js +18 -0
- package/dist/notion/schemas/parent.js.map +1 -0
- package/dist/notion/schemas/user.d.ts +83 -0
- package/dist/notion/schemas/user.d.ts.map +1 -0
- package/dist/notion/schemas/user.js +31 -0
- package/dist/notion/schemas/user.js.map +1 -0
- package/dist/reservation/agree.d.ts +3 -0
- package/dist/reservation/agree.d.ts.map +1 -0
- package/dist/reservation/agree.js +23 -0
- package/dist/reservation/agree.js.map +1 -0
- package/dist/reservation/checks.d.ts +8 -0
- package/dist/reservation/checks.d.ts.map +1 -0
- package/dist/reservation/checks.js +28 -0
- package/dist/reservation/checks.js.map +1 -0
- package/dist/reservation/display-vehicle.d.ts +1152 -0
- package/dist/reservation/display-vehicle.d.ts.map +1 -0
- package/dist/reservation/display-vehicle.js +244 -0
- package/dist/reservation/display-vehicle.js.map +1 -0
- package/dist/reservation/fetch-or-create.d.ts +11 -0
- package/dist/reservation/fetch-or-create.d.ts.map +1 -0
- package/dist/reservation/fetch-or-create.js +207 -0
- package/dist/reservation/fetch-or-create.js.map +1 -0
- package/dist/reservation/invoice.d.ts +12 -0
- package/dist/reservation/invoice.d.ts.map +1 -0
- package/dist/reservation/invoice.js +248 -0
- package/dist/reservation/invoice.js.map +1 -0
- package/dist/reservation/payer.d.ts +5 -0
- package/dist/reservation/payer.d.ts.map +1 -0
- package/dist/reservation/payer.js +38 -0
- package/dist/reservation/payer.js.map +1 -0
- package/dist/reservation/reserve.d.ts +5 -0
- package/dist/reservation/reserve.d.ts.map +1 -0
- package/dist/reservation/reserve.js +44 -0
- package/dist/reservation/reserve.js.map +1 -0
- package/dist/reservation/types.d.ts +28 -0
- package/dist/reservation/types.d.ts.map +1 -0
- package/dist/reservation/types.js +2 -0
- package/dist/reservation/types.js.map +1 -0
- package/dist/reservation/vehicle.d.ts +6 -0
- package/dist/reservation/vehicle.d.ts.map +1 -0
- package/dist/reservation/vehicle.js +32 -0
- package/dist/reservation/vehicle.js.map +1 -0
- package/dist/slack.d.ts +19 -0
- package/dist/slack.d.ts.map +1 -0
- package/dist/slack.js +105 -0
- package/dist/slack.js.map +1 -0
- package/dist/validation.d.ts +63 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +99 -0
- package/dist/validation.js.map +1 -0
- package/dist/vehicle/vehicle-pricing/constants.d.ts +91 -0
- package/dist/vehicle/vehicle-pricing/constants.d.ts.map +1 -0
- package/dist/vehicle/vehicle-pricing/constants.js +142 -0
- package/dist/vehicle/vehicle-pricing/constants.js.map +1 -0
- package/dist/vehicle/vehicle-pricing/index.d.ts +79 -0
- package/dist/vehicle/vehicle-pricing/index.d.ts.map +1 -0
- package/dist/vehicle/vehicle-pricing/index.js +169 -0
- package/dist/vehicle/vehicle-pricing/index.js.map +1 -0
- package/dist/vehicle/vehicle-pricing/types.d.ts +43 -0
- package/dist/vehicle/vehicle-pricing/types.d.ts.map +1 -0
- package/dist/vehicle/vehicle-pricing/types.js +2 -0
- package/dist/vehicle/vehicle-pricing/types.js.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Token, type User } from '@driveflux/db';
|
|
2
|
+
import { type PromisedResult } from '@driveflux/result';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export type RegisterApiResponse = {
|
|
5
|
+
token: Token;
|
|
6
|
+
user: User;
|
|
7
|
+
};
|
|
8
|
+
export type RegisterOptions = z.infer<typeof Body>;
|
|
9
|
+
declare const Body: z.ZodObject<{
|
|
10
|
+
firstName: z.ZodString;
|
|
11
|
+
lastName: z.ZodString;
|
|
12
|
+
phoneNumber: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
13
|
+
authMethod: z.ZodEnum<{
|
|
14
|
+
email: "email";
|
|
15
|
+
mobile: "mobile";
|
|
16
|
+
facebook: "facebook";
|
|
17
|
+
google: "google";
|
|
18
|
+
apple: "apple";
|
|
19
|
+
}>;
|
|
20
|
+
code: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
21
|
+
keepCode: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
22
|
+
email: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
23
|
+
dateOfBirth: z.ZodOptional<z.ZodDate>;
|
|
24
|
+
password: z.ZodOptional<z.ZodString>;
|
|
25
|
+
noMarketing: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
pageSource: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
27
|
+
skipPassword: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export declare const handleRegister: (b: Record<string, unknown>, xForwardedFor?: string | string[]) => PromisedResult<RegisterApiResponse>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/auth/register.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAA;AAG7D,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,MAAM,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;CACV,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;AAElD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;iBA0BR,CAAA;AAEF,eAAO,MAAM,cAAc,GAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,gBAAgB,MAAM,GAAG,MAAM,EAAE,KAC/B,cAAc,CAAC,mBAAmB,CAgHpC,CAAA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { cleanupPhoneNumber } from '@driveflux/api-functions/auth/formatter';
|
|
2
|
+
import { refreshEmailPreferences } from '@driveflux/api-functions/mailjet/refresh-email-preferences';
|
|
3
|
+
import { dateValidation } from '@driveflux/api-functions/validation';
|
|
4
|
+
import { prisma } from '@driveflux/db';
|
|
5
|
+
import { generateId } from '@driveflux/db/id';
|
|
6
|
+
import { makeProblem, PROBLEM_CONFLICT } from '@driveflux/problem';
|
|
7
|
+
import { Err, Ok } from '@driveflux/result';
|
|
8
|
+
import bcrypt from 'bcryptjs';
|
|
9
|
+
import { addDays } from 'date-fns/addDays';
|
|
10
|
+
import { isAfter } from 'date-fns/isAfter';
|
|
11
|
+
import { subYears } from 'date-fns/subYears';
|
|
12
|
+
import { nanoid } from 'nanoid';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { SALT_ROUNDS } from '../constants.js';
|
|
15
|
+
import { setContactInList } from '../mailjet/set-contact';
|
|
16
|
+
import { clearToken, verifyToken } from './tokens';
|
|
17
|
+
import { sendVerificationEmail } from './verifications.js';
|
|
18
|
+
const Body = z.object({
|
|
19
|
+
firstName: z.string(),
|
|
20
|
+
lastName: z.string(),
|
|
21
|
+
phoneNumber: z.string().transform((s) => s.replace(/[\s-]/g, '')),
|
|
22
|
+
authMethod: z.enum(['mobile', 'email', 'facebook', 'google', 'apple']),
|
|
23
|
+
code: z.string().optional().nullable(),
|
|
24
|
+
keepCode: z.boolean().optional().default(false),
|
|
25
|
+
email: z
|
|
26
|
+
.string()
|
|
27
|
+
.email()
|
|
28
|
+
.transform((s) => s.toLowerCase().trim()),
|
|
29
|
+
dateOfBirth: dateValidation
|
|
30
|
+
.refine((d) => {
|
|
31
|
+
return isAfter(d, subYears(new Date(), 25));
|
|
32
|
+
}, {
|
|
33
|
+
path: ['dateOfBirth'],
|
|
34
|
+
message: 'You must be at least 25 years old to signup for the service.',
|
|
35
|
+
})
|
|
36
|
+
.optional(),
|
|
37
|
+
password: z.string().min(6).optional(),
|
|
38
|
+
noMarketing: z.boolean().optional(),
|
|
39
|
+
pageSource: z.string().optional().nullable(),
|
|
40
|
+
skipPassword: z.boolean().optional().nullable(),
|
|
41
|
+
});
|
|
42
|
+
export const handleRegister = async (b, xForwardedFor) => {
|
|
43
|
+
const { noMarketing, password, authMethod, phoneNumber, code, keepCode, pageSource, skipPassword, ...body } = Body.parse(b);
|
|
44
|
+
let phoneNumberVerified = false;
|
|
45
|
+
if (code) {
|
|
46
|
+
const tokenResult = await verifyToken(code, { scope: 'verify-phone' });
|
|
47
|
+
if (tokenResult.err) {
|
|
48
|
+
return new Err(makeProblem(PROBLEM_CONFLICT, 'Invalid OTP token'));
|
|
49
|
+
}
|
|
50
|
+
if (!keepCode) {
|
|
51
|
+
await clearToken(tokenResult.val.id);
|
|
52
|
+
}
|
|
53
|
+
phoneNumberVerified = true;
|
|
54
|
+
}
|
|
55
|
+
if (!password && !skipPassword) {
|
|
56
|
+
return new Err(makeProblem(PROBLEM_CONFLICT, 'Password is invalid'));
|
|
57
|
+
}
|
|
58
|
+
// Check if the user exists
|
|
59
|
+
const foundUser = await prisma.user.findFirst({
|
|
60
|
+
where: { email: body.email },
|
|
61
|
+
});
|
|
62
|
+
if (foundUser) {
|
|
63
|
+
return new Err(makeProblem(PROBLEM_CONFLICT, 'A user with this email address already exists. Did you mean to login?'));
|
|
64
|
+
}
|
|
65
|
+
const formattedPohoneNumber = cleanupPhoneNumber(phoneNumber);
|
|
66
|
+
const id = generateId('User');
|
|
67
|
+
const hashedPassword = await bcrypt.hash(password ?? nanoid(), SALT_ROUNDS);
|
|
68
|
+
const user = await prisma.user.create({
|
|
69
|
+
data: {
|
|
70
|
+
id,
|
|
71
|
+
password: hashedPassword,
|
|
72
|
+
...body,
|
|
73
|
+
phoneNumber: formattedPohoneNumber,
|
|
74
|
+
preferredCurrency: 'MYR',
|
|
75
|
+
preferredLocale: 'en',
|
|
76
|
+
phoneNumberVerified,
|
|
77
|
+
consented: true,
|
|
78
|
+
groups: ['member'],
|
|
79
|
+
consents: {
|
|
80
|
+
create: {
|
|
81
|
+
id: generateId('UserConsent'),
|
|
82
|
+
ipAddress: Array.isArray(xForwardedFor)
|
|
83
|
+
? xForwardedFor?.[0] || '0.0.0.0'
|
|
84
|
+
: xForwardedFor || '0.0.0.0',
|
|
85
|
+
consentType: 'terms',
|
|
86
|
+
email: body.email,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
signupParams: {
|
|
90
|
+
method: authMethod,
|
|
91
|
+
source: pageSource,
|
|
92
|
+
},
|
|
93
|
+
registrationComplete: true,
|
|
94
|
+
accounts: {
|
|
95
|
+
create: {
|
|
96
|
+
id: generateId('Account'),
|
|
97
|
+
object: 'account',
|
|
98
|
+
type: 'default',
|
|
99
|
+
provider: 'credentials',
|
|
100
|
+
providerAccountId: id,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const token = await prisma.token.create({
|
|
106
|
+
data: {
|
|
107
|
+
id: generateId('Token'),
|
|
108
|
+
user: {
|
|
109
|
+
connect: {
|
|
110
|
+
id: user.id,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
expiresAt: addDays(new Date(), 365),
|
|
114
|
+
scope: 'all',
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
// We don't want this to be a task. It should be instant
|
|
118
|
+
await sendVerificationEmail(user.id);
|
|
119
|
+
if (!noMarketing) {
|
|
120
|
+
await setContactInList(user.id, { generalMarketing: true });
|
|
121
|
+
}
|
|
122
|
+
await refreshEmailPreferences(user.id);
|
|
123
|
+
return new Ok({
|
|
124
|
+
token,
|
|
125
|
+
user,
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/auth/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { TokenWithMaybeUser } from '@driveflux/db/types';
|
|
2
|
+
import { type PromisedResult } from '@driveflux/result';
|
|
3
|
+
type Verifications = {
|
|
4
|
+
scope?: string;
|
|
5
|
+
metadata?: Record<string, any>;
|
|
6
|
+
};
|
|
7
|
+
type VerifyTokenOptions = {
|
|
8
|
+
includeUser?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const createToken: (userId: string | null, type: "email" | "phoneNumber", value: string, providedExpiresAt?: Date) => Promise<{
|
|
11
|
+
object: import("@driveflux/db/enums").TokenObject;
|
|
12
|
+
id: string;
|
|
13
|
+
metadata: PrismaJson.AnyMetadata | null;
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
updatedAt: Date;
|
|
16
|
+
value: string | null;
|
|
17
|
+
userId: string | null;
|
|
18
|
+
client: string | null;
|
|
19
|
+
identifier: string | null;
|
|
20
|
+
expiresAt: Date | null;
|
|
21
|
+
redirectUrl: string | null;
|
|
22
|
+
scope: string | null;
|
|
23
|
+
invalid: boolean;
|
|
24
|
+
lastUsed: Date | null;
|
|
25
|
+
} | undefined>;
|
|
26
|
+
export declare const createEmailToken: (userId: string, email: string) => Promise<{
|
|
27
|
+
object: import("@driveflux/db/enums").TokenObject;
|
|
28
|
+
id: string;
|
|
29
|
+
metadata: PrismaJson.AnyMetadata | null;
|
|
30
|
+
createdAt: Date;
|
|
31
|
+
updatedAt: Date;
|
|
32
|
+
value: string | null;
|
|
33
|
+
userId: string | null;
|
|
34
|
+
client: string | null;
|
|
35
|
+
identifier: string | null;
|
|
36
|
+
expiresAt: Date | null;
|
|
37
|
+
redirectUrl: string | null;
|
|
38
|
+
scope: string | null;
|
|
39
|
+
invalid: boolean;
|
|
40
|
+
lastUsed: Date | null;
|
|
41
|
+
} | undefined>;
|
|
42
|
+
export declare const createSMSToken: (userId: string | null, phoneNumber: string) => Promise<{
|
|
43
|
+
object: import("@driveflux/db/enums").TokenObject;
|
|
44
|
+
id: string;
|
|
45
|
+
metadata: PrismaJson.AnyMetadata | null;
|
|
46
|
+
createdAt: Date;
|
|
47
|
+
updatedAt: Date;
|
|
48
|
+
value: string | null;
|
|
49
|
+
userId: string | null;
|
|
50
|
+
client: string | null;
|
|
51
|
+
identifier: string | null;
|
|
52
|
+
expiresAt: Date | null;
|
|
53
|
+
redirectUrl: string | null;
|
|
54
|
+
scope: string | null;
|
|
55
|
+
invalid: boolean;
|
|
56
|
+
lastUsed: Date | null;
|
|
57
|
+
} | undefined>;
|
|
58
|
+
export declare const verifyToken: (tokenIdOrValue: string | TokenWithMaybeUser, verifications?: Verifications, option?: VerifyTokenOptions) => PromisedResult<TokenWithMaybeUser>;
|
|
59
|
+
export declare const clearToken: (tokenId: string) => Promise<void>;
|
|
60
|
+
export declare const clearExpiredTokens: () => Promise<void>;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAQ7D,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAKhE,KAAK,aAAa,GAAG;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC9B,CAAA;AAED,KAAK,kBAAkB,GAAG;IACzB,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,WAAW,GACvB,QAAQ,MAAM,GAAG,IAAI,EACrB,MAAM,OAAO,GAAG,aAAa,EAC7B,OAAO,MAAM,EACb,oBAAoB,IAAI;;;;;;;;;;;;;;;cAsCxB,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAU,QAAQ,MAAM,EAAE,OAAO,MAAM;;;;;;;;;;;;;;;cAEnE,CAAA;AAED,eAAO,MAAM,cAAc,GAC1B,QAAQ,MAAM,GAAG,IAAI,EACrB,aAAa,MAAM;;;;;;;;;;;;;;;cAGnB,CAAA;AAED,eAAO,MAAM,WAAW,GACvB,gBAAgB,MAAM,GAAG,kBAAkB,EAC3C,gBAAgB,aAAa,EAC7B,SAAS,kBAAkB,KACzB,cAAc,CAAC,kBAAkB,CAmFnC,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,SAAS,MAAM,kBAU/C,CAAA;AAED,eAAO,MAAM,kBAAkB,qBAM9B,CAAA"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { prisma } from '@driveflux/db';
|
|
2
|
+
import { generateId } from '@driveflux/db/id';
|
|
3
|
+
import { makeProblem, PROBLEM_CORRUPT, PROBLEM_EXPIRED, PROBLEM_INVALID_DATA, PROBLEM_NOT_FOUND, } from '@driveflux/problem';
|
|
4
|
+
import { Err, Ok } from '@driveflux/result';
|
|
5
|
+
import { addDays } from 'date-fns/addDays';
|
|
6
|
+
import { addMinutes } from 'date-fns/addMinutes';
|
|
7
|
+
import { customAlphabet } from 'nanoid';
|
|
8
|
+
export const createToken = async (userId, type, value, providedExpiresAt) => {
|
|
9
|
+
// Generate 6 digits
|
|
10
|
+
const alphabet = '0123456789';
|
|
11
|
+
const nanoid = customAlphabet(alphabet, 6);
|
|
12
|
+
const identifier = !userId ? value : null;
|
|
13
|
+
const scope = type === 'email' ? 'verify-email' : 'verify-phone';
|
|
14
|
+
const expiresAt = providedExpiresAt ||
|
|
15
|
+
(type === 'email' ? addDays(new Date(), 1) : addMinutes(new Date(), 30));
|
|
16
|
+
if (!userId && !identifier) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
return await prisma.token.create({
|
|
20
|
+
data: {
|
|
21
|
+
id: generateId('Token'),
|
|
22
|
+
value: nanoid(),
|
|
23
|
+
...(userId
|
|
24
|
+
? {
|
|
25
|
+
user: {
|
|
26
|
+
connect: {
|
|
27
|
+
id: userId,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
: {}),
|
|
32
|
+
...(identifier ? { identifier } : {}),
|
|
33
|
+
expiresAt,
|
|
34
|
+
scope,
|
|
35
|
+
metadata: {
|
|
36
|
+
[type]: value,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
export const createEmailToken = async (userId, email) => {
|
|
42
|
+
return await createToken(userId, 'email', email);
|
|
43
|
+
};
|
|
44
|
+
export const createSMSToken = async (userId, phoneNumber) => {
|
|
45
|
+
return await createToken(userId, 'phoneNumber', phoneNumber);
|
|
46
|
+
};
|
|
47
|
+
export const verifyToken = async (tokenIdOrValue, verifications, option) => {
|
|
48
|
+
const token = typeof tokenIdOrValue === 'object'
|
|
49
|
+
? tokenIdOrValue
|
|
50
|
+
: (await prisma.token.findFirst({
|
|
51
|
+
where: {
|
|
52
|
+
OR: [{ id: tokenIdOrValue }, { value: tokenIdOrValue }],
|
|
53
|
+
},
|
|
54
|
+
...(option?.includeUser ? { include: { user: true } } : {}),
|
|
55
|
+
}));
|
|
56
|
+
if (!token) {
|
|
57
|
+
return new Err(makeProblem(PROBLEM_NOT_FOUND, 'Token not found'));
|
|
58
|
+
}
|
|
59
|
+
if (token.expiresAt && token.expiresAt.getTime() < Date.now()) {
|
|
60
|
+
return new Err(makeProblem(PROBLEM_EXPIRED, 'This token has expired'));
|
|
61
|
+
}
|
|
62
|
+
if (typeof verifications?.scope !== 'undefined' &&
|
|
63
|
+
token.scope !== verifications.scope) {
|
|
64
|
+
return new Err(makeProblem(PROBLEM_INVALID_DATA, 'Invalid token scope'));
|
|
65
|
+
}
|
|
66
|
+
if (typeof verifications?.metadata !== 'undefined') {
|
|
67
|
+
if (typeof verifications.metadata.phoneNumber !== 'undefined') {
|
|
68
|
+
const tokenPhoneNumber = token?.metadata &&
|
|
69
|
+
typeof token.metadata === 'object' &&
|
|
70
|
+
'phoneNumber' in token.metadata
|
|
71
|
+
? token.metadata.phoneNumber
|
|
72
|
+
: undefined;
|
|
73
|
+
const formattedTokenPhoneNumber = `+${(tokenPhoneNumber)?.replace(/[^0-9]/g, '')}`;
|
|
74
|
+
const phoneNumber = verifications.metadata?.phoneNumber;
|
|
75
|
+
if (verifications.scope === 'verify-phone' &&
|
|
76
|
+
phoneNumber !== formattedTokenPhoneNumber &&
|
|
77
|
+
phoneNumber !== tokenPhoneNumber) {
|
|
78
|
+
return new Err(makeProblem(PROBLEM_INVALID_DATA, 'Invalid token data'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (typeof verifications.metadata.email !== 'undefined') {
|
|
82
|
+
const tokenEmail = token?.metadata &&
|
|
83
|
+
typeof token.metadata === 'object' &&
|
|
84
|
+
'email' in token.metadata
|
|
85
|
+
? token.metadata.email
|
|
86
|
+
: undefined;
|
|
87
|
+
if (verifications.scope === 'verify-email' &&
|
|
88
|
+
tokenEmail !== verifications.metadata.email) {
|
|
89
|
+
return new Err(makeProblem(PROBLEM_INVALID_DATA, 'Invalid token data'));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// if (typeof verifications?.metadata !== 'undefined') {
|
|
94
|
+
// for (const key of Object.keys(verifications.metadata)) {
|
|
95
|
+
// if (
|
|
96
|
+
// typeof verifications.metadata[key] !== 'undefined' &&
|
|
97
|
+
// verifications.metadata[key] !== (token.metadata as any)?.[key] &&
|
|
98
|
+
// ((key === 'email' && verifications.scope === 'verify-email') ||
|
|
99
|
+
// (key === 'phoneNumber' && verifications.scope === 'verify-phone'))
|
|
100
|
+
// ) {
|
|
101
|
+
// return new Err(makeProblem(PROBLEM_INVALID_DATA, `Invalid token data`))
|
|
102
|
+
// }
|
|
103
|
+
// }
|
|
104
|
+
// }
|
|
105
|
+
if (option?.includeUser && !token.user) {
|
|
106
|
+
return new Err(makeProblem(PROBLEM_CORRUPT, 'Token is invalid'));
|
|
107
|
+
}
|
|
108
|
+
return new Ok(token);
|
|
109
|
+
};
|
|
110
|
+
export const clearToken = async (tokenId) => {
|
|
111
|
+
try {
|
|
112
|
+
await prisma.token.delete({
|
|
113
|
+
where: {
|
|
114
|
+
id: tokenId,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (_e) {
|
|
119
|
+
// Nothing to for now
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
export const clearExpiredTokens = async () => {
|
|
123
|
+
await prisma.token.deleteMany({
|
|
124
|
+
where: {
|
|
125
|
+
OR: [{ expiresAt: { lte: new Date() } }, { invalid: true }],
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { User } from '@driveflux/db';
|
|
2
|
+
import { Err, Ok, type PromisedResult } from '@driveflux/result';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export type CheckDuplicationOptions = z.infer<typeof CheckDuplicationBody>;
|
|
5
|
+
declare const CheckDuplicationBody: z.ZodObject<{
|
|
6
|
+
phoneNumber: z.ZodString;
|
|
7
|
+
email: z.ZodEffects<z.ZodString, string, string>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
email: string;
|
|
10
|
+
phoneNumber: string;
|
|
11
|
+
}, {
|
|
12
|
+
email: string;
|
|
13
|
+
phoneNumber: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const sendVerificationEmail: (userId: string | User, temporaryEmail?: string, next?: string) => PromisedResult<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
link: string;
|
|
18
|
+
}>;
|
|
19
|
+
export declare const verifyEmailUsage: (newEmail: string) => Promise<Err<import("@driveflux/problem").Problem, unknown> | Ok<{}, unknown>>;
|
|
20
|
+
export declare const sendVerificationSMS: (userId: string | null, phoneNumber: string) => PromisedResult<{
|
|
21
|
+
success: boolean;
|
|
22
|
+
code: string;
|
|
23
|
+
}>;
|
|
24
|
+
export declare const handleCheckDuplication: (b: Record<string, unknown>) => Promise<Err<import("@driveflux/problem").Problem, unknown> | Ok<{
|
|
25
|
+
notDuplicate: boolean;
|
|
26
|
+
}, unknown>>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=verifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifications.d.ts","sourceRoot":"","sources":["../../src/auth/verifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAezC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAE1E,QAAA,MAAM,oBAAoB;;;iBAGxB,CAAA;AAEF,eAAO,MAAM,qBAAqB,GACjC,QAAQ,MAAM,GAAG,IAAI,EACrB,iBAAiB,MAAM,EACvB,OAAO,MAAM,KACX,cAAc,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAwGnD,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAU,UAAU,MAAM,kFAwBtD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC/B,QAAQ,MAAM,GAAG,IAAI,EACrB,aAAa,MAAM,KACjB,cAAc,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAQnD,CAAA;AAiDD,eAAO,MAAM,sBAAsB,GAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;YAmCtE,CAAA"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { config } from '@driveflux/config/backend';
|
|
2
|
+
import { prisma } from '@driveflux/db';
|
|
3
|
+
import { send } from '@driveflux/email';
|
|
4
|
+
import { verificationEmail } from '@driveflux/email-templates/flux/verification';
|
|
5
|
+
import { enhancedFetch } from '@driveflux/fetch';
|
|
6
|
+
import { makeProblem, PROBLEM_CONFLICT, PROBLEM_EXTERNAL, PROBLEM_INTERNAL, PROBLEM_INVALID_DATA, PROBLEM_NOT_FOUND, PROBLEM_NOT_IMPLEMENTED, } from '@driveflux/problem';
|
|
7
|
+
import { reportProblem } from '@driveflux/reporter';
|
|
8
|
+
import { Err, Ok } from '@driveflux/result';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { cleanupPhoneNumber } from './formatter.js';
|
|
11
|
+
import { clearToken, createEmailToken, createSMSToken } from './tokens.js';
|
|
12
|
+
const CheckDuplicationBody = z.object({
|
|
13
|
+
phoneNumber: z.string(),
|
|
14
|
+
email: z.string().transform((email) => email.toLowerCase().trim()),
|
|
15
|
+
});
|
|
16
|
+
export const sendVerificationEmail = async (userId, temporaryEmail, next) => {
|
|
17
|
+
const user = typeof userId === 'string'
|
|
18
|
+
? await prisma.user.findUnique({ where: { id: userId } })
|
|
19
|
+
: userId;
|
|
20
|
+
if (!user) {
|
|
21
|
+
return new Err(makeProblem(PROBLEM_NOT_FOUND, `User ${typeof userId === 'string' ? userId : 'unknown'} not found.`));
|
|
22
|
+
}
|
|
23
|
+
if (temporaryEmail) {
|
|
24
|
+
const results = await verifyEmailUsage(temporaryEmail);
|
|
25
|
+
if (results?.err) {
|
|
26
|
+
return results;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const destinationEmail = temporaryEmail || user.email;
|
|
30
|
+
const token = await createEmailToken(user.id, destinationEmail);
|
|
31
|
+
if (!token) {
|
|
32
|
+
return new Err(makeProblem(PROBLEM_NOT_IMPLEMENTED, 'Token was not created'));
|
|
33
|
+
}
|
|
34
|
+
const updatedUser = await prisma.user.update({
|
|
35
|
+
where: {
|
|
36
|
+
id: user.id,
|
|
37
|
+
},
|
|
38
|
+
data: {
|
|
39
|
+
temporaryEmail: destinationEmail,
|
|
40
|
+
},
|
|
41
|
+
include: {
|
|
42
|
+
tokens: true,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
const tokens = updatedUser?.tokens;
|
|
46
|
+
if (tokens) {
|
|
47
|
+
await Promise.allSettled(tokens.map(async (userToken) => {
|
|
48
|
+
if (userToken.scope === 'verify-email' && userToken.id !== token.id) {
|
|
49
|
+
return await clearToken(userToken.id);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
// Query object for the link
|
|
55
|
+
const query = new URLSearchParams({
|
|
56
|
+
email: destinationEmail,
|
|
57
|
+
token: token.id,
|
|
58
|
+
code: token.value,
|
|
59
|
+
});
|
|
60
|
+
if (next) {
|
|
61
|
+
query.append('next', next);
|
|
62
|
+
}
|
|
63
|
+
const link = `${config.appUrl}/verify?${query}`;
|
|
64
|
+
const title = temporaryEmail
|
|
65
|
+
? 'Confirm email change'
|
|
66
|
+
: 'Verify your email address';
|
|
67
|
+
try {
|
|
68
|
+
// Generate html
|
|
69
|
+
const html = verificationEmail({
|
|
70
|
+
user: user.firstName || '',
|
|
71
|
+
link,
|
|
72
|
+
title: `${title}`,
|
|
73
|
+
newEmail: temporaryEmail,
|
|
74
|
+
isChanging: !!temporaryEmail,
|
|
75
|
+
});
|
|
76
|
+
// send email
|
|
77
|
+
const result = await send({
|
|
78
|
+
to: {
|
|
79
|
+
name: user.firstName || '',
|
|
80
|
+
address: destinationEmail,
|
|
81
|
+
},
|
|
82
|
+
subject: `${title}`,
|
|
83
|
+
html,
|
|
84
|
+
});
|
|
85
|
+
if (result.err) {
|
|
86
|
+
console.error('Error sending email:', result.val);
|
|
87
|
+
return new Err(makeProblem('email_not_sent', 'Unable to send the verification email'));
|
|
88
|
+
}
|
|
89
|
+
return new Ok({ success: true, link });
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
return new Err(makeProblem('email_not_sent', e.message));
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export const verifyEmailUsage = async (newEmail) => {
|
|
96
|
+
// TODO: add email regex checking
|
|
97
|
+
if (newEmail.length < 3) {
|
|
98
|
+
return new Err(makeProblem(PROBLEM_INVALID_DATA, 'Email address needs minimum 3 characters'));
|
|
99
|
+
}
|
|
100
|
+
const existingEmail = await prisma.user.findFirst({
|
|
101
|
+
where: {
|
|
102
|
+
email: newEmail,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
if (existingEmail) {
|
|
106
|
+
return new Err(makeProblem(PROBLEM_INVALID_DATA, 'The email address is already in use'));
|
|
107
|
+
}
|
|
108
|
+
return new Ok({});
|
|
109
|
+
};
|
|
110
|
+
export const sendVerificationSMS = async (userId, phoneNumber) => {
|
|
111
|
+
const token = await createSMSToken(userId, phoneNumber);
|
|
112
|
+
if (!token) {
|
|
113
|
+
return new Err(makeProblem(PROBLEM_NOT_IMPLEMENTED, 'Token was not created'));
|
|
114
|
+
}
|
|
115
|
+
return await sendSms(phoneNumber, token.value);
|
|
116
|
+
};
|
|
117
|
+
const sendSms = async (phoneNumber, code) => {
|
|
118
|
+
try {
|
|
119
|
+
const body = {
|
|
120
|
+
user: config.esms.apiKey,
|
|
121
|
+
pass: config.esms.apiSecret,
|
|
122
|
+
to: cleanupPhoneNumber(phoneNumber),
|
|
123
|
+
msg: `RM0.00 FLUX verification code: ${code}`,
|
|
124
|
+
sender: 'FLUX',
|
|
125
|
+
};
|
|
126
|
+
const result = await enhancedFetch('https://api.esms.com.my/sms/send', {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
});
|
|
130
|
+
if (result.err) {
|
|
131
|
+
return new Err(await reportProblem(makeProblem({
|
|
132
|
+
type: 'public',
|
|
133
|
+
code: PROBLEM_EXTERNAL,
|
|
134
|
+
message: 'Unable to send sms verification',
|
|
135
|
+
privateMetadata: {
|
|
136
|
+
error: result.val,
|
|
137
|
+
},
|
|
138
|
+
})));
|
|
139
|
+
}
|
|
140
|
+
return new Ok({ success: true, code });
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
return new Err(await reportProblem(makeProblem({
|
|
144
|
+
type: 'public',
|
|
145
|
+
code: PROBLEM_INTERNAL,
|
|
146
|
+
message: 'Unable to send sms verification',
|
|
147
|
+
privateMetadata: {
|
|
148
|
+
error: e,
|
|
149
|
+
},
|
|
150
|
+
})));
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
export const handleCheckDuplication = async (b) => {
|
|
154
|
+
const { phoneNumber, email } = CheckDuplicationBody.parse(b);
|
|
155
|
+
// Check if the user exists
|
|
156
|
+
const checkForEmail = await prisma.user.findFirst({
|
|
157
|
+
where: {
|
|
158
|
+
email: email.toLowerCase().trim(),
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
if (checkForEmail) {
|
|
162
|
+
return new Err(makeProblem(PROBLEM_CONFLICT, 'This email is already registered. Are you trying to sign in?'));
|
|
163
|
+
}
|
|
164
|
+
const checkForMobile = await prisma.user.findFirst({
|
|
165
|
+
where: {
|
|
166
|
+
phoneNumber: phoneNumber.replace(/[\s-]/g, ''),
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
if (checkForMobile) {
|
|
170
|
+
return new Err(makeProblem(PROBLEM_CONFLICT, 'The phone number is already in use. Please try a different one.'));
|
|
171
|
+
}
|
|
172
|
+
return new Ok({ notDuplicate: true });
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=verifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifications.js","sourceRoot":"","sources":["../../src/auth/verifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const TASK_PIPELINE_SLACK = "slack-pipeline";
|
|
2
|
+
export declare const TASK_COMMIT_SLACK_CHANNEL = "commit-slack-channel";
|
|
3
|
+
export declare const TASK_PIPELINE_SLACK_CRON = "* * * * *";
|
|
4
|
+
export declare const SALT_ROUNDS = 12;
|
|
5
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AACnD,eAAO,MAAM,yBAAyB,yBAAyB,CAAA;AAC/D,eAAO,MAAM,wBAAwB,cAAc,CAAA;AAEnD,eAAO,MAAM,WAAW,KAAK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAA;AAC/D,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAA"}
|
package/dist/global.d.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="@driveflux/engine/types" />
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { User } from '@driveflux/db';
|
|
2
|
+
import { Err } from '@driveflux/result';
|
|
3
|
+
import type { MailjetLists, StatusAction } from '../types';
|
|
4
|
+
import { type ResponseBase } from './request-service';
|
|
5
|
+
type Params = {
|
|
6
|
+
users: User[];
|
|
7
|
+
list: keyof MailjetLists;
|
|
8
|
+
action?: StatusAction;
|
|
9
|
+
};
|
|
10
|
+
type Response = ResponseBase<{
|
|
11
|
+
JobID: number;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const manageContactsInList: ({ users, list, action, }: Params) => Promise<Err<import("@driveflux/problem").Problem, unknown> | (import("@driveflux/result").Ok<Response, {
|
|
14
|
+
headers: globalThis.Response["headers"];
|
|
15
|
+
status: globalThis.Response["status"];
|
|
16
|
+
}> & {
|
|
17
|
+
map<T2>(mapper: (val: Response) => T2): import("@driveflux/result").Result<T2, import("@driveflux/problem").Problem, unknown, unknown>;
|
|
18
|
+
mapErr<E2>(mapper: (val: import("@driveflux/problem").Problem) => E2): import("@driveflux/result").Result<Response, E2, unknown, unknown>;
|
|
19
|
+
})>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=manage-contacts-in-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-contacts-in-list.d.ts","sourceRoot":"","sources":["../../../src/mailjet/calls/manage-contacts-in-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,KAAK,EAAW,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEnE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAElE,KAAK,MAAM,GAAG;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,IAAI,EAAE,MAAM,YAAY,CAAA;IACxB,MAAM,CAAC,EAAE,YAAY,CAAA;CACrB,CAAA;AAED,KAAK,QAAQ,GAAG,YAAY,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAA;CACb,CAAC,CAAA;AAGF,eAAO,MAAM,oBAAoB,GAAU,0BAIxC,MAAM;;;;;;GA6BR,CAAA"}
|