From 40340653b68e0e779467f98518618d672b010438 Mon Sep 17 00:00:00 2001 From: alannasantoso Date: Tue, 20 Oct 2026 14:19:29 +1300 Subject: [PATCH 1/2] style: restore Tadiwa navbar for team handoff --- client/src/components/Navbar.tsx | 222 +--------------------------- client/src/components/NewNavbar.tsx | 183 +++++++++++++++++++++++ client/src/components/UMSALogo.png | Bin 0 -> 4965 bytes 3 files changed, 185 insertions(+), 220 deletions(-) create mode 100644 client/src/components/NewNavbar.tsx create mode 100644 client/src/components/UMSALogo.png diff --git a/client/src/components/Navbar.tsx b/client/src/components/Navbar.tsx index 56b25fe..2794177 100644 --- a/client/src/components/Navbar.tsx +++ b/client/src/components/Navbar.tsx @@ -1,228 +1,10 @@ -import { MEMBERSHIP_FORM_URL } from "../lib/siteLinks"; +import NewNavbar from "./NewNavbar"; import Marquee from "./Marquee"; -import { useEffect, useState } from "react"; -import { Link, NavLink, useLocation } from "react-router-dom"; -import { AnimatePresence, motion } from "motion/react"; -import { FiChevronDown, FiMenu, FiX } from "react-icons/fi"; -import logo from "../assets/brand/umsa-logo.png"; - -const ABOUT_MENU = [ - { to: "/about", label: "About Us" }, - { to: "/contact", label: "Contact" }, - { to: "/team", label: "Our Team" }, -]; - -const LINKS = [ - { to: "/", label: "Home", end: true }, - { to: "/events", label: "Events" }, - { to: "/sponsors", label: "Sponsors" }, - { to: "/gallery", label: "Photos" }, -]; - -const LINK_BASE = - "font-heading text-[13px] tracking-[0.12em] uppercase transition-colors"; - -function AboutMenu() { - const [open, setOpen] = useState(false); - const { pathname } = useLocation(); - const active = ABOUT_MENU.some((item) => pathname === item.to); - - useEffect(() => { - if (!open) return; - const onKey = (e: KeyboardEvent) => e.key === "Escape" && setOpen(false); - document.addEventListener("keydown", onKey); - return () => document.removeEventListener("keydown", onKey); - }, [open]); - - return ( -
setOpen(true)} - onMouseLeave={() => setOpen(false)} - onFocus={() => setOpen(true)} - onBlur={(e) => { - if (!e.currentTarget.contains(e.relatedTarget as Node)) setOpen(false); - }} - > - setOpen(false)} - aria-expanded={open} - aria-haspopup="menu" - className={`relative flex items-center gap-1 ${LINK_BASE} ${ - active - ? "text-accent2-primary" - : "text-accent1-primary hover:text-accent2-primary" - }`} - > - About - - {active && ( - - )} - - - - {open && ( - - {ABOUT_MENU.map((item) => ( - setOpen(false)} - className={({ isActive }) => - `block px-5 py-2.5 ${LINK_BASE} ${ - isActive - ? "text-accent2-primary" - : "text-accent1-primary hover:text-accent2-primary" - }` - } - > - {item.label} - - ))} - - )} - -
- ); -} export default function Navbar() { - const [open, setOpen] = useState(false); - - const linkClass = ({ isActive }: { isActive: boolean }) => - `relative ${LINK_BASE} ${ - isActive - ? "text-accent2-primary" - : "text-accent1-primary hover:text-accent2-primary" - }`; - return (
- - + ); diff --git a/client/src/components/NewNavbar.tsx b/client/src/components/NewNavbar.tsx new file mode 100644 index 0000000..c574103 --- /dev/null +++ b/client/src/components/NewNavbar.tsx @@ -0,0 +1,183 @@ +import { MEMBERSHIP_FORM_URL } from "../lib/siteLinks"; +import { NavLink } from "react-router-dom"; +import { useState } from "react"; +import UMSALogo from "./UMSALogo.png"; + +export default function NewNavbar() { + const [isOpen, setIsOpen] = useState(false); + const [openMenu, setOpenMenu] = useState<"about" | "events" | null>(null); + const linkClass = + "text-[16px] whitespace-nowrap font-normal uppercase [font-family:'Sekuya'] text-[#2727DC] transition-colors hover:text-blue-700"; + + const dropdownItem = + "px-4 py-2 text-[14px] uppercase [font-family:'Sekuya'] text-[#2727DC] hover:bg-[#e6e6fa]"; + + const loginClass = + "rounded-full bg-[#FF4B55] px-5 py-[3px] text-[14px] uppercase text-white [font-family:'Sekuya'] " + + "shadow-[0_3px_0_#B3202B] transition-transform hover:translate-y-[1px] hover:shadow-[0_2px_0_#B3202B]"; + + return ( + + ); +} diff --git a/client/src/components/UMSALogo.png b/client/src/components/UMSALogo.png new file mode 100644 index 0000000000000000000000000000000000000000..65156e6fc0d5888cc926730c6cd0fd01927f5025 GIT binary patch literal 4965 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 literal 0 HcmV?d00001 From 20294c71d65b6c808dd0c327f16bf1779a5056d2 Mon Sep 17 00:00:00 2001 From: alannasantoso Date: Tue, 20 Oct 2026 21:13:56 +1300 Subject: [PATCH 2/2] chore: cleaning old files --- README.md | 54 +++-- client/README.md | 73 ------- client/src/lazyRoutes.ts | 6 - client/src/main.tsx | 16 -- client/src/pages/Project-Team.tsx | 42 ---- client/src/pages/project-team/Alanna.tsx | 109 ---------- client/src/pages/project-team/Alex.tsx | 126 ----------- client/src/pages/project-team/Minahil.tsx | 35 --- client/src/pages/project-team/Pruna.tsx | 86 -------- client/src/pages/project-team/Tadiwa.tsx | 93 -------- client/src/pages/project-team/Terrence.tsx | 108 --------- docs/01-setup.md | 19 -- docs/02-architecture.md | 124 ----------- docs/03-backend-reference.md | 229 -------------------- docs/04-auth.md | 145 ------------- docs/05-api-reference.md | 31 --- docs/06-client-contract.md | 167 -------------- docs/07-adding-a-feature.md | 143 ------------ docs/08-gotchas.md | 77 ------- docs/README.md | 53 ----- docs/blueprints/00-image-uploads.md | 206 ------------------ docs/blueprints/01-events.md | 155 ------------- docs/blueprints/02-team-members.md | 141 ------------ docs/blueprints/03-gallery.md | 129 ----------- docs/blueprints/04-theme-and-fonts.md | 241 --------------------- docs/blueprints/05-logos-and-branding.md | 148 ------------- docs/blueprints/06-admin-accounts.md | 199 ----------------- docs/blueprints/README.md | 79 ------- docs/contributors.md | 15 -- dpr-ian.jpg | Bin 84461 -> 0 bytes jay-park.jpg | Bin 11109 -> 0 bytes karina.jpg | Bin 168143 -> 0 bytes server/package.json | 3 +- server/scripts/seed-admin.ts | 33 --- 34 files changed, 34 insertions(+), 3051 deletions(-) delete mode 100644 client/README.md delete mode 100644 client/src/pages/Project-Team.tsx delete mode 100644 client/src/pages/project-team/Alanna.tsx delete mode 100644 client/src/pages/project-team/Alex.tsx delete mode 100644 client/src/pages/project-team/Minahil.tsx delete mode 100644 client/src/pages/project-team/Pruna.tsx delete mode 100644 client/src/pages/project-team/Tadiwa.tsx delete mode 100644 client/src/pages/project-team/Terrence.tsx delete mode 100644 docs/01-setup.md delete mode 100644 docs/02-architecture.md delete mode 100644 docs/03-backend-reference.md delete mode 100644 docs/04-auth.md delete mode 100644 docs/05-api-reference.md delete mode 100644 docs/06-client-contract.md delete mode 100644 docs/07-adding-a-feature.md delete mode 100644 docs/08-gotchas.md delete mode 100644 docs/README.md delete mode 100644 docs/blueprints/00-image-uploads.md delete mode 100644 docs/blueprints/01-events.md delete mode 100644 docs/blueprints/02-team-members.md delete mode 100644 docs/blueprints/03-gallery.md delete mode 100644 docs/blueprints/04-theme-and-fonts.md delete mode 100644 docs/blueprints/05-logos-and-branding.md delete mode 100644 docs/blueprints/06-admin-accounts.md delete mode 100644 docs/blueprints/README.md delete mode 100644 docs/contributors.md delete mode 100644 dpr-ian.jpg delete mode 100644 jay-park.jpg delete mode 100644 karina.jpg delete mode 100644 server/scripts/seed-admin.ts diff --git a/README.md b/README.md index feac3e2..49b5014 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,44 @@ -# UMSA website +# selamat datang! :malaysia: -React, TypeScript, Express and MongoDB. +this is the repo for wdcc's project umsa 2026 !! -## Setup +## a bit about the project -Use Node 22 and pnpm. Copy `server/.env.example` to `server/.env` and fill in the values. +this is a full-stack react, node, express & mongodb, written in typescript with a vite front end & tailwindcss for ui styling :) -```sh -pnpm install -pnpm dev -``` +## getting started -Vite prints the frontend URL. The local API runs on port 5051. +### prerequisites -```sh -pnpm build -pnpm lint -``` +- install git [here](https://git-scm.com/downloads) +- install node [here](https://nodejs.org/en/download) +### running the project -## Content management +- git clone +- cd umsa +- npm install -g pnpm +- pnpm install +- pnpm dev -Open `/admin` directly to sign in and edit homepage text, team members, events, -sponsors, gallery photos and FAQs. Image uploads use Cloudinary. +### other scripts -Contact sends email through Resend to `umsa@projects.wdcc.co.nz`. -Set `RESEND_API_KEY` and `CONTACT_FROM_EMAIL` using a verified sender. -Membership is managed through the linked Google Form. +to lint: pnpm lint +to build: pnpm build -See [setup](docs/01-setup.md), [API reference](docs/05-api-reference.md) -and [contributors](docs/contributors.md). +## team members + +| name | role | fuel | quote | +| ------------------------ | --------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| hannah santiago | project manager | | | +| alanna santoso | tech lead | jasmine milk tea 70 sugar less ice | _"hi!"_ | +| koutaro yumimi | tech overlord | ethiopian natural | _"studying is doubting your own potential"_ | +| matthew ren | project manager | | | +| nicholars garcia-scholtz | tech exec | | | +| amy yan | designer | | _"meow"_ | +| andrew qiu | designer | charlies tea osmanthus oolong 30 sugar no ice | _"i am just a designer~"_ | +| terrence wu | developer | oolong milk tea 30 sugar little ice | _"hardstuck bronze in league for 6 years (BUT IM GETTING OUT THIS YEAR IM BRONZE 3 44LP NOW)"_ | +| alex lee | developer | pink monster | "DAH" -pinkpanteress | +| eric zheng | developer | dirty matcha latte | "disaster-" | +| jacky chen | developer | purple rice yoghurt | _"i make a lot of typos"_ | +| pruna lee | developer | coconut redbull | _"i love food"_ | diff --git a/client/README.md b/client/README.md deleted file mode 100644 index db579d2..0000000 --- a/client/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default defineConfig([ - globalIgnores(["dist"]), - { - files: ["**/*.{ts,tsx}"], - extends: [ - // Other configs... - - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, - - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ["./tsconfig.node.json", "./tsconfig.app.json"], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]); -``` - -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from "eslint-plugin-react-x"; -import reactDom from "eslint-plugin-react-dom"; - -export default defineConfig([ - globalIgnores(["dist"]), - { - files: ["**/*.{ts,tsx}"], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs["recommended-typescript"], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ["./tsconfig.node.json", "./tsconfig.app.json"], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]); -``` diff --git a/client/src/lazyRoutes.ts b/client/src/lazyRoutes.ts index 920ebcc..1ae63e7 100644 --- a/client/src/lazyRoutes.ts +++ b/client/src/lazyRoutes.ts @@ -1,11 +1,5 @@ import { lazy } from "react"; -export const Pruna = lazy(() => import("./pages/project-team/Pruna")); -export const Alanna = lazy(() => import("./pages/project-team/Alanna")); -export const Tadiwa = lazy(() => import("./pages/project-team/Tadiwa")); -export const Terrence = lazy(() => import("./pages/project-team/Terrence")); -export const Alex = lazy(() => import("./pages/project-team/Alex")); - export const AdminLayout = lazy(() => import("./layouts/AdminLayout")); export const AdminLogin = lazy(() => import("./pages/admin/Login")); export const HomeContentEditor = lazy(() => import("./pages/admin/HomeContentEditor")); diff --git a/client/src/main.tsx b/client/src/main.tsx index 144fca3..6c7f1fd 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -13,7 +13,6 @@ import "./index.css"; { /* page imports */ } -import ProjectTeam from "./pages/Project-Team"; import Events from "./pages/Events"; import SignUp from "./pages/SignUp"; import Gallery from "./pages/Gallery"; @@ -24,23 +23,15 @@ import FAQ from "./pages/Frequent-Asked-Question"; import About from "./pages/About"; import NotFound from "./pages/NotFound"; -{ - /* project team imports */ -} import { AdminLayout, AdminLogin, - Alanna, - Alex, EventsEditor, FaqEditor, GalleryEditor, HomeContentEditor, - Pruna, SponsorsEditor, - Tadiwa, TeamEditor, - Terrence, } from "./lazyRoutes"; const router = createBrowserRouter([ @@ -51,12 +42,6 @@ const router = createBrowserRouter([ { index: true, element: }, { path: "events", element: }, { path: "team", element: }, - { path: "project-team", element: }, - { path: "alanna", element: }, - { path: "alex", element: }, - { path: "pruna", element: }, - { path: "tadiwa", element: }, - { path: "terrence", element: }, { path: "sign-up", element: }, { path: "gallery", element: }, { path: "faq", element: }, @@ -136,7 +121,6 @@ const fontsReady = document.fonts : Promise.resolve(); fontsReady - // one frame so React has laid out and the images above the fold exist .then( () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))), diff --git a/client/src/pages/Project-Team.tsx b/client/src/pages/Project-Team.tsx deleted file mode 100644 index 7f7a063..0000000 --- a/client/src/pages/Project-Team.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { Link } from "react-router-dom"; -export default function ProjectTeam() { - return ( -
-

Project Team

-

This project was created by:

-
    -
  • - - Alanna Santoso - -
  • -
  • - - Pruna Lee - -
  • -
- -

- welcome! today, you're going to make your own intro page - click on - my name to have a look. you can use this page as a template to make your - own one, and learn some frontend react along the way :) -

- -

- {/* make a link to your page here! */} - - Alanna Santoso - -

- - Alex Lee - -

- - Terrence Wu - -

-
- ); -} diff --git a/client/src/pages/project-team/Alanna.tsx b/client/src/pages/project-team/Alanna.tsx deleted file mode 100644 index 76dfae0..0000000 --- a/client/src/pages/project-team/Alanna.tsx +++ /dev/null @@ -1,109 +0,0 @@ -// at the top, we import all the libraries & components (parts) that we're going to use in the page -import { FaInstagram, FaGithub, FaLinkedin, FaFilm } from "react-icons/fa"; -import MemberStatsTable from "../../components/StatsTable"; -import AlannaPhoto from "../../assets/about-us/alanna.jpg"; -import { useEffect } from "react"; - -// now to create the page! we export it as a function so we can use it in the router (main.tsx) -export default function Alanna() { - // this is a react hook that lets us perform side effects - in this case, changing the title (the name you see in the browser tab) - useEffect(() => { - document.title = "Alanna | UMSA"; - }, []); - - // here's where we return the jsx content - this is what lets us write HTML in our javascript! - return ( - <> - {/* this is the pink background container */} -
- {/* this manages our page content */} -
- {/* header section */} -
-

- hi, my name is alanna :D -

-
- - {/* stats section */} -
- {/* we use an img component to display my photo! */} - - - {/* here's where components come in - we use a pre built stats component, - and just fill in the props (stats). check /components/StatsTable.tsx to see how it works! */} -
- -
-
- - {/* about paragraph section */} -
-

- hey everyone :) i'm super excited to be umsa's tech lead - for 2026!
a couple fun facts about me: i'm a huge - sitcom fan (how i met your mother!), movies, photography & murder - mysteries. i love compsci because it lets me get creative, see how - things work and meet super cool people :)) i'm always down - for a coffee/milk-tea/matcha run,, and love to yap about - everything from world history to your latest travels & hobby - findings. -

-
- - {/* social media section */} -
-

- find me online!~ -

-
- {/* the tags are for creating links */} - - - - - - - - - - - - -
-
-
-
- - ); -} diff --git a/client/src/pages/project-team/Alex.tsx b/client/src/pages/project-team/Alex.tsx deleted file mode 100644 index e65bfaf..0000000 --- a/client/src/pages/project-team/Alex.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { - FaInstagram, - FaGithub, - FaLinkedin, - FaFilm, - FaSpotify, -} from "react-icons/fa"; -import MemberStatsTable from "../../components/StatsTable"; -import bgImage from "../../assets/about-us/alexBackground.jpeg"; -import AlexImage from "../../assets/about-us/alex.jpeg"; -import { useEffect } from "react"; - -export default function Alex() { - useEffect(() => { - document.title = "Alex(#1 Developer) | UMSA"; - }, []); - - return ( - <> -
- {/* bg image */} -
- - {/* contents */} -
- {/* header */} -
-

- ALEXANDER THE GREAT -

-
- - {/* main */} -
- {/* beautiful photo of me */} - - - {/* stats */} -
- -
-
- - {/* about me */} - - - {/* social media section */} -
-

- ✨Socials✨ -

-
- {/* the tags are for creating links */} - - - - - - - - - - - - - - - -
-
-
-
- - ); -} diff --git a/client/src/pages/project-team/Minahil.tsx b/client/src/pages/project-team/Minahil.tsx deleted file mode 100644 index cc62709..0000000 --- a/client/src/pages/project-team/Minahil.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import MinahilPhoto from "../../assets/about-us/minahil.jpg"; -import MemberStatsTable from "../../components/StatsTable"; - -export default function Minahil() { - return ( - <> -
-

- HI! My name is Minahil ⸜(q˃ α΅• Λ‚ )⸝♑{" "} -

- -

hi!

- - -
-
- -
- - ); -} diff --git a/client/src/pages/project-team/Pruna.tsx b/client/src/pages/project-team/Pruna.tsx deleted file mode 100644 index 7775358..0000000 --- a/client/src/pages/project-team/Pruna.tsx +++ /dev/null @@ -1,86 +0,0 @@ -//import pic, react icons, react components later -import { useEffect } from "react"; -import PrunaPhoto from "../../assets/about-us/pruna.jpg"; -import MemberStatsTable from "../../components/StatsTable"; -import { FaInstagram, FaGithub, FaLinkedin } from "react-icons/fa"; - -export default function Pruna() { - useEffect(() => { - document.title = "Pruna Lee | UMSA"; - }, []); - - return ( - <> -
-
-
-

- hellooo! my name is pruna -

-
- -
- - -
- -
-
- -
-

- hi guyss i'm so so excited to be a developer for WDCC's - umsa project :p my fav hobbies are muay thai, music (drums, - guitar, bass) and motorbikes (i ride to campus when its not - raining :D) i'm looking forward to working with all you - guys!!!! -

-
- -
-

- here are my socials :D -

- -
-
-
- - ); -} diff --git a/client/src/pages/project-team/Tadiwa.tsx b/client/src/pages/project-team/Tadiwa.tsx deleted file mode 100644 index 0e04ccb..0000000 --- a/client/src/pages/project-team/Tadiwa.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import instapic from "../../assets/icons/ibsta.webp"; -import MemberStatsTable from "../../components/StatsTable"; -import linkedinpic from "../../assets/icons/linkedin.png"; -import github from "../../assets/icons/github.svg"; -import me from "../../assets/icons/pic.jpg"; -import pinkme from "../../assets/icons/pinkhair.png"; - -export default function Tadiwa() { - return ( - <> -

TADIWA'S ABOUT ME PAGE

- -
-

Hello

-

- {" "} - My name is Tadiwa. -

    -
  • I like Cats
  • -
  • Music
  • -
  • Gym
  • -
  • Food
  • -
  • - {" "} - My fave foods is shibby, sushi, minieggs, fries and greeksalad -
  • -
- I work at countdown (woolies) and I used to work at burgerfuel as a - shift manager{" "} -

-
- -
-
-
- -

This is me

-
-
- -

This is me with pink hair

-
-
- please add my linkedin #verylongroadto500 - {/* social media section */} -
-

- if u wanna stalk me..click on the icon{" "} -

- -
-
- - ); -} diff --git a/client/src/pages/project-team/Terrence.tsx b/client/src/pages/project-team/Terrence.tsx deleted file mode 100644 index 5442831..0000000 --- a/client/src/pages/project-team/Terrence.tsx +++ /dev/null @@ -1,108 +0,0 @@ -// at the top, we import all the libraries & components (parts) that we're going to use in the page -import { FaInstagram, FaGithub, FaLinkedin } from "react-icons/fa"; -import MemberStatsTable from "../../components/StatsTable"; -import TerrencePhoto from "../../assets/about-us/terrence.jpg"; -import { useEffect } from "react"; - -export default function Terrence() { - // this is a react hook that lets us perform side effects - in this case, changing the title (the name you see in the browser tab) - useEffect(() => { - document.title = "Terrence | UMSA"; - }, []); - - // heres where we return the jsx content - its what lets us write html in js - return ( - <> - {/* this is the background container */} -
- {/* this manages our page content */} -
- {/* header section */} -
-

Terrence :o

-
- - {/* stats section */} -
- {/* we use an img component to display my photo */} - - {/* heres where components come in - we use a pre built stats component, - and just fill in the props (stats). check /components/StatsTable.tsx to see how it works */} -
- -
-
- - {/* abut paragraph section */} - -
-

- Temporary about me section Temporary about me section Temporary - about me section Temporary about me section Temporary about me - section Temporary about me section Temporary about me section - Temporary about me section Temporary about me section Temporary - about me section Temporary about me section Temporary about me - section Temporary about me section Temporary about me section - Temporary about me section Temporary about me section Temporary - about me section Temporary about me section Temporary about me - section Temporary about me section Temporary about me section - Temporary about me section Temporary about me section Temporary - about me section Temporary about me section Temporary about me - section Temporary about me section Temporary about me section - Temporary about me section Temporary about me section -

-
- - {/* social media section */} -
-

- Social Links: -

- {/*

add me on Linkedin pls

*/} -
- {/* the tags are for creating links */} - - - - - - - - - - - -
-
-
-
- - ); -} diff --git a/docs/01-setup.md b/docs/01-setup.md deleted file mode 100644 index 479a748..0000000 --- a/docs/01-setup.md +++ /dev/null @@ -1,19 +0,0 @@ -# Local setup - -Use Node 22 and pnpm. Run `pnpm install`, copy `server/.env.example` to `server/.env` -and fill in your own server credentials. Never commit the actual environment file. -Run `pnpm dev`; use the frontend URL printed by Vite (normally port 5173, or the next free port). -The example API port is 5051. Set PORT=5050 inside Docker, as nginx proxies to 5050. -Set API_PROXY_TARGET when using a different local backend port. - -Admin login uses an existing MongoDB account; there is no built-in demo password. -An account can be deliberately bootstrapped with ADMIN_EMAIL and ADMIN_PASSWORD -(at least 12 characters), then `pnpm --filter server seed:admin`. This updates -that account's password and should not be run as an ordinary startup step. - -Cloudinary's three environment variables are needed for image uploads. -Contact sends through Resend to umsa@projects.wdcc.co.nz. Set RESEND_API_KEY and -CONTACT_FROM_EMAIL to a verified sender address. Membership uses the official Google Form. -There is no admin inbox or local membership database. - -Checks: `pnpm build` and `pnpm lint`. diff --git a/docs/02-architecture.md b/docs/02-architecture.md deleted file mode 100644 index d5761b3..0000000 --- a/docs/02-architecture.md +++ /dev/null @@ -1,124 +0,0 @@ -# 2. Architecture - -## The shape of it - -``` - PUBLIC ADMIN - β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” - β”‚ Homepage β”‚ GET /api/content/home β”‚/admin/login β”‚ - β”‚ (App.tsx) │◄──────────────┐ β”‚POST …/auth/login ─┼─► sets umsa_admin - β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ cookie (httpOnly) - β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” - β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β” PUT (cookie)β”‚/admin/home-contentβ”‚ - β”‚ Express + zod │◄───────────────HomeContentEditor β”‚ - β”‚ requireAdmin β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ Mongoose - β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β” - β”‚ MongoDB β”‚ HomeContent (singleton), AdminUser - β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -``` - -Two ideas hold the whole thing together, one per side: - -**Server: auth is applied once, structurally.** `app.use("/api/admin", requireAdmin)` sits -between the auth router and every other admin router. Mount a router below that line and it is -protected β€” there is no per-route guard to forget. - -**Client: TanStack Query's cache is the app's state.** The homepage and the editor both read the -`["content", "home"]` cache entry. When the editor saves, it invalidates that entry and every -reader updates. No Redux, no context, no prop drilling. - -## Repo layout - -A pnpm workspace with two packages (`pnpm-workspace.yaml`). - -``` -umsa/ -β”œβ”€β”€ client/ Vite + React 19 + TypeScript + Tailwind 4 -β”œβ”€β”€ server/ Express 5 + Mongoose 9 + TypeScript (ESM) -β”œβ”€β”€ docs/ you are here -β”œβ”€β”€ Dockerfile one image: nginx + node, built by Fly -β”œβ”€β”€ nginx.conf /api/ β†’ localhost:5050, everything else β†’ the SPA -β”œβ”€β”€ fly.toml app umsa-prod, region syd -└── .github/workflows/fly-deploy.yml deploys on push to main -``` - -## How `/api` resolves - -The client's axios instance uses a **relative** base URL, `"/api"` β€” never an absolute host, -never an env var. Something else forwards it in each environment: - -| Environment | Browser hits | Forwarded by | To | -|---|---|---|---| -| Dev | `localhost:5173/api/...` | Vite proxy (`client/vite.config.ts`) | `localhost:5050` | -| Prod | `umsa-prod.fly.dev/api/...` | nginx (`nginx.conf`) | `localhost:5050` in the same container | - -This is why there is no CORS handling in the browser path and no absolute-URL config to keep in -sync: **the API is same-origin from the browser's point of view in both environments**. It also -means the session cookie is first-party, which is what makes `sameSite: "lax"` viable. - -(The server still configures `cors()` with `credentials: true` for anything calling it directly β€” -curl, Postman, a future mobile app.) - -## Request lifecycle - -Follow a single admin save from click to database. Every step is a real file you can open. - -1. **Form submit.** `client/src/pages/admin/HomeContentEditor.tsx` β€” react-hook-form validates - against the zod schema in `client/src/schemas/content.ts`. Invalid input never leaves the - browser. -2. **Mutation.** `useSaveHomeContent()` in `client/src/hooks/useHomeContent.ts` calls - `api.put("/admin/content/home", values)`. -3. **Transport.** The axios instance (`client/src/lib/api.ts`) has `withCredentials: true`, so - the browser attaches the `umsa_admin` cookie. The JavaScript never sees the token β€” it's - `httpOnly`. -4. **Proxy.** Vite (dev) or nginx (prod) forwards to Express on 5050. -5. **Middleware stack**, in the order declared in `server/src/app.ts`: - - | Order | Middleware | Why it's there | - |---|---|---| - | 1 | `app.set("trust proxy", 1)` | One hop (nginx / Fly edge). Without it, `req.ip` is the proxy's IP and every visitor shares one rate-limit bucket. | - | 2 | `helmet()` | Security response headers. | - | 3 | `cors({ origin, credentials: true })` | `credentials: true` is required for cookie auth. | - | 4 | `express.json({ limit })` | The **only** body parser. No urlencoded, no multipart β€” the API cannot accept a file upload today. | - | 5 | `cookieParser()` | Populates `req.cookies`, which `requireAdmin` reads. Must run before any guard. | - | 6 | `apiRateLimit` on `/api` | 300 requests / 15 min / IP. A brute-force backstop. | - | 7 | routers | Public first, then `/api/admin/auth`, then the guard, then protected routers. | - | 8 | `notFound` | Anything unmatched β†’ 404. | - | 9 | `errorHandler` | Anything thrown β†’ 500. | - -6. **Guard.** `requireAdmin` verifies the JWT and re-checks the user still exists in the - database. On success it writes `res.locals.admin`. See [04-auth.md](04-auth.md). -7. **Validation.** `validate(homeContentSchema)` parses the body, replaces `req.body` with the - parsed result, or 400s. -8. **Handler.** `server/src/routes/admin/content.ts` calls Mongoose directly β€” there is no - service or controller layer. -9. **Response.** Success is a plain JSON body. Every error is the same envelope: - `{ error: { code, message } }`. -10. **Cache invalidation.** Back on the client, `onSuccess` invalidates `["content", "home"]`, - so the public homepage refetches and re-renders with the new text. - -## The five layers of a feature - -Every CMS feature is the same five files. This table *is* the recipe β€” [07-adding-a-feature.md](07-adding-a-feature.md) -just expands it. - -| Layer | Reference file | What it does | -|---|---|---| -| Model | `server/src/models/HomeContent.ts` | Mongoose schema β€” the shape in the database. | -| Schema | `server/src/schemas/content.ts` | zod schema β€” the shape of a *valid request body*: required, trimmed, max length. | -| Validation | `server/src/middleware/validate.ts` | Reusable. `validate(schema)` rejects bad bodies with a 400 before your handler runs, and replaces `req.body` with the parsed result β€” trimmed strings, unknown keys stripped, which is free mass-assignment protection. | -| Public route | `server/src/routes/content.ts` | The read endpoint. Falls back to `HOME_DEFAULTS` when nothing was ever saved, so the site works against an empty database. | -| Admin route | `server/src/routes/admin/content.ts` | The write endpoint, mounted below the guard. | - -**Singleton vs list.** `HomeContent` is a *singleton* β€” there is only ever one document, queried -with `findOne()` (no filter) and written with `findOneAndUpdate({}, …, { upsert: true })`. Theme -settings and site branding are singletons too. - -Events, team members and gallery images are *lists*: many documents, each with its own `_id`, -using `find()`, `findById()`, `new Model().save()`, `findByIdAndUpdate()`, `findByIdAndDelete()` β€” -see the worked example in [07-adding-a-feature.md](07-adding-a-feature.md). - -Picking the wrong one is the most common early mistake. Ask: *would an admin ever want two of -these at once?* If yes, it's a list. diff --git a/docs/03-backend-reference.md b/docs/03-backend-reference.md deleted file mode 100644 index fdac5bd..0000000 --- a/docs/03-backend-reference.md +++ /dev/null @@ -1,229 +0,0 @@ -# 3. Backend reference - -A file-by-file tour of `server/`. Read [02-architecture.md](02-architecture.md) first for the -mental model; this is the detail. - -``` -server/ -β”œβ”€β”€ server.ts process entry point -β”œβ”€β”€ db/connection.ts mongoose.connect -β”œβ”€β”€ src/ -β”‚ β”œβ”€β”€ app.ts Express app assembly β€” middleware order, route mounting -β”‚ β”œβ”€β”€ middleware/ -β”‚ β”‚ β”œβ”€β”€ requireAdmin.ts the auth guard -β”‚ β”‚ β”œβ”€β”€ validate.ts zod body validation factory -β”‚ β”‚ β”œβ”€β”€ rateLimit.ts 300 req / 15 min / IP -β”‚ β”‚ β”œβ”€β”€ notFound.ts 404 fallback -β”‚ β”‚ └── errorHandler.ts 500 fallback -β”‚ β”œβ”€β”€ models/ Mongoose schemas -β”‚ β”œβ”€β”€ routes/ request handlers (inline, no controllers) -β”‚ β”œβ”€β”€ schemas/ zod request-body schemas -β”‚ └── utils/ -β”‚ β”œβ”€β”€ apiError.ts sendError() β€” the one error shape -β”‚ └── adminSession.ts cookie name, TTL, secret, options -└── dist/ STALE BUILD OUTPUT β€” ignore it entirely -``` - -There is no `controllers/`, no `services/`, no `repositories/`. Route handlers call Mongoose -directly. For a codebase this size that's the right call β€” a service layer that only forwards to -a model is indirection with no payoff. If a handler ever grows past ~40 lines or two routes need -the same logic, *then* extract. - -## Boot sequence - -`server/server.ts` is the entry point. (`package.json` says `"main": "index.js"` β€” that's a lie, -nothing reads it.) - -```ts -import "dotenv/config"; // MUST be the first import β€” see below - -import connectDB from "./db/connection.js"; -import app from "./src/app.js"; - -if (process.env.NODE_ENV === "production" && !process.env.JWT_SECRET) { - throw new Error("JWT_SECRET must be set in production"); -} - -const PORT = process.env.PORT || 5050; - -connectDB(); // note: NOT awaited - -app.listen(PORT, () => { console.log(`server is running on port ${PORT}`); }); -``` - -Three things worth knowing: - -- **`import "dotenv/config"` must stay first.** Static imports are hoisted and evaluated before - any other code in the file, so if it came second, every module imported above it would already - have read an empty `process.env`. Same rule in `scripts/seed-admin.ts`. -- **`connectDB()` is not awaited.** The server starts listening immediately and Mongoose buffers - queries until the connection is up. In practice you'll never notice; it does mean a request - arriving in the first few hundred milliseconds waits rather than failing. -- **A failed connection calls `process.exit(1)`** (`db/connection.ts`). There are no reconnect - handlers and no pool tuning β€” Mongoose's defaults are fine at our traffic. - -Note the `.js` extensions on relative imports. That is required, not a typo: the server is -native ESM (`"type": "module"`) with `moduleResolution: "NodeNext"`, so TypeScript wants the -*output* filename. Omit it and the build compiles but the process crashes at runtime. - -## `src/app.ts` - -The whole file is 47 lines and worth reading in full. The part that matters: - -```ts -app.use("/api/content", contentRoutes); - -app.use("/api/admin/auth", adminAuthRoutes); // login/logout/me β€” above the guard -// every /api/admin/* route below requires a logged-in admin account -app.use("/api/admin", requireAdmin); -app.use("/api/admin/content", adminContentRoutes); -``` - -**Mount your admin router below the `requireAdmin` line and it's protected automatically.** Only -the auth router sits above it, because you have to be able to reach `/login` while logged out. - -A consequence to expect: `GET /api/admin/anything-that-doesnt-exist` returns **401, not 404**, -when you're logged out. The guard runs before routing gets a chance to miss. - -## Models β€” `src/models/` - -Two of them. Both use `{ timestamps: true }` (adds `createdAt` / `updatedAt`). Neither has hooks, -virtuals, instance methods, refs, enums or custom indexes β€” deliberately plain. - -| Model | Fields | Shape | -|---|---|---| -| `AdminUser.ts` | `email` (required, **unique**, lowercased, trimmed), `passwordHash` (required) | list, but effectively one row | -| `HomeContent.ts` | `heading` (required), `subtitle` (required) | **singleton** | - -`AdminUser`'s `unique: true` is the only index in the codebase (Mongoose creates it for you). - -One caveat to keep in mind: - -- **Nothing enforces singleton-ness at the database level.** `HomeContent` is a singleton only - because every query is `findOne()` with no filter. Two documents would not error, the second - would just be invisible. - -## Routes β€” `src/routes/` - -Handlers are inline async arrows. The house convention, visible in every file: - -```ts -router.get("/", async (_req, res) => { - try { - const items = await Model.find(); - res.json(items); - } catch { - sendError(res, 500, "INTERNAL_ERROR", "Unable to fetch items"); - } -}); -``` - -`try { … } catch { sendError(…) }` with a **domain-specific message**. The catch takes no -binding because the error object is never inspected β€” it's logged by the global handler if it -gets that far. Follow this pattern; a reviewer will ask why if you don't. - -For anything taking an `:id`, guard the ObjectId before hitting the database: - -```ts -if (!mongoose.isValidObjectId(req.params.id)) { - return sendError(res, 400, "BAD_REQUEST", "Invalid id"); -} -``` - -Without it, a malformed id throws a `CastError` and surfaces as a 500 β€” which is a lie, since -the client sent a bad request. - -Full endpoint list is in [05-api-reference.md](05-api-reference.md). - -## Validation β€” `src/middleware/validate.ts` and `src/schemas/` - -One factory, used by every write endpoint: - -```ts -export const validate = - (schema: ZodType): RequestHandler => - (req, res, next) => { - // Express 5 leaves req.body undefined when no JSON body was sent - const result = schema.safeParse(req.body ?? {}); - - if (!result.success) { - const message = result.error.issues.map((issue) => issue.message).join(", "); - return sendError(res, 400, "VALIDATION_ERROR", message); - } - - req.body = result.data; - next(); - }; -``` - -The line that does the quiet work is `req.body = result.data`. Your handler receives the -**parsed** body β€” strings trimmed, unknown keys stripped. That last part is free -mass-assignment protection: a client that POSTs `{ heading, subtitle, isAdmin: true }` can't -smuggle `isAdmin` into a `findOneAndUpdate`, because zod dropped it before your code ran. - -Schemas live in `src/schemas/` and describe a valid *request body*, not a database document: - -```ts -export const homeContentSchema = z.object({ - heading: z.string().trim().min(1, "Heading is required") - .max(200, "Heading is too long (200 characters max)"), - subtitle: z.string().trim().min(1, "Subtitle is required") - .max(500, "Subtitle is too long (500 characters max)"), -}); - -export type HomeContentInput = z.infer; -``` - -Every message is user-facing β€” it goes straight into the API response and then into the form. -Write them as you'd want to read them. - -Export the `z.infer` type alongside the schema and use it in the handler -(`req.body as HomeContentInput`). One definition, both the runtime check and the type. - -**Not validated today**: route params and query strings anywhere. If you add a query parameter, -validate it. - -## Errors β€” `src/utils/apiError.ts` - -Every error response in the app has one shape, and the client's `apiErrorMessage()` depends on -it: - -```json -{ "error": { "code": "VALIDATION_ERROR", "message": "Heading is required" } } -``` - -```ts -export type ApiErrorCode = - | "BAD_REQUEST" | "INTERNAL_ERROR" | "NOT_FOUND" | "UNAUTHORIZED" | "VALIDATION_ERROR"; -``` - -| Code | Status | When | -|---|---|---| -| `VALIDATION_ERROR` | 400 | zod rejected the body. | -| `BAD_REQUEST` | 400 | Malformed input zod didn't cover β€” a bad ObjectId, say. | -| `UNAUTHORIZED` | 401 | No cookie, dead token, or deleted account. | -| `NOT_FOUND` | 404 | No such document, or no such route. | -| `INTERNAL_ERROR` | 500 | Something threw. | - -If you need a code that isn't in the union, add it there β€” don't invent a new envelope. - -## The two fallbacks - -`notFound` returns 404 for anything unmatched. `errorHandler` is the terminal handler: it logs -(unless `NODE_ENV === "test"`) and always returns a **generic** 500, never the real message. -That's deliberate β€” stack traces and Mongo errors leak schema details. - -Express 5 forwards rejected promises to `errorHandler` automatically, so an unhandled async -throw becomes a 500 rather than a hung request. Since every handler already has its own -try/catch, `errorHandler` is a backstop rather than the main path. The one place it actually -fires today is `requireAdmin`'s `findById`, which isn't wrapped. - -## Rate limiting β€” `src/middleware/rateLimit.ts` - -300 requests per 15 minutes per IP, applied to all of `/api` including login. This is a -brute-force backstop, not a tuned policy. `app.set("trust proxy", 1)` is what makes "per IP" -true behind nginx β€” without it, every visitor in production shares a single bucket and one -enthusiastic user locks out the club. - -A dedicated, much stricter limiter on the login route is listed in -[blueprints/06-admin-accounts.md](blueprints/06-admin-accounts.md). diff --git a/docs/04-auth.md b/docs/04-auth.md deleted file mode 100644 index 044ab11..0000000 --- a/docs/04-auth.md +++ /dev/null @@ -1,145 +0,0 @@ -# 4. Auth - -One admin account, a bcrypt hash in the database, a JWT in an httpOnly cookie. Both halves β€” -server and client β€” are here, because you can't understand either alone. - -## The lifecycle - -1. **`POST /api/admin/auth/login`** (`server/src/routes/admin/auth.ts`) looks up the `AdminUser` - by lowercased email and compares the password with **bcrypt**. Only the *hash* is stored β€” if - the database leaks, the password doesn't. Hashing happens in `server/scripts/seed-admin.ts` - at cost factor 12. -2. On success the server signs a **JWT** β€” payload `{ sub: userId, email }`, expiry 7 days β€” and - puts it in a cookie. The browser sends that cookie automatically on every subsequent request. - **The client never touches the token.** -3. **`requireAdmin`** (`server/src/middleware/requireAdmin.ts`) verifies the JWT on every admin - request *and re-checks the user still exists in the database*. -4. **`POST /api/admin/auth/logout`** clears the cookie. It works when you're already logged out - too, which keeps the client simple. - -## The guard - -Read this one in full β€” it's the security boundary of the entire CMS. - -```ts -export const requireAdmin: RequestHandler = async (req, res, next) => { - const token = req.cookies?.[ADMIN_COOKIE]; - if (!token) { - return sendError(res, 401, "UNAUTHORIZED", "Not logged in"); - } - - let payload: { sub: string; email: string }; - try { - payload = jwt.verify(token, jwtSecret()) as { sub: string; email: string }; - } catch { - return sendError(res, 401, "UNAUTHORIZED", "Session expired - please log in again"); - } - - const user = await AdminUser.findById(payload.sub); - if (!user) { - return sendError(res, 401, "UNAUTHORIZED", "Account no longer exists"); - } - - res.locals.admin = { id: user.id, email: user.email }; - next(); -}; -``` - -Why the database lookup, when the JWT already proves the token is genuine? Because a JWT is -valid until it expires and **cannot be revoked**. Re-checking means deleting an `AdminUser` -document instantly kills that person's sessions. One extra indexed lookup per admin request, on -an admin panel used by a handful of people β€” worth it. - -Downstream handlers read the identity from **`res.locals.admin`**, not `req.user`. There are no -roles: every admin can do everything. - -## Where the guard is applied - -Once, in `server/src/app.ts`: - -```ts -app.use("/api/admin/auth", adminAuthRoutes); // above the guard β€” login must work logged-out -app.use("/api/admin", requireAdmin); -app.use("/api/admin/content", adminContentRoutes); -``` - -New admin routers go below that line. You cannot forget the guard, because you'd have to -actively mount above it to escape it. - -`GET /me` is the exception: its router sits above the line, so it applies `requireAdmin` inline -per-route. - -## The cookie - -Configured in `server/src/utils/adminSession.ts`. - -| Setting | Value | Why | -|---|---|---| -| name | `umsa_admin` | Easy to spot in devtools. | -| `httpOnly` | `true` | JavaScript can never read the token, so XSS can't steal the session. Check it yourself: `document.cookie` in the console won't show it. | -| `sameSite` | `"lax"` | The browser won't attach it to cross-site POSTs β€” blocks basic CSRF for free. | -| `secure` | prod only | HTTPS-only in production; plain `http://localhost` still works in dev. | -| `maxAge` | 7 days | Matches the JWT's `expiresIn` so the cookie and the token die together. | -| `path` | `/` | Sent on every `/api/...` request. | - -Three deliberate choices worth understanding: - -- **The login error is vague on purpose.** "Incorrect email or password" for *both* wrong-email - and wrong-password means an attacker can't probe which emails exist. -- **`cookieOptions()` has no `maxAge`.** `res.clearCookie()` only works when called with the same - options the cookie was set with, *minus* the expiry β€” so login spreads `maxAge` in itself and - logout passes the base options. Keep it that way. -- **`jwtSecret()` is a function, not a constant.** It reads `process.env` at call time, which - makes the module import-order-proof. Copy that habit for any env-dependent value. - -## Client side: react-query *is* your auth context - -**There is no `AuthContext`.** `client/src/hooks/useAuth.ts` defines three hooks, and the -`["auth", "me"]` cache entry is the shared auth state: - -- `useMe()` β€” a query for `GET /admin/auth/me` whose `queryFn` returns `null` on a 401 instead of - throwing. **Being logged out is a normal state, not an error.** That single decision is what - removes the need for a context. -- `useLogin()` / `useLogout()` β€” mutations that write that cache entry with `setQueryData` on - success. - -Every component calling `useMe()` reads the same entry, so a hand-rolled context would just -duplicate what react-query already gives you. - -## The guard, client side - -Declarative, in `client/src/layouts/AdminLayout.tsx`: - -```tsx -if (isPending) return
Checking login…
; -if (!me) return ; -``` - -Because the guard lives on the **layout route**, every `/admin/*` deep link is covered β€” including -pages that don't exist yet. `Login.tsx` does the inverse: already logged in β†’ ``. - -There is deliberately **no axios interceptor that redirects on 401**. Instead, if a session dies -mid-edit, the save mutation's `onError` sets the auth cache entry to `null`: - -```ts -onError: (err) => { - if (isAxiosError(err) && err.response?.status === 401) { - queryClient.setQueryData(ME_KEY, null); // AdminLayout redirects on the next render - } -} -``` - -State change in, redirect out. Copy this `onError` into every admin mutation you write. - -## Adding an admin page - -Two lines, no auth work: - -1. An entry in the `MENU` array at the top of `AdminLayout.tsx`: - ```tsx - const MENU = [{ to: "/admin/home-content", label: "Homepage text" }]; - ``` -2. A route under `/admin` in `client/src/main.tsx`. - -Admin routes are **siblings** of the public `RootLayout` route, which is why admin pages don't -inherit the public navbar and footer. diff --git a/docs/05-api-reference.md b/docs/05-api-reference.md deleted file mode 100644 index 6f2a733..0000000 --- a/docs/05-api-reference.md +++ /dev/null @@ -1,31 +0,0 @@ -# API reference - -All paths are relative to `/api`. Validation failures return 400; errors use -`{ error: { code, message } }`. Protected routes require the HTTP-only admin session cookie. - -| Method | Path | Access | Purpose | -| --- | --- | --- | --- | -| GET | /health | Public | Process health; does not probe MongoDB | -| GET | /content/home | Public | Heading, subtitle, aboutHeading, aboutBody, optional introVideoUrl | -| GET | /members, /events, /sponsors, /gallery, /faqs | Public | List saved collection records with stable id fields | -| POST | /admin/auth/login | Public | Validate account password and set session cookie | -| GET | /admin/auth/me | Admin | Read the current account email | -| POST | /admin/auth/logout | Public | Clear session cookie | -| PUT | /admin/content/home | Admin | Save validated homepage fields | -| POST | /admin/members, /admin/events, /admin/sponsors, /admin/gallery, /admin/faqs | Admin | Create a validated record | -| PUT | /admin/{collection}/{id} | Admin | Replace a record's editable fields | -| DELETE | /admin/{collection}/{id} | Admin | Delete a record | -| POST | /admin/uploads/signature | Admin | Sign upload to an allowed Cloudinary folder | - -Collection schemas are in `server/src/schemas/collections.ts`. Member committee values: -presidents, executives, marketing, publicRelations, social, cultural, sports, other. -Older records without a committee remain visible under Other. Homepage video URLs must -be HTTPS YouTube embed URLs, and an empty URL hides the video. - -`POST /api/contact` accepts name, email and message. It sends plain-text email through -Resend to umsa@projects.wdcc.co.nz and sets reply_to to the visitor's email. It returns -200 only after Resend accepts the email. Missing configuration returns 503; provider -errors return 502. Requests are limited to five per IP per 15 minutes. - -Membership uses the confirmed Google Form; `/api/membership` and -`/api/admin/submissions` are not available. diff --git a/docs/06-client-contract.md b/docs/06-client-contract.md deleted file mode 100644 index e29274e..0000000 --- a/docs/06-client-contract.md +++ /dev/null @@ -1,167 +0,0 @@ -# 6. Client contract - -Enough of the frontend to wire your endpoint to a page. This is not a React guide β€” it's the -four conventions the client uses, so your feature looks like the rest of the codebase. - -## One axios instance - -`client/src/lib/api.ts` is the entire transport layer: - -```ts -export const api = axios.create({ - baseURL: "/api", - withCredentials: true, // send/receive the umsa_admin session cookie -}); - -export function apiErrorMessage(err: unknown): string { - if (isAxiosError(err)) { - // our server wraps errors as { error: { code, message } } - return err.response?.data?.error?.message ?? err.message; - } - return "Something went wrong"; -} -``` - -Three rules: - -- **Never call `fetch` or create a second axios instance.** You'd lose `withCredentials` and - every admin request would 401. -- `baseURL: "/api"` is relative, so paths you pass are relative too: `api.get("/content/home")`, - not `api.get("/api/content/home")`. -- **There are no interceptors.** No token attaching (the cookie is automatic), no redirect on - 401 (see below). Don't add any β€” the alternative is described in [04-auth.md](04-auth.md) and - it's deliberate. - -Use `apiErrorMessage(err)` to surface failures. It unwraps the server's error envelope, so the -message your zod schema produced on the server is the message the admin reads. - -## One hooks file per feature - -`client/src/hooks/useHomeContent.ts` is the file you'll copy most. The whole convention: - -```ts -export const HOME_CONTENT_KEY = ["content", "home"] as const; - -export function useHomeContent() { - return useQuery({ - queryKey: HOME_CONTENT_KEY, - queryFn: () => api.get("/content/home").then((res) => res.data), - }); -} - -export function useSaveHomeContent() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: (values: HomeContentValues) => - api.put("/admin/content/home", values).then((res) => res.data), - // forces refetch so every render sees the new values - onSuccess: () => queryClient.invalidateQueries({ queryKey: HOME_CONTENT_KEY }), - onError: (err) => { - if (isAxiosError(err) && err.response?.status === 401) { - // session died mid-edit -> nulls auth cache and AdminLayout redirects - queryClient.setQueryData(ME_KEY, null); - } - }, - }); -} -``` - -Four things, every time: **an exported query key constant**, a `useQuery` read hook, `useMutation` -write hooks, and `invalidateQueries` on success so every reader refetches. - -The key constant matters β€” the public page and the admin editor must invalidate the *same* key -or saving won't update the site. Export it, don't inline the array twice. - -Query keys in use today: `["auth", "me"]`, `["content", "home"]`. For list features use -`["events"]`, `["team"]`, `["gallery"]` β€” flat and predictable. - -**Why react-query rather than `useEffect` + `useState` + `fetch`?** Caching, request -de-duplication (StrictMode's double-mount fires *one* network request), automatic -`isPending`/`isError` states, and cross-component updates β€” save in the editor and the homepage -refetches by itself. You'd otherwise hand-roll all four, badly. - -## Public pages: always have a fallback - -From `client/src/App.tsx`: - -```tsx -const { data } = useHomeContent(); -const content = data ?? DEFAULTS; -``` - -`?? DEFAULTS` covers *both* the loading moment and the API-being-down case in one line β€” the -public site never looks broken because the CMS is unreachable. Do this on every public page you -convert. - -(We don't use react-query's `initialData`, because that writes the fallback into the cache as if -it were real server data.) - -Admin pages are the opposite: they should show explicit `isPending` / `isError` states, because -an admin needs to know whether they're editing real data. `HomeContentEditor.tsx` does exactly -that before rendering the form. - -## Forms: react-hook-form + zod - -Both existing forms use the same shape: - -```tsx -const { register, handleSubmit, formState: { errors } } = useForm({ - resolver: zodResolver(homeContentSchema), - values: data, // editor only: prefills when the query resolves - resetOptions: { keepDirtyValues: true }, -}); -``` - -- **One zod schema drives everything**: the validation rules, the error messages, *and* the - TypeScript type via `z.infer`. Change a max length in one place and the form, the types and - (after copying to the server schema) the API all agree. -- **`values: data`** is react-hook-form's built-in answer to "prefill a form from an async - fetch" β€” no `useEffect` + `reset()` dance. Pair it with `resetOptions: { keepDirtyValues: true }` - so a background refetch (window refocus, post-save invalidation) can't wipe what the admin is - currently typing. -- Disable the submit button on `mutation.isPending`, and render `apiErrorMessage(mutation.error)` - on failure. `HomeContentEditor.tsx` shows both. - -**The client schemas in `client/src/schemas/` are hand-copied duplicates of the server ones in -`server/src/schemas/`.** Keep them in sync manually. The server always re-validates, so a drifted -copy is a UX bug, never a security hole β€” *client validation is UX, server validation is -security*. (Upgrade path: a shared workspace package so both import one file.) - -## Routing and the admin shell - -Public routes are children of `RootLayout` (navbar + footer). Admin routes are **siblings** of -it in `client/src/main.tsx`, which is why the admin panel has no public chrome: - -```tsx -{ path: "/admin/login", element: }, // outside the guard by design -{ - path: "/admin", - element: , // the guard lives here - children: [ - { index: true, element: }, - { path: "home-content", element: }, - ], -}, -``` - -Adding an admin page is two edits: a route here, and an entry in the `MENU` array at the top of -`client/src/layouts/AdminLayout.tsx`. - -## Where the data currently comes from - -Only the homepage reads from the API. Everything else is literals in `.tsx`, which is the work -the blueprints describe. - -| Page | File | Source today | -|---|---|---| -| `/` | `client/src/App.tsx` | **API** β€” `GET /api/content/home` | -| `/events` | `client/src/pages/Events.tsx` | Hardcoded 15-item array; has working tag filter + pagination to preserve | -| `/team` | `client/src/pages/Team.tsx` | Hardcoded, with placeholder stock photo URLs | -| `/gallery` | `client/src/pages/Gallery.tsx` | Two placeholder PNGs repeated ten times | -| `/sponsors` | `client/src/pages/Sponsors.tsx` | Hardcoded array, imported JPEGs | -| `/about`, `/faq` | `client/src/pages/About.tsx`, `Frequent-Asked-Question.tsx` | Hardcoded copy | -| `/contact` | `client/src/pages/Contact.tsx` | Third-party β€” POSTs to Formspree, not our API | -| `/sign-up` | `client/src/pages/SignUp.tsx` | An iframed Google Form | - -Note the last two: contact and sign-up don't go through our backend at all. Leave them alone -unless someone explicitly asks for them to be moved. diff --git a/docs/07-adding-a-feature.md b/docs/07-adding-a-feature.md deleted file mode 100644 index edb14ca..0000000 --- a/docs/07-adding-a-feature.md +++ /dev/null @@ -1,143 +0,0 @@ -# 7. Adding a feature - -The recipe. Worked example: **Events**. Every step names the file to copy, because copying a -working file beats writing one from scratch. - -Do this once by hand before you start your assigned blueprint β€” even if your blueprint is a -different feature, the twelve steps are the same. - -## Before you start: singleton or list? - -Ask *would an admin ever want two of these at once?* - -- **No** β†’ singleton. One document, `findOne()` and `findOneAndUpdate({}, …, { upsert: true })`. - Copy `HomeContent`. Theme settings and site branding are singletons. -- **Yes** β†’ list. Many documents each with an `_id`, full CRUD, like the Event model below. Events, - team members and gallery images are lists. - -Getting this wrong is the most common early mistake and it's expensive to undo, because the API -shape changes. - -## Server - -**1. Model** β€” create `server/src/models/Event.ts`: - -```ts -const EventSchema = new Schema( - { - title: { type: String, required: true }, - startsAt: { type: Date, required: true }, - description: { type: String, required: true }, - }, - { timestamps: true }, -); -``` - -Singleton features copy `server/src/models/HomeContent.ts` instead. - -**2. Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/event.ts`. Describe the -*request body*, not the document: required, trimmed, sensible max lengths, user-facing messages. -Export the `z.infer` type next to it. - -**3. Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/events.ts`. - -```ts -router.get("/", async (_req, res) => { - try { - res.json(await Event.find().sort({ startsAt: 1 })); - } catch { - sendError(res, 500, "INTERNAL_ERROR", "Unable to fetch events"); - } -}); -``` - -Every document in that response carries its `_id` β€” that's what the admin UI uses to update and -delete specific events. - -**4. Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ `server/src/routes/admin/events.ts`. -For a list feature you need three handlers: - -- `POST /` β€” `validate(eventSchema)`, `new Event(req.body).save()`, respond `201`. -- `PUT /:id` β€” `validate(eventSchema)`, `findByIdAndUpdate(id, req.body, { new: true })`, - `404` if it returns null. -- `DELETE /:id` β€” **no `validate`**. A delete has no body, so validating would 400 every delete. - -Check the id before touching the database: - -```ts -if (!mongoose.isValidObjectId(req.params.id)) { - return sendError(res, 400, "BAD_REQUEST", "Invalid id"); -} -``` - -**5. Mount both** in `server/src/app.ts` β€” the admin one **below the `requireAdmin` line**, which -protects it automatically: - -```ts -app.use("/api/events", eventRoutes); -// …below the requireAdmin guard line: -app.use("/api/admin/events", adminEventRoutes); -``` - -At this point stop and test the server on its own, before writing any React: - -```bash -curl localhost:5050/api/events -curl -X POST localhost:5050/api/admin/events -H 'Content-Type: application/json' -d '{}' -# expect 401 β€” you're not logged in -``` - -## Client - -**6. Schema** β€” copy `client/src/schemas/content.ts` β†’ `client/src/schemas/event.ts`. It's a -duplicate of the server schema; keep them in sync by hand. - -**7. Hooks** β€” copy `client/src/hooks/useHomeContent.ts` β†’ `client/src/hooks/useEvents.ts`. Key -`["events"]`, a `useEvents()` query, and `useCreateEvent()` / `useUpdateEvent()` / -`useDeleteEvent()` mutations, each invalidating `["events"]` on success and each carrying the -401 `onError` handler. Update and delete take the `_id` from the fetched list: - -```ts -api.put(`/admin/events/${id}`, values) -``` - -**8. Admin page** β€” copy `client/src/pages/admin/HomeContentEditor.tsx` β†’ -`client/src/pages/admin/EventsEditor.tsx`. A list plus a form, rather than a single form: render -each event with edit and delete buttons, and a form that creates a new one. - -**9. Menu** β€” add `{ to: "/admin/events", label: "Events" }` to `MENU` in -`client/src/layouts/AdminLayout.tsx`. - -**10. Route** β€” add `{ path: "events", element: }` under the `/admin` route in -`client/src/main.tsx`. - -**11. Public page** β€” replace the hardcoded data in `client/src/pages/Events.tsx` with -`useEvents()`. Keep a fallback for the loading and error states (`data ?? []` at minimum), and -keep whatever presentation logic already exists β€” the tag filter and pagination on that page -work fine and don't need rewriting. - -**12. Verify** β€” the public page renders, the admin flow works, a bad submit shows the validation -message, a save updates the public page without a refresh, and a delete removes it. - -That's the whole pattern. Nothing else in the codebase needs to change. - -## Checklist before you open the PR - -- [ ] New env variable? Added to `server/.env.example` too. -- [ ] Admin router mounted **below** `app.use("/api/admin", requireAdmin)`. -- [ ] Every write endpoint has `validate(...)`; the delete deliberately doesn't. -- [ ] `mongoose.isValidObjectId` guard on every `:id` route. -- [ ] Handlers use `try { … } catch { sendError(...) }` with a specific message. -- [ ] Client and server zod schemas match. -- [ ] Mutations invalidate the right query key, and carry the 401 `onError`. -- [ ] Public page still renders with the API stopped. -- [ ] `pnpm lint` passes. -- [ ] Endpoints added to [05-api-reference.md](05-api-reference.md). - -That last one is not optional. A feature nobody can find the URL for is half-built. - -## Then read your blueprint - -The twelve steps above are the *mechanics*. The [blueprints/](blueprints/) folder has the -*decisions* β€” exact schema, exact URLs, and the gotchas specific to each of the six capabilities, -so you don't have to design as well as build. diff --git a/docs/08-gotchas.md b/docs/08-gotchas.md deleted file mode 100644 index 9db9cb5..0000000 --- a/docs/08-gotchas.md +++ /dev/null @@ -1,77 +0,0 @@ -# 8. Gotchas and conventions - -## Read before you're bitten - -- **dotenv + ES modules.** Static imports are hoisted, so they're evaluated before any other code - in the importing file runs. That's why `server/server.ts` and `server/scripts/seed-admin.ts` - load env with `import "dotenv/config"` **as their first import** β€” a plain `dotenv.config()` - call would run *after* every imported module had already been evaluated. Keep that import - first, and prefer reading `process.env` inside functions (see `server/src/utils/adminSession.ts`) - so modules stay import-order-proof. - -- **`.js` extensions on server imports.** `import AdminUser from "../models/AdminUser.js"` β€” in a - `.ts` file. This is correct and required: native ESM with `moduleResolution: "NodeNext"` wants - the *output* filename. Omit it and the build passes but the process crashes at runtime. - -- **react-query v5 names.** It's `isPending` (not v4's `isLoading`) and `gcTime` (not `cacheTime`). - Old tutorials and LLM answers will happily give you v4 code that doesn't compile. - -- **zod v4 idioms.** `z.email()` is top-level, not `z.string().email()`. Error lists live on - `error.issues`. - -- **StrictMode double-mount.** In dev, React mounts components twice. react-query de-duplicates - the fetches β€” if you see one request in the Network tab, that's correct, not a bug you fixed. - -- **Rate limiting.** Everything under `/api`, including login, shares the 300-requests-per-15-min- - per-IP limiter (`server/src/middleware/rateLimit.ts`). `app.set("trust proxy", 1)` is what makes - "per IP" true behind nginx in production (without it every visitor shares one bucket). - -- **`server/dist/` is stale build output. Never read it, never import from it.** It's gitignored - and rebuilt by `pnpm build`. It matters because it contains a *much larger* feature set β€” - developer CRUD, admin settings, password reset tokens β€” that has **no - TypeScript source in this branch**. Someone browsing `dist/` will confidently document features - that do not exist. The blueprints point at it deliberately in a couple of places as a *reference - for how it was done before*; that's the only legitimate use. - -- **Express 5 leaves `req.body` undefined** when no JSON body was sent. `validate` handles it with - `req.body ?? {}`. If you write a handler that reads `req.body` without `validate`, guard it. - -- **`/api/admin/*` returns 401, not 404, for routes that don't exist** when you're logged out. The - guard runs before routing can miss. - - -## Conventions - -**Pre-commit** β€” husky runs `pnpm lint` over the whole repo on every commit. It is not -`lint-staged`, so someone else's lint error will block your commit; fix it or tell them. - -**Where new code goes** β€” server route handlers stay inline in the route file; there is no -controller layer and adding one for a single feature would be inconsistent. Shared logic goes in -`server/src/utils/`. - -## Production upgrade path - -Roughly in order of value. None of these block the CMS work. - -1. **Stricter login rate limit** β€” a second limiter of ~10/15min on `/api/admin/auth/login`. - Specced in [blueprints/06-admin-accounts.md](blueprints/06-admin-accounts.md). -2. **Shared schemas package** β€” a `packages/shared` workspace so client and server import the - same zod schemas instead of keeping hand-copied duplicates in sync. -3. **Secrets management** β€” set `JWT_SECRET` (long and random) and the admin password via - `fly secrets set`, never in the repo. The server refuses to boot in production without - `JWT_SECRET` (`server/server.ts`), so a forgotten secret fails loudly rather than quietly - signing tokens with the public default. -4. **A 404 route on the client.** `client/src/main.tsx` has no `errorElement` and no catch-all. - -## Deployment, briefly - -Push to `main` β†’ GitHub Actions (`.github/workflows/fly-deploy.yml`) β†’ `flyctl deploy --remote-only` -β†’ Fly app `umsa-prod` in Sydney. - -One container runs both halves (`Dockerfile`): nginx serves `client/dist` and proxies `/api/` to -`node dist/server.js` on port 5050 (`nginx.conf`). `NODE_ENV=production` is set in the image, -which turns on the `secure` cookie flag and the `JWT_SECRET` boot check. - -The machine has `min_machines_running = 0` and auto-stops, so the first request after a quiet -period is slow. That's expected, not a bug β€” and it's a reason not to store anything on the -container's filesystem, since it doesn't survive. diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index e605e86..0000000 --- a/docs/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# UMSA docs - -The repo has a **working baseline CMS slice**: an admin logs in at `/admin`, edits the homepage -welcome text in a form, and the public homepage updates β€” no code changes, no redeploy. - -That slice is deliberately tiny. It exists so you can copy it. Everything else the CMS needs to -do β€” events, gallery, team members, theme colours, logos β€” is still hardcoded in `.tsx` files, -and building it is the work ahead. - -These docs are split so you only read what you need. - -## The map - -| Doc | Read it when | -|---|---| -| [01-setup.md](01-setup.md) | First day. Get the thing running on your machine. | -| [02-architecture.md](02-architecture.md) | You want the mental model β€” what talks to what, and what happens between a click and a database write. | -| [03-backend-reference.md](03-backend-reference.md) | You're in `server/` and want to know what each file is for. | -| [04-auth.md](04-auth.md) | You're touching anything behind a login, or wondering why there's no `AuthContext`. | -| [05-api-reference.md](05-api-reference.md) | You need the exact shape of a request or response. Lookup, not reading. | -| [06-client-contract.md](06-client-contract.md) | You're wiring a React page to an endpoint you just built. | -| [07-adding-a-feature.md](07-adding-a-feature.md) | You're about to write your first CMS feature. This is the recipe. | -| [08-gotchas.md](08-gotchas.md) | Something is behaving strangely, or you're about to open a PR. | -| [blueprints/](blueprints/) | You've been assigned one of the six CMS capabilities. One file per capability, each a complete spec. | - -## Reading paths - -**New to the repo** β€” 01 β†’ 02 β†’ 04 β†’ 07. About 30 minutes. Skim 03 and 05; you'll come back to -them constantly, so there's no point memorising them now. - -**Assigned a feature** β€” 07 (the pattern) β†’ your blueprint in `blueprints/` (the spec) β†’ -06 (the client side). Keep 05 open in a tab. If your feature involves images, read -[blueprints/00-image-uploads.md](blueprints/00-image-uploads.md) first regardless of which -feature you were given, because it's the piece everything visual depends on. - -**Reviewing someone's PR** β€” 08, then 05 to check the endpoint contract matches what they wrote. - -## What's already built vs what isn't - -| Area | State | -|---|---| -| Admin login, session, logout | Done. One admin account, created by a seed script. | -| Homepage heading + subtitle | Done, end to end. This is the reference implementation. | -| Events, gallery, team, sponsors, FAQ, about copy | Hardcoded in `client/src/pages/*.tsx`. Not in the database. | -| Image uploads | Does not exist. No upload endpoint, no storage. See the blueprint. | -| Theme colours, fonts, logo | Static CSS in `client/src/tokens.css` and imported assets. Not editable. | -| Tests | No automated suite β€” small team, small app, not the point of this project. Run the app and click through the change before merging to `main`, since `main` deploys straight to Fly. | - -## A note on how these docs are written - -Every file path in here is repo-relative and clickable-ish β€” `server/src/app.ts` means -`server/src/app.ts` from the repo root. If a doc tells you to copy a file, that file exists; -if you can't find it, the doc is wrong and that's a bug worth fixing in the same PR. diff --git a/docs/blueprints/00-image-uploads.md b/docs/blueprints/00-image-uploads.md deleted file mode 100644 index 8d8bb65..0000000 --- a/docs/blueprints/00-image-uploads.md +++ /dev/null @@ -1,206 +0,0 @@ -# Blueprint 00 β€” Image uploads - -**Build this first.** Gallery, team photos, event images and the logo all need it. Building it -once means one upload widget and one mental model; skipping it means four people each inventing -a different half-solution. - -Nothing in the backend can accept a file today. `server/src/app.ts` mounts `express.json()` and -nothing else β€” no multer, no multipart parser, no `express.static`. This blueprint adds the -whole capability. - -## What the admin can do - -- Pick an image file in an admin form and see it upload with a progress or "uploading…" state. -- See a preview of the uploaded image before saving the surrounding form. -- Save the form; the image URL is stored on the document. -- Delete the document; the image file is removed from storage too, not orphaned. -- Get a clear error for a file that's too large or the wrong type, before anything uploads. - -## Decisions already made for you - -### Use Cloudinary with signed direct upload - -The browser uploads the file **straight to Cloudinary**. Express never sees the bytes β€” it only -signs a short-lived permission slip. - -``` - Browser Express Cloudinary - β”‚ β”‚ β”‚ - β”‚ POST /api/admin/uploads/signature β”‚ - β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ (requireAdmin) β”‚ - β”‚ β”‚ sign(timestamp, folder) β”‚ - │◄──────────────────────────── with CLOUDINARY_API_SECRET β”‚ - β”‚ { signature, timestamp, apiKey, cloudName, folder } β”‚ - β”‚ β”‚ - β”‚ POST the actual file, with the signature β”‚ - β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ - │◄────────────────────────────────────────────────────────── - β”‚ { secure_url, public_id } β”‚ - β”‚ β”‚ β”‚ - β”‚ POST /api/admin/gallery { url, publicId } β”‚ - β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ saves the strings only β”‚ -``` - -Why this shape and not the obvious one: - -| Approach | Verdict | -|---|---| -| **Cloudinary signed direct upload** | **Chosen.** Express stays a JSON API. No large request bodies, no memory pressure on a 256 MB Fly VM, and free CDN delivery and on-the-fly resizing. | -| Base64 the image into a JSON body | No. `JSON_BODY_LIMIT` is 1 MB and base64 inflates by ~33%. A phone photo blows straight past it. | -| multer β†’ the container's filesystem | No. Fly's filesystem is ephemeral and `fly.toml` has `min_machines_running = 0`, so the machine stops and every upload disappears. | -| multer β†’ stream through Express β†’ Cloudinary | Works, but puts every byte through our one small VM for no benefit. Only worth it if you need to inspect files server-side. | - -**The credentials already exist.** `server/.env` holds `CLOUDINARY_CLOUD_NAME`, -`CLOUDINARY_API_KEY` and `CLOUDINARY_API_SECRET` from an earlier iteration β€” no source file reads -them today. Ask the tech lead to confirm the account is still live, and add all three to -`server/.env.example`. - -**There is prior art in `server/dist/`.** `dist/src/lib/cloudinary.js` and -`dist/src/routes/admin/uploads.js` are a compiled version of roughly this design, with no -TypeScript source. Read them for reference if you're stuck. **Do not import from `dist/` and do -not copy it blindly** β€” it's stale, and its cookie module in particular is wrong for the current -code (see [../08-gotchas.md](../08-gotchas.md)). - -### The storage shape - -Every model that owns an image stores **two** strings, never one: - -```ts -imageUrl: { type: String }, // Cloudinary secure_url β€” what the renders -imagePublicId: { type: String }, // Cloudinary public_id β€” what a delete needs -``` - -Without `publicId` you cannot delete the file, and the Cloudinary account fills with orphans -nobody can identify. For a gallery of dozens of images that matters within one year. - -Both are optional at the schema level so a document can exist before its image does. - -### Endpoints - -| Method | Path | Auth | Body | Returns | -|---|---|---|---|---| -| `POST` | `/api/admin/uploads/signature` | admin | `{ folder }` β€” one of a fixed allowlist | `{ signature, timestamp, apiKey, cloudName, folder }` | - -One endpoint. It does not accept a file and it does not return a URL β€” it returns permission to -upload. - -**`folder` must be validated against a `z.enum`**, not passed through. Allowed values: -`"umsa/gallery"`, `"umsa/team"`, `"umsa/events"`, `"umsa/branding"`. An admin account is trusted, -but a fixed enum keeps the Cloudinary account tidy and means a bug can't scatter files. - -The signature is short-lived by construction: Cloudinary rejects a signed upload whose -`timestamp` is more than an hour old. - -## Server work - -1. **Dependency** β€” `pnpm --filter server add cloudinary`. - -2. **Config helper** β€” new file `server/src/utils/cloudinary.ts`. Read env inside functions, the - way `server/src/utils/adminSession.ts` does, so the module stays import-order-proof: - - ```ts - export const cloudinaryConfig = () => ({ - cloudName: process.env.CLOUDINARY_CLOUD_NAME || "", - apiKey: process.env.CLOUDINARY_API_KEY || "", - apiSecret: process.env.CLOUDINARY_API_SECRET || "", - }); - ``` - - Export two functions: `signUpload(folder)` returning `{ signature, timestamp }`, and - `destroyAsset(publicId)` for deletes. Both are thin wrappers over the `cloudinary` SDK. - -3. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/upload.ts`: - - ```ts - export const uploadSignatureSchema = z.object({ - folder: z.enum(["umsa/gallery", "umsa/team", "umsa/events", "umsa/branding"]), - }); - ``` - -4. **Route** β€” copy `server/src/routes/admin/content.ts` β†’ `server/src/routes/admin/uploads.ts`, - with `POST /signature` behind `validate(uploadSignatureSchema)`. Return 500 with a clear - message if the Cloudinary env vars are missing β€” a silent empty signature is a miserable - debug. - -5. **Mount** in `server/src/app.ts`, **below** the `requireAdmin` line: - ```ts - app.use("/api/admin/uploads", adminUploadRoutes); - ``` - -6. **Document the env vars** in `server/.env.example`. - -7. **Delete cleanup.** Whichever feature owns the image calls `destroyAsset(doc.imagePublicId)` - in its `DELETE /:id` handler before removing the document. Wrap it so a Cloudinary failure - doesn't block the database delete β€” an orphaned file is annoying, an undeletable event is - worse. - -## Client work - -8. **Hook** β€” new file `client/src/hooks/useImageUpload.ts`. Not a react-query *query* β€” it's a - two-step mutation: - - ``` - mutationFn: async (file: File) => { - const { data: sig } = await api.post("/admin/uploads/signature", { folder }); - const form = new FormData(); - form.append("file", file); - form.append("api_key", sig.apiKey); - form.append("timestamp", sig.timestamp); - form.append("signature", sig.signature); - form.append("folder", sig.folder); - // NOTE: plain axios/fetch here, NOT our `api` instance β€” different host - const res = await axios.post(`https://api.cloudinary.com/v1_1/${sig.cloudName}/image/upload`, form); - return { url: res.data.secure_url, publicId: res.data.public_id }; - } - ``` - - Carry the same 401 `onError` handler every other admin mutation has (see - [../06-client-contract.md](../06-client-contract.md)). - -9. **Component** β€” new file `client/src/components/admin/ImageUploadField.tsx`. A file input, a - preview ``, an uploading state, and an error message. It takes `value` / `onChange` so it - drops into react-hook-form via `Controller`. Every feature reuses this; nobody writes a second - one. - - Validate client-side before uploading: max ~5 MB, and `image/jpeg | image/png | image/webp`. - That's UX β€” the real limit is whatever Cloudinary enforces. - -## Gotchas for this feature - -- **The Cloudinary upload does not go through our axios instance.** `client/src/lib/api.ts` has - `baseURL: "/api"` and `withCredentials: true`; sending our session cookie to a third party - would be wrong and the base URL is wrong anyway. Use a bare `axios.post` with the full URL. -- **`CLOUDINARY_API_SECRET` must never reach the browser.** The signature endpoint returns the - *api key* (public) and a *signature* (derived), never the secret. If you find yourself putting - a secret in a Vite env var, stop. -- **Upload and save are two steps, and the user can abandon between them.** If someone uploads an - image then closes the tab, the file exists in Cloudinary with no document pointing at it. Accept - this for now; a periodic orphan sweep is a stretch goal. -- **Replacing an image leaves the old one behind.** When an update changes `imagePublicId`, destroy - the previous asset in the same handler. -- **CORS.** The upload goes browser β†’ Cloudinary directly. Cloudinary permits this; our own CORS - config is irrelevant to that request. -- **Don't put uploaded images in `client/src/assets/`.** Those are ES imports resolved at build - time. A CMS image is a runtime URL string β€” the two mechanisms don't mix, and there is no - `client/public/` directory either. - -## Definition of done - -- [ ] `POST /api/admin/uploads/signature` returns a signature for a valid folder, `401` when - logged out, `400 VALIDATION_ERROR` for a folder outside the enum. -- [ ] An admin can pick a file in `ImageUploadField` and see a preview of the hosted image. -- [ ] The resulting `{ url, publicId }` round-trips into a document and back out. -- [ ] Deleting that document removes the Cloudinary asset. -- [ ] Replacing an image destroys the old asset. -- [ ] All three `CLOUDINARY_*` vars are in `server/.env.example`. -- [ ] The endpoint is added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -Out of scope. Do not build these first. - -- Cloudinary transformation URLs for responsive `srcset` (a real win for the gallery later). -- Drag-and-drop and multi-file upload. -- A scheduled sweep for orphaned assets. -- Client-side image compression before upload. diff --git a/docs/blueprints/01-events.md b/docs/blueprints/01-events.md deleted file mode 100644 index 5596db9..0000000 --- a/docs/blueprints/01-events.md +++ /dev/null @@ -1,155 +0,0 @@ -# Blueprint 01 β€” Events - -The best first feature. It's a plain list with full CRUD, and the page it replaces already has -working filter and pagination logic you get to keep. - -Today `client/src/pages/Events.tsx` holds a 15-item hardcoded array. Every entry uses the same -imported image, and each carries a `page: 1` field and an `eventIsDone` boolean maintained by -hand. - -## What the admin can do - -- See every event in the admin panel, newest first. -- Create an event: name, date, description, tag, an optional external link, an optional image. -- Edit any existing event. -- Delete an event, with a confirmation step. -- Never think about "upcoming" versus "past" β€” that follows from the date automatically. - -## Decisions already made for you - -### Upcoming/past is derived, never stored - -The current data already demonstrates why. "Jalinan Raya" is dated `2026-05-20` with -`eventIsDone: false`, while an event dated `2026-04-20` has `eventIsDone: true`. Both dates are -in the past. The boolean is wrong because somebody has to remember to flip it, and nobody did. - -So: **store `startsAt`, compute the rest.** An event moves from upcoming to past on its own, with -no cron job, no scheduled task, and no admin action. - -Same reasoning kills the `page: 1` field. Pagination is a function of how many events exist and -how many fit on a screen; storing a page number means renumbering everything whenever one event -is added. - -**Where to compute it:** return all events from one endpoint and split them in the browser. - -```ts -const now = Date.now(); -const upcoming = events.filter((e) => new Date(e.startsAt).getTime() >= now); -const past = events.filter((e) => new Date(e.startsAt).getTime() < now); -``` - -Not a `?when=upcoming` query parameter. A club runs tens of events, not thousands β€” one request, -one cache entry, both sections rendered, and no risk of the two views disagreeing. Revisit if -the collection ever passes a few hundred documents. - -### Schema - -```ts -// server/src/models/Event.ts -{ - name: { type: String, required: true }, - startsAt: { type: Date, required: true }, - description: { type: String, required: true }, - tag: { type: String, required: true }, // "Social" | "Competition" | … - link: { type: String }, // optional external link (Instagram post) - imageUrl: { type: String }, // from blueprint 00 - imagePublicId: { type: String }, -} -// { timestamps: true } -``` - -Field-by-field reasoning: - -| Field | Why | -|---|---| -| `startsAt` as `Date` | Not a string. Mongo sorts and compares dates correctly; strings sort correctly only by accident. | -| `tag` as a plain string | The current page derives its filter buttons from whatever tags exist. A `z.enum` would mean a code change to add a tag, which defeats the point of a CMS. Validate it as a non-empty trimmed string. | -| `link` optional | Several current events point at an Instagram post; some won't have one. | -| No `isDone` | Derived. | -| No `page` | Derived. | -| No `endsAt` | Nothing displays it today. Add it when something does. | - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/events` | public | All events sorted `startsAt: -1`. Returns `[]` when empty, never 404. | -| `POST` | `/api/admin/events` | admin | `validate(eventSchema)`, responds `201`. | -| `PUT` | `/api/admin/events/:id` | admin | `validate(eventSchema)`, `404` if no such id. | -| `DELETE` | `/api/admin/events/:id` | admin | **No `validate`** β€” a delete has no body. | - -## Server work - -1. **Model** β€” create `server/src/models/Event.ts`, fields above (see the worked example in - [../07-adding-a-feature.md](../07-adding-a-feature.md)). -2. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/event.ts`. - `startsAt` needs `z.coerce.date()`, because JSON has no date type and the body arrives as an - ISO string. Give `name` and `description` sensible `max()` lengths with readable messages. -3. **Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/events.ts`: - `GET /` β†’ `Event.find().sort({ startsAt: -1 })`. -4. **Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ `server/src/routes/admin/events.ts` - with the three handlers. Guard both `:id` routes with `mongoose.isValidObjectId` (see - [../03-backend-reference.md](../03-backend-reference.md)). If blueprint 00 is done, call - `destroyAsset` in the delete handler. -5. **Mount** in `server/src/app.ts` β€” public anywhere, admin **below** the `requireAdmin` line. - -Test with curl before writing any React. `GET /api/events` should return `[]` on a fresh -database, and `POST /api/admin/events` should 401 when logged out. - -## Client work - -6. **Schema** β€” copy `client/src/schemas/content.ts` β†’ `client/src/schemas/event.ts`. Keep it in - sync with the server copy. -7. **Hooks** β€” copy `client/src/hooks/useHomeContent.ts` β†’ `client/src/hooks/useEvents.ts`. Key - `["events"]`; `useEvents()`, `useCreateEvent()`, `useUpdateEvent()`, `useDeleteEvent()`. Each - mutation invalidates `["events"]` on success and carries the 401 `onError`. -8. **Admin page** β€” copy `client/src/pages/admin/HomeContentEditor.tsx` β†’ - `client/src/pages/admin/EventsEditor.tsx`. A list of existing events with edit and delete - buttons, plus a create form. Use `` for `startsAt`. -9. **Menu + route** β€” `{ to: "/admin/events", label: "Events" }` in `AdminLayout.tsx`, and - `{ path: "events", element: }` in `client/src/main.tsx`. -10. **Public page** β€” in `client/src/pages/Events.tsx`, delete the hardcoded array and call - `useEvents()`. **Keep the tag filter and the pagination** β€” they work. Derive the tag list - from the fetched data instead of hardcoding it, and derive `eventIsDone` from `startsAt` - when passing props to `EventsElement`. - -`client/src/components/EventsElement.tsx` needs its prop names updated (`eventName` β†’ `name`, -and so on) or a small mapping at the call site. Either is fine; mapping at the call site is a -smaller diff. - -## Gotchas for this feature - -- **`z.coerce.date()`, not `z.date()`.** The body arrives as JSON, so `startsAt` is a string. A - plain `z.date()` rejects every request and the error message won't make it obvious. -- **`` gives you a local-time string with no timezone.** It becomes - a UTC `Date` on the server. For a club whose events are all in Auckland this is fine, but be - aware that an event created at 11pm can display on the next day if you format it carelessly. - Format with `toLocaleDateString("en-NZ")` and don't chop the ISO string by hand. -- **`EventsElement` types `eventImage` as `string`.** A build-time asset import is a string too, - so a CMS URL drops in without a type change β€” but give it a placeholder for events with no - image, or you'll render a broken ``. -- **Sort direction.** The admin list wants newest first (`-1`). The public "upcoming" section - reads better soonest-first. Sort once on the server and reverse the upcoming slice in the - component rather than making two requests. -- **Don't reuse `eventIsDone` as a field name** even though the component prop is called that. - The whole point is that it isn't stored. - -## Definition of done - -- [ ] `GET /api/events` returns `[]` against an empty database. -- [ ] An admin can create, edit and delete an event; each change shows on `/events` without a - manual refresh. -- [ ] An event whose date has passed appears as past **with no admin action**. -- [ ] Submitting an empty form shows the server's validation message. -- [ ] `DELETE` with a malformed id returns `400`, not `500`. -- [ ] `/events` still renders with the server stopped. -- [ ] The tag filter and pagination still work, driven by fetched data. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -- An `endsAt` field and multi-day events. -- A "featured event" flag surfaced on the homepage. -- Ticket or RSVP links as structured fields rather than one `link`. -- Server-side pagination, if the collection ever gets big enough to need it. diff --git a/docs/blueprints/02-team-members.md b/docs/blueprints/02-team-members.md deleted file mode 100644 index cffb2a7..0000000 --- a/docs/blueprints/02-team-members.md +++ /dev/null @@ -1,141 +0,0 @@ -# Blueprint 02 β€” Team members - -The exec team changes every year. The requirement is that next year's committee can update the -team page themselves, and that previous years don't vanish. - -Today `client/src/pages/Team.tsx` hardcodes `` components with placeholder names and -stock photo URLs, in two sections: "Executive Section" and "Member Section". - -## What the admin can do - -- Add a team member: name, role, section, photo, LinkedIn and Instagram links. -- Reorder members within a section, so the President appears before the Treasurer. -- Mark a member inactive rather than deleting them. -- Roll over to a new year without touching last year's entries. -- Optionally, let the public browse past years. - -## Decisions already made for you - -### `year` is a field on each member, not a separate collection - -A handover is then: the new committee adds documents with `year: 2027`. Last year's documents -stay exactly as they are and become an archive for free. - -The alternative β€” editing existing documents in place each year β€” destroys history the first -time it's used, and there's no undo. - -```ts -// server/src/models/TeamMember.ts -{ - name: { type: String, required: true }, - role: { type: String, required: true }, // "President", "Events Officer", … - section: { type: String, required: true }, // "executive" | "member" - year: { type: Number, required: true }, - order: { type: Number, default: 0 }, - active: { type: Boolean, default: true }, - photoUrl: { type: String }, // from blueprint 00 - photoPublicId: { type: String }, - linkedin: { type: String }, - instagram: { type: String }, -} -// { timestamps: true } -``` - -| Field | Why | -|---|---| -| `year` as `Number` | `2026`, not `"2026/27"`. Sorts and compares without parsing. Display it however you like. | -| `section` | Mirrors the two headings the page already has. A string, not an enum, so a third section doesn't need a code change β€” validate it as non-empty. | -| `order` | Committee order is meaningful and is not alphabetical. Without this you cannot put the President first. Default `0`, tie-break by `name`. | -| `active` | Someone stepping down mid-year should disappear from the site without losing the record. | -| `linkedin` / `instagram` optional | `MemberInfo` renders both icons unconditionally today; make them conditional. | - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/team` | public | Active members for the **newest year present**, sorted `section`, then `order`, then `name`. | -| `GET` | `/api/team?year=2025` | public | Active members for that year. | -| `GET` | `/api/team/years` | public | Distinct years, descending. Lets the public page build a year switcher without fetching everything. | -| `GET` | `/api/admin/team` | admin | **All** members including inactive ones, all years. The admin list must show what the public one hides. | -| `POST` | `/api/admin/team` | admin | `validate(teamMemberSchema)`, `201`. | -| `PUT` | `/api/admin/team/:id` | admin | `validate(teamMemberSchema)`. | -| `DELETE` | `/api/admin/team/:id` | admin | No `validate`. | - -**Defaulting to the newest year matters.** If the public route required a `year`, the site would -break on 1 January until someone remembered to update a constant. Instead: - -```ts -const year = req.query.year - ? Number(req.query.year) - : (await TeamMember.findOne().sort({ year: -1 }))?.year; -``` - -Note this is the first route in the codebase to read a query parameter. **Validate it** β€” a -`z.coerce.number().int()` check, or an explicit `Number.isInteger` guard, and `400 BAD_REQUEST` -otherwise. Passing `req.query.year` straight into a Mongo filter is how injection bugs start. - -## Server work - -1. **Model** β€” create `server/src/models/TeamMember.ts`, following the list-shaped pattern in - [../07-adding-a-feature.md](../07-adding-a-feature.md). -2. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/teamMember.ts`. - `year` as `z.coerce.number().int().min(2000).max(2100)`, `order` as - `z.coerce.number().int().default(0)`, the URL fields as `z.url().optional().or(z.literal(""))` - so an empty form field doesn't fail validation. -3. **Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/team.ts`, with the - two `GET`s. Filter `{ active: true }` on the public list. -4. **Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ `server/src/routes/admin/team.ts` - with list, create, update, delete. `mongoose.isValidObjectId` on `:id` routes. Call - `destroyAsset(photoPublicId)` on delete, and when an update replaces the photo. -5. **Mount** in `server/src/app.ts` β€” admin **below** the `requireAdmin` line. - -## Client work - -6. **Schema** β€” copy to `client/src/schemas/teamMember.ts`. -7. **Hooks** β€” copy `client/src/hooks/useHomeContent.ts` β†’ `client/src/hooks/useTeam.ts`. - Careful with keys: the public list is year-dependent, so `["team", year]`, while the admin - list is `["team", "admin"]`. Mutations must invalidate **both** β€” `invalidateQueries({ queryKey: ["team"] })` - matches every key with that prefix, which is exactly what you want. -8. **Admin page** β€” copy `HomeContentEditor.tsx` β†’ `client/src/pages/admin/TeamEditor.tsx`. - Group the list by year, then by section. Include the `ImageUploadField` from blueprint 00. - For `order`, a plain number input is fine and shippable β€” drag-and-drop is a stretch goal. -9. **Menu + route** β€” `{ to: "/admin/team", label: "Team" }` and the matching route. -10. **Public page** β€” `client/src/pages/Team.tsx` calls `useTeam()`, groups by `section`, and maps - over the result into the existing `MemberInfo` component. Keep the two headings. - -`client/src/components/MemberInfo.tsx` needs small changes: render the social icons only when the -link exists, and fall back to a placeholder when `photoUrl` is empty. - -## Gotchas for this feature - -- **A member with no photo will render a broken image.** `MemberInfo` has no fallback today. - Add one before you wire real data in, or your first empty entry looks like a bug. -- **`order` ties.** Two members with `order: 0` come back in whatever order Mongo feels like. - Always add a secondary sort on `name`. -- **The admin list must include inactive members** or nobody can reactivate one. That's why - there's a separate `GET /api/admin/team`. -- **Deleting versus deactivating.** The UI should push `active: false` and make delete the - deliberate, confirmed action β€” a delete also destroys the photo. -- **Query-parameter validation.** See above. This is the first place in the codebase that reads - one, so there's no existing pattern to copy β€” set a good one. -- **The stock photo URLs currently in `Team.tsx` are remote hotlinks.** Don't migrate them into - the database; they'll rot. Upload real photos or leave the field empty. - -## Definition of done - -- [ ] `GET /api/team` returns the newest year's active members with no query parameter. -- [ ] `GET /api/team?year=2025` returns that year's; a garbage `year` returns `400`, not `500`. -- [ ] An admin can add, edit, reorder, deactivate and delete members. -- [ ] Deactivating removes someone from the public page but keeps them in the admin list. -- [ ] Members appear in `order`, with the President first β€” verify by reordering. -- [ ] `/team` still renders with the server stopped. -- [ ] Deleting a member removes their photo from Cloudinary. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -- Drag-and-drop reordering. -- A year switcher on the public page, backed by `GET /api/team/years`. -- A "clone last year's team" button to bootstrap a new committee. -- Per-member bio text and a detail page. diff --git a/docs/blueprints/03-gallery.md b/docs/blueprints/03-gallery.md deleted file mode 100644 index 6b43927..0000000 --- a/docs/blueprints/03-gallery.md +++ /dev/null @@ -1,129 +0,0 @@ -# Blueprint 03 β€” Gallery - -The smallest of the six, *provided* [00-image-uploads.md](00-image-uploads.md) is done first. -Without it there is no feature here at all β€” a gallery is nothing but uploaded images. - -Today `client/src/pages/Gallery.tsx` renders two placeholder PNGs repeated ten times. - -## What the admin can do - -- Upload a photo to the gallery with an optional caption. -- Reorder photos so the best ones lead. -- Delete a photo, which removes it from storage too. -- Do all of this without an event existing β€” gallery photos are standalone. - -## Decisions already made for you - -### The gallery is deliberately not linked to events - -This was specified: gallery images are *not* event-specific. So there is no `eventId`, no `ref`, -no population. - -That's also the right call independently. Club photos are often "a bunch of us at the beach" with -no event behind them, and requiring one would mean inventing fake events to hold photos. - -If you later want event galleries, add an **optional** `eventId` β€” an optional link is easy to add -and a required one is painful to remove. - -### Schema - -```ts -// server/src/models/GalleryImage.ts -{ - url: { type: String, required: true }, // Cloudinary secure_url - publicId: { type: String, required: true }, // Cloudinary public_id - caption: { type: String }, // optional, also used as alt text - order: { type: Number, default: 0 }, -} -// { timestamps: true } -``` - -Both image fields are **required** here, unlike in events and team members. A gallery image -without an image is not a thing. - -| Field | Why | -|---|---| -| `caption` optional | Most photos won't have one. Falls back to a generic alt string. | -| `order` | Explicit control. Default sort is `order` ascending, then `createdAt` descending so new uploads land predictably. | -| No `album` or `tags` | Not asked for. One flat gallery. Adding grouping later is a field and a filter; getting it wrong now is a migration. | - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/gallery` | public | Sorted `order: 1, createdAt: -1`. `[]` when empty. | -| `POST` | `/api/admin/gallery` | admin | `validate(galleryImageSchema)`, `201`. | -| `PUT` | `/api/admin/gallery/:id` | admin | Caption and order. Replacing the image is allowed but rare. | -| `DELETE` | `/api/admin/gallery/:id` | admin | No `validate`. **Must destroy the Cloudinary asset.** | - -No separate admin list endpoint β€” unlike team members there's nothing hidden, so the admin page -reuses `GET /api/gallery`. The homepage editor does the same thing with -`GET /api/content/home`; reusing a public read endpoint in the admin UI is normal. - -## Server work - -1. **Model** β€” create `server/src/models/GalleryImage.ts`, following the list-shaped pattern in - [../07-adding-a-feature.md](../07-adding-a-feature.md). -2. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/gallery.ts`. - `url` as `z.url()`, `publicId` as a non-empty trimmed string, `caption` optional with a - `max(200)`, `order` as `z.coerce.number().int().default(0)`. -3. **Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/gallery.ts`. -4. **Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ - `server/src/routes/admin/gallery.ts`. The delete handler is the interesting one: - - ```ts - const doc = await GalleryImage.findById(req.params.id); - if (!doc) return sendError(res, 404, "NOT_FOUND", "Image not found"); - try { await destroyAsset(doc.publicId); } catch { /* orphaned file beats an undeletable row */ } - await doc.deleteOne(); - res.status(204).end(); - ``` - - Note the deliberate empty catch, and the comment explaining it. A Cloudinary outage must not - stop an admin removing a photo from the site. - -5. **Mount** in `server/src/app.ts` β€” admin **below** the `requireAdmin` line. - -## Client work - -6. **Schema** β€” copy to `client/src/schemas/gallery.ts`. -7. **Hooks** β€” copy `useHomeContent.ts` β†’ `client/src/hooks/useGallery.ts`. Key `["gallery"]`. -8. **Admin page** β€” copy `HomeContentEditor.tsx` β†’ `client/src/pages/admin/GalleryEditor.tsx`. - A thumbnail grid, each tile with a caption field, an order field and a delete button, plus - the `ImageUploadField` for adding new ones. Confirm before deleting β€” it's irreversible. -9. **Menu + route** β€” `{ to: "/admin/gallery", label: "Gallery" }` and the matching route. -10. **Public page** β€” `client/src/pages/Gallery.tsx` calls `useGallery()`, maps over - `data ?? []`, and uses `caption` as the `alt`. Keep the existing grid classes; the layout is - fine, only the data source changes. - -## Gotchas for this feature - -- **An empty gallery is a real state.** With no images, `data ?? []` renders nothing at all and - the page looks broken. Show a short "Photos coming soon" message instead. -- **Upload then save is two steps.** The image reaches Cloudinary before the document exists. If - the admin closes the tab in between, the file is orphaned. Acceptable; noted in blueprint 00. -- **Full-resolution images will make this page enormous.** Ten phone photos is easily 40 MB. The - quick fix is Cloudinary transformation parameters in the URL (`w_400,c_fill,q_auto,f_auto`) for - the thumbnails β€” a stretch goal, but the one that matters most here. -- **`alt` text.** Use the caption when there is one, and a sensible generic string when there - isn't. Never leave `alt` empty on a content image. -- **The delete is genuinely irreversible** β€” the document and the file both go. Confirm first. - -## Definition of done - -- [ ] `GET /api/gallery` returns `[]` against an empty database, and the page shows an empty - state rather than a blank strip. -- [ ] An admin can upload a photo and see it on `/gallery` without a refresh. -- [ ] Changing `order` visibly reorders the public grid. -- [ ] Deleting removes the document **and** the Cloudinary asset. -- [ ] Every image has meaningful `alt` text. -- [ ] `/gallery` still renders with the server stopped. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -- Cloudinary transformations for thumbnails and a responsive `srcset`. -- A lightbox on click. -- Drag-and-drop reordering and multi-file upload. -- Albums, or an optional link to an event. diff --git a/docs/blueprints/04-theme-and-fonts.md b/docs/blueprints/04-theme-and-fonts.md deleted file mode 100644 index 5c698c4..0000000 --- a/docs/blueprints/04-theme-and-fonts.md +++ /dev/null @@ -1,241 +0,0 @@ -# Blueprint 04 β€” Theme colours and fonts - -The intuition in the original brief was right: *if all the colours and fonts are variables, this -should be doable.* They mostly are β€” `client/src/tokens.css` already defines semantic tokens on -top of a palette. The catch is that **most components ignore those tokens and hardcode colours**, -so the CMS half of this is easy and the refactor half is the actual work. - -Read this whole page before writing anything. It's the one blueprint where the design decision -matters more than the code. - -## What the admin can do - -- Change the site's accent colours and background/foreground colours from a colour picker. -- Choose a heading font and a body font from a small curated list. -- See changes on the public site immediately, with no rebuild and no redeploy. -- Reset to the UMSA defaults in one click. - -## Decisions already made for you - -### How Tailwind v4 makes this possible - -There is no `tailwind.config.js`. Tailwind v4 is configured in CSS, and `client/src/tokens.css` -opens with: - -```css -@theme { - --color-foreground-primary: var(--color-gray-800); - --color-background-primary: var(--color-gray-20); - --color-accent1-primary: var(--color-blue-500); - --color-accent1-secondary: var(--color-blue-300); - /* …then the full UMSA palette: --color-gray-900 … --color-blue-50 */ -} -``` - -A `@theme` block does two things: it emits those custom properties onto `:root`, **and** it -generates utility classes that *reference the variable* rather than baking in its value. So -`bg-accent1-primary` compiles to roughly: - -```css -.bg-accent1-primary { background-color: var(--color-accent1-primary); } -``` - -Which means overriding the variable at runtime restyles every element using that utility: - -```ts -document.documentElement.style.setProperty("--color-accent1-primary", "hsla(160, 70%, 45%, 1)"); -``` - -No rebuild, no CSS-in-JS, no class swapping. That's the whole mechanism. - -> **Do not change `@theme` to `@theme inline`.** The `inline` variant substitutes values at build -> time instead of emitting `var()` references, and runtime theming stops working entirely. If -> theming mysteriously does nothing, check this first. - -### Store the semantic tokens only, not the palette - -The `@theme` block has two kinds of variable: ten semantic tokens -(`--color-accent1-primary`, `--color-background-primary`, …) and roughly forty palette primitives -(`--color-gray-800`, `--color-blue-500`, …). - -**The CMS controls the semantic tokens.** The palette stays in CSS. - -Giving an admin forty colour pickers guarantees an unusable site. Giving them six named choices β€” -"accent", "secondary accent", "page background", "body text" β€” is a decision they can actually -make, and the palette remains a designer's job in Figma. - -### Schema - -A singleton. There is only ever one theme. - -```ts -// server/src/models/SiteTheme.ts -{ - foregroundPrimary: { type: String }, // "hsla(250, 15%, 20%, 1)" or "#2b2733" - foregroundSecondary: { type: String }, - backgroundPrimary: { type: String }, - backgroundSecondary: { type: String }, - accent1Primary: { type: String }, - accent1Secondary: { type: String }, - accent2Primary: { type: String }, - accent2Secondary: { type: String }, - headingFont: { type: String }, // one of the allowlist below - bodyFont: { type: String }, -} -// { timestamps: true } -``` - -Every field optional, with `THEME_DEFAULTS` in the route β€” exactly like `HOME_DEFAULTS` in -`server/src/routes/content.ts`. An empty database returns the defaults and the site looks -correct. - -**Colours are stored as CSS colour strings**, not as `{ h, s, l }` objects. The value goes -straight into `setProperty`, and any format a browser accepts works. Validate with a regex for -`#rgb`, `#rrggbb`, `rgb()`, `rgba()`, `hsl()` or `hsla()` β€” this string ends up in a stylesheet, -so an unvalidated value is a (mild) injection surface. Reject anything that isn't clearly a -colour. - -### Fonts are an allowlist, not a text field - -```ts -export const FONT_OPTIONS = ["system", "inter", "poppins", "playfair"] as const; -``` - -A free-text font name is a trap: a browser silently falls back when the font isn't installed, so -the admin sees their choice work on their own machine and nobody else's. An enum of fonts the -repo actually ships cannot fail that way. - -Ship them properly rather than hotlinking Google Fonts: - -```bash -pnpm --filter client add @fontsource/inter @fontsource/poppins @fontsource/playfair-display -``` - -Import all of them once in `client/src/index.css`; the runtime switch only changes which -`font-family` the CSS variable points at. Three extra font files is a fair price for a font -picker that works, but keep the list to three or four β€” each one is real bytes on every page load. - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/theme` | public | Returns the theme merged over `THEME_DEFAULTS`. Never 404s. | -| `PUT` | `/api/admin/theme` | admin | `validate(themeSchema)`, `findOneAndUpdate({}, …, { upsert: true })`. | - -Identical in shape to `/api/content/home`. Copy that pair of files and change the fields. - -## The prerequisite refactor - -**This is the part that will surprise you.** Components across the app hardcode raw palette -classes rather than semantic tokens: - -```tsx -// client/src/layouts/AdminLayout.tsx -
-// client/src/App.tsx -

-// client/src/components/EventsElement.tsx -className={`… ${element.eventIsDone ? "bg-gray-700 opacity-50" : "bg-gray-900 hover:bg-gray-800 …"}`} -``` - -Changing `--color-accent1-primary` does nothing to any of those. `bg-gray-950` isn't even defined -in `tokens.css` β€” it falls through to Tailwind's stock grey. - -So a theme feature that stops at the API is a theme feature that visibly does nothing. Before or -alongside the CMS work, migrate public components to semantic tokens: - -| Hardcoded | Becomes | -|---|---| -| `bg-gray-950`, `bg-gray-900` | `bg-background-primary`, `bg-background-secondary` | -| `text-white`, `text-gray-400` | `text-foreground-primary`, `text-foreground-secondary` | -| `bg-blue-300`, `focus:border-blue-300` | `bg-accent1-secondary`, `focus:border-accent1-secondary` | - -Two notes on scope. The current semantic tokens describe a **light** theme -(`--color-background-primary` is `gray-20`, nearly white) while the site renders dark. Agree the -intended direction with whoever owns the design before mass-renaming classes β€” the tokens may -need their default values flipped, and that's a design decision, not a code one. - -And leave the admin panel hardcoded. An admin who picks an unreadable colour scheme must still be -able to reach the form to fix it. **The CMS must not be able to break itself.** - -## Server work - -1. **Model** β€” copy `server/src/models/HomeContent.ts` β†’ `server/src/models/SiteTheme.ts`. -2. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/theme.ts`. A shared - `cssColor` helper (`z.string().trim().regex(...)`) reused for each colour field, plus - `z.enum(FONT_OPTIONS)` for the two font fields. All `.optional()`. -3. **Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/theme.ts`, with a - `THEME_DEFAULTS` object mirroring the current values in `tokens.css`, and - `{ ...THEME_DEFAULTS, ...doc }` on the way out. -4. **Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ `server/src/routes/admin/theme.ts`. -5. **Mount** in `server/src/app.ts` β€” admin **below** the `requireAdmin` line. - -## Client work - -6. **Schema** β€” copy to `client/src/schemas/theme.ts`, exporting `FONT_OPTIONS` for the picker. -7. **Hooks** β€” copy `useHomeContent.ts` β†’ `client/src/hooks/useTheme.ts`, key `["theme"]`. -8. **Apply the theme** β€” a small `useApplyTheme()` hook called once in - `client/src/layouts/RootLayout.tsx`: - - ```ts - const { data } = useSiteTheme(); - useLayoutEffect(() => { - if (!data) return; - const root = document.documentElement; - root.style.setProperty("--color-accent1-primary", data.accent1Primary); - // …one line per token, or drive it from a tokenβ†’CSS-variable map - root.style.setProperty("--font-sans", FONT_STACKS[data.bodyFont]); - }, [data]); - ``` - - `useLayoutEffect`, not `useEffect`, so the properties are set before the browser paints. - - Call it in `RootLayout` only β€” **not** in `AdminLayout`. See above. - -9. **Admin page** β€” copy `HomeContentEditor.tsx` β†’ `client/src/pages/admin/ThemeEditor.tsx`. - `` for each colour, `` only speaks `#rrggbb`.** The tokens are all `hsla()`. Either convert - on the way in and out, or accept that saving through the picker converts everything to hex. - Converting is nicer; accepting hex is fine and much less code. Decide once and write it down. -- **Alpha is lost** through a native colour input. If any token needs transparency, that field - needs a text input rather than the picker. -- **Flash of default theme on first paint.** The theme arrives from an API call, so the page - paints with `tokens.css` values first. Keep `THEME_DEFAULTS` on the server **identical** to the - values in `tokens.css` and the flash is invisible until someone actually customises. Don't try - to fix it with a blocking request β€” a brief flash is much better than a white screen. -- **`client/src/index.css` has a second, unrelated `:root` block** with `--text`, `--bg`, - `--accent` and a `prefers-color-scheme: dark` override. Those are leftovers from the Vite - template, they are not Tailwind tokens, and almost nothing uses them. Don't wire the CMS to - them. Deleting them is a reasonable side quest, in its own commit. -- **Contrast.** An admin can pick white text on a white background. A minimum-contrast check in - the editor is a stretch goal, but a "Reset to defaults" button is the cheap safety net and it's - in the required scope for that reason. - -## Definition of done - -- [ ] `GET /api/theme` returns sensible defaults against an empty database. -- [ ] Changing an accent colour in the admin panel visibly changes the public site after a save, - with no rebuild. -- [ ] Changing the heading font visibly changes headings. -- [ ] A garbage colour value (`"; background: url(...)"`) is rejected with `400`. -- [ ] "Reset to defaults" restores the original look. -- [ ] The admin panel remains readable and usable no matter what theme is saved. -- [ ] Public components use semantic tokens, not raw palette classes. -- [ ] The public site still renders correctly with the server stopped. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -- A contrast checker warning in the editor. -- Saved theme presets to switch between. -- Light/dark variants of the palette. -- Spacing and border-radius tokens (`@theme` supports far more than colour). -- Uploading a custom webfont β€” genuinely hard; don't. diff --git a/docs/blueprints/05-logos-and-branding.md b/docs/blueprints/05-logos-and-branding.md deleted file mode 100644 index d9b4281..0000000 --- a/docs/blueprints/05-logos-and-branding.md +++ /dev/null @@ -1,148 +0,0 @@ -# Blueprint 05 β€” Logos and branding - -Small, and a good second feature once [00-image-uploads.md](00-image-uploads.md) exists. - -The brief asked whether the logo needs to be "a variable throughout" β€” yes, and it currently -isn't one at all. There is **no logo asset in the repo**. `client/src/components/Navbar.tsx` -renders the literal text "UMSA", and `client/index.html` links a `/favicon.svg` that doesn't -exist (there's no `client/public/` directory either). - -So this blueprint introduces the logo as a concept, not just a CMS field for one. - -## What the admin can do - -- Upload a logo and see it in the navbar and footer. -- Upload a favicon. -- Edit the site name used in page titles and as the logo's alt text. -- Update the Instagram and Facebook links without a code change. - -## Decisions already made for you - -### One `SiteSettings` singleton for all site-wide chrome - -Not a separate model per item. These are all "things that appear on every page and change once a -year", they're always fetched together, and one document means one request. - -```ts -// server/src/models/SiteSettings.ts -{ - siteName: { type: String }, // "UMSA" β€” alt text and page titles - logoUrl: { type: String }, - logoPublicId: { type: String }, - faviconUrl: { type: String }, - faviconPublicId: { type: String }, - instagramUrl: { type: String }, - facebookUrl: { type: String }, -} -// { timestamps: true } -``` - -Every field optional with `SETTINGS_DEFAULTS` in the route, same as `HOME_DEFAULTS` in -`server/src/routes/content.ts`. The defaults are the values hardcoded in `Navbar.tsx` and -`Footer.tsx` today, so an empty database reproduces the current site exactly. - -**Keep this separate from `SiteTheme`** (blueprint 04) even though both are singletons an admin -edits under "site settings". They have different shapes, different validation and different -consumers, and a combined model means every colour tweak rewrites the logo fields. Two small -singletons, two small editors. - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/settings` | public | Merged over `SETTINGS_DEFAULTS`. Never 404s. | -| `PUT` | `/api/admin/settings` | admin | `validate(settingsSchema)`, upsert. | - -**Careful:** `/api/admin/settings` in this blueprint is *site* settings. Blueprint 06 uses -`/api/admin/settings/admins` for admin accounts. Those two coexist fine, but if you're building -both, mount the routers so one doesn't swallow the other's paths β€” or rename this one to -`/api/admin/site-settings`. Agree it with whoever has blueprint 06 before either of you starts. - -## Server work - -1. **Model** β€” copy `server/src/models/HomeContent.ts` β†’ `server/src/models/SiteSettings.ts`. -2. **Schema** β€” copy `server/src/schemas/content.ts` β†’ `server/src/schemas/settings.ts`. URLs as - `z.url().optional().or(z.literal(""))` so a cleared form field validates. `siteName` trimmed, - 1–60 characters. -3. **Public route** β€” copy `server/src/routes/content.ts` β†’ `server/src/routes/settings.ts`, with - `SETTINGS_DEFAULTS`. -4. **Admin route** β€” copy `server/src/routes/admin/content.ts` β†’ - `server/src/routes/admin/settings.ts`. When an update replaces `logoPublicId`, destroy the old - asset. -5. **Mount** in `server/src/app.ts` β€” admin **below** the `requireAdmin` line. - -## Client work - -6. **Schema** β€” copy to `client/src/schemas/settings.ts`. -7. **Hooks** β€” copy `useHomeContent.ts` β†’ `client/src/hooks/useSettings.ts`, key `["settings"]`. -8. **Navbar** β€” in `client/src/components/Navbar.tsx`, replace the hardcoded "UMSA" text: - - ```tsx - const { data } = useSettings(); - // … - {data?.logoUrl - ? {data.siteName - : {data?.siteName ?? "UMSA"}} - ``` - - **Always keep the text fallback.** With no logo uploaded, or the API down, the navbar must - still say something. - -9. **Footer** β€” `client/src/components/Footer.tsx` currently hardcodes the Instagram and Facebook - hrefs. Point them at `data?.instagramUrl ?? `. -10. **Favicon** β€” the one genuinely fiddly bit. `client/index.html` is static, so a CMS favicon - has to be swapped at runtime: - - ```ts - useEffect(() => { - if (!data?.faviconUrl) return; - let link = document.querySelector("link[rel~='icon']"); - if (!link) { link = document.createElement("link"); link.rel = "icon"; document.head.appendChild(link); } - link.href = data.faviconUrl; - }, [data?.faviconUrl]); - ``` - - Put this in the same hook as the navbar's data fetch, or in `RootLayout`. - -11. **Admin page** β€” copy `HomeContentEditor.tsx` β†’ `client/src/pages/admin/SettingsEditor.tsx`. - Two `ImageUploadField`s, a site-name input, two URL inputs. Preview the logo against both a - light and a dark background β€” logos are usually designed for one and break on the other. -12. **Menu + route** β€” `{ to: "/admin/settings", label: "Site settings" }` and the matching route. - -## Gotchas for this feature - -- **`client/index.html` still says `client`** and links a non-existent - `/favicon.svg`. Fix the title while you're here; it's the browser tab of the live site. -- **Page titles are set imperatively** β€” several pages do `useEffect(() => { document.title = … })` - with a hardcoded `"| UMSA"` suffix. If `siteName` becomes editable, those suffixes should read - from settings, or they'll contradict it. A small shared `usePageTitle(name)` hook is the tidy - fix. -- **Logo aspect ratio.** Constrain with `h-10 w-auto` and never a fixed width β€” an admin will - upload something square and something very wide, and both must look acceptable. -- **Don't delete `client/src/assets/`.** Those imports are build-time assets used by About, - Sponsors and the project-team pages, and they are not part of this feature. -- **A favicon is not a logo.** It renders at 32px. Keep them as separate fields, and say so in - the form's help text, or someone will upload a wide wordmark and get an unreadable smudge. -- **Settings load on every public page**, so keep the query's `staleTime` generous (five minutes - or more) β€” this data changes about once a year. - -## Definition of done - -- [ ] `GET /api/settings` returns the current hardcoded values as defaults against an empty - database β€” the site looks identical before anyone touches the CMS. -- [ ] Uploading a logo changes the navbar without a rebuild. -- [ ] With no logo, the navbar falls back to the site name as text. -- [ ] Uploading a favicon changes the browser tab icon. -- [ ] Social links in the footer come from settings. -- [ ] Replacing the logo destroys the old Cloudinary asset. -- [ ] Every public page still renders with the server stopped. -- [ ] The `/api/admin/settings` path collision with blueprint 06 has been agreed. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md). -- [ ] `pnpm lint` passes. - -## Stretch goals - -- Separate light and dark logo variants. -- Open Graph image and description for link previews. -- More social platforms, as an array rather than fixed fields. -- A contact email and address surfaced in the footer. diff --git a/docs/blueprints/06-admin-accounts.md b/docs/blueprints/06-admin-accounts.md deleted file mode 100644 index 9006c76..0000000 --- a/docs/blueprints/06-admin-accounts.md +++ /dev/null @@ -1,199 +0,0 @@ -# Blueprint 06 β€” Admin accounts and hardening - -The only blueprint where most of the work is already done. Login, sessions, the guard and logout -all work β€” read [../04-auth.md](../04-auth.md) before this page, because this one only describes -the gaps. - -Independent of every other blueprint. Do it whenever. - -## What works today - -| Capability | State | -|---|---| -| Log in with email and password | Works. bcrypt cost 12, JWT in an httpOnly cookie. | -| Stay logged in for 7 days | Works. | -| Log out | Works. | -| Every `/api/admin/*` route protected | Works, structurally β€” `app.use("/api/admin", requireAdmin)`. | -| Revoking access instantly | Works. Delete the `AdminUser` document; `requireAdmin` re-checks on every request. | -| Creating the admin account | Works, but only via `pnpm --filter server seed:admin` on a developer's machine. | - -## What the admin should be able to do - -- Add a second admin without a developer running a script. -- See who has admin access. -- Remove an admin β€” but never the last one. -- Change their own password from inside the panel. -- Reset a forgotten password without asking a developer. - -## Decisions already made for you - -### Deliberately out of scope: roles and permissions - -Every admin can do everything. A university club has a handful of trusted committee members, and -a role system would add a `role` field, permission checks on every route, a UI for managing them, -and a class of bug where someone can't do their job. - -If that ever changes, the hook already exists: `requireAdmin` writes `res.locals.admin`, so a -`requireRole("owner")` middleware would layer on top without touching any handler. - -### Endpoints - -| Method | Path | Auth | Notes | -|---|---|---|---| -| `GET` | `/api/admin/settings/admins` | admin | List admins. **Project fields explicitly** β€” never return the document verbatim. | -| `POST` | `/api/admin/settings/admins` | admin | Create with email + initial password. `409` on duplicate email. | -| `DELETE` | `/api/admin/settings/admins/:id` | admin | **Refuse if it's the last admin.** | -| `PUT` | `/api/admin/auth/password` | admin | Change own password. Requires the current password. | -| `POST` | `/api/admin/auth/forgot-password` | **public** | Always `200`, regardless of whether the email exists. | -| `POST` | `/api/admin/auth/reset-password` | **public** | Token + new password. | - -The last two are public and must therefore be mounted **above** the `requireAdmin` line, in -`server/src/routes/admin/auth.ts` alongside login. A forgotten password is by definition a -logged-out state. - -> Note the path collision with [05-logos-and-branding.md](05-logos-and-branding.md), which also -> wants `/api/admin/settings`. Agree with that blueprint's owner before either of you starts β€” -> either mount this at `/api/admin/settings/admins` specifically, or rename theirs to -> `/api/admin/site-settings`. - -### Password reset needs a token model - -```ts -// server/src/models/PasswordResetToken.ts -{ - tokenHash: { type: String, required: true }, // hash of the token, never the token - adminUser: { type: Schema.Types.ObjectId, ref: "AdminUser", required: true }, - expiresAt: { type: Date, required: true }, -} -// { timestamps: true } -// Index: { expiresAt: 1 } with expireAfterSeconds: 0 β€” Mongo TTL, deletes expired docs for you -``` - -Two things worth understanding: - -- **Store a hash of the token, not the token.** Same reasoning as passwords: a leaked database - shouldn't hand out account access. The plaintext token exists only in the emailed link. -- **The TTL index is the cleanup.** `expireAfterSeconds: 0` on `expiresAt` makes MongoDB delete - the document once that time passes. No cron job. This would be the codebase's first non-unique - index β€” see `server/src/models/AdminUser.ts` for how `unique` is declared, and add - `PasswordResetTokenSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 })`. - -Reset links need email delivery. **Resend** is the cheap, low-friction choice -(`pnpm --filter server add resend`, one `RESEND_API_KEY`, a generous free tier). In dev, fall back -to logging the link to the console rather than requiring every developer to hold an API key. - -There's prior art for this in `server/dist/src/lib/email.js` and -`server/dist/src/models/PasswordResetToken.js` β€” compiled leftovers with no TypeScript source. -Read for reference, never import. See [../08-gotchas.md](../08-gotchas.md). - -## Server work - -**Part A β€” admin management** (do this first; it's most of the value) - -1. **Schema** β€” copy `server/src/schemas/auth.ts` β†’ extend with `createAdminSchema` (email + - password with `min(8)`) and `changePasswordSchema` (`currentPassword`, `newPassword`). -2. **Route** β€” copy `server/src/routes/admin/content.ts` β†’ - `server/src/routes/admin/adminUsers.ts`. Three handlers. The delete guard: - - ```ts - if ((await AdminUser.countDocuments()) <= 1) { - return sendError(res, 400, "BAD_REQUEST", "Cannot delete the last admin account"); - } - ``` - - Without it, one click locks everybody out permanently and only a developer with database - access can recover it. - - Reuse the hashing from `server/scripts/seed-admin.ts` β€” `bcrypt.hash(password, 12)`. Same cost - factor, no exceptions. - - The list handler must project: `AdminUser.find().select("email createdAt")`. - -3. **Change password** β€” add `PUT /password` to `server/src/routes/admin/auth.ts`, behind an - inline `requireAdmin` like `GET /me`. Verify the current password before accepting the new - one, otherwise a hijacked session can lock the real owner out. - -**Part B β€” hardening** (small, high value, do it in the same PR) - -4. **A dedicated login limiter.** Copy `server/src/middleware/rateLimit.ts` and add: - - ```ts - export const loginRateLimit = rateLimit({ windowMs: 15 * 60 * 1000, max: 10 }); - ``` - - Apply it to the login route only. The global 300/15min limiter allows 300 password guesses a - quarter-hour, which is a lot. - -5. **Timing-safe login.** When the email doesn't exist, `server/src/routes/admin/auth.ts` returns - immediately; when it exists but the password is wrong, it waits for bcrypt. That timing - difference reveals which emails are registered, despite the identical message. Fix by always - running a compare: - - ```ts - const DUMMY_HASH = "$2b$12$" + "…"; // hash of a random string, generated once - const ok = user - ? await bcrypt.compare(password, user.passwordHash) - : (await bcrypt.compare(password, DUMMY_HASH), false); - ``` - -**Part C β€” password reset** (largest; split into its own PR) - -6. Model, schemas, the two public routes, and the email helper as described above. - -## Client work - -7. **Hooks** β€” extend `client/src/hooks/useAuth.ts` with `useAdmins()`, `useCreateAdmin()`, - `useDeleteAdmin()`, `useChangePassword()`. Key `["auth", "admins"]`. -8. **Admin page** β€” copy `HomeContentEditor.tsx` β†’ `client/src/pages/admin/AdminUsersEditor.tsx`. - A list with delete buttons, an add form, and a change-your-own-password form. Disable the - delete button when only one admin remains, *and* keep the server-side guard β€” client-side - checks are UX, server-side checks are security. -9. **Menu + route** β€” `{ to: "/admin/admins", label: "Admin accounts" }` and the matching route. -10. **Reset pages** β€” `/admin/forgot-password` and `/admin/reset-password`, both **outside** - `AdminLayout` in `client/src/main.tsx`, next to `/admin/login`. Inside the layout they'd be - behind the guard, which is exactly backwards. - -## Gotchas for this feature - -- **Deleting yourself.** Nothing stops an admin deleting their own account. `requireAdmin` - re-checks the user on every request, so their very next action 401s and the session dies - mid-click. Either block self-deletion or handle the redirect gracefully β€” blocking is simpler. -- **The last-admin guard is a race in theory.** Two simultaneous deletes could both see a count - of 2. With this many users it will never happen; don't build a transaction for it, just know - it's there. -- **`POST /forgot-password` must always return `200`**, whether or not the email exists. - Otherwise it becomes an account-enumeration oracle and undoes the work in step 5. -- **Don't email the token hash.** The link carries the plaintext token; the database stores its - hash. Getting these backwards makes reset links that can never validate. -- **The seed script still works** and is still the bootstrap path for a fresh database. Don't - remove it. It's also the recovery route if someone does get locked out. -- **Never log a password or a token**, including in a `console.log` you mean to delete. -- **Resend's free tier only sends to verified addresses** until a domain is verified. Fine for a - committee; check it before assuming reset works for anyone. - -## Definition of done - -**Part A + B:** -- [ ] An admin can add a second admin who can then log in. -- [ ] The admin list never includes `passwordHash` β€” check the raw network response. -- [ ] Deleting the last admin returns `400` and does not delete. -- [ ] Changing your own password requires the current one; the new password works on next login. -- [ ] 11 rapid failed logins are rate limited while normal browsing is unaffected. -- [ ] An unknown email and a wrong password take a comparable amount of time. -- [ ] Endpoints added to [../05-api-reference.md](../05-api-reference.md), and the "Known gaps" - section of [../04-auth.md](../04-auth.md) updated. - -**Part C:** -- [ ] A reset link arrives, works once, and is rejected after expiry. -- [ ] `POST /forgot-password` returns `200` for an unknown email. -- [ ] `RESEND_API_KEY` documented in `server/.env.example`, with the dev console fallback working - when it's unset. -- [ ] `pnpm lint` passes. - -## Stretch goals - -- Invite-by-email instead of setting an initial password by hand. -- An audit log of admin actions. -- Two-factor authentication (TOTP). -- Roles β€” but read the note at the top first. -- Session listing and "log out everywhere". Needs a token version field on `AdminUser`. diff --git a/docs/blueprints/README.md b/docs/blueprints/README.md deleted file mode 100644 index c64506b..0000000 --- a/docs/blueprints/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Blueprints - -One file per CMS capability. Each is a **complete spec**: what the admin should be able to do, -the schema and URLs already decided, which files to copy, the gotchas specific to that feature, -and a definition of done. - -They stop short of code. The point is that you can be handed one of these and build it without -first having a design conversation β€” and that two people building two features end up with -consistent APIs. - -Read [../07-adding-a-feature.md](../07-adding-a-feature.md) first. That's the *mechanics*; these -are the *decisions*. - -## Build order - -``` - 00-image-uploads ◄── build this first - β”‚ - β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” - β–Ό β–Ό β–Ό β–Ό - 03-gallery 01-events 02-team 05-logos-and-branding - β”‚ - β–Ό - 04-theme-and-fonts - (independent, but ships with branding) - - 06-admin-accounts β€” independent, do it whenever -``` - -| # | Blueprint | Depends on | Rough size | -|---|---|---|---| -| [00](00-image-uploads.md) | Image uploads | β€” | Large. Unblocks three others. | -| [01](01-events.md) | Events, upcoming/past | 00 (for event images) | Medium. Best first feature. | -| [02](02-team-members.md) | Team members, year to year | 00 (for photos) | Medium. | -| [03](03-gallery.md) | Gallery images | 00 | Small once 00 exists. | -| [04](04-theme-and-fonts.md) | Theme colours and fonts | β€” | Medium, plus a refactor. | -| [05](05-logos-and-branding.md) | Logos and site branding | 00 | Small. | -| [06](06-admin-accounts.md) | Admin accounts and hardening | β€” | Medium. | - -**Image uploads is the foundation.** Gallery, team photos, event images and the logo all need a -way to get a file from an admin's laptop onto the internet. Building that once, first, is the -difference between one upload mechanism and four half-working ones. If you're assigned gallery, -logos, team or events, read [00-image-uploads.md](00-image-uploads.md) even if someone else is -building it β€” your schema stores its output. - -**Events is the best first feature** if uploads aren't ready yet: build it with a plain -`imageUrl` string field, and swap in the upload widget later without touching the model. - -## How to read a blueprint - -Every one has the same seven sections: - -1. **What the admin can do** β€” acceptance criteria in plain English. This is what you're judged - against. If the spec and this list disagree, this list wins. -2. **Decisions already made for you** β€” the schema and the URLs, with reasoning. Don't - redesign these without talking to the tech lead; other people are building against them. -3. **Server work** β€” files to create, each as "copy `X` β†’ `Y`". -4. **Client work** β€” same. -5. **Gotchas for this feature** β€” the things that will actually cost you an afternoon. -6. **Definition of done** β€” the checklist for your PR. -7. **Stretch goals** β€” explicitly out of scope. Don't build these first. - -## Shared decisions - -These hold across every blueprint, so they're stated once here: - -- **Public read routes are unauthenticated** and live at `/api/`. Admin write routes live - at `/api/admin/` and are mounted below the `requireAdmin` line. -- **Public reads never 404 on empty.** Return `[]` for lists and defaults for singletons, so the - public site works against an empty database. -- **Ordering is explicit, not implicit.** Anything an admin can reorder gets an `order: Number` - field. Never rely on insertion order. -- **Dates are stored as `Date`, never as pre-computed booleans or strings.** Derive - "upcoming/past" at read time. -- **Images are stored as `{ url, publicId }` pairs.** The `publicId` is what lets you delete the - file from the host when the document is deleted. -- **Every list feature's public route returns `_id` on each document**, because that's what the - admin UI uses to target updates and deletes. -- **New env variables go in `server/.env.example`** in the same PR. diff --git a/docs/contributors.md b/docs/contributors.md deleted file mode 100644 index 2f375e3..0000000 --- a/docs/contributors.md +++ /dev/null @@ -1,15 +0,0 @@ -# Contributors - -The site builds on the team’s work in [UoaWDCC/umsa](https://github.com/UoaWDCC/umsa). - -- Minahil: About page β€” [#65](https://github.com/UoaWDCC/umsa/pull/65) -- Jacky: committee layout and member cards β€” [#62](https://github.com/UoaWDCC/umsa/pull/62) -- Terrence: homepage, carousel and gallery β€” [#61](https://github.com/UoaWDCC/umsa/pull/61), [#48](https://github.com/UoaWDCC/umsa/pull/48) -- Pruna: homepage and marquee β€” [#55](https://github.com/UoaWDCC/umsa/pull/55), [#56](https://github.com/UoaWDCC/umsa/pull/56) -- Alex: image uploads β€” [#63](https://github.com/UoaWDCC/umsa/pull/63) -- Eric: backend setup, authentication, CMS and deployment fixes -- Andrew: design, fonts and colour tokens -- Tadiwa: navigation -- Alanna: site design adaptations and integration - -Original author information is retained in Git history. diff --git a/dpr-ian.jpg b/dpr-ian.jpg deleted file mode 100644 index a3d58020100118978cbf2a219156758604d62b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84461 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

THvo0_T4yFkNBiD<9pzr|Yh` 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 L+6gqQu_OQ406i5f diff --git a/jay-park.jpg b/jay-park.jpg deleted file mode 100644 index 1721150357d23e7898c5d6dd378d5459048196f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11109 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 diff --git a/karina.jpg b/karina.jpg deleted file mode 100644 index 7629be9ec4add4156e85ff619e551757809e03fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168143 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

MF66UQGz9*8-p$qL)4X`l>BV25$0j4QdJ_; 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

Ikp5bDsnY7 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

Qnl!XYXKK~!W&{AjW?5Yn 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 { - const uri = process.env.ATLAS_URI; - if (!uri) { - throw new Error("ATLAS_URI is required to seed the admin account"); - } - - const email = (process.env.ADMIN_EMAIL || "umsa@projects.wdcc.co.nz").trim().toLowerCase(); - const password = process.env.ADMIN_PASSWORD; - if (!password || password.length < 12) throw new Error("Set ADMIN_PASSWORD to at least 12 characters"); - const passwordHash = await bcrypt.hash(password, 12); - - try { - await mongoose.connect(uri, { serverSelectionTimeoutMS: 10000, dbName: process.env.MONGODB_DB_NAME }); - await AdminUser.findOneAndUpdate( - { email }, - { $set: { passwordHash } }, - { upsert: true, runValidators: true, setDefaultsOnInsert: true }, - ); - console.log(`Admin account created or updated: ${email}`); - } finally { - await mongoose.disconnect(); - } -} - -seedAdmin().catch(() => { - console.error("Unable to seed admin account. Check ATLAS_URI and database access."); - process.exitCode = 1; -});