lad-website/RESUME.md

186 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LAD Website — Session Resume Guide
**Last updated:** 2026-05-24
**Repo:** `https://gitea.sigd.net/chaulmark/lad-website`
**Local clone:** `/home/chaulmark/websites/lad-website`
**Last commit:** `c9e042f` (Update/Article models, migration script, full rebrand)
**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 | MonFri 9am4pm |
| 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 entire codebase
- Brand color switched from blue (`#1a56db`) 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
- Breaking changes fixed: async params, broken imports, next.config.js remotePatterns
### Pages (all complete)
| Page | File | Status |
|------|------|--------|
| Home | `app/page.tsx` | ✅ Announcement banner, real events, LAD copy |
| About | `app/about/page.tsx` | ✅ 201921 board, 10 affiliated orgs, history |
| Updates | `app/updates/page.tsx` | ✅ Static — needs wiring to backend API |
| Events | `app/events/page.tsx` | ✅ Static — needs wiring to backend API |
| Minutes | `app/minutes/page.tsx` | ✅ Static — needs wiring to backend API |
| Deaf Focus | `app/deaf-focus/page.tsx` | ✅ Static — needs wiring to backend API |
| 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` | Unchanged |
| Video | `models/Video.ts` | Unchanged |
| **Update** | `models/Update.ts` | NEW — news/update posts |
| **Article** | `models/Article.ts` | NEW — 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:**
- 235 updates ✅ (photos are Directus URLs — 403 protected, used as fallback)
- 148 events ✅ (same photo situation)
- 201 public minutes PDFs downloaded to `uploads/documents/`
- 6 Deaf Focus articles ✅
- **230 members-only PDFs** — skipped, need manual upload via admin panel
- Full manifest in `scripts/migration-report.json` (gitignored, regenerated on re-run)
### Infrastructure (complete)
- `mongo-init/01-init.js` — creates `lad_db` user from `MONGO_USER`/`MONGO_PASSWORD` env vars
- `docker-compose.yml` — fully rebranded (lad_db, lad-mongo-data, lad-redis-data)
- `backend/.env.example` — template for all production env vars
- `backend/.gitignore` — excludes uploads/ contents, .env, migration-report.json
---
## What Still Needs To Be Done
### 1. Wire Frontend to Backend API (next up)
Replace static arrays in 4 page files with Next.js Server Component `fetch()` calls:
| Page | API endpoint |
|------|-------------|
| `app/updates/page.tsx` | `GET /api/updates?status=published` |
| `app/events/page.tsx` | `GET /api/events?status=published` |
| `app/minutes/page.tsx` | `GET /api/documents` (isPublic split) |
| `app/deaf-focus/page.tsx` | `GET /api/articles?status=published` |
Recommendation: use Next.js Server Components with `{ next: { revalidate: 3600 } }` for caching.
### 2. Production Deploy on 10.4.0.205
- Add LAD to `webhook-listener/server.py` `REPO_CONFIG` on 10.4.0.205
- Create `backend/.env` from `.env.example` with real credentials
- Add Caddy entry on 10.4.0.205 for the real domain
- `docker compose up -d`
- `docker exec lad-backend npx tsx scripts/migrate-directus.ts`
### 3. 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`
### 4. Minor Cleanup
- Fix duplicate Mongoose index warnings in `Document` model (`documentType` and `isPublic` defined both inline and in `schema.index()`)
---
## File Structure Reference
```
lad-website/
├── frontend/
│ └── src/app/
│ ├── page.tsx ✅ Homepage
│ ├── about/page.tsx ✅ Board + orgs
│ ├── updates/page.tsx ⚡ Static → needs API wiring
│ ├── events/page.tsx ⚡ Static → needs API wiring
│ ├── minutes/page.tsx ⚡ Static → needs API wiring
│ ├── deaf-focus/page.tsx ⚡ Static → needs API wiring
│ ├── contact/page.tsx ✅ LAD contact info
│ ├── membership/page.tsx ✅ LAD copy
│ ├── donate/page.tsx ✅ LAD nonprofit
│ └── 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/ (gitkeep stubs — populated by migration)
│ ├── .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`
- **MongoDB (local dev):** `sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork`
- **Always run build first:** `cd frontend && npm run build` before making changes
- **Gitea token:** embedded in remote URL
---
## How to Resume
1. `cd ~/websites/lad-website`
2. `git log --oneline -3` — confirm at `c9e042f` or later
3. `cd frontend && npm run build` — verify build passes
4. Start dev server: `npm run dev -- --hostname 0.0.0.0`
5. Next task: wire the 4 static pages to the backend API (see section above)