@rpcbase/auth 0.44.0 → 0.46.0
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/api/me/handler.d.ts +5 -0
- package/dist/api/me/handler.d.ts.map +1 -0
- package/dist/api/me/index.d.ts +16 -0
- package/dist/api/me/index.d.ts.map +1 -0
- package/dist/api/sign-in/handler.d.ts +2 -1
- package/dist/api/sign-in/handler.d.ts.map +1 -1
- package/dist/api/sign-in/index.d.ts +5 -1
- package/dist/api/sign-in/index.d.ts.map +1 -1
- package/dist/api/sign-out/handler.d.ts.map +1 -1
- package/dist/api/sign-up/handler.d.ts +2 -1
- package/dist/api/sign-up/handler.d.ts.map +1 -1
- package/dist/api/sign-up/index.d.ts +5 -2
- package/dist/api/sign-up/index.d.ts.map +1 -1
- package/dist/api/verify-otp/handler.d.ts +5 -0
- package/dist/api/verify-otp/handler.d.ts.map +1 -0
- package/dist/api/verify-otp/index.d.ts +16 -0
- package/dist/api/verify-otp/index.d.ts.map +1 -0
- package/dist/components/{EmailOrPhoneInput → EmailInput}/index.d.ts +1 -1
- package/dist/components/EmailInput/index.d.ts.map +1 -0
- package/dist/components/PasswordInput/index.d.ts +10 -0
- package/dist/components/PasswordInput/index.d.ts.map +1 -0
- package/dist/components/SignInForm/index.d.ts.map +1 -1
- package/dist/components/SignUpForm/index.d.ts +2 -1
- package/dist/components/SignUpForm/index.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/handler-Ba3pgtfZ.js +57 -0
- package/dist/handler-CE4lXc0G.js +64 -0
- package/dist/{handler-42q87FS8.js → handler-CNHucHrj.js} +4 -1
- package/dist/handler-DOnLMd-9.js +57 -0
- package/dist/handler-r4ZECW_z.js +48 -0
- package/dist/index-Bdcryyvv.js +17 -0
- package/dist/index-DwX0Y2YV.js +17 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +169 -16
- package/dist/middleware-BiMXO6Dq.js +21 -0
- package/dist/middleware.d.ts +6 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/routes.js +1 -1
- package/dist/{schemas-7XFc7XYG.js → schemas-KL7REOdt.js} +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +8 -1
- package/dist/components/EmailOrPhoneInput/index.d.ts.map +0 -1
- package/dist/handler-BD2C82Z3.js +0 -17
- package/dist/handler-C7htSfmB.js +0 -32
- package/dist/index-Nc4R1TKZ.js +0 -25
- package/dist/index-oIC-DH2m.js +0 -21
- package/dist/isEmail-IG0hXiQk.js +0 -390
- package/dist/isValidNumber-6pMDGLRn.js +0 -1902
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/me/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA8B,MAAM,cAAc,CAAA;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;yBAkDlC,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAGC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from '../../../../vite/node_modules/zod';
|
|
2
|
+
export declare const Route = "/api/rb/auth/me";
|
|
3
|
+
export declare const requestSchema: z.ZodObject<{}, z.core.$strip>;
|
|
4
|
+
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
5
|
+
export declare const responseSchema: z.ZodObject<{
|
|
6
|
+
id: z.ZodOptional<z.ZodString>;
|
|
7
|
+
email: z.ZodOptional<z.ZodString>;
|
|
8
|
+
phone: z.ZodOptional<z.ZodString>;
|
|
9
|
+
name: z.ZodOptional<z.ZodString>;
|
|
10
|
+
tenants: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
11
|
+
current_tenant_id: z.ZodOptional<z.ZodString>;
|
|
12
|
+
signed_in_tenants: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
|
|
13
|
+
error: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/me/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,oBAAoB,CAAA;AAEtC,eAAO,MAAM,aAAa,gCAAe,CAAA;AACzC,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;;;;;;iBASzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAA8B,MAAM,cAAc,CAAA;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;yBA4DlC,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { z } from '../../../../vite/node_modules/zod';
|
|
2
2
|
export declare const Route = "/api/rb/auth/sign-in";
|
|
3
3
|
export declare const requestSchema: z.ZodObject<{
|
|
4
|
-
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
password: z.ZodString;
|
|
5
6
|
remember_me: z.ZodDefault<z.ZodBoolean>;
|
|
6
7
|
}, z.core.$strip>;
|
|
7
8
|
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
8
9
|
export declare const responseSchema: z.ZodObject<{
|
|
9
10
|
success: z.ZodBoolean;
|
|
11
|
+
error: z.ZodOptional<z.ZodString>;
|
|
12
|
+
user_id: z.ZodOptional<z.ZodString>;
|
|
13
|
+
tenant_id: z.ZodOptional<z.ZodString>;
|
|
10
14
|
}, z.core.$strip>;
|
|
11
15
|
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa;;;;iBAOxB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-out/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-out/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAO,MAAM,cAAc,CAAA;yBAkBvB,KAAK,GAAG;AAAxB,wBAEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAA8B,MAAM,cAAc,CAAA;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;yBAgFlC,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { z } from '../../../../vite/node_modules/zod';
|
|
2
2
|
export declare const Route = "/api/rb/auth/sign-up";
|
|
3
3
|
export declare const requestSchema: z.ZodObject<{
|
|
4
|
-
|
|
4
|
+
email: z.ZodString;
|
|
5
5
|
password: z.ZodString;
|
|
6
|
-
|
|
6
|
+
remember_me: z.ZodDefault<z.ZodBoolean>;
|
|
7
7
|
}, z.core.$strip>;
|
|
8
8
|
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
9
9
|
export declare const responseSchema: z.ZodObject<{
|
|
10
10
|
success: z.ZodBoolean;
|
|
11
|
+
error: z.ZodOptional<z.ZodString>;
|
|
12
|
+
user_id: z.ZodOptional<z.ZodString>;
|
|
13
|
+
tenant_id: z.ZodOptional<z.ZodString>;
|
|
11
14
|
}, z.core.$strip>;
|
|
12
15
|
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
13
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa;;;;iBAQtB,CAAA;AAEJ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/verify-otp/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA8B,MAAM,cAAc,CAAA;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;yBA0DlC,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from '../../../../vite/node_modules/zod';
|
|
2
|
+
export declare const Route = "/api/rb/auth/verify-otp";
|
|
3
|
+
export declare const requestSchema: z.ZodObject<{
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
code: z.ZodString;
|
|
6
|
+
remember_me: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
9
|
+
export declare const responseSchema: z.ZodObject<{
|
|
10
|
+
success: z.ZodBoolean;
|
|
11
|
+
error: z.ZodOptional<z.ZodString>;
|
|
12
|
+
user_id: z.ZodOptional<z.ZodString>;
|
|
13
|
+
tenant_id: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/verify-otp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,4BAA4B,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;iBAIxB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/EmailInput/index.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,GAAI,iCAIxB;IACD,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,4CA2BA,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type PasswordInputProps = {
|
|
2
|
+
id: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
className?: string;
|
|
5
|
+
placeholder?: string;
|
|
6
|
+
autoComplete?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const PasswordInput: ({ id, name, className, placeholder, autoComplete, }: PasswordInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PasswordInput/index.tsx"],"names":[],"mappings":"AAKA,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,qDAM3B,kBAAkB,4CA2CpB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignInForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAY,MAAM,OAAO,CAAA;AAW1C,eAAO,MAAM,UAAU,GAAI,yBAGxB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignInForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAY,MAAM,OAAO,CAAA;AAW1C,eAAO,MAAM,UAAU,GAAI,yBAGxB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,4CA6CA,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
export declare const SignUpForm: ({ children, className }: {
|
|
2
|
+
export declare const SignUpForm: ({ children, className, otpNextPath }: {
|
|
3
3
|
children: ReactNode;
|
|
4
4
|
className?: string;
|
|
5
|
+
otpNextPath?: string;
|
|
5
6
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignUpForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignUpForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAsB,MAAM,OAAO,CAAA;AAYpD,eAAO,MAAM,UAAU,GAAI,sCAIxB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,4CA8EA,CAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export * from './AuthLayout';
|
|
2
2
|
export * from './AppleSignInButton';
|
|
3
|
-
export * from './
|
|
3
|
+
export * from './EmailInput';
|
|
4
4
|
export * from './SignInForm';
|
|
5
5
|
export * from './SignUpForm';
|
|
6
6
|
export * from './RememberMeCheckbox';
|
|
7
|
+
export * from './PasswordInput';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { loadModel } from "@rpcbase/api";
|
|
2
|
+
import { r as restrictSessionMiddleware } from "./middleware-BiMXO6Dq.js";
|
|
3
|
+
import { o as object, s as string, a as array } from "./schemas-KL7REOdt.js";
|
|
4
|
+
const Route = "/api/rb/auth/me";
|
|
5
|
+
object({});
|
|
6
|
+
object({
|
|
7
|
+
id: string().optional(),
|
|
8
|
+
email: string().email().optional(),
|
|
9
|
+
phone: string().optional(),
|
|
10
|
+
name: string().optional(),
|
|
11
|
+
tenants: array(string()).default([]),
|
|
12
|
+
current_tenant_id: string().optional(),
|
|
13
|
+
signed_in_tenants: array(string()).default([]).optional(),
|
|
14
|
+
error: string().optional()
|
|
15
|
+
});
|
|
16
|
+
const me = async (_payload, ctx) => {
|
|
17
|
+
const sessionUser = ctx.req.session?.user;
|
|
18
|
+
if (!sessionUser?.id) {
|
|
19
|
+
ctx.res.status(401);
|
|
20
|
+
return {
|
|
21
|
+
id: "",
|
|
22
|
+
current_tenant_id: "",
|
|
23
|
+
signed_in_tenants: [],
|
|
24
|
+
tenants: [],
|
|
25
|
+
error: "not_authenticated"
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const User = await loadModel("User", ctx);
|
|
29
|
+
const user = await User.findById(sessionUser.id);
|
|
30
|
+
if (!user) {
|
|
31
|
+
ctx.res.status(404);
|
|
32
|
+
return {
|
|
33
|
+
id: "",
|
|
34
|
+
current_tenant_id: "",
|
|
35
|
+
signed_in_tenants: [],
|
|
36
|
+
tenants: [],
|
|
37
|
+
error: "user_not_found"
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const tenantId = sessionUser.current_tenant_id || user.tenants?.[0]?.toString?.() || "00000000";
|
|
41
|
+
return {
|
|
42
|
+
id: user._id.toString(),
|
|
43
|
+
email: user.email,
|
|
44
|
+
phone: user.phone,
|
|
45
|
+
name: user.name,
|
|
46
|
+
tenants: (user.tenants || []).map((t) => t.toString?.() || String(t)),
|
|
47
|
+
current_tenant_id: tenantId,
|
|
48
|
+
signed_in_tenants: sessionUser.signed_in_tenants || []
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
const handler = (api) => {
|
|
52
|
+
api.use(Route, restrictSessionMiddleware);
|
|
53
|
+
api.get(Route, me);
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
handler as default
|
|
57
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { loadModel } from "@rpcbase/api";
|
|
3
|
+
import { hashPassword, sendEmail } from "@rpcbase/server";
|
|
4
|
+
import { R as Route, r as requestSchema } from "./index-DwX0Y2YV.js";
|
|
5
|
+
const signUp = async (payload, ctx) => {
|
|
6
|
+
const User = await loadModel("User", ctx);
|
|
7
|
+
const Tenant = await loadModel("Tenant", ctx);
|
|
8
|
+
const parsed = requestSchema.safeParse(payload);
|
|
9
|
+
if (!parsed.success) {
|
|
10
|
+
ctx.res.status(400);
|
|
11
|
+
return { success: false, error: "invalid_payload" };
|
|
12
|
+
}
|
|
13
|
+
const { email, password, remember_me: _remember_me } = parsed.data;
|
|
14
|
+
const existingUser = await User.findOne({ email });
|
|
15
|
+
if (existingUser) {
|
|
16
|
+
console.log("user with email already exists", email);
|
|
17
|
+
ctx.res.status(409);
|
|
18
|
+
return { success: false, error: "user_exists" };
|
|
19
|
+
}
|
|
20
|
+
const salt = crypto.randomBytes(16).toString("hex");
|
|
21
|
+
const derivedKey = await hashPassword(password, salt);
|
|
22
|
+
const hashedPassword = `${salt}:${derivedKey.toString("hex")}`;
|
|
23
|
+
const tenantId = crypto.randomUUID();
|
|
24
|
+
const emailVerificationCode = crypto.randomInt(0, 1e6).toString().padStart(6, "0");
|
|
25
|
+
const emailVerificationExpiresAt = new Date(Date.now() + 10 * 60 * 1e3);
|
|
26
|
+
const user = new User({
|
|
27
|
+
email,
|
|
28
|
+
password: hashedPassword,
|
|
29
|
+
tenants: [tenantId],
|
|
30
|
+
email_verification_code: emailVerificationCode,
|
|
31
|
+
email_verification_expires_at: emailVerificationExpiresAt
|
|
32
|
+
});
|
|
33
|
+
await user.save();
|
|
34
|
+
try {
|
|
35
|
+
await sendEmail({
|
|
36
|
+
to: email,
|
|
37
|
+
subject: `Verify your email: ${emailVerificationCode}`,
|
|
38
|
+
html: `
|
|
39
|
+
<p>Welcome to rpcbase!</p>
|
|
40
|
+
<p>Your verification code is <strong>${emailVerificationCode}</strong>. It expires in 10 minutes.</p>
|
|
41
|
+
<p>If you didn't request this, you can ignore this message.</p>
|
|
42
|
+
`,
|
|
43
|
+
text: `Welcome to rpcbase! Your verification code is ${emailVerificationCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`
|
|
44
|
+
});
|
|
45
|
+
} catch (err) {
|
|
46
|
+
console.warn("failed to send sign-up email", err);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await Tenant.create({
|
|
50
|
+
tenant_id: tenantId,
|
|
51
|
+
name: email
|
|
52
|
+
});
|
|
53
|
+
} catch (err) {
|
|
54
|
+
console.warn("failed to create tenant for user", err);
|
|
55
|
+
}
|
|
56
|
+
console.log("created new user", user._id.toString());
|
|
57
|
+
return { success: true, user_id: user._id.toString(), tenant_id: tenantId };
|
|
58
|
+
};
|
|
59
|
+
const handler = (api) => {
|
|
60
|
+
api.post(Route, signUp);
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
handler as default
|
|
64
|
+
};
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { o as object, b as boolean } from "./schemas-
|
|
1
|
+
import { o as object, b as boolean } from "./schemas-KL7REOdt.js";
|
|
2
2
|
const Route = "/api/rb/auth/sign-out";
|
|
3
3
|
object({});
|
|
4
4
|
object({
|
|
5
5
|
success: boolean()
|
|
6
6
|
});
|
|
7
7
|
const handleSignOut = async (_, ctx) => {
|
|
8
|
+
if (!ctx.req.session) {
|
|
9
|
+
return { success: true };
|
|
10
|
+
}
|
|
8
11
|
await new Promise((resolve) => ctx.req.session.destroy(() => resolve()));
|
|
9
12
|
return {
|
|
10
13
|
success: true
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { loadModel } from "@rpcbase/api";
|
|
2
|
+
import { o as object, b as boolean, s as string } from "./schemas-KL7REOdt.js";
|
|
3
|
+
const Route = "/api/rb/auth/verify-otp";
|
|
4
|
+
const requestSchema = object({
|
|
5
|
+
email: string().email(),
|
|
6
|
+
code: string().length(6, "Code must be 6 digits"),
|
|
7
|
+
remember_me: boolean().default(true)
|
|
8
|
+
});
|
|
9
|
+
object({
|
|
10
|
+
success: boolean(),
|
|
11
|
+
error: string().optional(),
|
|
12
|
+
user_id: string().optional(),
|
|
13
|
+
tenant_id: string().optional()
|
|
14
|
+
});
|
|
15
|
+
const verifyOtp = async (payload, ctx) => {
|
|
16
|
+
const User = await loadModel("User", ctx);
|
|
17
|
+
const parsed = requestSchema.safeParse(payload);
|
|
18
|
+
if (!parsed.success) {
|
|
19
|
+
ctx.res.status(400);
|
|
20
|
+
return { success: false, error: "invalid_payload" };
|
|
21
|
+
}
|
|
22
|
+
const { email, code } = parsed.data;
|
|
23
|
+
const user = await User.findOne({ email }, { email_verification_code: 1, email_verification_expires_at: 1, tenants: 1 });
|
|
24
|
+
if (!user) {
|
|
25
|
+
ctx.res.status(404);
|
|
26
|
+
return { success: false, error: "user_not_found" };
|
|
27
|
+
}
|
|
28
|
+
const storedCode = user.email_verification_code;
|
|
29
|
+
const expiresAt = user.email_verification_expires_at;
|
|
30
|
+
const isExpired = expiresAt instanceof Date && expiresAt.getTime() < Date.now();
|
|
31
|
+
if (!storedCode || storedCode !== code || isExpired) {
|
|
32
|
+
ctx.res.status(400);
|
|
33
|
+
return { success: false, error: "invalid_code" };
|
|
34
|
+
}
|
|
35
|
+
user.email_verification_code = void 0;
|
|
36
|
+
user.email_verification_expires_at = void 0;
|
|
37
|
+
await user.save();
|
|
38
|
+
const tenantId = user.tenants?.[0]?.toString?.() || "00000000";
|
|
39
|
+
const signedInTenants = (user.tenants || []).map((t) => t.toString?.() || String(t)) || [tenantId];
|
|
40
|
+
if (!ctx.req.session) {
|
|
41
|
+
ctx.res.status(500);
|
|
42
|
+
return { success: false, error: "session_unavailable" };
|
|
43
|
+
}
|
|
44
|
+
ctx.req.session.user = {
|
|
45
|
+
id: user._id.toString(),
|
|
46
|
+
current_tenant_id: tenantId,
|
|
47
|
+
signed_in_tenants: signedInTenants.length ? signedInTenants : [tenantId],
|
|
48
|
+
is_entry_gate_authorized: true
|
|
49
|
+
};
|
|
50
|
+
return { success: true, user_id: user._id.toString(), tenant_id: tenantId };
|
|
51
|
+
};
|
|
52
|
+
const handler = (api) => {
|
|
53
|
+
api.post(Route, verifyOtp);
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
handler as default
|
|
57
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { loadModel } from "@rpcbase/api";
|
|
3
|
+
import { hashPassword } from "@rpcbase/server";
|
|
4
|
+
import { R as Route, r as requestSchema } from "./index-Bdcryyvv.js";
|
|
5
|
+
const signIn = async (payload, ctx) => {
|
|
6
|
+
const User = await loadModel("User", ctx);
|
|
7
|
+
const parsed = requestSchema.safeParse(payload);
|
|
8
|
+
if (!parsed.success) {
|
|
9
|
+
ctx.res.status(400);
|
|
10
|
+
return { success: false, error: "invalid_payload" };
|
|
11
|
+
}
|
|
12
|
+
const { email, password } = parsed.data;
|
|
13
|
+
const user = await User.findOne({ email }, { password: 1, tenants: 1 });
|
|
14
|
+
if (!user?.password) {
|
|
15
|
+
ctx.res.status(401);
|
|
16
|
+
return { success: false, error: "invalid_credentials" };
|
|
17
|
+
}
|
|
18
|
+
const [salt, hashedPassword] = String(user.password).split(":");
|
|
19
|
+
if (!salt || !hashedPassword) {
|
|
20
|
+
ctx.res.status(500);
|
|
21
|
+
return { success: false, error: "invalid_password_format" };
|
|
22
|
+
}
|
|
23
|
+
const derivedKey = await hashPassword(password, salt);
|
|
24
|
+
const passwordMatches = crypto.timingSafeEqual(Buffer.from(hashedPassword, "hex"), derivedKey);
|
|
25
|
+
if (!passwordMatches) {
|
|
26
|
+
ctx.res.status(401);
|
|
27
|
+
return { success: false, error: "invalid_credentials" };
|
|
28
|
+
}
|
|
29
|
+
const tenantId = user.tenants?.[0]?.toString?.() || "00000000";
|
|
30
|
+
const signedInTenants = (user.tenants || []).map((t) => t.toString?.() || String(t)) || [tenantId];
|
|
31
|
+
if (!ctx.req.session) {
|
|
32
|
+
ctx.res.status(500);
|
|
33
|
+
return { success: false, error: "session_unavailable" };
|
|
34
|
+
}
|
|
35
|
+
ctx.req.session.user = {
|
|
36
|
+
id: user._id.toString(),
|
|
37
|
+
current_tenant_id: tenantId,
|
|
38
|
+
signed_in_tenants: signedInTenants.length ? signedInTenants : [tenantId],
|
|
39
|
+
is_entry_gate_authorized: true
|
|
40
|
+
};
|
|
41
|
+
return { success: true, user_id: user._id.toString(), tenant_id: tenantId };
|
|
42
|
+
};
|
|
43
|
+
const handler = (api) => {
|
|
44
|
+
api.post(Route, signIn);
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
handler as default
|
|
48
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { o as object, b as boolean, s as string } from "./schemas-KL7REOdt.js";
|
|
2
|
+
const Route = "/api/rb/auth/sign-in";
|
|
3
|
+
const requestSchema = object({
|
|
4
|
+
email: string().nonempty("Email is required").email("Please enter a valid email address"),
|
|
5
|
+
password: string().min(1, { message: "Password is required" }),
|
|
6
|
+
remember_me: boolean().default(true)
|
|
7
|
+
});
|
|
8
|
+
object({
|
|
9
|
+
success: boolean(),
|
|
10
|
+
error: string().optional(),
|
|
11
|
+
user_id: string().optional(),
|
|
12
|
+
tenant_id: string().optional()
|
|
13
|
+
});
|
|
14
|
+
export {
|
|
15
|
+
Route as R,
|
|
16
|
+
requestSchema as r
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { o as object, b as boolean, s as string } from "./schemas-KL7REOdt.js";
|
|
2
|
+
const Route = "/api/rb/auth/sign-up";
|
|
3
|
+
const requestSchema = object({
|
|
4
|
+
email: string().nonempty("Email is required").email("Please enter a valid email address"),
|
|
5
|
+
password: string().min(8, { message: "Password must be at least 8 characters long." }),
|
|
6
|
+
remember_me: boolean().default(true)
|
|
7
|
+
});
|
|
8
|
+
object({
|
|
9
|
+
success: boolean(),
|
|
10
|
+
error: string().optional(),
|
|
11
|
+
user_id: string().optional(),
|
|
12
|
+
tenant_id: string().optional()
|
|
13
|
+
});
|
|
14
|
+
export {
|
|
15
|
+
Route as R,
|
|
16
|
+
requestSchema as r
|
|
17
|
+
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA"}
|