@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.
Files changed (174) hide show
  1. package/dist/auth/confirm.d.ts +33 -0
  2. package/dist/auth/confirm.d.ts.map +1 -0
  3. package/dist/auth/confirm.js +88 -0
  4. package/dist/auth/confirm.js.map +1 -0
  5. package/dist/auth/emails.d.ts +4 -0
  6. package/dist/auth/emails.d.ts.map +1 -0
  7. package/dist/auth/emails.js +51 -0
  8. package/dist/auth/emails.js.map +1 -0
  9. package/dist/auth/formatter.d.ts +2 -0
  10. package/dist/auth/formatter.d.ts.map +1 -0
  11. package/dist/auth/formatter.js +249 -0
  12. package/dist/auth/formatter.js.map +1 -0
  13. package/dist/auth/otp.d.ts +44 -0
  14. package/dist/auth/otp.d.ts.map +1 -0
  15. package/dist/auth/otp.js +154 -0
  16. package/dist/auth/otp.js.map +1 -0
  17. package/dist/auth/register.d.ts +31 -0
  18. package/dist/auth/register.d.ts.map +1 -0
  19. package/dist/auth/register.js +128 -0
  20. package/dist/auth/register.js.map +1 -0
  21. package/dist/auth/tokens.d.ts +62 -0
  22. package/dist/auth/tokens.d.ts.map +1 -0
  23. package/dist/auth/tokens.js +129 -0
  24. package/dist/auth/tokens.js.map +1 -0
  25. package/dist/auth/verifications.d.ts +28 -0
  26. package/dist/auth/verifications.d.ts.map +1 -0
  27. package/dist/auth/verifications.js +174 -0
  28. package/dist/auth/verifications.js.map +1 -0
  29. package/dist/constants.d.ts +5 -0
  30. package/dist/constants.d.ts.map +1 -0
  31. package/dist/constants.js +5 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/global.d.js +1 -0
  34. package/dist/mailjet/calls/manage-contacts-in-list.d.ts +21 -0
  35. package/dist/mailjet/calls/manage-contacts-in-list.d.ts.map +1 -0
  36. package/dist/mailjet/calls/manage-contacts-in-list.js +28 -0
  37. package/dist/mailjet/calls/manage-contacts-in-list.js.map +1 -0
  38. package/dist/mailjet/calls/manage-subscription-status.d.ts +15 -0
  39. package/dist/mailjet/calls/manage-subscription-status.d.ts.map +1 -0
  40. package/dist/mailjet/calls/manage-subscription-status.js +16 -0
  41. package/dist/mailjet/calls/manage-subscription-status.js.map +1 -0
  42. package/dist/mailjet/calls/request-service.d.ts +7 -0
  43. package/dist/mailjet/calls/request-service.d.ts.map +1 -0
  44. package/dist/mailjet/calls/request-service.js +24 -0
  45. package/dist/mailjet/calls/request-service.js.map +1 -0
  46. package/dist/mailjet/refresh-email-preferences.d.ts +23 -0
  47. package/dist/mailjet/refresh-email-preferences.d.ts.map +1 -0
  48. package/dist/mailjet/refresh-email-preferences.js +43 -0
  49. package/dist/mailjet/refresh-email-preferences.js.map +1 -0
  50. package/dist/mailjet/set-contact.d.ts +21 -0
  51. package/dist/mailjet/set-contact.d.ts.map +1 -0
  52. package/dist/mailjet/set-contact.js +39 -0
  53. package/dist/mailjet/set-contact.js.map +1 -0
  54. package/dist/mailjet/types.d.ts +31 -0
  55. package/dist/mailjet/types.d.ts.map +1 -0
  56. package/dist/mailjet/types.js +2 -0
  57. package/dist/mailjet/types.js.map +1 -0
  58. package/dist/mailjet/utils/convert-to-array.d.ts +6 -0
  59. package/dist/mailjet/utils/convert-to-array.d.ts.map +1 -0
  60. package/dist/mailjet/utils/convert-to-array.js +23 -0
  61. package/dist/mailjet/utils/convert-to-array.js.map +1 -0
  62. package/dist/mailjet/utils/extract-email-preferences.d.ts +17 -0
  63. package/dist/mailjet/utils/extract-email-preferences.d.ts.map +1 -0
  64. package/dist/mailjet/utils/extract-email-preferences.js +51 -0
  65. package/dist/mailjet/utils/extract-email-preferences.js.map +1 -0
  66. package/dist/mailjet/utils/lists.d.ts +13 -0
  67. package/dist/mailjet/utils/lists.d.ts.map +1 -0
  68. package/dist/mailjet/utils/lists.js +41 -0
  69. package/dist/mailjet/utils/lists.js.map +1 -0
  70. package/dist/mailjet/utils/update-email-references.d.ts +4 -0
  71. package/dist/mailjet/utils/update-email-references.d.ts.map +1 -0
  72. package/dist/mailjet/utils/update-email-references.js +31 -0
  73. package/dist/mailjet/utils/update-email-references.js.map +1 -0
  74. package/dist/notion/client.d.ts +12 -0
  75. package/dist/notion/client.d.ts.map +1 -0
  76. package/dist/notion/client.js +63 -0
  77. package/dist/notion/client.js.map +1 -0
  78. package/dist/notion/helpful.d.ts +7 -0
  79. package/dist/notion/helpful.d.ts.map +1 -0
  80. package/dist/notion/helpful.js +32 -0
  81. package/dist/notion/helpful.js.map +1 -0
  82. package/dist/notion/schemas/block.d.ts +89 -0
  83. package/dist/notion/schemas/block.d.ts.map +1 -0
  84. package/dist/notion/schemas/block.js +89 -0
  85. package/dist/notion/schemas/block.js.map +1 -0
  86. package/dist/notion/schemas/common.d.ts +25 -0
  87. package/dist/notion/schemas/common.d.ts.map +1 -0
  88. package/dist/notion/schemas/common.js +31 -0
  89. package/dist/notion/schemas/common.js.map +1 -0
  90. package/dist/notion/schemas/database.d.ts +517 -0
  91. package/dist/notion/schemas/database.d.ts.map +1 -0
  92. package/dist/notion/schemas/database.js +222 -0
  93. package/dist/notion/schemas/database.js.map +1 -0
  94. package/dist/notion/schemas/emoji.d.ts +12 -0
  95. package/dist/notion/schemas/emoji.d.ts.map +1 -0
  96. package/dist/notion/schemas/emoji.js +6 -0
  97. package/dist/notion/schemas/emoji.js.map +1 -0
  98. package/dist/notion/schemas/file.d.ts +43 -0
  99. package/dist/notion/schemas/file.d.ts.map +1 -0
  100. package/dist/notion/schemas/file.js +18 -0
  101. package/dist/notion/schemas/file.js.map +1 -0
  102. package/dist/notion/schemas/kb.d.ts +1526 -0
  103. package/dist/notion/schemas/kb.d.ts.map +1 -0
  104. package/dist/notion/schemas/kb.js +74 -0
  105. package/dist/notion/schemas/kb.js.map +1 -0
  106. package/dist/notion/schemas/page.d.ts +608 -0
  107. package/dist/notion/schemas/page.d.ts.map +1 -0
  108. package/dist/notion/schemas/page.js +181 -0
  109. package/dist/notion/schemas/page.js.map +1 -0
  110. package/dist/notion/schemas/parent.d.ts +42 -0
  111. package/dist/notion/schemas/parent.d.ts.map +1 -0
  112. package/dist/notion/schemas/parent.js +18 -0
  113. package/dist/notion/schemas/parent.js.map +1 -0
  114. package/dist/notion/schemas/user.d.ts +83 -0
  115. package/dist/notion/schemas/user.d.ts.map +1 -0
  116. package/dist/notion/schemas/user.js +31 -0
  117. package/dist/notion/schemas/user.js.map +1 -0
  118. package/dist/reservation/agree.d.ts +3 -0
  119. package/dist/reservation/agree.d.ts.map +1 -0
  120. package/dist/reservation/agree.js +23 -0
  121. package/dist/reservation/agree.js.map +1 -0
  122. package/dist/reservation/checks.d.ts +8 -0
  123. package/dist/reservation/checks.d.ts.map +1 -0
  124. package/dist/reservation/checks.js +28 -0
  125. package/dist/reservation/checks.js.map +1 -0
  126. package/dist/reservation/display-vehicle.d.ts +1152 -0
  127. package/dist/reservation/display-vehicle.d.ts.map +1 -0
  128. package/dist/reservation/display-vehicle.js +244 -0
  129. package/dist/reservation/display-vehicle.js.map +1 -0
  130. package/dist/reservation/fetch-or-create.d.ts +11 -0
  131. package/dist/reservation/fetch-or-create.d.ts.map +1 -0
  132. package/dist/reservation/fetch-or-create.js +207 -0
  133. package/dist/reservation/fetch-or-create.js.map +1 -0
  134. package/dist/reservation/invoice.d.ts +12 -0
  135. package/dist/reservation/invoice.d.ts.map +1 -0
  136. package/dist/reservation/invoice.js +248 -0
  137. package/dist/reservation/invoice.js.map +1 -0
  138. package/dist/reservation/payer.d.ts +5 -0
  139. package/dist/reservation/payer.d.ts.map +1 -0
  140. package/dist/reservation/payer.js +38 -0
  141. package/dist/reservation/payer.js.map +1 -0
  142. package/dist/reservation/reserve.d.ts +5 -0
  143. package/dist/reservation/reserve.d.ts.map +1 -0
  144. package/dist/reservation/reserve.js +44 -0
  145. package/dist/reservation/reserve.js.map +1 -0
  146. package/dist/reservation/types.d.ts +28 -0
  147. package/dist/reservation/types.d.ts.map +1 -0
  148. package/dist/reservation/types.js +2 -0
  149. package/dist/reservation/types.js.map +1 -0
  150. package/dist/reservation/vehicle.d.ts +6 -0
  151. package/dist/reservation/vehicle.d.ts.map +1 -0
  152. package/dist/reservation/vehicle.js +32 -0
  153. package/dist/reservation/vehicle.js.map +1 -0
  154. package/dist/slack.d.ts +19 -0
  155. package/dist/slack.d.ts.map +1 -0
  156. package/dist/slack.js +105 -0
  157. package/dist/slack.js.map +1 -0
  158. package/dist/validation.d.ts +63 -0
  159. package/dist/validation.d.ts.map +1 -0
  160. package/dist/validation.js +99 -0
  161. package/dist/validation.js.map +1 -0
  162. package/dist/vehicle/vehicle-pricing/constants.d.ts +91 -0
  163. package/dist/vehicle/vehicle-pricing/constants.d.ts.map +1 -0
  164. package/dist/vehicle/vehicle-pricing/constants.js +142 -0
  165. package/dist/vehicle/vehicle-pricing/constants.js.map +1 -0
  166. package/dist/vehicle/vehicle-pricing/index.d.ts +79 -0
  167. package/dist/vehicle/vehicle-pricing/index.d.ts.map +1 -0
  168. package/dist/vehicle/vehicle-pricing/index.js +169 -0
  169. package/dist/vehicle/vehicle-pricing/index.js.map +1 -0
  170. package/dist/vehicle/vehicle-pricing/types.d.ts +43 -0
  171. package/dist/vehicle/vehicle-pricing/types.d.ts.map +1 -0
  172. package/dist/vehicle/vehicle-pricing/types.js +2 -0
  173. package/dist/vehicle/vehicle-pricing/types.js.map +1 -0
  174. 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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4DAA4D,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,MAAM,EAAyB,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAuB,MAAM,mBAAmB,CAAA;AAChE,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAS1D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/C,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,KAAK,EAAE;SACP,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1C,WAAW,EAAE,cAAc;SACzB,MAAM,CACN,CAAC,CAAC,EAAE,EAAE;QACL,OAAO,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5C,CAAC,EACD;QACC,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,8DAA8D;KACvE,CACD;SACA,QAAQ,EAAE;IACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,CAA0B,EAC1B,aAAiC,EACK,EAAE;IACxC,MAAM,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,GAAG,IAAI,EACP,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEjB,IAAI,mBAAmB,GAAG,KAAK,CAAA;IAC/B,IAAI,IAAI,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QAEtE,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;YACrB,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAA;QACnE,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrC,CAAC;QAED,mBAAmB,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC,CAAA;IACrE,CAAC;IAED,2BAA2B;IAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7C,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;KAC5B,CAAC,CAAA;IAEF,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,GAAG,CACb,WAAW,CACV,gBAAgB,EAChB,uEAAuE,CACvE,CACD,CAAA;IACF,CAAC;IACD,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;IAE7D,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,WAAW,CAAC,CAAA;IAC3E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACrC,IAAI,EAAE;YACL,EAAE;YACF,QAAQ,EAAE,cAAc;YACxB,GAAG,IAAI;YACP,WAAW,EAAE,qBAAqB;YAClC,iBAAiB,EAAE,KAAK;YACxB,eAAe,EAAE,IAAI;YACrB,mBAAmB;YACnB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,CAAC,QAAQ,CAAC;YAClB,QAAQ,EAAE;gBACT,MAAM,EAAE;oBACP,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC;oBAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;wBACtC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;wBACjC,CAAC,CAAC,aAAa,IAAI,SAAS;oBAC7B,WAAW,EAAE,OAAO;oBACpB,KAAK,EAAE,IAAI,CAAC,KAAK;iBACjB;aACD;YACD,YAAY,EAAE;gBACb,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,UAAU;aAClB;YACD,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE;gBACT,MAAM,EAAE;oBACP,EAAE,EAAE,UAAU,CAAC,SAAS,CAAC;oBACzB,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,aAAa;oBACvB,iBAAiB,EAAE,EAAE;iBACrB;aACD;SACD;KACD,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,IAAI,EAAE;YACL,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE;gBACL,OAAO,EAAE;oBACR,EAAE,EAAE,IAAI,CAAC,EAAE;iBACX;aACD;YACD,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC;YACnC,KAAK,EAAE,KAAK;SACZ;KACD,CAAC,CAAA;IAEF,wDAAwD;IACxD,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEtC,OAAO,IAAI,EAAE,CAAC;QACb,KAAK;QACL,IAAI;KACJ,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -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,5 @@
1
+ export const TASK_PIPELINE_SLACK = 'slack-pipeline';
2
+ export const TASK_COMMIT_SLACK_CHANNEL = 'commit-slack-channel';
3
+ export const TASK_PIPELINE_SLACK_CRON = '* * * * *';
4
+ export const SALT_ROUNDS = 12;
5
+ //# sourceMappingURL=constants.js.map
@@ -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"}
@@ -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"}