175 lines
7.2 KiB
Markdown
175 lines
7.2 KiB
Markdown
# LAD Website — Session Resume Guide
|
||
|
||
**Last updated:** 2026-05-25
|
||
**Repo:** `https://gitea.sigd.net/chaulmark/lad-website`
|
||
**Local clone:** `/home/chaulmark/websites/lad-website`
|
||
**Last commit:** `82e17d3` (Fix PDF download links — route through Next.js /api/uploads proxy)
|
||
**Dev URL:** `https://lad.sigd.net` → Caddy on 10.8.0.10 → 10.8.0.165:3000
|
||
|
||
---
|
||
|
||
## Stack
|
||
|
||
| Layer | Technology | Notes |
|
||
|-------|-----------|-------|
|
||
| Frontend | Next.js 16, React 19.2, Tailwind CSS v4 | `/frontend/` |
|
||
| Backend | Express 5, TypeScript, MongoDB, Redis | `/backend/` |
|
||
| CMS (source) | Directus at `https://db.lad1908.org` | Being replaced — data migrated |
|
||
| Infra | Docker Compose + Nginx | `/docker-compose.yml` |
|
||
| Git host | Gitea at `gitea.sigd.net` | user: chaulmark |
|
||
|
||
---
|
||
|
||
## Brand Reference
|
||
|
||
| Item | Value |
|
||
|------|-------|
|
||
| Organization | Louisiana Association of the Deaf (LAD) |
|
||
| Founded | 1908 |
|
||
| Brand color | `#13AE3A` (green) |
|
||
| LAD logo | `https://db.lad1908.org/assets/5cdfa81d-ffc8-4cae-a178-5db3bfbaaeb8` |
|
||
| Deaf Focus logo | `https://db.lad1908.org/assets/c15110fe-d25a-4863-8e9c-055bfad3c710` |
|
||
| General contact | info@lad1908.org |
|
||
| Deaf Focus interpreting | request@deaffocus.org / (225) 319-5586 / Fax (225) 308-4025 |
|
||
| Hours | Mon–Fri 9am–4pm |
|
||
| Scraped content | `LAD_CONTENT.md` in repo root |
|
||
|
||
---
|
||
|
||
## What Has Been Done
|
||
|
||
### Rebrand (complete)
|
||
- All "Olathe Club of the Deaf" / "OCD" references replaced with LAD throughout
|
||
- Brand color switched from blue to LAD green (`#13AE3A`) in `globals.css`
|
||
- Navigation, Footer, layout metadata all updated
|
||
|
||
### Package Upgrades (complete)
|
||
- Frontend: Next.js 15→16, React 18→19.2, axios added
|
||
- Backend: Express 4→5, Mongoose 8→9, bcrypt 5→6, helmet 7→8, Zod 3→4
|
||
|
||
### Pages (all complete)
|
||
|
||
| Page | File | Status |
|
||
|------|------|--------|
|
||
| Home | `app/page.tsx` | ✅ Announcement banner, real events, LAD copy |
|
||
| About | `app/about/page.tsx` | ✅ 2019–21 board, 10 affiliated orgs, history |
|
||
| Updates | `app/updates/page.tsx` | ✅ Wired to `GET /api/updates?status=published` |
|
||
| Events | `app/events/page.tsx` | ✅ Wired to `GET /api/events?status=published` |
|
||
| Minutes | `app/minutes/page.tsx` | ✅ Wired to `GET /api/documents`, PDF proxy links |
|
||
| Deaf Focus | `app/deaf-focus/page.tsx` | ✅ Wired to `GET /api/articles?status=published` |
|
||
| Contact | `app/contact/page.tsx` | ✅ Real LAD contact info |
|
||
| Membership | `app/membership/page.tsx` | ✅ LAD copy, fees TBD (contact-us prompt) |
|
||
| Donate | `app/donate/page.tsx` | ✅ LAD nonprofit info |
|
||
|
||
### Backend Models (all complete)
|
||
|
||
| Model | File | Notes |
|
||
|-------|------|-------|
|
||
| Event | `models/Event.ts` | + directusId, photoUrl, photoCaption |
|
||
| Document | `models/Document.ts` | + directusId, directusAssetId, 3 new minute types |
|
||
| Member | `models/Member.ts` | Duplicate index warning fixed |
|
||
| Video | `models/Video.ts` | Unchanged |
|
||
| Update | `models/Update.ts` | News/update posts |
|
||
| Article | `models/Article.ts` | Deaf Focus articles |
|
||
|
||
All models have full CRUD routes at `/api/{collection}`.
|
||
|
||
### Data Migration (complete — local only)
|
||
|
||
Migration script: `backend/scripts/migrate-directus.ts`
|
||
Run with: `npx tsx scripts/migrate-directus.ts` from `/backend/`
|
||
|
||
**Local migration results:**
|
||
- 233 updates ✅
|
||
- 148 events ✅
|
||
- 201 public minutes PDFs downloaded to `uploads/documents/` ✅
|
||
- 6 Deaf Focus articles ✅
|
||
- **230 members-only PDFs** — skipped, need manual upload via admin panel
|
||
|
||
### Frontend API Wiring (complete)
|
||
- All 4 dynamic pages fetch from Express backend via async Server Components
|
||
- 1-hour revalidation cache (`{ next: { revalidate: 3600 } }`)
|
||
- Graceful empty-state fallback if backend is unreachable
|
||
- PDF downloads use Next.js proxy route `/api/uploads/[...path]` — reads from `../backend/uploads/` on filesystem, works through Caddy without exposing backend port
|
||
- `frontend/.env.local` (gitignored): `BACKEND_URL=http://localhost:4000`
|
||
- `frontend/.env.example`: documents env vars for production
|
||
|
||
### Infrastructure (complete)
|
||
- `mongo-init/01-init.js` — creates `lad_db` user from env vars
|
||
- `docker-compose.yml` — fully rebranded
|
||
- `backend/.env.example` — template for all production env vars
|
||
- `backend/src/index.ts` — serves `/uploads` as static files
|
||
|
||
---
|
||
|
||
## What Still Needs To Be Done
|
||
|
||
### 1. Production Deploy on 10.4.0.205
|
||
|
||
- Create `backend/.env` on server from `.env.example` with real credentials
|
||
- Add Caddy entry on 10.4.0.205 for `lad1908.org`
|
||
- `docker compose up -d`
|
||
- Run migration: `docker exec lad-backend npx tsx scripts/migrate-directus.ts`
|
||
- Set `NEXT_PUBLIC_BACKEND_URL` in `frontend/.env` to public-facing backend URL
|
||
|
||
### 2. Admin Panel
|
||
|
||
- Verify JWT login at `/admin/login`
|
||
- Auth middleware: `backend/src/middleware/auth.ts`
|
||
- Test CRUD for all 6 collections
|
||
- Upload the 230 members-only PDFs via `/admin/documents`
|
||
|
||
---
|
||
|
||
## File Structure Reference
|
||
|
||
```
|
||
lad-website/
|
||
├── frontend/
|
||
│ └── src/app/
|
||
│ ├── page.tsx ✅ Homepage
|
||
│ ├── about/page.tsx ✅ Board + orgs
|
||
│ ├── updates/page.tsx ✅ API wired
|
||
│ ├── events/page.tsx ✅ API wired
|
||
│ ├── minutes/page.tsx ✅ API wired + PDF proxy
|
||
│ ├── deaf-focus/page.tsx ✅ API wired
|
||
│ ├── contact/page.tsx ✅ LAD contact info
|
||
│ ├── membership/page.tsx ✅ LAD copy
|
||
│ ├── donate/page.tsx ✅ LAD nonprofit
|
||
│ ├── api/uploads/[...path] ✅ PDF proxy (reads ../backend/uploads/)
|
||
│ └── admin/ (full CRUD panel — needs auth verification)
|
||
├── backend/
|
||
│ ├── src/
|
||
│ │ ├── models/ (Event, Document, Member, Video, Update, Article)
|
||
│ │ ├── controllers/ (full CRUD for all 6)
|
||
│ │ ├── routes/ (REST API)
|
||
│ │ └── middleware/auth.ts (JWT)
|
||
│ ├── scripts/
|
||
│ │ └── migrate-directus.ts ✅ Directus→MongoDB migration
|
||
│ ├── uploads/ (populated by migration — gitignored contents)
|
||
│ ├── .env.example ✅ Production env template
|
||
│ └── .gitignore ✅
|
||
├── mongo-init/01-init.js ✅ Creates lad_db user
|
||
├── docker-compose.yml ✅ lad_db, lad-mongo-data
|
||
├── LAD_CONTENT.md (all scraped content)
|
||
└── RESUME.md (this file)
|
||
```
|
||
|
||
---
|
||
|
||
## Environment / Shell Notes
|
||
|
||
- **EDQUOT issue:** Shell has had recurring disk quota problems from Chrome cache. If bash commands fail silently (exit code 1, no output), check `~/.npm/_cacache`, `~/.cache/tracker3`, `~/.config/chrome-cdp-profile`
|
||
- **Dev server:** `cd ~/websites/lad-website/frontend && npm run dev -- --hostname 0.0.0.0`
|
||
- **Backend dev:** `cd ~/websites/lad-website/backend && npm run dev`
|
||
- **MongoDB (local dev):** `sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork`
|
||
- **Gitea token:** embedded in remote URL
|
||
|
||
---
|
||
|
||
## How to Resume
|
||
|
||
1. `cd ~/websites/lad-website`
|
||
2. `git log --oneline -3` — confirm at `82e17d3` or later
|
||
3. Verify MongoDB is running: `curl -s http://localhost:4000/health` (start backend if needed)
|
||
4. Next task: production deploy on 10.4.0.205, then admin panel verification
|