first commit
This commit is contained in:
commit
34ea15a54d
246 changed files with 18660 additions and 0 deletions
414
docs/PROGRESS.md
Normal file
414
docs/PROGRESS.md
Normal file
|
|
@ -0,0 +1,414 @@
|
|||
# Implementation Progress — Desi Clans
|
||||
|
||||
**Last updated:** 2026-04-04 (Phase 13 visual refinement)
|
||||
|
||||
This file tracks delivery against [ARCHITECTURE.md](./ARCHITECTURE.md) phases.
|
||||
|
||||
---
|
||||
|
||||
## Legend
|
||||
|
||||
| Symbol | Meaning |
|
||||
|--------|---------|
|
||||
| ✅ | Done |
|
||||
| 🟡 | Partial |
|
||||
| ⬜ | Not started |
|
||||
|
||||
---
|
||||
|
||||
## Phase 0 — Constitution
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| PRD.md | ✅ | v1.0 |
|
||||
| ARCHITECTURE.md | ✅ | v1.0 |
|
||||
| DESIGN_SYSTEM.md | ✅ | v1.0 |
|
||||
| API_SPEC.md | ✅ | v1.0 |
|
||||
| DATABASE.md | ✅ | v1.0 |
|
||||
| PROGRESS.md | ✅ | This file |
|
||||
| README.md | ✅ | Root readme |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1a — Project foundation
|
||||
|
||||
### Monorepo & tooling
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Root `.gitignore` | ✅ | Node, Python, env, uploads |
|
||||
| `docker-compose.yml` | ✅ | PostgreSQL 16 for local dev |
|
||||
| Dev scripts (`scripts/*.ps1`, `*.sh`) | ✅ | Backend + frontend |
|
||||
| Root README setup | ✅ | Quick start |
|
||||
|
||||
### Backend foundation
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| FastAPI app entry | ✅ | CORS, optional `/media` mount |
|
||||
| `app/config.py` (Pydantic Settings) | ✅ | `.env` driven |
|
||||
| `app/database.py` | ✅ | SQLAlchemy engine + session |
|
||||
| `app/storage.py` | ✅ | Local + S3 backends |
|
||||
| `requirements.txt` | ✅ | Pinned ranges |
|
||||
| `backend/.env.example` | ✅ | Documented variables |
|
||||
| `backend/README.md` | ✅ | Setup + scripts |
|
||||
| Alembic + migrations | ✅ | Existing revisions (models in repo) |
|
||||
| Health endpoint only in `main` | ✅ | `GET /api/public/health` |
|
||||
| `tests/test_health.py` | ✅ | FastAPI TestClient |
|
||||
| `create_all` removed from `main` | ✅ | Use Alembic for schema |
|
||||
|
||||
### Frontend foundation
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Vite + React (JSX) | ✅ | `frontend/` |
|
||||
| Tailwind CSS v3 | ✅ | Design tokens in config |
|
||||
| React Router | ✅ | Home + 404, `AppLayout` |
|
||||
| Axios client | ✅ | `src/api/client.js` |
|
||||
| GSAP setup | ✅ | `src/animations/gsap.js` + hero fade |
|
||||
| Lucide React | ✅ | Home page icon |
|
||||
| Folder structure | ✅ | api, components, hooks, layouts, pages, styles, utils, animations |
|
||||
| `frontend/.env.example` | ✅ | `VITE_API_URL` |
|
||||
| Vite dev proxy `/api` | ✅ | `vite.config.js` |
|
||||
| `frontend/README.md` | ✅ | |
|
||||
|
||||
### Business features (deferred — next step)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Mount public/admin/auth routers | ⬜ | Code exists under `app/routers/` |
|
||||
| Public event pages (UI) | ⬜ | |
|
||||
| Admin dashboard (UI) | ⬜ | |
|
||||
| Wire Axios to editions API | ⬜ | |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1b — Public site + admin content
|
||||
|
||||
### Backend (routers to enable)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| JWT admin auth | 🟡 | `app/auth.py` + `routers/auth.py` |
|
||||
| Public editions API | 🟡 | `routers/public.py` |
|
||||
| Admin CRUD + media | 🟡 | `routers/admin.py` |
|
||||
| Analytics, share, subscribers | 🟡 | Routers present, not mounted |
|
||||
|
||||
### Frontend
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Events list + detail pages | ⬜ | |
|
||||
| Admin dashboard UI | ⬜ | |
|
||||
| SEO meta per route | 🟡 | Default in `index.html` only |
|
||||
|
||||
### DevOps
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Docker backend image | 🟡 | `backend/Dockerfile` |
|
||||
| CI lint/test | ⬜ | |
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — Design system (UI primitives)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Tailwind tokens (color, type, spacing, radius, shadow) | ✅ | `tailwind.config.js` |
|
||||
| Typography components (`Heading`, `Text`, `Eyebrow`) | ✅ | Fluid display scale |
|
||||
| `Button`, `Badge`, `Card`, `Container` | ✅ | `src/components/ui/` |
|
||||
| `Section`, `SectionHeader`, `SectionSplit` | ✅ | Editorial layouts |
|
||||
| `Navbar`, `NavLink`, `SiteFooter` | ✅ | Mobile menu + sticky header |
|
||||
| `EventCard` | ✅ | Image-led, minimal radius |
|
||||
| `Skeleton`, `Spinner`, `EmptyState` | ✅ | Loading & empty patterns |
|
||||
| Barrel exports | ✅ | `src/components/index.js` |
|
||||
| Showcase route `/system` | ✅ | Responsive verification + breakpoint hook |
|
||||
| `npm run build` | ✅ | Verified |
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — Public homepage (mock data)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `MarketingLayout` + overlay nav | ✅ | Scroll-solid header, anchor links |
|
||||
| Cinematic `HomeHero` | ✅ | Full-viewport, parallax image, GSAP entrance |
|
||||
| Upcoming events + `EventCard` grid | ✅ | `src/data/homeMock.js` |
|
||||
| Featured edition section | ✅ | Editorial split layout |
|
||||
| Cultural categories | ✅ | Image tiles, ink section |
|
||||
| Bengaluru venues list | ✅ | `#venues` |
|
||||
| Immersive gallery | ✅ | Horizontal snap mobile, grid desktop |
|
||||
| Brand story | ✅ | `SectionSplit` + pull quote |
|
||||
| Final CTA + mock subscribe form | ✅ | No API |
|
||||
| Premium `MarketingFooter` | ✅ | |
|
||||
| GSAP ScrollTrigger reveals | ✅ | `useHomeScrollAnimations`, gallery stagger |
|
||||
| `prefers-reduced-motion` | ✅ | Animations skipped |
|
||||
| `overflow-x-hidden` / responsive gutters | ✅ | |
|
||||
| `npm run build` | ✅ | |
|
||||
|
||||
**Not in scope:** backend API, ticketing, auth.
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 — Event details (mock data)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Route `/events/:slug` | ✅ | `EventDetailsPage` |
|
||||
| Mock catalog `eventsMock.js` + `getEventBySlug` | ✅ | 5 editions incl. long title / no cover |
|
||||
| Reusable `components/event/*` sections (10 blocks) | ✅ | Hero → CTA |
|
||||
| Invalid slug empty state | ✅ | Tested `/events/does-not-exist` |
|
||||
| Homepage cards → event routes | ✅ | `EventCard` `to` prop |
|
||||
| Mobile sticky ticket bar | ✅ | Hidden `lg+` |
|
||||
| Document title per edition | ✅ | `useDocumentTitle` |
|
||||
| Payments / checkout | ⬜ | Deferred |
|
||||
| API-driven editions | ⬜ | Replace mock |
|
||||
|
||||
---
|
||||
|
||||
## Phase 5 — FastAPI backend foundation
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `app/core/` config, deps, errors | ✅ | Pydantic Settings, DI, handlers |
|
||||
| `app/db/` session + Base | ✅ | PostgreSQL via `DATABASE_URL` |
|
||||
| `app/models/` package | ✅ | Entities for Alembic |
|
||||
| `app/schemas/` package | ✅ | `HealthResponse` + domain schemas |
|
||||
| `app/api/routes/health.py` | ✅ | `GET /api/health` + DB ping |
|
||||
| `app/main.py` factory | ✅ | CORS, static media, router mount |
|
||||
| Legacy `app/routers/` | 🟡 | Not mounted yet |
|
||||
| `pytest` health test | ✅ | 200 or 503 with DB fields |
|
||||
| API_SPEC.md | ✅ | `/api/health` documented |
|
||||
|
||||
---
|
||||
|
||||
## Phase 6 — Event & venue data layer
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Models: `Venue`, `Event`, `EventMedia`, `TicketType` | ✅ | `app/models/catalog.py` |
|
||||
| Alembic `20260404_0005` | ✅ | FKs, indexes, enums |
|
||||
| `GET /api/events` + filters | ✅ | category, status, upcoming |
|
||||
| `GET /api/events/{slug}` | ✅ | Detail + media + tickets |
|
||||
| `GET /api/venues`, `/api/venues/{id}` | ✅ | |
|
||||
| Pydantic `schemas/catalog.py` | ✅ | |
|
||||
| `scripts/seed_catalog.py` | ✅ | Holi, Garba, Dandiya |
|
||||
| API tests `test_catalog_api.py` | ✅ | 8 pytest total passing |
|
||||
| DATABASE.md / API_SPEC.md | ✅ | |
|
||||
| Frontend wired to API | ✅ | Phase 7 — see below |
|
||||
|
||||
---
|
||||
|
||||
## Phase 7 — Frontend API integration
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `src/services/api.js` | ✅ | Axios client, `ApiError`, health |
|
||||
| `src/services/events.js` | ✅ | List, slug, view mappers |
|
||||
| `src/services/venues.js` | ✅ | List + row mapper |
|
||||
| `useAsyncQuery` + domain hooks | ✅ | `useEventsList`, `useEventDetail`, `useVenuesList` |
|
||||
| Homepage → events + venues API | ✅ | Loading / error / empty / retry |
|
||||
| Event details → slug API | ✅ | 404 empty, error retry |
|
||||
| Presentation vs data separation | ✅ | Sections receive props; no fetch in UI |
|
||||
| `RequestState` / skeletons | ✅ | Shared loading & error UI |
|
||||
| Vitest service tests | ✅ | Success, network, empty, 404 slug |
|
||||
| `npm run build` | ✅ | Production bundle |
|
||||
| Static hero/brand/categories | 🟡 | Still `homeMock.js` (non-catalog) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 8 — Authentication
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `User` model + Alembic `20260404_0006` | ✅ | `users` table, bcrypt hashes only |
|
||||
| `POST /api/auth/register` | ✅ | Validation, 409 on duplicate |
|
||||
| `POST /api/auth/login` | ✅ | JWT `type: user` |
|
||||
| `GET /api/auth/me` | ✅ | `CurrentUser` dependency |
|
||||
| `app/core/security.py` | ✅ | Hash, verify, encode/decode JWT |
|
||||
| Config: `SECRET_KEY`, token TTL | ✅ | Production strength checks |
|
||||
| Frontend `services/auth.js` + `token.js` | ✅ | Bearer interceptor on API client |
|
||||
| `AuthProvider` + `useAuth` | ✅ | Bootstrap via `/me` |
|
||||
| Login / register / account pages | ✅ | Marketing layout |
|
||||
| `ProtectedRoute` (`/account`) | ✅ | Redirect to `/login` |
|
||||
| Navbar sign in / sign out | ✅ | |
|
||||
| Backend tests `test_auth`, `test_security` | ✅ | |
|
||||
| Frontend vitest `auth.test.js` | ✅ | |
|
||||
| Admin RBAC | ⬜ | Deferred — legacy routers not mounted |
|
||||
|
||||
---
|
||||
|
||||
## Phase 9 — Ticket inventory & orders
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `Order`, `OrderItem`, `Ticket` + migration `0007` | ✅ | Inventory reservation, unique codes |
|
||||
| Catalog `TicketType` inventory | ✅ | `FOR UPDATE`, oversell checks |
|
||||
| `GET /api/events/{id}/tickets` | ✅ | |
|
||||
| `POST /api/orders`, `GET` order/tickets | ✅ | Server-side pricing |
|
||||
| Concurrency tests | ✅ | `test_orders.py` |
|
||||
|
||||
---
|
||||
|
||||
## Phase 10 — Payment integration
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Razorpay server SDK + env secrets | ✅ | `razorpay` package |
|
||||
| `PAYMENT_PROVIDER` mock / razorpay | ✅ | Mock for local & CI |
|
||||
| Pending order → verified `paid` | ✅ | Tickets issued after confirm |
|
||||
| `POST …/payment/verify` | ✅ | Signature verification |
|
||||
| Webhooks + idempotency table | ✅ | `0008`, duplicate safe |
|
||||
| Cancel / timeout / failed payment | ✅ | Inventory release |
|
||||
| `Idempotency-Key` on checkout | ✅ | |
|
||||
| Frontend checkout (no secrets) | ✅ | `useCheckout`, Razorpay.js |
|
||||
| Tests `test_payments.py` | ✅ | verify, webhook, cancel |
|
||||
| Garba category image fix | ✅ | `homeMock` + seed alt media |
|
||||
|
||||
---
|
||||
|
||||
## Phase 12 — Admin dashboard
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Admin JWT (`type: admin`) separate from attendees | ✅ | `decode_admin_access_token` |
|
||||
| `POST /api/admin/auth/login`, `GET /api/admin/auth/me` | ✅ | |
|
||||
| RBAC `editor` / `super_admin` deps | ✅ | `EditorAdmin`, `SuperAdmin` |
|
||||
| Dashboard metrics API | ✅ | Revenue, tickets, orders, attendance |
|
||||
| Events / venues / ticket types CRUD | ✅ | Admin catalog services |
|
||||
| Orders & payments lists | ✅ | |
|
||||
| Admin ticket verify | ✅ | Reuses gate logic |
|
||||
| Event statistics | ✅ | Per-event breakdown |
|
||||
| Admin SPA `/admin/*` | ✅ | Tables, forms, filters |
|
||||
| `scripts/seed_admin.py` | ✅ | |
|
||||
| `test_admin_api.py` | ✅ | Attendee blocked |
|
||||
|
||||
---
|
||||
|
||||
## Phase 11 — Digital tickets
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `qr_token` + QR PNG generation | ✅ | Issued on payment; migration `0009` |
|
||||
| `GET /api/tickets/{id}` detail | ✅ | Owner-only digital pass |
|
||||
| `POST /api/tickets/verify` | ✅ | Check-in key, atomic `used` |
|
||||
| Ticket states `valid` / `used` / `cancelled` | ✅ | Renamed from `redeemed` |
|
||||
| React `DigitalTicket` + `/tickets/:id` | ✅ | Branding, QR, metadata |
|
||||
| Account ticket list | ✅ | Links to pass |
|
||||
| Tests `test_digital_tickets.py` | ✅ | QR detail + reuse prevention |
|
||||
|
||||
---
|
||||
|
||||
## Phase 15 — Security audit
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| `docs/SECURITY.md` | ✅ | Assumptions, controls, prod checklist |
|
||||
| Production settings validation | ✅ | Gate key, Razorpay, CORS, admin password |
|
||||
| Mock webhook gated to development | ✅ | |
|
||||
| Admin verify requires gate key | ✅ | Constant-time key compare |
|
||||
| Auth rate limits (in-process) | ✅ | login/register/verify/payment |
|
||||
| Login password min length aligned | ✅ | 8 chars attendee + admin |
|
||||
|
||||
---
|
||||
|
||||
## Phase 14 — Production performance audit
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Route code splitting (marketing, admin, auth) | ✅ | `App.jsx` lazy routes |
|
||||
| Dynamic GSAP load | ✅ | `loadGsap.js` |
|
||||
| API cache + deferred featured detail | ✅ | `queryCache.js`, idle fetch |
|
||||
| Responsive Unsplash `srcSet` | ✅ | `utils/mediaUrl.js` |
|
||||
| Navbar scroll rAF throttle | ✅ | |
|
||||
| `docs/PERFORMANCE.md` | ✅ | Audit + targets |
|
||||
|
||||
---
|
||||
|
||||
## Phase 13b — Hero WebGL atmosphere (single 3D touchpoint)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Home hero festival dust (Three.js) | ✅ | `src/webgl/hero-atmosphere/` only |
|
||||
| Lazy load + idle defer | ✅ | `React.lazy`, `requestIdleCallback`, separate chunk |
|
||||
| Desktop / WebGL / reduced-motion gates | ✅ | `eligibility.js` + vitest |
|
||||
| Mobile & no-WebGL fallback | ✅ | Layer not mounted; hero unchanged |
|
||||
| Offscreen pause (IntersectionObserver) | ✅ | Stops rAF when hero scrolls away |
|
||||
|
||||
---
|
||||
|
||||
## Phase 13 — Visual refinement (public site)
|
||||
|
||||
| Item | Status | Notes |
|
||||
|------|--------|-------|
|
||||
| Typography, spacing, cards (`rounded-2xl`, shadows) | ✅ | Buttons, `EventCard`, tiers, ticket pass |
|
||||
| Nav / hover / section rhythm | ✅ | Editorial nav underline, fade into content |
|
||||
| GSAP: home stagger groups + event detail reveals | ✅ | `useEventDetailAnimations`, parallax heroes |
|
||||
| `prefers-reduced-motion` CSS + GSAP guards | ✅ | `index.css`, hooks skip motion |
|
||||
| Image cropping (`object` focal) + `sizes` | ✅ | Hero, gallery, cards |
|
||||
| Vite chunk split (GSAP) | ✅ | `manualChunks` |
|
||||
| Lighthouse pass (local preview) | 🟡 | Home perf ~86, a11y 96 (preview build); LCP tuned via hero preload + no opacity-hiding H1 |
|
||||
|
||||
---
|
||||
|
||||
## Phase 2b — Polish & performance
|
||||
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| GSAP ScrollTrigger sections | ✅ | Phase 13 |
|
||||
| `prefers-reduced-motion` (beyond GSAP init) | ✅ | Phase 13 |
|
||||
| Image lazy load on real event pages | ✅ | Lazy below fold; hero `fetchPriority` |
|
||||
| Accessibility audit (WCAG AA) | ⬜ |
|
||||
| Lighthouse performance pass | 🟡 | Chunking + LCP hints; audit ongoing |
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — Native ticketing
|
||||
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| DB: ticket_tiers, orders, tickets | ✅ | Phase 9 |
|
||||
| Attendee users + auth | ✅ | Phase 8 |
|
||||
| Checkout + payment webhook | ✅ | Phase 10 |
|
||||
| QR generation + ticket page | ✅ | Phase 11 |
|
||||
| Staff check-in API + UI | ⬜ |
|
||||
| Email ticket delivery | ⬜ |
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 — Hardening
|
||||
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| E2E tests (critical paths) | ⬜ |
|
||||
| Rate limiting / WAF | ⬜ |
|
||||
| Production CDN for media | ⬜ |
|
||||
| Runbooks + monitoring | ⬜ |
|
||||
|
||||
---
|
||||
|
||||
## Current focus (recommended)
|
||||
|
||||
1. Mount existing API routers in `app/main.py` and verify against PostgreSQL.
|
||||
2. Add admin SPA routes and auth token handling.
|
||||
3. GSAP polish, a11y audit, Lighthouse pass (Phase 2b).
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-04-04 | Initial constitution docs |
|
||||
| 2026-04-04 | Phase 1a foundation: frontend scaffold, backend config/database/storage, health API, docker-compose, dev scripts |
|
||||
| 2026-04-04 | Phase 2 design system: Tailwind tokens, React primitives, `/system` showcase |
|
||||
| 2026-04-04 | Phase 3 public homepage: mock data, marketing sections, GSAP motion |
|
||||
| 2026-04-04 | Phase 4 event details: `/events/:slug`, reusable sections, mock catalog |
|
||||
| 2026-04-04 | Phase 5 backend: layered app layout, `/api/health`, PostgreSQL check |
|
||||
| 2026-04-04 | Phase 6 catalog: venues/events/media/tickets API + seed |
|
||||
| 2026-04-04 | Phase 7: services layer, hooks, homepage + event detail API wiring, vitest |
|
||||
| 2026-04-04 | Phase 8: attendee auth API, JWT, React auth flow, tests |
|
||||
| 2026-04-04 | Phase 9–10: orders, Razorpay/mock payments, webhooks, checkout UI |
|
||||
| 2026-04-04 | Phase 11: QR digital passes, verify API, ticket UI |
|
||||
| 2026-04-04 | Phase 13: design-system visual polish, motion, perf chunking |
|
||||
Loading…
Add table
Add a link
Reference in a new issue