diff options
Diffstat (limited to 'src/routes/kid.ts')
| -rw-r--r-- | src/routes/kid.ts | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/routes/kid.ts b/src/routes/kid.ts new file mode 100644 index 0000000..a326d5b --- /dev/null +++ b/src/routes/kid.ts @@ -0,0 +1,107 @@ +import express from "express"; +import { authDevice } from "../middleware/auth"; +import { db } from "../db/db"; +import { deviceConfig } from "../db/schema"; +import { eq } from "drizzle-orm"; +import { logger } from "../lib/pino"; +import { z } from "zod"; + +/** Schema for validating device IDs from authenticated requests */ +const DeviceIdSchema = z + .number() + .int() + .positive("Device ID must be a positive integer"); + +const router: express.Router = express.Router(); + +router.get("/kid/getconfig", authDevice, async (req, res) => { + const deviceId = req.user!.id; + + const parsed = DeviceIdSchema.safeParse(deviceId); + if (!parsed.success) { + logger.error( + { deviceId, error: parsed.error }, + "Invalid device ID in getconfig request", + ); + res.status(400).json({ + success: false, + reason: parsed.error.issues[0]?.message || "Invalid device ID", + }); + return; + } + + try { + let config; + try { + config = await db + .select() + .from(deviceConfig) + .where(eq(deviceConfig.deviceId, deviceId)) + .limit(1); + } catch (dbError) { + logger.error( + { error: dbError, deviceId }, + "Database error fetching device config", + ); + throw dbError; + } + + if (config.length === 0) { + try { + const newConfig = await db + .insert(deviceConfig) + .values({ deviceId }) + .returning(); + config = newConfig; + logger.info({ deviceId }, "Created default device config"); + } catch (insertError) { + logger.error( + { error: insertError, deviceId }, + "Failed to create default device config", + ); + throw insertError; + } + } + + const cfg = config[0]; + if (!cfg) { + logger.error( + { deviceId }, + "Config is unexpectedly undefined after creation", + ); + res.status(500).json({ + success: false, + reason: "Failed to get device configuration", + }); + return; + } + + logger.debug( + { + deviceId, + config: { + disableBuddy: cfg.disableBuddy, + blockAdultSites: cfg.blockAdultSites, + }, + }, + "Device config retrieved successfully", + ); + + res.json({ + success: true, + config: { + disableBuddy: cfg.disableBuddy, + blockAdultSites: cfg.blockAdultSites, + familyLinkAntiCircumvention: cfg.familyLinkAntiCircumvention, + }, + }); + } catch (e) { + logger.error({ error: e, deviceId }, "Failed to get device config"); + res.status(500).json({ + success: false, + reason: "Failed to get device configuration", + }); + } +}); + +export default router; |