invy/QUICKSTART.md

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.