feat(rfid): add/update readers now possible

This commit is contained in:
2025-03-16 15:35:43 -05:00
parent 7bfb48b81f
commit 4aae659ee4
5 changed files with 141 additions and 8 deletions

View File

@@ -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<typeof ReaderData>;
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}`};
}
};

View File

@@ -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.
*/

View File

@@ -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) => {

View File

@@ -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;

View File

@@ -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;