From bdc8dab1ad7c29d44073f89005fe40a621b24f5a Mon Sep 17 00:00:00 2001 From: Nathaniel Tampus Date: Wed, 5 Apr 2023 22:29:54 +0800 Subject: [PATCH] api for fetching user profile --- client/src/lib/user.ts | 18 ++++++++++++ server/src/controllers/users.controller.ts | 33 ++++++++++++++++++++++ server/src/routes/index.ts | 2 ++ server/src/routes/users.route.ts | 8 ++++++ 4 files changed, 61 insertions(+) create mode 100644 client/src/lib/user.ts create mode 100644 server/src/controllers/users.controller.ts create mode 100644 server/src/routes/users.route.ts diff --git a/client/src/lib/user.ts b/client/src/lib/user.ts new file mode 100644 index 0000000..17487b8 --- /dev/null +++ b/client/src/lib/user.ts @@ -0,0 +1,18 @@ +import { API_URL } from "@/config"; +import type { User, Game } from "@chessu/types"; + +export const getProfileData = async (name: string) => { + try { + // TODO: handle caching more efficiently? + const res = await fetch(`${API_URL}/v1/users/${name}`, { + next: { revalidate: 10 } + }); + + if (res && res.status === 200) { + const data: User & { recentGames: Game[] } = await res.json(); + return data; + } + } catch (err) { + console.error(err); + } +}; diff --git a/server/src/controllers/users.controller.ts b/server/src/controllers/users.controller.ts new file mode 100644 index 0000000..b400be8 --- /dev/null +++ b/server/src/controllers/users.controller.ts @@ -0,0 +1,33 @@ +import type { Request, Response } from "express"; +import xss from "xss"; + +import GameModel from "../db/models/game.model.js"; +import UserModel from "../db/models/user.model.js"; + +export const getUserProfile = async (req: Request, res: Response) => { + try { + const name = xss(req.params.name); + + const users = await UserModel.findByNameEmail({ name, email: name }); + + if (!users || !users.length) { + res.status(404).end(); + return; + } + + const recentGames = await GameModel.findByUserId(users[0].id as number); + + const publicUser = { + id: users[0].id, + name: users[0].name, + wins: users[0].wins, + losses: users[0].losses, + draws: users[0].draws + }; + + res.status(200).json({ ...publicUser, recentGames }); + } catch (err: unknown) { + console.log(err); + res.status(500).end(); + } +}; diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts index 51ebefc..7710b1b 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/index.ts @@ -1,10 +1,12 @@ import { Router } from "express"; import games from "./games.route.js"; import auth from "./auth.route.js"; +import users from "./users.route.js"; const router = Router(); router.use("/games", games); router.use("/auth", auth); +router.use("/users", users); export default router; diff --git a/server/src/routes/users.route.ts b/server/src/routes/users.route.ts new file mode 100644 index 0000000..520e1b0 --- /dev/null +++ b/server/src/routes/users.route.ts @@ -0,0 +1,8 @@ +import { Router } from "express"; +import * as controller from "../controllers/users.controller.js"; + +const router = Router(); + +router.route("/:name").get(controller.getUserProfile); + +export default router;