diff --git a/apps/backend/src/modules/index.ts b/apps/backend/src/modules/index.ts index ce1e523..f9eb6c2 100644 --- a/apps/backend/src/modules/index.ts +++ b/apps/backend/src/modules/index.ts @@ -3,11 +3,13 @@ import authHandler from "@repo/backend/middlewares/auth"; import authRouter from "@repo/backend/modules/auth/auth.route"; import chatRouter from "@repo/backend/modules/chat/chat.route"; import friendsRouter from "@repo/backend/modules/friends/friends.route"; +import userRouter from "@repo/backend/modules/user/user.route"; const rootRouter = Router(); rootRouter.use("/auth", authRouter); rootRouter.use("/chat", authHandler, chatRouter); rootRouter.use("/friends", authHandler, friendsRouter); +rootRouter.use("/user", authHandler, userRouter); export default rootRouter; diff --git a/apps/backend/src/modules/user/user.controller.ts b/apps/backend/src/modules/user/user.controller.ts new file mode 100644 index 0000000..e19da6d --- /dev/null +++ b/apps/backend/src/modules/user/user.controller.ts @@ -0,0 +1,20 @@ +import { Response } from "express"; +import { StatusCodes } from "http-status-codes"; +import { AuthenticatedRequest } from "@repo/backend/middlewares/auth"; +import { getUser, updateUser } from "./user.service"; + +const getUserController = async (req: AuthenticatedRequest, res: Response) => { + const user = await getUser(req.userId); + res.status(StatusCodes.OK).json({ user }); +}; + +const updateUserController = async ( + req: AuthenticatedRequest, + res: Response, +) => { + const { updatedUser } = req.body; + const user = await updateUser(req.userId, updatedUser); + res.status(StatusCodes.OK).json({ user }); +}; + +export { getUserController, updateUserController }; diff --git a/apps/backend/src/modules/user/user.route.ts b/apps/backend/src/modules/user/user.route.ts new file mode 100644 index 0000000..cdc05ec --- /dev/null +++ b/apps/backend/src/modules/user/user.route.ts @@ -0,0 +1,17 @@ +import { Router, Response } from "express"; +import { AuthenticatedRequest } from "@repo/backend/middlewares/auth"; +import { getUserController, updateUserController } from "./user.controller"; +import validateHandler from "@repo/backend/middlewares/validation"; +import { updateUserSchema } from "./user.schema"; + +const userRouter = Router(); + +userRouter.get("/", (req, res) => { + getUserController(req as AuthenticatedRequest, res as Response); +}); + +userRouter.patch("/", validateHandler(updateUserSchema), (req, res) => { + updateUserController(req as AuthenticatedRequest, res as Response); +}); + +export default userRouter; diff --git a/apps/backend/src/modules/user/user.schema.ts b/apps/backend/src/modules/user/user.schema.ts new file mode 100644 index 0000000..029b4c5 --- /dev/null +++ b/apps/backend/src/modules/user/user.schema.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; +import { createUpdateSchema } from "drizzle-zod"; +import { users } from "@repo/database/schema"; + +const updateUserSchema = z.object({ + body: z.object({ + updatedUser: createUpdateSchema(users).partial(), + }), +}); + +export { updateUserSchema }; diff --git a/apps/backend/src/modules/user/user.service.ts b/apps/backend/src/modules/user/user.service.ts new file mode 100644 index 0000000..f7ed919 --- /dev/null +++ b/apps/backend/src/modules/user/user.service.ts @@ -0,0 +1,30 @@ +import { and, eq } from "drizzle-orm"; +import { db } from "@repo/database"; +import { User, users } from "@repo/database/schema"; +import { BadRequestError, NotFoundError } from "@repo/backend/utils/errors"; + +const getUser = async (userId: number) => { + const me = await db.query.users.findFirst({ + where: and(eq(users.id, userId)), + }); + if (!me) throw new BadRequestError("User not found."); + + return me; +}; + +const updateUser = async (userId: number, updatedUser: Partial) => { + const user = await db + .update(users) + .set({ + updatedAt: new Date(), + ...updatedUser, + }) + .where(eq(users.id, userId)) + .returning(); + + if (!user.length) throw new NotFoundError("User not found."); + + return user[0]; +}; + +export { getUser, updateUser };