aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web/server/api/routers
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-02-22 15:32:40 +0000
committerMohamedBassem <me@mbassem.com>2024-02-22 15:32:40 +0000
commit942aac691225f4895c159a0260890ad2c576e0c9 (patch)
tree06a055fcd59c2753531f498ab58d0af4c7e8464c /packages/web/server/api/routers
parent08e7cbcfcb5e0b992d10ada324712c224b7a4d07 (diff)
downloadkarakeep-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.ts2
-rw-r--r--packages/web/server/api/routers/users.ts45
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",
+ });
+ }
+ }),
+});