304 lines
7.2 KiB
Markdown
304 lines
7.2 KiB
Markdown
# 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.
|