diff options
| author | MohamedBassem <me@mbassem.com> | 2024-02-22 15:32:40 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-02-22 15:32:40 +0000 |
| commit | 942aac691225f4895c159a0260890ad2c576e0c9 (patch) | |
| tree | 06a055fcd59c2753531f498ab58d0af4c7e8464c /packages/web/server/api/routers | |
| parent | 08e7cbcfcb5e0b992d10ada324712c224b7a4d07 (diff) | |
| download | karakeep-942aac691225f4895c159a0260890ad2c576e0c9.tar.zst | |
feature: Add support for credentials registration and sign in
Diffstat (limited to 'packages/web/server/api/routers')
| -rw-r--r-- | packages/web/server/api/routers/_app.ts | 2 | ||||
| -rw-r--r-- | packages/web/server/api/routers/users.ts | 45 |
2 files changed, 47 insertions, 0 deletions
diff --git a/packages/web/server/api/routers/_app.ts b/packages/web/server/api/routers/_app.ts index 2097b47d..b958ef8f 100644 --- a/packages/web/server/api/routers/_app.ts +++ b/packages/web/server/api/routers/_app.ts @@ -1,9 +1,11 @@ import { router } from "../trpc"; import { apiKeysAppRouter } from "./apiKeys"; import { bookmarksAppRouter } from "./bookmarks"; +import { usersAppRouter } from "./users"; export const appRouter = router({ bookmarks: bookmarksAppRouter, apiKeys: apiKeysAppRouter, + users: usersAppRouter, }); // export type definition of API export type AppRouter = typeof appRouter; diff --git a/packages/web/server/api/routers/users.ts b/packages/web/server/api/routers/users.ts new file mode 100644 index 00000000..aecec1d4 --- /dev/null +++ b/packages/web/server/api/routers/users.ts @@ -0,0 +1,45 @@ +import { zSignUpSchema } from "@/lib/types/api/users"; +import { publicProcedure, router } from "../trpc"; +import { Prisma, prisma } from "@hoarder/db"; +import { z } from "zod"; +import { hashPassword } from "@/server/auth"; +import { TRPCError } from "@trpc/server"; + +export const usersAppRouter = router({ + create: publicProcedure + .input(zSignUpSchema) + .output( + z.object({ + name: z.string(), + email: z.string(), + }), + ) + .mutation(async ({ input }) => { + try { + return await prisma.user.create({ + data: { + name: input.name, + email: input.email, + password: await hashPassword(input.password), + }, + select: { + name: true, + email: true, + }, + }); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === "P2002") { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Email is already taken", + }); + } + } + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Something went wrong", + }); + } + }), +}); |
