75 lines
2.0 KiB
TypeScript
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;
|