From b68daf7312bce9e5178f3d0e885cec538f16b936 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Sun, 8 Jun 2025 12:54:54 -0700 Subject: [PATCH] create new package for schemas and use it for auth --- bun.lockb | Bin 432280 -> 433832 bytes packages/doorman-api/package.json | 3 +- .../src/functions/api/door/auth.ts | 11 +-- packages/doorman-schema/package.json | 9 ++ packages/doorman-schema/src/index.ts | 1 + packages/doorman-schema/src/routes/auth.ts | 10 +++ packages/doorman-ui/package.json | 4 +- .../src/components/AuthComponent.tsx | 78 +++++++++++------- packages/doorman-ui/src/index.tsx | 4 +- 9 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 packages/doorman-schema/package.json create mode 100644 packages/doorman-schema/src/index.ts create mode 100644 packages/doorman-schema/src/routes/auth.ts diff --git a/bun.lockb b/bun.lockb index 21baeaec17b7ff382c388339bc9e310bbe258739..144415a271470869928bd11e004b0f4be6db095c 100755 GIT binary patch delta 78619 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 z

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 e#@}>Nk>aWBPXgYu+!KwLi2qcdG5-g>#iJbn diff --git a/packages/doorman-api/package.json b/packages/doorman-api/package.json index dfab9cd..aea0490 100644 --- a/packages/doorman-api/package.json +++ b/packages/doorman-api/package.json @@ -25,7 +25,8 @@ "winston-loki": "^6.1.3", "zod": "^3.25.42", "zod-validation-error": "^3.4.1", - "zod_utilz": "^0.8.4" + "zod_utilz": "^0.8.4", + "doorman-schema": "workspace:*" }, "devDependencies": { "twilio-run": "^3.5.4", diff --git a/packages/doorman-api/src/functions/api/door/auth.ts b/packages/doorman-api/src/functions/api/door/auth.ts index 896e3ca..308dc6f 100644 --- a/packages/doorman-api/src/functions/api/door/auth.ts +++ b/packages/doorman-api/src/functions/api/door/auth.ts @@ -13,17 +13,8 @@ import { AuthMetrics, registerMetrics } from "../../../metrics/AuthMetrics"; import { Counter } from "prom-client"; import { DoorConfig, getDoorConfigID } from "../../../schema/DoorConfig"; import { createLockStatusWithTimeout, getLockStatusID, isLockOpen } from "../../../schema/LockStatus"; -import { z } from "zod"; import { setResponseJson } from "../../../utils/responseUtils"; - -export const AuthRequestSchema = z.object({ - door: z.string(), - key: z.string(), - ip: z.string().optional(), - timeout: z.coerce.number().gt(0, "Timeout cannot be 0").optional(), -}); - -export type AuthRequest = z.infer; +import { AuthRequest, AuthRequestSchema } from "../../../../../doorman-schema/src"; export interface AuthRequestTwilio extends ServerlessEventObject { }; diff --git a/packages/doorman-schema/package.json b/packages/doorman-schema/package.json new file mode 100644 index 0000000..9ff2901 --- /dev/null +++ b/packages/doorman-schema/package.json @@ -0,0 +1,9 @@ +{ + "name": "doorman-schema", + "module": "src/index.ts", + "type": "module", + "dependencies": { + "zod": "^3.25.56", + "zod_utilz": "^0.8.4" + } +} \ No newline at end of file diff --git a/packages/doorman-schema/src/index.ts b/packages/doorman-schema/src/index.ts new file mode 100644 index 0000000..fed0a87 --- /dev/null +++ b/packages/doorman-schema/src/index.ts @@ -0,0 +1 @@ +export * from "./routes/auth"; \ No newline at end of file diff --git a/packages/doorman-schema/src/routes/auth.ts b/packages/doorman-schema/src/routes/auth.ts new file mode 100644 index 0000000..e2e7db3 --- /dev/null +++ b/packages/doorman-schema/src/routes/auth.ts @@ -0,0 +1,10 @@ +import z from "zod"; + +export const AuthRequestSchema = z.object({ + door: z.string(), + key: z.string().min(1, "PIN cannot be empty"), + ip: z.string().optional(), + timeout: z.coerce.number().gt(0, "Timeout cannot be 0").optional(), +}); + +export type AuthRequest = z.infer; \ No newline at end of file diff --git a/packages/doorman-ui/package.json b/packages/doorman-ui/package.json index e412577..49eb5aa 100644 --- a/packages/doorman-ui/package.json +++ b/packages/doorman-ui/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@cloudscape-design/components": "^3.0.375", + "@hookform/resolvers": "^5.1.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^13.0.0", "@testing-library/user-event": "^13.2.1", @@ -22,7 +23,8 @@ "vite": "^4.4.9", "vite-plugin-svgr": "^4.0.0", "vite-tsconfig-paths": "^4.2.1", - "web-vitals": "^2.1.0" + "web-vitals": "^2.1.0", + "zod": "^3.25.56" }, "scripts": { "start": "vite", diff --git a/packages/doorman-ui/src/components/AuthComponent.tsx b/packages/doorman-ui/src/components/AuthComponent.tsx index 80f72af..1444d47 100644 --- a/packages/doorman-ui/src/components/AuthComponent.tsx +++ b/packages/doorman-ui/src/components/AuthComponent.tsx @@ -1,8 +1,12 @@ -import { Button, FormField, Icon, Input, SpaceBetween } from "@cloudscape-design/components"; +import { Button, Form, FormField, Icon, Input, SpaceBetween } from "@cloudscape-design/components"; import { useEffect, useState } from "react"; -import type { AuthRequest } from "../../../doorman-api/src/functions/api/door/auth"; +import { AuthRequest, AuthRequestSchema } from "../../../doorman-schema/src"; import { fetchUrlEncoded } from "../helpers/FetchHelper"; +import { useForm } from "react-hook-form"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import CInput from "react-hook-form-cloudscape/components/input"; // COPIED FROM SERVER export enum IAuthMode { @@ -10,7 +14,6 @@ export enum IAuthMode { RANDOM_ROTATING_KEY = "Random Rotating Key", } - export interface IAuthComponentProps { door: string, authMode: IAuthMode, @@ -21,17 +24,42 @@ export interface IAuthComponentProps { } export const AuthComponent = ({ door, secret, authMode, onError, onUnlock, runCheck }: IAuthComponentProps) => { - const [ key, setKey ] = useState(secret || ""); - const [ error, setError ] = useState(""); + const { control, setError, formState, handleSubmit, setValue, getValues } = useForm({ + resolver: zodResolver(AuthRequestSchema), + defaultValues: { + key: secret || "", + door, + } + }); + + const [isLoading, setLoading] = useState(false); + + const onSubmit = async (body: AuthRequest) => { + setLoading(true); + await fetchUrlEncoded('/api/door/auth', body) + .then(async res => { + if (res.status !== 200) { + setError("key", { type: "validate", message: "Incorrect PIN"}); + onError && onError(await res.json()); + return; + } + onUnlock(); + }); + setLoading(false); + }; useEffect(() => { - if (runCheck) { - onSubmit(); + // don't allow us to submit while we are submitting + if (runCheck && !isLoading) { + handleSubmit(onSubmit)(); } - }, [runCheck]) + }, [runCheck]); - const onSubmit = async () => { - const ip = await fetch('https://api.ipify.org?format=json') + + // try and submit on load if the pin is passed in by query params + useEffect(() => { + setLoading(true); + fetch('https://api.ipify.org?format=json') .then(response => response.json()) .then(data => { return data.ip; @@ -39,30 +67,24 @@ export const AuthComponent = ({ door, secret, authMode, onError, onUnlock, runCh .catch(error => { console.log('Error:', error); return "null"; - }); + }) + .then(async ip => { + setValue("ip", ip); - const body: AuthRequest = { - door, - ip, - key, - }; - - fetchUrlEncoded('/api/door/auth', body) - .then(async res => { - if (res.status !== 200) { - setError("Incorrect PIN"); - onError && onError(await res.json()); - return; + // if the key is there, then try submitting right away + if (secret !== null) { + await handleSubmit(onSubmit)(); } - onUnlock(); - }); - } + + setLoading(false); + }); + }, [secret]); return ( <> - - setKey(detail.value)} /> + + diff --git a/packages/doorman-ui/src/index.tsx b/packages/doorman-ui/src/index.tsx index f30daa7..32493b5 100644 --- a/packages/doorman-ui/src/index.tsx +++ b/packages/doorman-ui/src/index.tsx @@ -36,7 +36,5 @@ const router = createBrowserRouter([ ]) root.render( - - - + );