From dda9834a4e7b991a847b6be29030c888670fb5b0 Mon Sep 17 00:00:00 2001 From: Andus <30293380+AndusDEV@users.noreply.github.com> Date: Sun, 4 Jan 2026 03:45:20 +0100 Subject: [PATCH] Add user profile page (#302) * Add user page and API endpoint * add: /user/[id] page * add: /api/v1/user/[id] API endpoint * Change loading message in user profile page * Fix build errors, prettier code --- server/i18n/locales/en_us.json | 8 +++ server/pages/user/[id]/index.vue | 75 +++++++++++++++++++++ server/server/api/v1/user/[id]/index.get.ts | 29 ++++++++ 3 files changed, 112 insertions(+) create mode 100644 server/pages/user/[id]/index.vue create mode 100644 server/server/api/v1/user/[id]/index.get.ts diff --git a/server/i18n/locales/en_us.json b/server/i18n/locales/en_us.json index d167034d..6509eb60 100644 --- a/server/i18n/locales/en_us.json +++ b/server/i18n/locales/en_us.json @@ -629,6 +629,14 @@ "type": "Type", "upload": "Upload", "uploadFile": "Upload file", + "user": { + "unknown": "Unknown user", + "editProfile": "Edit profile", + "recent": "Recent activity (TODO)", + "recentSub": "Recent activity by this user", + "notFound": "User not found", + "noActivity": "No recent activity" + }, "userHeader": { "closeSidebar": "Close sidebar", "links": { diff --git a/server/pages/user/[id]/index.vue b/server/pages/user/[id]/index.vue new file mode 100644 index 00000000..74855a10 --- /dev/null +++ b/server/pages/user/[id]/index.vue @@ -0,0 +1,75 @@ + + + + + + + {{ profile?.displayName ?? profile?.username ?? $t("user.unknown") }} + + + @{{ profile?.username }} + + + {{ $t("user.editProfile") }} + + + + + + + + {{ $t("user.recent") }} + + {{ $t("user.recentSub") }} + + + + {{ $t("common.srLoading") }} + + + {{ $t("user.notFound") }} + + + {{ $t("user.noActivity") }} + + + + + + + diff --git a/server/server/api/v1/user/[id]/index.get.ts b/server/server/api/v1/user/[id]/index.get.ts new file mode 100644 index 00000000..20d30c4b --- /dev/null +++ b/server/server/api/v1/user/[id]/index.get.ts @@ -0,0 +1,29 @@ +import aclManager from "~/server/internal/acls"; +import prisma from "~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const requestingUser = await aclManager.getUserACL(h3, ["read"]); + if (!requestingUser) throw createError({ statusCode: 403 }); + + const userId = getRouterParam(h3, "id"); + if (!userId) + throw createError({ + statusCode: 400, + statusMessage: "No userId in route.", + }); + + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { + id: true, + username: true, + displayName: true, + profilePictureObjectId: true, + }, + }); + + if (!user) + throw createError({ statusCode: 404, statusMessage: "User not found." }); + + return user; +});
{{ $t("user.recentSub") }}