import { z } from "zod"; import { procedure, router } from "../api/trpc"; import db from "../db"; import { TRPCError } from "@trpc/server"; import { and, eq, isNull } from "drizzle-orm"; import { user } from "../db/schema/user"; import { verifyPassword } from "../lib/crypto"; import { createToken } from "../lib/jwt"; const authRouter = router({ login: procedure .input( z.object({ email: z.string().email(), password: z.string().min(1), }) ) .mutation(async ({ ctx, input }) => { const userData = await db.query.user.findFirst({ where: and(eq(user.email, input.email), isNull(user.deletedAt)), }); if (!userData) { throw new TRPCError({ code: "BAD_REQUEST", message: "Email is not found!", }); } if (!(await verifyPassword(userData.password, input.password))) { throw new TRPCError({ code: "BAD_REQUEST", message: "Invalid password!", }); } // set user token const token = await createToken({ id: userData.id }); ctx.res.cookie("auth-token", token, { httpOnly: true }); return { ...userData, password: undefined }; }), logout: procedure.mutation(({ ctx }) => { ctx.res.cookie("auth-token", null, { httpOnly: true, expires: new Date(0), }); return true; }), }); export default authRouter;