15 KiB
15 KiB
Implementation Progress — Desi Clans
Last updated: 2026-04-04 (Phase 13 visual refinement)
This file tracks delivery against 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 | ✅ |
prefers-reduced-motion (beyond GSAP init) |
✅ |
| Image lazy load on real event pages | ✅ |
| Accessibility audit (WCAG AA) | ⬜ |
| Lighthouse performance pass | 🟡 |
Phase 3 — Native ticketing
| Item | Status |
|---|---|
| DB: ticket_tiers, orders, tickets | ✅ |
| Attendee users + auth | ✅ |
| Checkout + payment webhook | ✅ |
| QR generation + ticket page | ✅ |
| 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)
- Mount existing API routers in
app/main.pyand verify against PostgreSQL. - Add admin SPA routes and auth token handling.
- 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 |