From 9cb405be22a5d163684f41200191f8e8d000577d Mon Sep 17 00:00:00 2001
From: Pascal Syma
Date: Thu, 14 Aug 2025 20:33:39 +0200
Subject: [PATCH] Add writing reviews for answers
---
TODO.md | 2 +-
app/components/admin/Answer.vue | 89 +++++++++++++++++--
app/components/admin/Team.vue | 2 +-
.../hunt/[huntSlug]/[questSlug]/admin.vue | 1 +
.../admin/answer/[answerId]/review.post.ts | 3 +-
server/api/admin/hunt/[huntId]/teams.get.ts | 31 ++++++-
server/api/admin/quest/[questId]/index.get.ts | 1 +
7 files changed, 116 insertions(+), 13 deletions(-)
diff --git a/TODO.md b/TODO.md
index 27d23e2..98fd626 100644
--- a/TODO.md
+++ b/TODO.md
@@ -5,7 +5,7 @@
- [ ] Change display name
- **Hunt Admin**
- [x] Start/Stop
- - [ ] Add Reviews/Score
+ - [x] Add Reviews/Score
- [x] View best Answers and Pictures
- [x] All/Best Images gallery
- [x] Manage teams (remove, kick, add)
diff --git a/app/components/admin/Answer.vue b/app/components/admin/Answer.vue
index d4f63b1..756d4a8 100644
--- a/app/components/admin/Answer.vue
+++ b/app/components/admin/Answer.vue
@@ -1,5 +1,7 @@
@@ -113,29 +153,64 @@ const style = computed<[string, string]>(() => {
class="flex flex-col justify-between gap-4 md:flex-row md:items-center"
>
-
+
- Save
+
+ Reviewed by {{ answer.review?.reviewer?.name }} at
+ {{ d(answer.review.updatedAt, fullDate) }}
+
+ {{ t(submitError) }}
+
+ Reset all values
+ Refresh
+ Save
+
diff --git a/app/components/admin/Team.vue b/app/components/admin/Team.vue
index 654769c..803a869 100644
--- a/app/components/admin/Team.vue
+++ b/app/components/admin/Team.vue
@@ -147,7 +147,7 @@ async function deleteTeam() {
diff --git a/app/pages/hunt/[huntSlug]/[questSlug]/admin.vue b/app/pages/hunt/[huntSlug]/[questSlug]/admin.vue
index 753b8f0..5be5dab 100644
--- a/app/pages/hunt/[huntSlug]/[questSlug]/admin.vue
+++ b/app/pages/hunt/[huntSlug]/[questSlug]/admin.vue
@@ -63,6 +63,7 @@ titleStore.title = data.value?.title;
:key="answer.id"
:answer="answer"
:quest="data"
+ @update="refresh"
/>
diff --git a/server/api/admin/answer/[answerId]/review.post.ts b/server/api/admin/answer/[answerId]/review.post.ts
index eb0f1ab..fdc4460 100644
--- a/server/api/admin/answer/[answerId]/review.post.ts
+++ b/server/api/admin/answer/[answerId]/review.post.ts
@@ -66,7 +66,8 @@ export default defineEventHandler(async (event) => {
},
create: {
...data,
- reviewerId: userId
+ reviewerId: userId,
+ answerId
}
});
diff --git a/server/api/admin/hunt/[huntId]/teams.get.ts b/server/api/admin/hunt/[huntId]/teams.get.ts
index b491a76..ffc99c6 100644
--- a/server/api/admin/hunt/[huntId]/teams.get.ts
+++ b/server/api/admin/hunt/[huntId]/teams.get.ts
@@ -18,7 +18,7 @@ export default defineEventHandler(async (event) => {
})
);
- const hunt = await prisma.hunt.findUnique({
+ const _hunt = await prisma.hunt.findUnique({
where: {
id: huntId,
OR: [
@@ -58,6 +58,22 @@ export default defineEventHandler(async (event) => {
answers: true
}
},
+ answers: {
+ select: {
+ review: {
+ select: {
+ score: true
+ }
+ }
+ },
+ where: {
+ review: {
+ score: {
+ gt: 0
+ }
+ }
+ }
+ },
members: {
select: {
createdAt: true,
@@ -75,9 +91,18 @@ export default defineEventHandler(async (event) => {
}
});
- if (!hunt) {
+ if (!_hunt) {
throw createError({ status: 404, statusText: 'Not found!' });
}
+ const { teams, ...hunt } = _hunt;
- return hunt;
+ return {
+ teams: teams
+ .map(({ answers, ...t }) => ({
+ ...t,
+ score: answers.reduce((sum, a) => sum + (a.review?.score || 0), 0)
+ }))
+ .toSorted((a, b) => b.score - a.score),
+ ...hunt
+ };
});
diff --git a/server/api/admin/quest/[questId]/index.get.ts b/server/api/admin/quest/[questId]/index.get.ts
index f0b66a6..200bf62 100644
--- a/server/api/admin/quest/[questId]/index.get.ts
+++ b/server/api/admin/quest/[questId]/index.get.ts
@@ -66,6 +66,7 @@ export default defineEventHandler(async (event) => {
internalNote: true,
rankingValue: true,
showcase: true,
+ updatedAt: true,
reviewer: {
select: {
name: true,