diff --git a/README.md b/README.md
index 84983e5..60c5c18 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
+
+
+
+
# scraps
nom nom nom
diff --git a/backend/README.md b/backend/README.md
index f88845b..f6c8fa5 100644
--- a/backend/README.md
+++ b/backend/README.md
@@ -1 +1,3 @@
-# scraps backend
\ No newline at end of file
+# scraps backend
+
+just don't
diff --git a/backend/src/routes/admin.ts b/backend/src/routes/admin.ts
index 5dcba20..06ab808 100644
--- a/backend/src/routes/admin.ts
+++ b/backend/src/routes/admin.ts
@@ -444,6 +444,11 @@ admin.post('/reviews/:id', async ({ params, body, headers }) => {
if (!project[0]) return { error: 'Project not found' }
+ // Validate hours override doesn't exceed project hours
+ if (hoursOverride !== undefined && hoursOverride > (project[0].hours ?? 0)) {
+ return { error: `Hours override (${hoursOverride}) cannot exceed project hours (${project[0].hours})` }
+ }
+
// Reject if project is deleted or not waiting for review
if (project[0].deleted) {
return { error: 'Cannot review a deleted project' }
diff --git a/frontend/README.md b/frontend/README.md
new file mode 100644
index 0000000..9fc3048
--- /dev/null
+++ b/frontend/README.md
@@ -0,0 +1,3 @@
+# scraps frontend
+
+at least it's not rails
diff --git a/frontend/src/routes/admin/reviews/[id]/+page.svelte b/frontend/src/routes/admin/reviews/[id]/+page.svelte
index 2af7b85..e8dd972 100644
--- a/frontend/src/routes/admin/reviews/[id]/+page.svelte
+++ b/frontend/src/routes/admin/reviews/[id]/+page.svelte
@@ -72,6 +72,12 @@
let hoursOverride = $state(undefined)
let tierOverride = $state(undefined)
+ let hoursOverrideError = $derived(
+ hoursOverride !== undefined && project && hoursOverride > project.hours
+ ? `Hours override cannot exceed project hours (${project.hours}h)`
+ : null
+ )
+
let confirmAction = $state<'approved' | 'denied' | 'permanently_rejected' | null>(null)
let projectId = $derived(page.params.id)
@@ -421,10 +427,15 @@
+ {#if hoursOverrideError}
+ {hoursOverrideError}
+ {/if}
@@ -465,24 +476,24 @@