From 4aae659ee41d952e823ba4582b4d3fab05bd2500 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Sun, 16 Mar 2025 15:35:43 -0500 Subject: [PATCH] feat(rfid): add/update readers now possible --- server/services/rfid/controller/addReader.ts | 34 ++++++++++++ server/services/rfid/controller/mgtMonitor.ts | 3 -- server/services/rfid/rfidService.ts | 9 ++-- server/services/rfid/route/addReader.ts | 51 ++++++++++++++++++ server/services/rfid/route/updateReader.ts | 52 +++++++++++++++++++ 5 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 server/services/rfid/controller/addReader.ts delete mode 100644 server/services/rfid/controller/mgtMonitor.ts create mode 100644 server/services/rfid/route/addReader.ts create mode 100644 server/services/rfid/route/updateReader.ts diff --git a/server/services/rfid/controller/addReader.ts b/server/services/rfid/controller/addReader.ts new file mode 100644 index 0000000..7b7abd5 --- /dev/null +++ b/server/services/rfid/controller/addReader.ts @@ -0,0 +1,34 @@ +import {z} from "zod"; +import {createLog} from "../../logger/logger.js"; +import {db} from "../../../../database/dbclient.js"; +import {rfidReaders} from "../../../../database/schema/rfidReaders.js"; + +const ReaderData = z.object({ + reader: z.string(), + readerIP: z.string(), +}); + +type ReaderData = z.infer; + +export const addReader = async (data: ReaderData, user: any) => { + /** + * add a new reader with name and ip. + */ + + ReaderData.parse(data); + + if (!data.reader && !data.readerIP) { + createLog("error", user.username, "rfid", "Missing data please check that you have both a name and ip."); + return {success: false, message: "Missing data please check that you have both a name and ip."}; + } + + // try to add the reader + try { + await db.insert(rfidReaders).values(data).onConflictDoUpdate({target: rfidReaders.reader, set: data}); + createLog("info", user.username, "rfid", `Just added ${data.reader}.`); + return {success: true, message: `${data.reader} was just added.`}; + } catch (error) { + createLog("error", user.username, "rfid", `there was an error adding ${data.reader}, ${error}`); + return {success: false, message: `${data.reader} encountered and error: ${error}`}; + } +}; diff --git a/server/services/rfid/controller/mgtMonitor.ts b/server/services/rfid/controller/mgtMonitor.ts deleted file mode 100644 index d221b61..0000000 --- a/server/services/rfid/controller/mgtMonitor.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** - * While in production we will monitor the readers if we have not gotten a heartbeat in the last 5 min we will send a reboot command along with an email. - */ diff --git a/server/services/rfid/rfidService.ts b/server/services/rfid/rfidService.ts index dd97f7d..91bd477 100644 --- a/server/services/rfid/rfidService.ts +++ b/server/services/rfid/rfidService.ts @@ -2,13 +2,12 @@ import {OpenAPIHono} from "@hono/zod-openapi"; import mgtEvents from "./route/mgtEvents.js"; import tagInfo from "./route/tagInfo.js"; +import addReader from "./route/addReader.js"; +import updateReader from "./route/updateReader.js"; +import manualTrigger from "./route/manualTagRead.js"; const app = new OpenAPIHono(); -const routes = [ - mgtEvents, - tagInfo, - // settings -] as const; +const routes = [mgtEvents, tagInfo, addReader, updateReader, manualTrigger] as const; // app.route("/server", modules); const appRoutes = routes.forEach((route) => { diff --git a/server/services/rfid/route/addReader.ts b/server/services/rfid/route/addReader.ts new file mode 100644 index 0000000..6fb4adb --- /dev/null +++ b/server/services/rfid/route/addReader.ts @@ -0,0 +1,51 @@ +import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi"; +import {addReader} from "../controller/addReader.js"; +import {authMiddleware} from "../../auth/middleware/authMiddleware.js"; +import {responses} from "../../../globalUtils/routeDefs/responses.js"; +import type {User} from "../../../types/users.js"; +import {verify} from "hono/jwt"; + +const app = new OpenAPIHono(); + +export const ReaderBody = z.object({ + reader: z.string().openapi({example: "wrapper1"}), + readerIP: z.string().openapi({example: "192.168.1.52"}), +}); + +app.openapi( + createRoute({ + tags: ["rfid"], + summary: "Add new reader", + method: "post", + path: "/addreader", + middleware: authMiddleware, + description: "Adding in a new reader to add to the network.", + request: { + body: {content: {"application/json": {schema: ReaderBody}}}, + }, + responses: responses(), + }), + async (c) => { + const body = await c.req.json(); + const authHeader = c.req.header("Authorization"); + + const token = authHeader?.split("Bearer ")[1] || ""; + let user: User; + + try { + const payload = await verify(token, process.env.JWT_SECRET!); + user = payload.user as User; + } catch (error) { + return c.json({message: "Unauthorized"}, 401); + } + + try { + const addingReader = await addReader(body, user); + return c.json({success: addingReader.success, message: addingReader.message}, 200); + } catch (error) { + return c.json({success: false, message: `${body.name} encountered an error while trying to be added`}, 400); + } + } +); + +export default app; diff --git a/server/services/rfid/route/updateReader.ts b/server/services/rfid/route/updateReader.ts new file mode 100644 index 0000000..5b982ee --- /dev/null +++ b/server/services/rfid/route/updateReader.ts @@ -0,0 +1,52 @@ +import {z, createRoute, OpenAPIHono} from "@hono/zod-openapi"; +import {addReader} from "../controller/addReader.js"; +import {authMiddleware} from "../../auth/middleware/authMiddleware.js"; +import {responses} from "../../../globalUtils/routeDefs/responses.js"; +import type {User} from "../../../types/users.js"; +import {verify} from "hono/jwt"; + +const app = new OpenAPIHono(); + +export const ReaderBody = z.object({ + reader: z.string().openapi({example: "wrapper1"}), + readerIP: z.string().openapi({example: "192.168.1.52"}), + active: z.boolean().optional().openapi({example: true}), +}); + +app.openapi( + createRoute({ + tags: ["rfid"], + summary: "Add new reader", + method: "patch", + path: "/updatereader", + middleware: authMiddleware, + description: "Updates the reader data..", + request: { + body: {content: {"application/json": {schema: ReaderBody}}}, + }, + responses: responses(), + }), + async (c) => { + const body = await c.req.json(); + const authHeader = c.req.header("Authorization"); + + const token = authHeader?.split("Bearer ")[1] || ""; + let user: User; + + try { + const payload = await verify(token, process.env.JWT_SECRET!); + user = payload.user as User; + } catch (error) { + return c.json({message: "Unauthorized"}, 401); + } + + try { + const addingReader = await addReader(body, user); + return c.json({success: addingReader.success, message: addingReader.message}, 200); + } catch (error) { + return c.json({success: false, message: `${body.name} encountered an error while trying to be added`}, 400); + } + } +); + +export default app;