diff options
| author | MohamedBassem <me@mbassem.com> | 2024-03-02 12:48:26 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-03-02 12:48:26 +0000 |
| commit | 64f75a0fb010d4a12086b839cc9d80ed011aa2b3 (patch) | |
| tree | 00282d3081f87407b67fd53135b75f2cdb2a40ba /packages/web/server/api/routers/users.ts | |
| parent | e70a2211e9c85d49c131fba2dbd7a4db61ad47e7 (diff) | |
| download | karakeep-64f75a0fb010d4a12086b839cc9d80ed011aa2b3.tar.zst | |
feature: Show user list in admin page
Diffstat (limited to 'packages/web/server/api/routers/users.ts')
| -rw-r--r-- | packages/web/server/api/routers/users.ts | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/packages/web/server/api/routers/users.ts b/packages/web/server/api/routers/users.ts index 3d5d982d..32d10860 100644 --- a/packages/web/server/api/routers/users.ts +++ b/packages/web/server/api/routers/users.ts @@ -1,23 +1,25 @@ import { zSignUpSchema } from "@/lib/types/api/users"; -import { publicProcedure, router } from "../trpc"; +import { adminProcedure, publicProcedure, router } from "../trpc"; import { SqliteError } from "@hoarder/db"; import { z } from "zod"; import { hashPassword } from "@/server/auth"; import { TRPCError } from "@trpc/server"; import { users } from "@hoarder/db/schema"; -import { count } from "drizzle-orm"; +import { count, eq } from "drizzle-orm"; export const usersAppRouter = router({ create: publicProcedure .input(zSignUpSchema) .output( z.object({ + id: z.string(), name: z.string(), email: z.string(), role: z.enum(["user", "admin"]).nullable(), }), ) .mutation(async ({ input, ctx }) => { + // TODO: This is racy, but that's probably fine. const [{ count: userCount }] = await ctx.db .select({ count: count() }) .from(users); @@ -31,6 +33,7 @@ export const usersAppRouter = router({ role: userCount == 0 ? "admin" : "user", }) .returning({ + id: users.id, name: users.name, email: users.email, role: users.role, @@ -51,4 +54,40 @@ export const usersAppRouter = router({ }); } }), + list: adminProcedure + .output( + z.object({ + users: z.array( + z.object({ + id: z.string(), + name: z.string(), + email: z.string(), + role: z.enum(["user", "admin"]).nullable(), + }), + ), + }), + ) + .query(async ({ ctx }) => { + const users = await ctx.db.query.users.findMany({ + columns: { + id: true, + name: true, + email: true, + role: true, + }, + }); + return { users }; + }), + delete: adminProcedure + .input( + z.object({ + userId: z.string(), + }), + ) + .mutation(async ({ input, ctx }) => { + const res = await ctx.db.delete(users).where(eq(users.id, input.userId)); + if (res.changes == 0) { + throw new TRPCError({ code: "NOT_FOUND" }); + } + }), }); |
