Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions apps/backend/src/modules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
20 changes: 20 additions & 0 deletions apps/backend/src/modules/user/user.controller.ts
Original file line number Diff line number Diff line change
@@ -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 };
17 changes: 17 additions & 0 deletions apps/backend/src/modules/user/user.route.ts
Original file line number Diff line number Diff line change
@@ -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;
11 changes: 11 additions & 0 deletions apps/backend/src/modules/user/user.schema.ts
Original file line number Diff line number Diff line change
@@ -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 };
30 changes: 30 additions & 0 deletions apps/backend/src/modules/user/user.service.ts
Original file line number Diff line number Diff line change
@@ -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<User>) => {
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 };
Loading