| | 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 }; |
| |
|