From 80c9e5e0065f2a0e95f00a163badb89841a8c20a Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:34:07 -0400 Subject: [PATCH 1/8] test file --- test.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.md diff --git a/test.md b/test.md new file mode 100644 index 0000000..e69de29 From 0dd3263459a9799def28436cd8580381f0a38744 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:15 -0400 Subject: [PATCH 2/8] remove leftover scratch file --- test.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.md diff --git a/test.md b/test.md deleted file mode 100644 index e69de29..0000000 From ca87084bd8aa1b8b9d83d7b3b410831c6fbb5fca Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:22 -0400 Subject: [PATCH 3/8] typo in comment and trailing space in 401 message --- middleware/auth.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/middleware/auth.js b/middleware/auth.js index 478022a..2300874 100644 --- a/middleware/auth.js +++ b/middleware/auth.js @@ -14,6 +14,8 @@ const ROLE_RANK = { member: 1, treasurer: 2, admin: 3 }; // requireRole("treasurer") RETURNS a middleware that allows treasurer and above. // The inner function is what Express actually runs per request; it "remebers" // minRole via closure +// REVIEW: typo "remebers" -> "remembers"; also the 401 message below has a +// trailing space ("Not authenticated ") that doesn't match the one on line 8. export const requireRole = (minRole) => { return (req, res, next) => { From 30069fc867a03b9e6d628f6c39214ec8c5548228 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:33 -0400 Subject: [PATCH 4/8] duesTier stored as string 'null' instead of actual null --- db/users-db.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/users-db.js b/db/users-db.js index fef4339..380fd91 100644 --- a/db/users-db.js +++ b/db/users-db.js @@ -43,6 +43,9 @@ function UsersCollection({ collectionName = "users" } = {}) { phoneNumber, duesStatus: DUES_STATUS.NOT_SUBMITTED, groupId: null, + // REVIEW: this is the string "null", not the null value used right above + // for groupId — was that intentional? A strict `=== null` check on + // duesTier elsewhere in the codebase would silently fail against this. duesTier: "null", duesAmount: null, discount: null, From e645a820481feb02d08587227e061b73e2323fc7 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:41 -0400 Subject: [PATCH 5/8] DB name still says group-sync, not ClubSync --- db/config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/config.js b/db/config.js index c8688d0..3f7cf08 100644 --- a/db/config.js +++ b/db/config.js @@ -1,6 +1,9 @@ import { MongoClient } from "mongodb"; import dotenv from "dotenv"; +// REVIEW: leftover from before the project was renamed to ClubSync? Worth +// updating to match (or a comment noting it's intentional to avoid a DB +// migration), since the name shows up in package.json too. export const DB_NAME = "group-sync"; dotenv.config(); const DEFAULT_URI = process.env.MONGO_URI; From b92f9e64de43117f1fe3dcfe5a52b4ad3dda7392 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:49 -0400 Subject: [PATCH 6/8] AI disclosure signature placed before section instead of after --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0eaf9f3..1c1f51c 100644 --- a/README.md +++ b/README.md @@ -271,6 +271,10 @@ Things we scoped out for this version but would build next: ## AI Use Disclosure + + -Julian I used an AI assistant (Claude Code, by Anthropic) during development, primarily as a **mentor/tutor rather than a code generator**. From b80b158678a35862845554ba759863cfe7c4a817 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:43:58 -0400 Subject: [PATCH 7/8] folder name 'desgin' is a typo for 'design' --- desgin/DESIGN.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/desgin/DESIGN.md b/desgin/DESIGN.md index a4d5e34..678c24b 100644 --- a/desgin/DESIGN.md +++ b/desgin/DESIGN.md @@ -1,3 +1,5 @@ + + # ClubSync — Design Document **Team:** Sean Behan, Julian Leonhardt From cbbe495d10c907ea9a1c33f5ef0713cd1b26d156 Mon Sep 17 00:00:00 2001 From: Khush Patel Date: Mon, 17 Aug 2026 19:44:11 -0400 Subject: [PATCH 8/8] toast message missing fallback for failed leave-club response --- .../pages/member/member-dashboard/group-widget/GroupWidget.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/pages/member/member-dashboard/group-widget/GroupWidget.jsx b/frontend/src/pages/member/member-dashboard/group-widget/GroupWidget.jsx index 6e3f42d..e8d5417 100644 --- a/frontend/src/pages/member/member-dashboard/group-widget/GroupWidget.jsx +++ b/frontend/src/pages/member/member-dashboard/group-widget/GroupWidget.jsx @@ -54,6 +54,8 @@ export default function GroupWidget() { if (!res.ok) { const data = await res.json().catch(() => ({})); setError(data.message ?? "Could not leave the club."); + // REVIEW: unlike the line above, this has no fallback — if res.json() + // fails and data is {}, this shows a "danger" toast with undefined text. showToast(data.message, "danger"); return; }