summaryrefslogtreecommitdiff
path: root/src/routes/kid.ts
diff options
context:
space:
mode:
authorJustZvan <justzvan@justzvan.xyz>2026-02-06 12:16:40 +0100
committerJustZvan <justzvan@justzvan.xyz>2026-02-06 12:16:40 +0100
commite904e9634548e47d611bdcbb88d7b180b927fd5f (patch)
tree21aa5be08fc5b22585508c0263ee5ea4effcc593 /src/routes/kid.ts
feat: initial commit!
Diffstat (limited to 'src/routes/kid.ts')
-rw-r--r--src/routes/kid.ts107
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;