aboutsummaryrefslogtreecommitdiffhomepage
path: root/pkgs/server/src/routes/auth.ts
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/server/src/routes/auth.ts')
-rw-r--r--pkgs/server/src/routes/auth.ts50
1 files changed, 50 insertions, 0 deletions
diff --git a/pkgs/server/src/routes/auth.ts b/pkgs/server/src/routes/auth.ts
new file mode 100644
index 0000000..3906d65
--- /dev/null
+++ b/pkgs/server/src/routes/auth.ts
@@ -0,0 +1,50 @@
+import { createUserSchema } from "@kioku/shared";
+import * as argon2 from "argon2";
+import { eq } from "drizzle-orm";
+import { Hono } from "hono";
+import { db, users } from "../db";
+import { Errors } from "../middleware";
+
+const auth = new Hono();
+
+auth.post("/register", async (c) => {
+ const body = await c.req.json();
+
+ const parsed = createUserSchema.safeParse(body);
+ if (!parsed.success) {
+ throw Errors.validationError(parsed.error.issues[0]?.message);
+ }
+
+ const { username, password } = parsed.data;
+
+ // Check if username already exists
+ const existingUser = await db
+ .select({ id: users.id })
+ .from(users)
+ .where(eq(users.username, username))
+ .limit(1);
+
+ if (existingUser.length > 0) {
+ throw Errors.conflict("Username already exists", "USERNAME_EXISTS");
+ }
+
+ // Hash password with Argon2
+ const passwordHash = await argon2.hash(password);
+
+ // Create user
+ const [newUser] = await db
+ .insert(users)
+ .values({
+ username,
+ passwordHash,
+ })
+ .returning({
+ id: users.id,
+ username: users.username,
+ createdAt: users.createdAt,
+ });
+
+ return c.json({ user: newUser }, 201);
+});
+
+export { auth };