|
|
import { Router } from "express"; |
|
|
import { z } from "zod"; |
|
|
import * as userStore from "../../shared/users/user-store"; |
|
|
import { parseSort, sortBy } from "../../shared/utils"; |
|
|
import { UserPartialSchema, UserSchema } from "../../shared/users/schema"; |
|
|
|
|
|
const router = Router(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.get("/", (req, res) => { |
|
|
const sort = parseSort(req.query.sort) || ["promptCount", "lastUsedAt"]; |
|
|
const users = userStore.getUsers().sort(sortBy(sort, false)); |
|
|
res.json({ users, count: users.length }); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.get("/:token", (req, res) => { |
|
|
const user = userStore.getUser(req.params.token); |
|
|
if (!user) { |
|
|
return res.status(404).json({ error: "Not found" }); |
|
|
} |
|
|
res.json(user); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.post("/", (req, res) => { |
|
|
const body = req.body; |
|
|
|
|
|
const base = z.object({ |
|
|
type: UserSchema.shape.type.exclude(["temporary"]).default("normal"), |
|
|
}); |
|
|
const tempUser = base |
|
|
.extend({ |
|
|
type: z.literal("temporary"), |
|
|
expiresAt: UserSchema.shape.expiresAt, |
|
|
tokenLimits: UserSchema.shape.tokenLimits, |
|
|
}) |
|
|
.required(); |
|
|
|
|
|
const schema = z.union([base, tempUser]); |
|
|
const result = schema.safeParse(body); |
|
|
if (!result.success) { |
|
|
return res.status(400).json({ error: result.error }); |
|
|
} |
|
|
|
|
|
const token = userStore.createUser({ ...result.data }); |
|
|
res.json({ token }); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.put("/:token", (req, res) => { |
|
|
const result = UserPartialSchema.safeParse({ |
|
|
...req.body, |
|
|
token: req.params.token, |
|
|
}); |
|
|
if (!result.success) { |
|
|
return res.status(400).json({ error: result.error }); |
|
|
} |
|
|
userStore.upsertUser(result.data); |
|
|
res.json(userStore.getUser(req.params.token)); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.put("/", (req, res) => { |
|
|
const result = z.array(UserPartialSchema).safeParse(req.body.users); |
|
|
if (!result.success) { |
|
|
return res.status(400).json({ error: result.error }); |
|
|
} |
|
|
const upserts = result.data.map((user) => userStore.upsertUser(user)); |
|
|
res.json({ upserted_users: upserts, count: upserts.length }); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.delete("/:token", (req, res) => { |
|
|
const user = userStore.getUser(req.params.token); |
|
|
const disabledReason = z |
|
|
.string() |
|
|
.optional() |
|
|
.safeParse(req.query.disabledReason); |
|
|
if (!disabledReason.success) { |
|
|
return res.status(400).json({ error: disabledReason.error }); |
|
|
} |
|
|
if (!user) { |
|
|
return res.status(404).json({ error: "Not found" }); |
|
|
} |
|
|
userStore.disableUser(req.params.token, disabledReason.data); |
|
|
res.json(userStore.getUser(req.params.token)); |
|
|
}); |
|
|
|
|
|
export { router as usersApiRouter }; |
|
|
|