# 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/ │ ├── alembic/ # Database migration scripts │ │ ├── versions/ # Migration files │ │ ├── env.py # Migration environment │ │ └── script.py.mako # Migration template │ ├── alembic.ini # Alembic configuration │ ├── 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 # Legacy database initialization (deprecated - use Alembic migrations) ├── docker-compose.yml ├── .env.example └── README.md ``` ## Getting Started ### Prerequisites - Docker - Docker Compose ### Installation 1. **Navigate to the project directory** 2. **The `.env` file 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) 3. **Start the services in your preferred mode**: ```bash # For development (with hot reloading) docker-compose --profile dev up -d # For production (optimized static files) docker-compose --profile prod up -d ``` 4. **Wait for services to be ready** (about 30 seconds for MySQL initialization): ```bash docker-compose logs -f ``` Press Ctrl+C when you see "Application startup complete" 5. **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) ```bash 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) ```bash 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`: ```bash # Deployment mode (for reference only) MODE=dev # Frontend allowed hosts (comma-separated) VITE_ALLOWED_HOSTS=sasaprod,localhost,members.sasalliance.org ``` ### Stopping Services ```bash # 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 user - `POST /api/v1/auth/login` - Login (OAuth2 form) - `POST /api/v1/auth/login-json` - Login (JSON) ### Users - `GET /api/v1/users/me` - Get current user profile - `PUT /api/v1/users/me` - Update current user profile - `GET /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 tiers - `GET /api/v1/tiers/{id}` - Get tier by ID - `POST /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 memberships - `POST /api/v1/memberships/` - Create membership - `GET /api/v1/memberships/{id}` - Get membership by ID - `PUT /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 payments - `POST /api/v1/payments/` - Create payment - `GET /api/v1/payments/{id}` - Get payment by ID - `PUT /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 ```bash # 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 ```bash # Access MySQL CLI (using environment variables) docker exec -it membership_mysql mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" "${DATABASE_NAME}" # Create backup docker exec membership_mysql mysqldump -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" "${DATABASE_NAME}" > backup_$(date +%Y%m%d_%H%M%S).sql # Restore database docker exec -i membership_mysql mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" "${DATABASE_NAME}" < backup.sql ``` ### Database Migrations The application uses Alembic for database schema migrations. Migrations are automatically run when the backend container starts. ```bash # Create a new migration (after making model changes) sudo docker compose exec backend alembic revision --autogenerate -m "Description of changes" # Apply migrations sudo docker compose exec backend alembic upgrade head # View migration status sudo docker compose exec backend alembic current # View migration history sudo docker compose exec backend alembic history ``` **Note**: The `database/init.sql` file is deprecated. All schema changes should now be made through Alembic migrations. ## API Testing You can use the interactive API documentation at http://localhost:8000/docs to test endpoints: 1. Register a new user 2. Login to get access token 3. Click "Authorize" button and enter: `Bearer ` 4. Test protected endpoints Or use curl: ```bash # 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: 1. **Personal** - £5/year - Access to member portal - Meeting notifications - Event participation 2. **Aircraft Owners** - £25/year - All Personal benefits - Priority event registration - Aircraft owner resources 3. **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 ```bash # 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 ```bash # 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 ```bash # 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.