Files
q-buffer/apps/server/src/loop/profiles.routes.ts
2026-01-02 15:49:01 +03:00

75 lines
2.0 KiB
TypeScript

import { Router } from "express";
import { randomUUID } from "node:crypto";
import { readDb, writeDb } from "../storage/jsondb"
import { profileSchema } from "../utils/validators"
import { nowIso } from "../utils/time"
const router = Router();
router.get("/", async (_req, res) => {
const db = await readDb();
res.json(db.profiles);
});
router.post("/", async (req, res) => {
const parsed = profileSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: parsed.error.flatten() });
}
const db = await readDb();
const profile = {
id: randomUUID(),
createdAt: nowIso(),
...parsed.data,
};
db.profiles.push(profile);
await writeDb(db);
res.json(profile);
});
router.put("/:profileId", async (req, res) => {
const parsed = profileSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: parsed.error.flatten() });
}
const db = await readDb();
const index = db.profiles.findIndex((p) => p.id === req.params.profileId);
if (index === -1) {
return res.status(404).json({ error: "Profile not found" });
}
db.profiles[index] = {
...db.profiles[index],
...parsed.data,
};
await writeDb(db);
res.json(db.profiles[index]);
});
router.delete("/:profileId", async (req, res) => {
const db = await readDb();
const next = db.profiles.filter((p) => p.id !== req.params.profileId);
if (next.length === db.profiles.length) {
return res.status(404).json({ error: "Profile not found" });
}
db.profiles = next;
await writeDb(db);
res.json({ ok: true });
});
router.post("/apply", async (req, res) => {
const { profileId, hash } = req.body ?? {};
const db = await readDb();
const profile = db.profiles.find((p) => p.id === profileId);
if (!profile) {
return res.status(404).json({ error: "Profile not found" });
}
res.json({
hash,
allowIp: profile.allowIp,
delayMs: profile.delayMs,
targetLoops: profile.targetLoops,
});
});
export default router;