2025-11-12 18:08:11 +00:00
2025-11-12 18:08:11 +00:00
2025-11-12 18:08:11 +00:00
2025-11-12 18:08:11 +00:00
2025-11-12 16:09:38 +00:00
2025-11-10 13:57:46 +00:00
2025-11-12 16:09:38 +00:00
2025-11-12 16:09:38 +00:00
2025-11-11 17:17:18 +00:00
2025-11-10 16:57:29 +00:00
2025-11-10 13:57:46 +00:00
2025-11-10 13:57:46 +00:00
2025-11-11 17:17:18 +00:00
2025-11-12 16:09:38 +00:00
2025-11-12 16:09:38 +00:00
2025-11-12 16:09:38 +00:00
2025-11-12 16:09:38 +00:00

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

  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:

    # 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):

    docker-compose logs -f
    

    Press Ctrl+C when you see "Application startup complete"

  5. Access the application:

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 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

# 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:

  1. Register a new user
  2. Login to get access token
  3. Click "Authorize" button and enter: Bearer <your_token>
  4. 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:

  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

# 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.

Description
No description provided
Readme 435 KiB
Languages
TypeScript 54.3%
Python 42%
CSS 2.9%
Dockerfile 0.4%
Mako 0.2%
Other 0.1%