Swansea Airport Stakeholders' Alliance Membership Management System
A comprehensive membership management system built with FastAPI, MySQL, and Docker.
Features
- User Management: Registration, authentication, and profile management
- Membership Tiers: Configurable membership levels with different benefits and fees
- Payment Processing: Support for Square payments, cash, and check payments
- Admin Dashboard: Complete administrative control over members and payments
- Event Management: Create and manage events with RSVP tracking (coming soon)
- Volunteer Management: Role assignments, scheduling, and certificates (coming soon)
- Email Notifications: Automated notifications via SMTP2GO (coming soon)
Tech Stack
- Backend: FastAPI (Python 3.11)
- Database: MySQL 8.0
- Authentication: JWT tokens with OAuth2
- Containerization: Docker & Docker Compose
- ORM: SQLAlchemy
Project Structure
membership/
├── backend/
│ ├── app/
│ │ ├── api/
│ │ │ ├── v1/
│ │ │ │ ├── auth.py # Authentication endpoints
│ │ │ │ ├── users.py # User management
│ │ │ │ ├── tiers.py # Membership tiers
│ │ │ │ ├── memberships.py # Membership management
│ │ │ │ └── payments.py # Payment processing
│ │ │ └── dependencies.py # Auth dependencies
│ │ ├── core/
│ │ │ ├── config.py # Configuration
│ │ │ ├── database.py # Database setup
│ │ │ └── security.py # Security utilities
│ │ ├── models/
│ │ │ └── models.py # Database models
│ │ ├── schemas/
│ │ │ └── schemas.py # Pydantic schemas
│ │ └── main.py # Application entry point
│ ├── Dockerfile
│ └── requirements.txt
├── database/
│ └── init.sql # Database initialization
├── docker-compose.yml
├── .env.example
└── README.md
Getting Started
Prerequisites
- Docker
- Docker Compose
Installation
-
Navigate to the project directory
-
The
.envfile is already configured with default settings. You can customize:- Square API credentials (for payment processing)
- SMTP2GO API key (for email notifications)
- Database password (if desired)
-
Start the services in your preferred mode:
# For development (with hot reloading) docker-compose --profile dev up -d # For production (optimized static files) docker-compose --profile prod up -d -
Wait for services to be ready (about 30 seconds for MySQL initialization):
docker-compose logs -fPress Ctrl+C when you see "Application startup complete"
-
Access the application:
- Frontend: http://localhost:3500 (development) or http://localhost:8080 (production)
- API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
Frontend Development vs Production
Choose your deployment mode by using the appropriate docker-compose file:
Development Mode (Vite)
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
- Frontend served by Vite dev server on port 3500
- Hot reloading and development features
- Access at: http://localhost:3500
Production Mode (Nginx)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- Frontend served by Nginx on port 8050
- Optimized static files, production-ready
- Access at: http://localhost:8050
Configuration
Set your preferred defaults in .env:
# Deployment mode (for reference only)
MODE=dev
# Frontend allowed hosts (comma-separated)
VITE_ALLOWED_HOSTS=sasaprod,localhost,members.sasalliance.org
Stopping Services
# Stop all services
docker compose -f docker-compose.yml -f docker-compose.dev.yml down
docker compose -f docker-compose.yml -f docker-compose.prod.yml down
Default Credentials
Admin Account:
- Email:
admin@swanseaairport.org - Password:
admin123
⚠️ IMPORTANT: Change the admin password immediately after first login!
API Endpoints
Authentication
POST /api/v1/auth/register- Register new userPOST /api/v1/auth/login- Login (OAuth2 form)POST /api/v1/auth/login-json- Login (JSON)
Users
GET /api/v1/users/me- Get current user profilePUT /api/v1/users/me- Update current user profileGET /api/v1/users/- List all users (admin)GET /api/v1/users/{id}- Get user by ID (admin)DELETE /api/v1/users/{id}- Delete user (admin)
Membership Tiers
GET /api/v1/tiers/- List all tiersGET /api/v1/tiers/{id}- Get tier by IDPOST /api/v1/tiers/- Create tier (admin)PUT /api/v1/tiers/{id}- Update tier (admin)DELETE /api/v1/tiers/{id}- Delete tier (admin)
Memberships
GET /api/v1/memberships/my-memberships- Get current user's membershipsPOST /api/v1/memberships/- Create membershipGET /api/v1/memberships/{id}- Get membership by IDPUT /api/v1/memberships/{id}- Update membership (admin)GET /api/v1/memberships/- List all memberships (admin)DELETE /api/v1/memberships/{id}- Delete membership (admin)
Payments
GET /api/v1/payments/my-payments- Get current user's paymentsPOST /api/v1/payments/- Create paymentGET /api/v1/payments/{id}- Get payment by IDPUT /api/v1/payments/{id}- Update payment (admin)GET /api/v1/payments/- List all payments (admin)POST /api/v1/payments/manual-payment- Record manual payment (admin)
Docker Compose Commands
Basic Operations
# Start all services
docker-compose up -d
# View logs (all services)
docker-compose logs -f
# View logs (specific service)
docker-compose logs -f backend
docker-compose logs -f mysql
# Stop services
docker-compose down
# Stop and remove volumes (clean slate)
docker-compose down -v
# Restart services
docker-compose restart
# Rebuild after code changes
docker-compose up -d --build
# Check service status
docker-compose ps
Database Operations
# Access MySQL CLI
docker exec -it membership_mysql mysql -u membership_user -pSecureMembershipPass2024! membership_db
# Create backup
docker exec membership_mysql mysqldump -u membership_user -pSecureMembershipPass2024! membership_db > backup_$(date +%Y%m%d_%H%M%S).sql
# Restore database
docker exec -i membership_mysql mysql -u membership_user -pSecureMembershipPass2024! membership_db < backup.sql
API Testing
You can use the interactive API documentation at http://localhost:8000/docs to test endpoints:
- Register a new user
- Login to get access token
- Click "Authorize" button and enter:
Bearer <your_token> - Test protected endpoints
Or use curl:
# Register
curl -X POST "http://localhost:8000/api/v1/auth/register" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123",
"first_name": "John",
"last_name": "Doe"
}'
# Login
curl -X POST "http://localhost:8000/api/v1/auth/login-json" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123"
}'
# Get profile (replace TOKEN with actual token)
curl -X GET "http://localhost:8000/api/v1/users/me" \
-H "Authorization: Bearer TOKEN"
Default Membership Tiers
The system comes with three pre-configured tiers:
-
Personal - £5/year
- Access to member portal
- Meeting notifications
- Event participation
-
Aircraft Owners - £25/year
- All Personal benefits
- Priority event registration
- Aircraft owner resources
-
Corporate - £100/year
- All benefits
- Corporate recognition
- Promotional opportunities
- File access
Security
- Passwords are hashed using bcrypt
- JWT tokens for authentication
- Role-based access control (Member, Admin, Super Admin)
- CORS protection
- Environment-based configuration
Troubleshooting
Services not starting
# Check status of all services
docker-compose ps
# View all logs
docker-compose logs
# View specific service logs
docker-compose logs mysql
docker-compose logs backend
# Restart all services
docker-compose restart
# Full restart with rebuild
docker-compose down
docker-compose up -d --build
Database connection issues
# Check if MySQL is healthy
docker-compose ps
# View MySQL logs for errors
docker-compose logs mysql
# Wait for MySQL to be fully ready (may take 30 seconds on first start)
docker-compose logs -f mysql
Clean slate restart
# Stop everything and remove volumes
docker-compose down -v
# Start fresh
docker-compose up -d
# Wait for initialization
docker-compose logs -f
Next Steps
- Implement Square payment integration
- Add email notification system
- Create event management endpoints
- Add volunteer management features
- Build frontend interface
- Add file upload/management
- Implement automated renewal reminders
- Add reporting and analytics
License
Copyright © 2024 Swansea Airport Stakeholders' Alliance
Support
For issues or questions, please contact the development team.