From d218d951042c98135a4f6d329ca7df143a09abcb Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Mon, 26 Feb 2024 20:41:58 -0800 Subject: [PATCH] define fixed pin auth mode --- .../server/src/middlewares/DoorAuthModes.ts | 13 ++++++++++ packages/server/src/routers/DoorRouter.ts | 24 +++++++++---------- packages/server/src/types/Environment.ts | 2 ++ packages/server/src/types/IDoor.ts | 4 ---- packages/server/src/types/RedisKeys.ts | 4 ++++ 5 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 packages/server/src/middlewares/DoorAuthModes.ts delete mode 100644 packages/server/src/types/IDoor.ts diff --git a/packages/server/src/middlewares/DoorAuthModes.ts b/packages/server/src/middlewares/DoorAuthModes.ts new file mode 100644 index 0000000..86c66ea --- /dev/null +++ b/packages/server/src/middlewares/DoorAuthModes.ts @@ -0,0 +1,13 @@ +import { RequestHandler } from "express"; +import { getRedisClient } from "../clients/db/RedisDbProvider"; + +const client = await getRedisClient(); + +export const ValidQueryParamAuth: RequestHandler = async (req, res, next) => { + if (req.query['key'] !== '123') { + res.status(401).json({ msg: "Unauthorized" }); + return; + } + + next(); +}; \ No newline at end of file diff --git a/packages/server/src/routers/DoorRouter.ts b/packages/server/src/routers/DoorRouter.ts index 5c3d9d0..a4947d5 100644 --- a/packages/server/src/routers/DoorRouter.ts +++ b/packages/server/src/routers/DoorRouter.ts @@ -1,23 +1,13 @@ import express from "express"; import { getRedisClient } from "../clients/db/RedisDbProvider"; -import { IDoor } from "../types/IDoor"; -import { RedisKeys, concatKeys } from "../types/RedisKeys"; +import { RedisKeys, concatKeys, doorStatusKey } from "../types/RedisKeys"; +import { ValidQueryParamAuth } from "../middlewares/DoorAuthModes"; const router = express.Router(); const client = await getRedisClient(); -router.post('/:id', async(req, res) => { - const door: IDoor = req.body; - - await client.getClient().hSet(concatKeys(RedisKeys.DOORS, req.params.id), { - ...door - }); - - res.status(200).json(door); -}); - router.get('/:id/status', async(req, res) => { - const isOpen = await client.getClient().exists(concatKeys(RedisKeys.DOORS, req.params.id, 'open')); + const isOpen = await client.getClient().exists(doorStatusKey(req.params.id)); if (isOpen) { res.status(200).json({ status: 'open' }); @@ -27,4 +17,12 @@ router.get('/:id/status', async(req, res) => { res.status(401).json({ status: 'closed' }); }); +router.all('/:id/auth', ValidQueryParamAuth, async(req, res) => { + const statusKey = doorStatusKey(req.params.id); + + await client.put(statusKey, 'true'); + await client.getClient().expire(statusKey, Bun.env.DOOR_OPEN_TIMEOUT); + res.status(200).json({ msg: `Opened the door "${req.params.id}" for ${Bun.env.DOOR_OPEN_TIMEOUT}s` }); +}); + export default router; \ No newline at end of file diff --git a/packages/server/src/types/Environment.ts b/packages/server/src/types/Environment.ts index 8d4f1ad..ea330f4 100644 --- a/packages/server/src/types/Environment.ts +++ b/packages/server/src/types/Environment.ts @@ -3,5 +3,7 @@ declare module "bun" { CHALLENGE_EXPIRE_MS: number; BASE_DOMAIN: string; REDIS_CONNECT_URL: string; // `redis[s]://[[username][:password]@][host][:port][/db-number]` + DOOR_OPEN_TIMEOUT: number; + DOOR_FIXED_PIN: string; } } \ No newline at end of file diff --git a/packages/server/src/types/IDoor.ts b/packages/server/src/types/IDoor.ts deleted file mode 100644 index 824e1aa..0000000 --- a/packages/server/src/types/IDoor.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IDoor { - id: string; - open?: string; -} \ No newline at end of file diff --git a/packages/server/src/types/RedisKeys.ts b/packages/server/src/types/RedisKeys.ts index eb6b1a9..15be8e7 100644 --- a/packages/server/src/types/RedisKeys.ts +++ b/packages/server/src/types/RedisKeys.ts @@ -3,6 +3,10 @@ export enum RedisKeys { DOORS = "doors" } +export function doorStatusKey(id: string) { + return concatKeys(RedisKeys.DOORS, id, 'open'); +} + export function concatKeys(...keys: String[]) { return keys.join(':'); } \ No newline at end of file