384 lines
8.1 KiB
Markdown
384 lines
8.1 KiB
Markdown
# API Reference
|
|
|
|
Complete REST API reference for Changemaker Lite V2. This section documents all API endpoints, request/response formats, authentication, and error handling.
|
|
|
|
## Overview
|
|
|
|
Changemaker Lite V2 provides two REST APIs:
|
|
|
|
- **Express API** (Port 4000) - Main application API
|
|
- **Fastify Media API** (Port 4100) - Media library operations
|
|
|
|
Both APIs use JSON for request/response bodies and follow RESTful conventions.
|
|
|
|
## API Documentation
|
|
|
|
API reference documentation will be added as the API stabilizes. Planned documentation includes:
|
|
|
|
### Authentication Endpoints
|
|
|
|
- `POST /api/auth/register` - User registration
|
|
- `POST /api/auth/login` - User login
|
|
- `POST /api/auth/refresh` - Refresh access token
|
|
- `POST /api/auth/logout` - User logout
|
|
- `GET /api/auth/me` - Get current user
|
|
|
|
### User Endpoints
|
|
|
|
- `GET /api/users` - List users
|
|
- `POST /api/users` - Create user
|
|
- `GET /api/users/:id` - Get user
|
|
- `PATCH /api/users/:id` - Update user
|
|
- `DELETE /api/users/:id` - Delete user
|
|
|
|
### Campaign Endpoints
|
|
|
|
- `GET /api/campaigns` - List campaigns
|
|
- `POST /api/campaigns` - Create campaign
|
|
- `GET /api/campaigns/:id` - Get campaign
|
|
- `PATCH /api/campaigns/:id` - Update campaign
|
|
- `DELETE /api/campaigns/:id` - Delete campaign
|
|
- `GET /api/campaigns/public` - List public campaigns
|
|
- `POST /api/campaigns/:id/send-email` - Send campaign email
|
|
|
|
### Location Endpoints
|
|
|
|
- `GET /api/locations` - List locations
|
|
- `POST /api/locations` - Create location
|
|
- `GET /api/locations/:id` - Get location
|
|
- `PATCH /api/locations/:id` - Update location
|
|
- `DELETE /api/locations/:id` - Delete location
|
|
- `POST /api/locations/import` - CSV import
|
|
- `GET /api/locations/export` - CSV export
|
|
- `POST /api/locations/geocode` - Bulk geocode
|
|
|
|
### Map Endpoints
|
|
|
|
- `GET /api/cuts` - List cuts
|
|
- `POST /api/cuts` - Create cut
|
|
- `GET /api/shifts` - List shifts
|
|
- `POST /api/shifts` - Create shift
|
|
- `GET /api/canvass/session` - Get active session
|
|
- `POST /api/canvass/session/start` - Start session
|
|
- `POST /api/canvass/visit` - Record visit
|
|
|
|
### Content Endpoints
|
|
|
|
- `GET /api/pages` - List pages
|
|
- `POST /api/pages` - Create page
|
|
- `GET /api/pages/public/:slug` - Get published page
|
|
- `GET /api/email-templates` - List templates
|
|
- `POST /api/email-templates` - Create template
|
|
|
|
### Media Endpoints (Port 4100)
|
|
|
|
- `GET /media-api/videos` - List videos
|
|
- `POST /media-api/upload` - Upload video
|
|
- `GET /media-api/public/videos` - List public videos
|
|
- `POST /media-api/reactions` - Add reaction
|
|
|
|
## Authentication
|
|
|
|
All authenticated endpoints require a valid JWT access token in the Authorization header:
|
|
|
|
```
|
|
Authorization: Bearer <access_token>
|
|
```
|
|
|
|
### Token Lifecycle
|
|
|
|
1. **Login** - POST `/api/auth/login`
|
|
- Returns: `accessToken` (15min) + `refreshToken` (7 days)
|
|
|
|
2. **Access Protected Resource** - Include token in header
|
|
- Token verified by `authenticate` middleware
|
|
|
|
3. **Refresh Token** - POST `/api/auth/refresh`
|
|
- Provide: `refreshToken`
|
|
- Returns: New `accessToken` + `refreshToken`
|
|
|
|
4. **Logout** - POST `/api/auth/logout`
|
|
- Invalidates refresh token
|
|
|
|
### Role-Based Access
|
|
|
|
Endpoints are protected by role requirements:
|
|
|
|
- **Public** - No authentication required
|
|
- **Authenticated** - Any logged-in user
|
|
- **Admin** - SUPER_ADMIN, INFLUENCE_ADMIN, or MAP_ADMIN
|
|
- **Role-Specific** - Specific role required
|
|
|
|
## Request Format
|
|
|
|
### JSON Body
|
|
|
|
```json
|
|
POST /api/campaigns
|
|
Content-Type: application/json
|
|
Authorization: Bearer <token>
|
|
|
|
{
|
|
"name": "Save the Parks",
|
|
"description": "Campaign description",
|
|
"published": true
|
|
}
|
|
```
|
|
|
|
### Query Parameters
|
|
|
|
```
|
|
GET /api/campaigns?page=1&limit=20&search=parks
|
|
```
|
|
|
|
### Path Parameters
|
|
|
|
```
|
|
GET /api/campaigns/:id
|
|
```
|
|
|
|
## Response Format
|
|
|
|
### Success Response
|
|
|
|
```json
|
|
{
|
|
"id": 1,
|
|
"name": "Save the Parks",
|
|
"description": "Campaign description",
|
|
"published": true,
|
|
"createdAt": "2026-01-01T00:00:00.000Z",
|
|
"updatedAt": "2026-01-01T00:00:00.000Z"
|
|
}
|
|
```
|
|
|
|
### Paginated Response
|
|
|
|
```json
|
|
{
|
|
"data": [...],
|
|
"pagination": {
|
|
"page": 1,
|
|
"limit": 20,
|
|
"total": 100,
|
|
"totalPages": 5
|
|
}
|
|
}
|
|
```
|
|
|
|
### Error Response
|
|
|
|
```json
|
|
{
|
|
"error": "Validation error",
|
|
"details": "Invalid email format",
|
|
"statusCode": 400
|
|
}
|
|
```
|
|
|
|
## Status Codes
|
|
|
|
- **200 OK** - Success
|
|
- **201 Created** - Resource created
|
|
- **204 No Content** - Success with no body
|
|
- **400 Bad Request** - Validation error
|
|
- **401 Unauthorized** - Authentication required
|
|
- **403 Forbidden** - Insufficient permissions
|
|
- **404 Not Found** - Resource not found
|
|
- **429 Too Many Requests** - Rate limit exceeded
|
|
- **500 Internal Server Error** - Server error
|
|
|
|
## Rate Limiting
|
|
|
|
Rate limits vary by endpoint:
|
|
|
|
- **Auth endpoints** - 10 requests/minute per IP
|
|
- **Canvass visits** - 30 requests/minute per IP
|
|
- **Public endpoints** - 60 requests/minute per IP
|
|
- **Authenticated endpoints** - 120 requests/minute per user
|
|
|
|
Rate limit headers:
|
|
|
|
```
|
|
X-RateLimit-Limit: 60
|
|
X-RateLimit-Remaining: 59
|
|
X-RateLimit-Reset: 1640995200
|
|
```
|
|
|
|
## CORS
|
|
|
|
CORS is enabled for all origins in development:
|
|
|
|
```javascript
|
|
app.use(cors({
|
|
origin: '*',
|
|
credentials: true,
|
|
}));
|
|
```
|
|
|
|
Production should restrict to known domains.
|
|
|
|
## Validation
|
|
|
|
Request bodies are validated using Zod schemas. Validation errors return 400 with details:
|
|
|
|
```json
|
|
{
|
|
"error": "Validation error",
|
|
"details": {
|
|
"email": "Invalid email format",
|
|
"password": "Password must be at least 12 characters"
|
|
},
|
|
"statusCode": 400
|
|
}
|
|
```
|
|
|
|
## Pagination
|
|
|
|
List endpoints support pagination:
|
|
|
|
- **page** - Page number (default: 1)
|
|
- **limit** - Items per page (default: 20, max: 100)
|
|
|
|
Example:
|
|
```
|
|
GET /api/campaigns?page=2&limit=50
|
|
```
|
|
|
|
## Search & Filtering
|
|
|
|
List endpoints support search and filtering:
|
|
|
|
- **search** - Text search (varies by endpoint)
|
|
- **filter** - Field-specific filters
|
|
|
|
Example:
|
|
```
|
|
GET /api/campaigns?search=parks&published=true
|
|
```
|
|
|
|
## Sorting
|
|
|
|
List endpoints support sorting:
|
|
|
|
- **sort** - Field to sort by
|
|
- **order** - Sort direction (asc/desc)
|
|
|
|
Example:
|
|
```
|
|
GET /api/campaigns?sort=createdAt&order=desc
|
|
```
|
|
|
|
## API Endpoints by Module
|
|
|
|
### Authentication
|
|
- Login, register, refresh, logout, current user
|
|
|
|
### Users
|
|
- CRUD operations, pagination, search, role management
|
|
|
|
### Settings
|
|
- Site settings singleton
|
|
|
|
### Campaigns
|
|
- CRUD, public listing, email sending
|
|
|
|
### Representatives
|
|
- Postal code lookup, cache management
|
|
|
|
### Responses
|
|
- CRUD, verification, upvoting, moderation
|
|
|
|
### Postal Codes
|
|
- Cache service
|
|
|
|
### Campaign Emails
|
|
- Email tracking, statistics
|
|
|
|
### Email Queue
|
|
- Queue monitoring, pause/resume, cleanup
|
|
|
|
### Locations
|
|
- CRUD, CSV import/export, geocoding, NAR import
|
|
|
|
### Cuts
|
|
- CRUD, spatial queries, location assignment
|
|
|
|
### Shifts
|
|
- CRUD, signups, email notifications
|
|
|
|
### Canvass
|
|
- Sessions, visits, routes, dashboard
|
|
|
|
### Tracking
|
|
- GPS tracking (future)
|
|
|
|
### Map Settings
|
|
- Map configuration
|
|
|
|
### Pages
|
|
- CRUD, block library, MkDocs export, public rendering
|
|
|
|
### Email Templates
|
|
- CRUD, versioning (future)
|
|
|
|
### Media (Port 4100)
|
|
- Videos, upload, shared media, reactions, jobs
|
|
|
|
### Listmonk
|
|
- Status, sync, test connection
|
|
|
|
### Pangolin
|
|
- Tunnel management, setup, configuration
|
|
|
|
### Docs
|
|
- MkDocs/Code Server status
|
|
|
|
### QR
|
|
- QR code generation
|
|
|
|
### Observability
|
|
- Prometheus/Grafana/Alertmanager integration
|
|
|
|
### Services
|
|
- Health checks
|
|
|
|
## OpenAPI Specification
|
|
|
|
OpenAPI/Swagger documentation is planned for future releases. This will provide:
|
|
|
|
- Interactive API explorer
|
|
- Auto-generated client libraries
|
|
- Comprehensive endpoint documentation
|
|
- Request/response examples
|
|
|
|
## Testing
|
|
|
|
Test API endpoints using:
|
|
|
|
- **curl** - Command-line HTTP client
|
|
- **Postman** - GUI API client
|
|
- **HTTPie** - User-friendly CLI
|
|
- **Insomnia** - API design/testing tool
|
|
|
|
Example with curl:
|
|
|
|
```bash
|
|
# Login
|
|
curl -X POST http://localhost:4000/api/auth/login \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"email":"admin@example.com","password":"Admin123!"}'
|
|
|
|
# Get campaigns (with token)
|
|
curl http://localhost:4000/api/campaigns \
|
|
-H "Authorization: Bearer <token>"
|
|
```
|
|
|
|
## Related Documentation
|
|
|
|
- [Backend Modules](../backend/modules/index.md)
|
|
- [Authentication](../backend/modules/auth.md)
|
|
- [Middleware](../backend/middleware/index.md)
|
|
- [Development Guide](../development/index.md)
|
|
- [Troubleshooting](../troubleshooting/index.md)
|