# Quick Start Guide - Multi-Event System ## 5-Minute Setup ### 1. Database Setup ```bash # Connect to PostgreSQL psql -U wedding_admin -d wedding_guests # Run migrations to create new tables \i backend/migrations.sql # Verify tables created \dt # Should show: users, events, event_members, guests_v2, (and old guests) ``` ### 2. Environment Configuration Copy and update `.env`: ```bash cp backend/.env.example backend/.env ``` For **local development**, keep defaults. For **WhatsApp messaging**, add: ```env WHATSAPP_ACCESS_TOKEN=your_token_here WHATSAPP_PHONE_NUMBER_ID=your_phone_id_here ``` ### 3. Start Backend ```bash cd backend pip install -r requirements.txt python -m uvicorn main:app --reload # API: http://localhost:8000 # Docs: http://localhost:8000/docs ``` ### 4. Start Frontend ```bash cd frontend npm install npm run dev # App: http://localhost:5173 ``` ## Key Differences from Old System ### Old Workflow ``` Login → See all guests → Add guest → Manage guests ``` ### New Workflow ``` Login → See my events → Create/select event → Manage guests for that event ``` ## Basic Usage ### 1. Create an Event - Click "New Event" button - Fill: Name (required), Date, Location - Click Create → Automatically added as admin ### 2. Invite Team Members - On event page, click "Members" - Enter email, select role (admin/editor/viewer), click Invite - Member gets access once they log in ### 3. Add Guests - Click "Add Guest" button - Enter: First name, Last name, Phone, Side (optional), Notes - Status auto-set to "invited" ### 4. Filter Guests - **Search**: By name or phone - **Status**: Show invited/confirmed/declined - **Side**: Group by side (e.g., "groom side") - **Added by me**: Show only guests you added ### 5. Send WhatsApp Messages (if configured) - Click guest → "Send WhatsApp" - Message auto-filled with phone number - Click Send (requires WhatsApp API credentials) ## API Reference (Most Common) ### Get Your Events ```bash GET http://localhost:8000/events # Returns: [ # { id: "uuid", name: "Wedding", date: "...", location: "..." }, # { id: "uuid", name: "Party", date: "...", location: "..." } # ] ``` ### Get Guests for Event ```bash GET http://localhost:8000/events/{event_id}/guests?status=confirmed # Returns: [ # { id: "uuid", first_name: "John", last_name: "Doe", phone: "+1...", status: "confirmed" } # ] ``` ### Create Guest ```bash POST http://localhost:8000/events/{event_id}/guests Content-Type: application/json { "first_name": "John", "last_name": "Doe", "phone": "+1-555-123-4567", "side": "groom side", "status": "invited" } ``` ### Bulk Import Guests ```bash POST http://localhost:8000/events/{event_id}/guests/import Content-Type: application/json { "guests": [ { "first_name": "John", "last_name": "Doe", "phone": "+1-555-0001" }, { "first_name": "Jane", "last_name": "Smith", "phone": "+1-555-0002" } ] } ``` ### Send WhatsApp Message ```bash POST http://localhost:8000/events/{event_id}/guests/{guest_id}/whatsapp Content-Type: application/json { "message": "Hi! Please confirm your attendance" } ``` See full API docs at `http://localhost:8000/docs` when running backend. ## Authentication (TODO) Currently uses `TEST_USER_EMAIL` from `.env` (hardcoded for testing). **To implement real auth**, edit `main.py`: ```python def get_current_user_id() -> UUID: # Replace this placeholder with real auth # Extract from JWT token, session, etc. # Return actual user UUID pass ``` Examples using FastAPI utilities: ```python from fastapi import Depends from fastapi.security import HTTPBearer, HTTPAuthCredentials security = HTTPBearer() def get_current_user_id(credentials: HTTPAuthCredentials = Depends(security)) -> UUID: # Verify JWT token payload = jwt.decode(credentials.credentials, SECRET) return UUID(payload["sub"]) ``` ## File Organization ``` backend/ main.py ← All API endpoints models.py ← Database models (must match schema) schemas.py ← Request/response validation crud.py ← Database operations authz.py ← Who can do what whatsapp.py ← WhatsApp messaging database.py ← DB connection .env ← Configuration (copy from .env.example) frontend/src/ App.jsx ← Main navigation (events → guests → actions) api/api.js ← HTTP client (all backend calls) components/ EventList.jsx ← Show/create events EventForm.jsx ← New event modal EventMembers.jsx ← Invite members GuestList.jsx ← Show/edit guests (needs update) ... ``` ## Common Tasks ### List All Events Admin can see events on main dashboard. Filter by: - Own events (events you created) - Invited to (events others invited you to) ### Add 100 Guests at Once Use bulk import: 1. Prepare CSV: first_name, last_name, phone, side 2. Convert to JSON 3. POST to `/events/{id}/guests/import` ### Filter by Confirmation Status ``` GET /events/{id}/guests?status=confirmed GET /events/{id}/guests?status=declined GET /events/{id}/guests?status=invited ``` ### Get Event Statistics ``` GET /events/{id}/stats # Returns: { # "stats": { "total": 100, "confirmed": 75, "declined": 5, "invited": 20 }, # "sides": [ { "side": "groom", "count": 50 }, { "side": "bride", "count": 50 } ] # } ``` ### Update Guest Status ``` PATCH /events/{id}/guests/{guest_id} { "status": "confirmed", "notes": "Confirmed with dietary restriction" } ``` ### Make Someone Event Admin ``` PATCH /events/{id}/members/{user_id} { "role": "admin" } ``` ## Testing Tips Use REST client or curl: ```bash # Create event curl -X POST http://localhost:8000/events \ -H "Content-Type: application/json" \ -d '{"name":"Test Event","date":"2026-03-15T18:00:00"}' # Get events curl http://localhost:8000/events # Add guest EVENT_ID="..." # from previous response curl -X POST http://localhost:8000/events/$EVENT_ID/guests \ -H "Content-Type: application/json" \ -d '{ "first_name":"John", "last_name":"Doe", "phone":"+1-555-0001" }' # Get guests curl http://localhost:8000/events/$EVENT_ID/guests ``` ## Troubleshooting | Issue | Solution | |-------|----------| | "Event not found" | Verify event_id UUID is correct, user is member | | "Not authorized" | User must be event member to access it | | "Guest not found" | Guest must belong to specified event_id | | WhatsApp "Invalid phone" | Phone must be in E.164 format (+countrycode...) | | CORS error | Check FRONTEND_URL in .env matches your frontend | | 401 Unauthorized | Remove TEST_USER_EMAIL from .env if implementing real auth | ## Next Steps 1. ✅ Understand the event-first architecture 2. ✅ Test creating events and adding guests 3. ⭐ Implement authentication (replace TEST_USER_EMAIL) 4. ⭐ Configure WhatsApp if sending messages 5. ⭐ Update GuestList component for event scope 6. ⭐ Deploy to production ## Help & Documentation - **Full API Docs**: `http://localhost:8000/docs` (Swagger UI) - **Database Schema**: See `backend/migrations.sql` - **Architecture**: Read `REFACTORING_GUIDE.md` - **Complete Changes**: See `IMPLEMENTATION_SUMMARY.md` - **API Reference**: Check docstrings in `main.py` --- **Questions?** Check the inline code comments in `main.py` and reference the REFACTORING_GUIDE for detailed explanations.