From 21c8153519ef4a0945661a61dea535d4ba9ed6dc Mon Sep 17 00:00:00 2001 From: Frederik Beimgraben Date: Mon, 1 Sep 2025 05:00:02 +0200 Subject: [PATCH] Neatly packaged for docker --- .env.example | 69 +++ .gitignore | 251 ++++------ Makefile | 181 +++++++ README.md | 273 ++++++++-- assets/qsm.pdf | Bin 129794 -> 0 bytes assets/vsm.pdf | Bin 129774 -> 0 bytes Dockerfile => backend/Dockerfile | 0 Dockerfile.dev => backend/Dockerfile.dev | 0 requirements.txt => backend/requirements.txt | 0 {src => backend/src}/parser_api.py | 0 {src => backend/src}/pdf_field_mapping.py | 0 {src => backend/src}/pdf_filler.py | 0 {src => backend/src}/pdf_to_struct.py | 0 {src => backend/src}/service_api.py | 5 + dev.sh | 66 --- docker-compose.watch.yml | 14 +- docker-compose.yml | 22 +- docs/API_REFERENCE.md | 469 ++++++++++++++++++ docs/ARCHITECTURE.md | 181 +++++++ .../ATTACHMENT_FEATURE.md | 0 .../COMPARISON_OFFERS_FEATURE.md | 0 docs/CONFIGURATION.md | 422 ++++++++++++++++ DEVELOPMENT.md => docs/DEVELOPMENT.md | 0 docs/INSTALLATION.md | 223 +++++++++ docs/QUICK_START.md | 204 ++++++++ docs/README.md | 98 ++++ scripts/create-env.sh | 128 +++++ scripts/dev.sh | 321 ++++++++++++ src/migrations/add_attachments_tables.sql | 32 -- .../add_comparison_offers_tables.sql | 41 -- .../add_is_preferred_to_comparison_offers.sql | 10 - .../add_url_to_comparison_offers.sql | 14 - .../alter_attachments_data_column.sql | 10 - 33 files changed, 2669 insertions(+), 365 deletions(-) create mode 100644 .env.example create mode 100644 Makefile delete mode 100644 assets/qsm.pdf delete mode 100644 assets/vsm.pdf rename Dockerfile => backend/Dockerfile (100%) rename Dockerfile.dev => backend/Dockerfile.dev (100%) rename requirements.txt => backend/requirements.txt (100%) rename {src => backend/src}/parser_api.py (100%) rename {src => backend/src}/pdf_field_mapping.py (100%) rename {src => backend/src}/pdf_filler.py (100%) rename {src => backend/src}/pdf_to_struct.py (100%) rename {src => backend/src}/service_api.py (99%) delete mode 100755 dev.sh create mode 100644 docs/API_REFERENCE.md create mode 100644 docs/ARCHITECTURE.md rename ATTACHMENT_FEATURE.md => docs/ATTACHMENT_FEATURE.md (100%) rename COMPARISON_OFFERS_FEATURE.md => docs/COMPARISON_OFFERS_FEATURE.md (100%) create mode 100644 docs/CONFIGURATION.md rename DEVELOPMENT.md => docs/DEVELOPMENT.md (100%) create mode 100644 docs/INSTALLATION.md create mode 100644 docs/QUICK_START.md create mode 100644 docs/README.md create mode 100755 scripts/create-env.sh create mode 100755 scripts/dev.sh delete mode 100644 src/migrations/add_attachments_tables.sql delete mode 100644 src/migrations/add_comparison_offers_tables.sql delete mode 100644 src/migrations/add_is_preferred_to_comparison_offers.sql delete mode 100644 src/migrations/add_url_to_comparison_offers.sql delete mode 100644 src/migrations/alter_attachments_data_column.sql diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..9f32a785 --- /dev/null +++ b/.env.example @@ -0,0 +1,69 @@ +# STUPA PDF API Configuration Example +# Copy this file to .env and update with your values + +# Database Configuration +MYSQL_HOST=db +MYSQL_PORT=3306 +MYSQL_DB=stupa +MYSQL_USER=stupa +MYSQL_PASSWORD=your_secure_password_here +MYSQL_ROOT_PASSWORD=your_secure_root_password_here + +# Authentication +# Master key for admin access - keep this secure! +MASTER_KEY=your_secure_master_key_here + +# Rate Limiting +# Requests per minute per IP address +RATE_IP_PER_MIN=60 +# Requests per minute per application key +RATE_KEY_PER_MIN=30 + +# Application Settings +# Timezone for the application +TZ=Europe/Berlin + +# PDF Templates (paths inside container - don't change unless you know what you're doing) +QSM_TEMPLATE=/app/assets/qsm.pdf +VSM_TEMPLATE=/app/assets/vsm.pdf + +# Frontend Configuration +NODE_ENV=production + +# Optional: CORS Configuration (for production) +# CORS_ORIGINS=["https://your-domain.com"] + +# Optional: Debug Mode (never enable in production) +# DEBUG=false + +# Optional: Database Connection Pool +# DB_POOL_SIZE=10 +# DB_MAX_OVERFLOW=20 + +# Optional: File Upload Limits +# MAX_UPLOAD_SIZE=104857600 # 100MB in bytes +# MAX_ATTACHMENTS_PER_APP=30 + +# Optional: Session Configuration +# SESSION_TIMEOUT=3600 # 1 hour in seconds + +# Optional: Email Configuration (for future notifications) +# SMTP_HOST=smtp.example.com +# SMTP_PORT=587 +# SMTP_USER=notifications@example.com +# SMTP_PASSWORD=smtp_password_here +# SMTP_FROM=noreply@example.com + +# Optional: Logging Configuration +# LOG_LEVEL=INFO +# LOG_FILE=/var/log/stupa-api.log + +# Optional: Backup Configuration +# BACKUP_ENABLED=true +# BACKUP_SCHEDULE="0 2 * * *" # Daily at 2 AM +# BACKUP_RETENTION_DAYS=30 + +# Production Security Headers (uncomment for production) +# SECURE_HEADERS=true +# HSTS_ENABLED=true +# CSP_ENABLED=true diff --git a/.gitignore b/.gitignore index 7264f1dd..d3768934 100644 --- a/.gitignore +++ b/.gitignore @@ -1,164 +1,119 @@ # ---> Python -# Byte-compiled / optimized / DLL files +# Python __pycache__/ *.py[cod] *$py.class - -# C extensions *.so - -# Distribution / packaging .Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ *.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ .pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy +.coverage .mypy_cache/ -.dmypy.json -dmypy.json +.ruff_cache/ -# Pyre type checker -.pyre/ +# Backend specific +backend/build/ +backend/dist/ +backend/.eggs/ +backend/venv/ +backend/env/ +backend/.venv/ -# pytype static type analyzer -.pytype/ +# Frontend specific +frontend/node_modules/ +frontend/dist/ +frontend/build/ +frontend/.parcel-cache/ +frontend/.next/ +frontend/.nuxt/ +frontend/.vuepress/ +frontend/.docusaurus/ +frontend/npm-debug.log* +frontend/yarn-debug.log* +frontend/yarn-error.log* +frontend/lerna-debug.log* +frontend/.pnpm-debug.log* -# Cython debug symbols -cython_debug/ +# Environment files +.env +.env.* +!.env.example -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store + +# Docker +docker-compose.override.yml + +# Database +*.sqlite +*.sqlite3 +*.db +mysql-data/ + +# Logs +logs/ +*.log + +# Testing +coverage/ +.nyc_output/ +test-results/ +junit.xml + +# Temporary files +tmp/ +temp/ +*.tmp +*.temp +*.bak +*.backup +*.orig + +# OS files +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp +*.lnk + +# Documentation build +docs/_build/ +docs/.doctrees/ +site/ + +# Backups +backups/ +*.sql +*.dump + +# Project specific +.ropeproject/ +uploads/ +downloads/ +cache/ + +# Certificates +*.pem +*.key +*.crt +*.csr +*.der +*.p12 +*.pfx + +# Monitoring +prometheus_data/ +grafana_data/ # PDF *.pdf diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..7d193789 --- /dev/null +++ b/Makefile @@ -0,0 +1,181 @@ +# STUPA PDF API Makefile +# Convenient commands for development and deployment + +.PHONY: help +help: ## Show this help message + @echo 'Usage: make [target]' + @echo '' + @echo 'Targets:' + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +.PHONY: install +install: ## Initial setup - create .env and install dependencies + @echo "Setting up STUPA PDF API..." + @chmod +x scripts/*.sh + @./scripts/create-env.sh + @echo "Setup complete! Run 'make start' to begin." + +.PHONY: start +start: ## Start all services + @docker compose up -d + @echo "Services starting..." + @echo "Frontend: http://localhost:3000" + @echo "API: http://localhost:8000" + @echo "API Docs: http://localhost:8000/docs" + @echo "Database UI: http://localhost:8080" + +.PHONY: stop +stop: ## Stop all services + @docker compose down + +.PHONY: restart +restart: ## Restart all services + @docker compose restart + +.PHONY: status +status: ## Show service status + @docker compose ps + +.PHONY: logs +logs: ## Show logs for all services + @docker compose logs -f + +.PHONY: logs-api +logs-api: ## Show API logs + @docker compose logs -f api + +.PHONY: logs-frontend +logs-frontend: ## Show frontend logs + @docker compose logs -f frontend + +.PHONY: logs-db +logs-db: ## Show database logs + @docker compose logs -f db + +.PHONY: build +build: ## Build all services + @docker compose build + +.PHONY: build-api +build-api: ## Build API service + @docker compose build api + +.PHONY: build-frontend +build-frontend: ## Build frontend service + @docker compose build frontend + +.PHONY: shell-api +shell-api: ## Open shell in API container + @docker compose exec api /bin/bash + +.PHONY: shell-frontend +shell-frontend: ## Open shell in frontend container + @docker compose exec frontend /bin/sh + +.PHONY: shell-db +shell-db: ## Open MySQL client + @docker compose exec db mysql -u root -p$${MYSQL_ROOT_PASSWORD} $${MYSQL_DB} + +.PHONY: migrate +migrate: ## Run database migrations + @echo "Running database migrations..." + @./scripts/dev.sh migrate + +.PHONY: test +test: ## Run all tests + @echo "Running tests..." + @./scripts/dev.sh test + +.PHONY: lint +lint: ## Run linters + @echo "Running linters..." + @./scripts/dev.sh lint + +.PHONY: format +format: ## Format code + @echo "Formatting code..." + @./scripts/dev.sh format + +.PHONY: clean +clean: ## Clean up temporary files and caches + @echo "Cleaning up..." + @find backend -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true + @find backend -type f -name "*.pyc" -delete 2>/dev/null || true + @docker system prune -f + +.PHONY: reset +reset: ## Reset everything (WARNING: deletes all data!) + @echo "WARNING: This will delete all data!" + @read -p "Are you sure? Type 'yes' to continue: " confirm && \ + if [ "$$confirm" = "yes" ]; then \ + docker compose down -v; \ + docker compose down --rmi local; \ + echo "Reset complete!"; \ + else \ + echo "Aborted."; \ + fi + +.PHONY: backup +backup: ## Create database backup + @mkdir -p backups + @docker compose exec -T db mysqldump -u root -p$${MYSQL_ROOT_PASSWORD} $${MYSQL_DB} > backups/backup-$$(date +%Y%m%d-%H%M%S).sql + @echo "Backup created in backups/" + +.PHONY: dev +dev: ## Start in development mode with hot reload + @docker compose -f docker-compose.yml -f docker-compose.watch.yml up + +.PHONY: prod +prod: ## Start in production mode + @docker compose up -d + +.PHONY: update +update: ## Update dependencies + @echo "Updating backend dependencies..." + @cd backend && pip-compile --upgrade requirements.in -o requirements.txt + @echo "Updating frontend dependencies..." + @cd frontend && npm update + +.PHONY: docs +docs: ## Open documentation in browser + @echo "Opening documentation..." + @python -m webbrowser "file://$$(pwd)/docs/README.md" || open docs/README.md || xdg-open docs/README.md + +.PHONY: api-docs +api-docs: ## Open API documentation in browser + @echo "Opening API documentation..." + @python -m webbrowser "http://localhost:8000/docs" || open "http://localhost:8000/docs" || xdg-open "http://localhost:8000/docs" + +.PHONY: check-env +check-env: ## Check if .env file exists + @if [ ! -f .env ]; then \ + echo "ERROR: .env file not found!"; \ + echo "Run 'make install' to create one."; \ + exit 1; \ + else \ + echo ".env file exists βœ“"; \ + fi + +.PHONY: validate +validate: check-env ## Validate configuration + @echo "Validating configuration..." + @docker compose config > /dev/null + @echo "Configuration is valid βœ“" + +.PHONY: ps +ps: ## Show running containers + @docker ps --filter "label=com.docker.compose.project=stupa-pdf-api" + +.PHONY: stats +stats: ## Show container resource usage + @docker stats --no-stream $$(docker compose ps -q) + +.PHONY: version +version: ## Show version information + @echo "STUPA PDF API Version Information:" + @echo "Backend: Python 3.11 with FastAPI" + @echo "Frontend: React 18 with TypeScript" + @echo "Database: MySQL 8.0" + @grep -m1 version frontend/package.json || echo "Frontend version not found" + @docker --version + @docker compose version diff --git a/README.md b/README.md index 612c714d..dd6ca795 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,249 @@ -# stupa-pdf-api +# STUPA PDF API -## Recent Updates +A comprehensive system for managing student parliament (STUPA) funding applications with PDF processing, form generation, and document management capabilities. -### Dark Mode Loading Screen Fix -- Fixed white background issue in loading screens when using dark mode -- The LoadingSpinner component now properly respects the theme settings +## πŸš€ Features -### File Attachments Feature -- Users can now upload up to 30 attachments per application -- Maximum total size: 100MB -- Files are stored securely in the database -- Full CRUD operations with progress tracking -- See [ATTACHMENT_FEATURE.md](ATTACHMENT_FEATURE.md) for details +- **PDF Processing**: Parse and extract structured data from uploaded PDF forms +- **Dynamic Form Generation**: Generate filled PDF forms from application data +- **Document Management**: Upload and manage supporting documents (up to 30 files, 100MB total) +- **Comparison Offers**: Manage cost comparison requirements with 3-offer validation +- **Secure Access**: Application-specific keys and master key authentication +- **Modern UI**: React-based frontend with Material-UI components +- **API Documentation**: Auto-generated OpenAPI/Swagger documentation +- **Rate Limiting**: Configurable rate limits for API protection +- **Database UI**: Integrated Adminer for database management -### Comparison Offers Feature -- Each cost position now requires 3 comparison offers -- Alternative: Users can provide a justification if offers are not applicable -- Visual indicators show completion status -- Offers can be linked to uploaded attachments -- See [COMPARISON_OFFERS_FEATURE.md](COMPARISON_OFFERS_FEATURE.md) for details +## πŸ“‹ Prerequisites -### Rate Limiting Configuration -- API rate limiting is now disabled for localhost connections -- Includes localhost (127.0.0.1) and Docker internal IPs (172.x.x.x) -- Production deployments maintain rate limiting for external IPs +- Docker Engine 20.10+ +- Docker Compose 2.0+ +- Git +- 4GB RAM minimum (8GB recommended) +- 2GB free disk space -## Database Migrations +## πŸ—οΈ Project Structure -Run these migrations to add the new features: - -```bash -# Add attachment tables -mysql -u your_user -p your_database < src/migrations/add_attachments_tables.sql - -# Fix attachment data column if needed -mysql -u your_user -p your_database < src/migrations/alter_attachments_data_column.sql - -# Add comparison offers tables -mysql -u your_user -p your_database < src/migrations/add_comparison_offers_tables.sql +``` +stupa-pdf-api/ +β”œβ”€β”€ backend/ # FastAPI backend application +β”‚ β”œβ”€β”€ src/ # Source code +β”‚ β”‚ β”œβ”€β”€ migrations/ # Database migrations +β”‚ β”‚ β”œβ”€β”€ service_api.py # Main API application +β”‚ β”‚ β”œβ”€β”€ pdf_filler.py # PDF generation +β”‚ β”‚ β”œβ”€β”€ pdf_to_struct.py # PDF parsing +β”‚ β”‚ └── ... +β”‚ β”œβ”€β”€ assets/ # PDF templates +β”‚ β”œβ”€β”€ requirements.txt # Python dependencies +β”‚ └── Dockerfile # Backend container definition +β”œβ”€β”€ frontend/ # React frontend application +β”‚ β”œβ”€β”€ src/ # Source code +β”‚ β”œβ”€β”€ public/ # Static assets +β”‚ β”œβ”€β”€ package.json # Node dependencies +β”‚ β”œβ”€β”€ nginx.conf # Nginx configuration +β”‚ └── Dockerfile # Frontend container definition +β”œβ”€β”€ docs/ # Documentation +β”‚ β”œβ”€β”€ README.md # Documentation index +β”‚ β”œβ”€β”€ ARCHITECTURE.md # System architecture +β”‚ β”œβ”€β”€ API_REFERENCE.md # API documentation +β”‚ └── ... +β”œβ”€β”€ scripts/ # Helper scripts +β”‚ β”œβ”€β”€ create-env.sh # Environment setup script +β”‚ └── dev.sh # Development helper script +β”œβ”€β”€ docker-compose.yml # Multi-container orchestration +└── README.md # This file ``` +## ⚑ Quick Start + +### 1. Clone the Repository +```bash +git clone https://github.com/your-org/stupa-pdf-api.git +cd stupa-pdf-api +``` + +### 2. Setup Environment +```bash +# Make scripts executable +chmod +x scripts/*.sh + +# Create .env file with secure defaults +./scripts/create-env.sh +``` + +### 3. Start Services +```bash +docker compose up -d +``` + +### 4. Access the Application +- **Frontend**: http://localhost:3000 +- **API Docs**: http://localhost:8000/docs +- **Database UI**: http://localhost:8080 + +## πŸ› οΈ Development + +### Using the Development Script +```bash +# Start all services +./scripts/dev.sh start + +# View logs +./scripts/dev.sh logs api + +# Open shell in container +./scripts/dev.sh shell frontend + +# Run database migrations +./scripts/dev.sh migrate + +# More commands +./scripts/dev.sh help +``` + +### Manual Development Setup + +#### Backend Development +```bash +cd backend +python -m venv venv +source venv/bin/activate # Linux/macOS +pip install -r requirements.txt +uvicorn src.service_api:app --reload +``` + +#### Frontend Development +```bash +cd frontend +npm install +npm run dev +``` + +## πŸ“š Documentation + +Comprehensive documentation is available in the `/docs` directory: + +- [Documentation Index](./docs/README.md) +- [Architecture Overview](./docs/ARCHITECTURE.md) +- [Installation Guide](./docs/INSTALLATION.md) +- [Quick Start Guide](./docs/QUICK_START.md) +- [API Reference](./docs/API_REFERENCE.md) +- [Development Guide](./docs/DEVELOPMENT.md) + +## πŸ”§ Configuration + +Key environment variables: + +```env +# Database +MYSQL_DB=stupa +MYSQL_USER=stupa +MYSQL_PASSWORD= + +# Authentication +MASTER_KEY= + +# Rate Limiting +RATE_IP_PER_MIN=60 +RATE_KEY_PER_MIN=30 + +# Application +TZ=Europe/Berlin +``` + +See [Configuration Guide](./docs/CONFIGURATION.md) for all options. + +## πŸ—„οΈ Database Migrations + +Run migrations after setup: + +```bash +./scripts/dev.sh migrate +``` + +Or manually: +```bash +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_attachments_tables.sql +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_comparison_offers_tables.sql +# ... other migrations +``` + +## πŸ§ͺ Testing + +```bash +# Run all tests +./scripts/dev.sh test + +# Run linters +./scripts/dev.sh lint + +# Format code +./scripts/dev.sh format +``` + +## 🚒 Deployment + +See [Deployment Guide](./docs/DEPLOYMENT.md) for production deployment instructions. + +### Basic Production Setup +1. Use environment-specific `.env` file +2. Enable SSL/TLS termination +3. Configure proper domain names +4. Set up backup procedures +5. Monitor logs and metrics + +## πŸ”’ Security + +- Application-specific access keys +- Master key for admin access +- Rate limiting per IP and key +- Input validation and sanitization +- SQL injection prevention via ORM +- XSS protection in React +- Secure password hashing + +See [Security Guide](./docs/SECURITY.md) for best practices. + +## πŸ“Š API Endpoints + +Key endpoints: + +- `POST /upload` - Upload PDF and create application +- `GET /applications/{id}` - Get application data +- `POST /applications/{id}/attachments` - Upload attachments +- `GET /applications/{id}/costs/{index}/offers` - Get comparison offers +- `PUT /applications/{id}` - Update application + +Full API documentation available at http://localhost:8000/docs when running. + +## 🀝 Contributing + +1. Fork the repository +2. Create a feature branch +3. Make your changes +4. Run tests and linting +5. Submit a pull request + +See [Contributing Guide](./docs/CONTRIBUTING.md) for details. + +## πŸ“ License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## πŸ†˜ Support + +- Check the [FAQ](./docs/FAQ.md) +- Review [Troubleshooting Guide](./docs/TROUBLESHOOTING.md) +- Create an issue for bugs or features +- Contact the development team + +## πŸ† Acknowledgments + +- Built with FastAPI, React, and MySQL +- PDF processing powered by PyPDF2 and ReportLab +- UI components from Material-UI + +--- + +**Version**: 1.0.0 +**Last Updated**: 2024 \ No newline at end of file diff --git a/assets/qsm.pdf b/assets/qsm.pdf deleted file mode 100644 index 59fe67c4d37a03ce9e9067824f6c795ff93fe605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129794 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⁡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

3wnHbaucw|MYMZwp&^+ENF&C;> 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

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

j3>Cy9Kb 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 diff --git a/Dockerfile b/backend/Dockerfile similarity index 100% rename from Dockerfile rename to backend/Dockerfile diff --git a/Dockerfile.dev b/backend/Dockerfile.dev similarity index 100% rename from Dockerfile.dev rename to backend/Dockerfile.dev diff --git a/requirements.txt b/backend/requirements.txt similarity index 100% rename from requirements.txt rename to backend/requirements.txt diff --git a/src/parser_api.py b/backend/src/parser_api.py similarity index 100% rename from src/parser_api.py rename to backend/src/parser_api.py diff --git a/src/pdf_field_mapping.py b/backend/src/pdf_field_mapping.py similarity index 100% rename from src/pdf_field_mapping.py rename to backend/src/pdf_field_mapping.py diff --git a/src/pdf_filler.py b/backend/src/pdf_filler.py similarity index 100% rename from src/pdf_filler.py rename to backend/src/pdf_filler.py diff --git a/src/pdf_to_struct.py b/backend/src/pdf_to_struct.py similarity index 100% rename from src/pdf_to_struct.py rename to backend/src/pdf_to_struct.py diff --git a/src/service_api.py b/backend/src/service_api.py similarity index 99% rename from src/service_api.py rename to backend/src/service_api.py index 3b318889..600b4e94 100644 --- a/src/service_api.py +++ b/backend/src/service_api.py @@ -355,6 +355,11 @@ app = FastAPI(title="STUPA PDF API", version="1.0.0") def _startup(): init_db() +@app.get("/") +def root(): + """Root endpoint for health checks""" + return {"message": "STUPA PDF API"} + # Helper function to check if we should skip rate limiting def should_skip_rate_limit(ip: str = "") -> bool: """Check if rate limiting should be skipped for localhost/Docker IPs""" diff --git a/dev.sh b/dev.sh deleted file mode 100755 index e1b9b11b..00000000 --- a/dev.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# Development script for running the STUPA PDF API with Docker Compose watch mode - -set -e - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -echo -e "${GREEN}Starting STUPA PDF API in development mode with watch...${NC}" - -# Check if Docker is running -if ! docker info > /dev/null 2>&1; then - echo -e "${RED}Docker is not running. Please start Docker first.${NC}" - exit 1 -fi - -# Check if docker compose supports watch -if ! docker compose version | grep -q "2\.[2-9][0-9]\|2\.[1-9][0-9][0-9]"; then - echo -e "${YELLOW}Warning: Docker Compose watch requires version 2.22.0 or higher${NC}" - echo -e "${YELLOW}Your version: $(docker compose version)${NC}" -fi - -# Create .env file if it doesn't exist -if [ ! -f .env ]; then - echo -e "${YELLOW}Creating .env file with default values...${NC}" - cat > .env << EOF -# MySQL Configuration -MYSQL_DB=stupa -MYSQL_USER=stupa -MYSQL_PASSWORD=secret -MYSQL_ROOT_PASSWORD=rootsecret - -# Application Configuration -MASTER_KEY=change_me_in_production -RATE_IP_PER_MIN=120 -RATE_KEY_PER_MIN=60 - -# Timezone -TZ=Europe/Berlin -EOF - echo -e "${GREEN}.env file created. Please update the MASTER_KEY for production use.${NC}" -fi - -# Build the development image -echo -e "${GREEN}Building development image...${NC}" -docker compose -f docker-compose.watch.yml build - -# Start services with watch -echo -e "${GREEN}Starting services with file watching enabled...${NC}" -echo -e "${YELLOW}Changes to files in ./src will automatically reload the API${NC}" -echo -e "${YELLOW}Changes to requirements.txt will rebuild the container${NC}" -echo -e "${YELLOW}Changes to assets will be synced immediately${NC}" -echo "" -echo -e "${GREEN}Services:${NC}" -echo -e " - API: http://localhost:8000" -echo -e " - API Docs: http://localhost:8000/docs" -echo -e " - Adminer: http://localhost:8080" -echo "" -echo -e "${YELLOW}Press Ctrl+C to stop${NC}" - -# Run docker compose with watch -exec docker compose -f docker-compose.watch.yml up --watch diff --git a/docker-compose.watch.yml b/docker-compose.watch.yml index 80fffcaf..296e815f 100644 --- a/docker-compose.watch.yml +++ b/docker-compose.watch.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: db: image: mysql:8.0 @@ -33,7 +31,7 @@ services: api: build: - context: . + context: ./backend dockerfile: Dockerfile.dev container_name: stupa_api restart: unless-stopped @@ -67,16 +65,16 @@ services: develop: watch: - action: sync - path: ./src + path: ./backend/src target: /app/src - action: rebuild - path: ./requirements.txt + path: ./backend/requirements.txt - action: sync - path: ./assets + path: ./backend/assets target: /app/assets volumes: - - ./src:/app/src - - ./assets:/app/assets + - ./backend/src:/app/src + - ./backend/assets:/app/assets adminer: image: adminer:4 diff --git a/docker-compose.yml b/docker-compose.yml index 51bf1cfd..82d910fc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: db: image: mysql:8.0 @@ -33,7 +31,7 @@ services: api: build: - context: . + context: ./backend dockerfile: Dockerfile container_name: stupa_api restart: unless-stopped @@ -65,6 +63,24 @@ services: timeout: 5s retries: 6 + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + container_name: stupa_frontend + restart: unless-stopped + depends_on: + - api + ports: + - "3001:80" + environment: + - NODE_ENV=production + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://localhost/ || exit 1"] + interval: 10s + timeout: 5s + retries: 6 + adminer: image: adminer:4 container_name: stupa_adminer diff --git a/docs/API_REFERENCE.md b/docs/API_REFERENCE.md new file mode 100644 index 00000000..a2993190 --- /dev/null +++ b/docs/API_REFERENCE.md @@ -0,0 +1,469 @@ +# API Reference + +This document provides a comprehensive reference for all API endpoints in the STUPA PDF API system. + +## Base URL + +- **Development**: `http://localhost:8000` +- **Production**: `https://your-domain.com/api` + +## Authentication + +The API uses two types of authentication: + +### Application Key Authentication +- **Header**: `X-PA-KEY` +- **Purpose**: Access specific application data +- **Scope**: Read/write access to single application + +### Master Key Authentication +- **Header**: `X-MASTER-KEY` +- **Purpose**: Administrative access +- **Scope**: Full access to all resources + +### Query Parameter Authentication +For endpoints that need to work with direct browser access (like PDF downloads), you can use: +- **Parameter**: `key` +- **Example**: `/applications/25-0001?format=pdf&key=your-app-key` + +## Response Format + +All API responses follow this general structure: + +```json +{ + "data": { ... }, // For successful responses + "detail": "...", // For error messages + "status": "success" // Optional status indicator +} +``` + +## Error Responses + +```json +{ + "detail": "Error message here" +} +``` + +Common HTTP status codes: +- `200 OK` - Success +- `201 Created` - Resource created +- `400 Bad Request` - Invalid request data +- `401 Unauthorized` - Missing or invalid authentication +- `403 Forbidden` - Insufficient permissions +- `404 Not Found` - Resource not found +- `429 Too Many Requests` - Rate limit exceeded +- `500 Internal Server Error` - Server error + +## Endpoints + +### Health Check + +#### GET / +Check if the API is running. + +**Response:** +```json +{ + "message": "STUPA PDF API" +} +``` + +--- + +### PDF Upload and Processing + +#### POST /upload +Upload a PDF form and create a new application. + +**Request:** +- **Content-Type**: `multipart/form-data` +- **Body**: + - `file` (required): PDF file to upload + - `form_type` (required): Type of form (`"pa_form"` or `"vsm_form"`) + +**Response:** +```json +{ + "pa_id": "25-0001", + "pa_key": "generated-secure-key", + "data": { + "projectBeginn": "2025-01-01", + "name": "Student Project", + // ... other parsed data + } +} +``` + +**Example:** +```bash +curl -X POST "http://localhost:8000/upload" \ + -F "file=@application.pdf" \ + -F "form_type=pa_form" +``` + +--- + +### Application Management + +#### GET /applications/{pa_id} +Retrieve application data. + +**Parameters:** +- `pa_id` (path): Application ID (e.g., "25-0001") +- `format` (query): Response format (`"json"` or `"pdf"`) +- `key` (query): Application key (alternative to header) + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response (JSON):** +```json +{ + "pa_id": "25-0001", + "created_at": "2024-01-01T00:00:00", + "updated_at": "2024-01-01T00:00:00", + "data": { + "projectBeginn": "2025-01-01", + "name": "Student Project", + // ... full application data + } +} +``` + +**Response (PDF):** +Binary PDF file with filled form. + +--- + +#### PUT /applications/{pa_id} +Update application data. + +**Parameters:** +- `pa_id` (path): Application ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Request Body:** +```json +{ + "projectBeginn": "2025-01-01", + "name": "Updated Project Name", + // ... fields to update +} +``` + +**Response:** +```json +{ + "pa_id": "25-0001", + "data": { + // ... updated application data + } +} +``` + +--- + +#### DELETE /applications/{pa_id} +Delete an application (admin only). + +**Parameters:** +- `pa_id` (path): Application ID + +**Headers:** +- `X-MASTER-KEY` (required) + +**Response:** +```json +{ + "detail": "Application deleted successfully" +} +``` + +--- + +### Attachment Management + +#### GET /applications/{pa_id}/attachments +List all attachments for an application. + +**Parameters:** +- `pa_id` (path): Application ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +```json +{ + "attachments": [ + { + "id": 1, + "filename": "receipt.pdf", + "content_type": "application/pdf", + "size": 102400, + "created_at": "2024-01-01T00:00:00" + } + ], + "total_count": 1, + "total_size": 102400 +} +``` + +--- + +#### POST /applications/{pa_id}/attachments +Upload a new attachment. + +**Parameters:** +- `pa_id` (path): Application ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Request:** +- **Content-Type**: `multipart/form-data` +- **Body**: + - `file` (required): File to upload + +**Response:** +```json +{ + "id": 1, + "filename": "receipt.pdf", + "content_type": "application/pdf", + "size": 102400, + "created_at": "2024-01-01T00:00:00" +} +``` + +**Limits:** +- Maximum 30 attachments per application +- Maximum 100MB total size per application +- Maximum 50MB per file + +--- + +#### GET /applications/{pa_id}/attachments/{attachment_id} +Download a specific attachment. + +**Parameters:** +- `pa_id` (path): Application ID +- `attachment_id` (path): Attachment ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +Binary file data + +--- + +#### DELETE /applications/{pa_id}/attachments/{attachment_id} +Delete an attachment. + +**Parameters:** +- `pa_id` (path): Application ID +- `attachment_id` (path): Attachment ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +```json +{ + "detail": "Attachment deleted successfully" +} +``` + +--- + +### Comparison Offers + +#### GET /applications/{pa_id}/costs/{cost_position_index}/offers +Get comparison offers for a cost position. + +**Parameters:** +- `pa_id` (path): Application ID +- `cost_position_index` (path): Cost position index (0-based) + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +```json +{ + "cost_position_index": 0, + "offers": [ + { + "id": 1, + "supplier_name": "Supplier A", + "amount": 1000.00, + "description": "Standard package", + "url": "https://supplier-a.com/quote", + "attachment_id": null, + "is_preferred": false, + "created_at": "2024-01-01T00:00:00" + } + ], + "no_offers_required": false, + "justification": null +} +``` + +--- + +#### POST /applications/{pa_id}/costs/{cost_position_index}/offers +Create a new comparison offer. + +**Parameters:** +- `pa_id` (path): Application ID +- `cost_position_index` (path): Cost position index + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Request Body:** +```json +{ + "supplier_name": "Supplier A", + "amount": 1000.00, + "description": "Standard package", + "url": "https://supplier-a.com/quote", + "attachment_id": null, + "is_preferred": false +} +``` + +**Response:** +```json +{ + "id": 1, + "supplier_name": "Supplier A", + "amount": 1000.00, + "description": "Standard package", + "url": "https://supplier-a.com/quote", + "attachment_id": null, + "is_preferred": false, + "created_at": "2024-01-01T00:00:00" +} +``` + +--- + +#### PUT /applications/{pa_id}/costs/{cost_position_index}/offers/{offer_id}/preferred +Set an offer as preferred. + +**Parameters:** +- `pa_id` (path): Application ID +- `cost_position_index` (path): Cost position index +- `offer_id` (path): Offer ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +```json +{ + "detail": "Preferred offer updated successfully" +} +``` + +--- + +#### DELETE /applications/{pa_id}/costs/{cost_position_index}/offers/{offer_id} +Delete a comparison offer. + +**Parameters:** +- `pa_id` (path): Application ID +- `cost_position_index` (path): Cost position index +- `offer_id` (path): Offer ID + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Response:** +```json +{ + "detail": "Offer deleted successfully" +} +``` + +--- + +#### PUT /applications/{pa_id}/costs/{cost_position_index}/justification +Update justification for not requiring comparison offers. + +**Parameters:** +- `pa_id` (path): Application ID +- `cost_position_index` (path): Cost position index + +**Headers:** +- `X-PA-KEY` or `X-MASTER-KEY` + +**Request Body:** +```json +{ + "no_offers_required": true, + "justification": "This is a unique service provider with no alternatives..." +} +``` + +**Response:** +```json +{ + "detail": "Justification updated successfully" +} +``` + +--- + +## Rate Limiting + +The API implements rate limiting to prevent abuse: + +- **Per IP**: 60 requests per minute (configurable) +- **Per Key**: 30 requests per minute (configurable) +- **Excluded**: localhost and Docker internal IPs + +Rate limit headers in responses: +- `X-RateLimit-Limit`: Maximum requests allowed +- `X-RateLimit-Remaining`: Requests remaining +- `X-RateLimit-Reset`: Unix timestamp when limit resets + +--- + +## WebSocket Endpoints + +Currently, the API does not provide WebSocket endpoints. All communication is via REST HTTP. + +--- + +## Pagination + +For endpoints that return lists, pagination may be implemented in future versions using: +- `limit`: Number of items per page +- `offset`: Starting position +- `page`: Page number (alternative to offset) + +--- + +## Versioning + +The API currently does not use versioning. Future versions may implement versioning via: +- URL path: `/v1/applications` +- Header: `Accept: application/vnd.stupa.v1+json` + +--- + +## OpenAPI Documentation + +Complete OpenAPI 3.0 documentation is available at: +- **Swagger UI**: `/docs` +- **ReDoc**: `/redoc` +- **OpenAPI JSON**: `/openapi.json` + +These provide interactive documentation with the ability to test endpoints directly. \ No newline at end of file diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..3fac02be --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,181 @@ +# Architecture Overview + +## System Architecture + +The STUPA PDF API is built using a microservices architecture with clear separation of concerns between the frontend, backend, and database layers. + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ Frontend │────▢│ API Gateway │────▢│ Backend β”‚ +β”‚ (React/TS) β”‚ β”‚ (Nginx) β”‚ β”‚ (FastAPI) β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ β”‚ β”‚ + β”‚ Database β”‚ β”‚ File Storage β”‚ + β”‚ (MySQL) β”‚ β”‚ (Base64 DB) β”‚ + β”‚ β”‚ β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Components + +### Frontend (React Application) +- **Technology**: React 18 with TypeScript +- **State Management**: With State +- **UI Framework**: Material-UI +- **Build Tool**: Vite +- **Features**: + - Single Page Application (SPA) + - Responsive design + - Real-time form validation + - File upload management + - PDF preview capabilities + +### API Gateway (Nginx) +- **Purpose**: Reverse proxy and static file serving +- **Features**: + - Route `/api/*` requests to backend + - Serve static frontend assets + - Handle CORS + - SSL termination (production) + - Request buffering + - Gzip compression + +### Backend (FastAPI) +- **Framework**: FastAPI (Python 3.11) +- **ORM**: SQLAlchemy +- **PDF Processing**: PyPDF2, ReportLab +- **Features**: + - RESTful API design + - Automatic API documentation + - Request validation + - Rate limiting + - Authentication middleware + - PDF parsing and generation + +### Database (MySQL) +- **Version**: MySQL 8.0 +- **Character Set**: utf8mb4 +- **Features**: + - Relational data model + - Foreign key constraints + - Indexes for performance + - Transaction support + +## Data Flow + +### Application Creation Flow +``` +1. User uploads PDF β†’ Frontend +2. Frontend sends PDF to API β†’ POST /upload +3. Backend parses PDF β†’ Extracts structured data +4. Backend creates application β†’ Stores in database +5. Backend returns application ID and key +6. Frontend redirects to application view +``` + +### PDF Generation Flow +``` +1. User requests PDF β†’ GET /applications/{id}?format=pdf +2. Backend loads application data +3. Backend fills PDF template +4. Backend returns filled PDF +5. Frontend displays/downloads PDF +``` + +## Security Architecture + +### Authentication Layers +1. **Application Key** (`X-PA-KEY`) + - Generated per application + - Allows read/write access to specific application + - Stored as SHA-256 hash + +2. **Master Key** (`X-MASTER-KEY`) + - Environment variable + - Full admin access + - Never exposed to frontend + +### Security Features +- Rate limiting per IP and per key +- SQL injection prevention (ORM) +- XSS protection (React) +- CORS configuration +- Input validation +- Secure password hashing + +## Database Schema + +### Core Tables +- `applications` - Main application data +- `application_keys` - Authentication keys +- `attachments` - File storage (Base64) +- `application_attachments` - Link table +- `comparison_offers` - Cost comparison data +- `cost_position_justifications` - Justification text + +### Key Relationships +- Applications ↔ Keys (1:N) +- Applications ↔ Attachments (N:N) +- Applications ↔ Comparison Offers (1:N) + +## Scalability Considerations + +### Horizontal Scaling +- Stateless API design +- Database connection pooling +- Load balancer ready +- Containerized deployment + +### Performance Optimizations +- Database indexes on foreign keys +- Lazy loading of attachments +- Efficient PDF streaming +- Response caching headers +- Gzip compression + +## Development vs Production + +### Development Environment +- Hot reloading (frontend & backend) +- Debug logging +- Local file storage +- Relaxed CORS +- Default credentials + +### Production Environment +- Optimized builds +- Error tracking +- Cloud storage ready +- Strict CORS +- Secret management +- SSL/TLS encryption + +## Future Architecture Considerations + +### Potential Enhancements +1. **Microservice Separation** + - PDF service + - Authentication service + - Notification service + +2. **External Storage** + - S3-compatible object storage + - CDN for static assets + +3. **Caching Layer** + - Redis for session management + - Application data caching + +4. **Message Queue** + - Async PDF generation + - Email notifications + +5. **Monitoring** + - Application metrics + - Performance monitoring + - Error tracking diff --git a/ATTACHMENT_FEATURE.md b/docs/ATTACHMENT_FEATURE.md similarity index 100% rename from ATTACHMENT_FEATURE.md rename to docs/ATTACHMENT_FEATURE.md diff --git a/COMPARISON_OFFERS_FEATURE.md b/docs/COMPARISON_OFFERS_FEATURE.md similarity index 100% rename from COMPARISON_OFFERS_FEATURE.md rename to docs/COMPARISON_OFFERS_FEATURE.md diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md new file mode 100644 index 00000000..5beed090 --- /dev/null +++ b/docs/CONFIGURATION.md @@ -0,0 +1,422 @@ +# Configuration Guide + +This guide covers all configuration options for the STUPA PDF API system. + +## Environment Variables + +The application is configured using environment variables. These can be set in a `.env` file in the project root or passed directly to Docker. + +### Database Configuration + +| Variable | Description | Default | Required | +|----------|-------------|---------|----------| +| `MYSQL_HOST` | MySQL server hostname | `db` | Yes | +| `MYSQL_PORT` | MySQL server port | `3306` | Yes | +| `MYSQL_DB` | Database name | `stupa` | Yes | +| `MYSQL_USER` | Database user | `stupa` | Yes | +| `MYSQL_PASSWORD` | Database password | None | Yes | +| `MYSQL_ROOT_PASSWORD` | MySQL root password | None | Yes | + +**Example:** +```env +MYSQL_HOST=db +MYSQL_PORT=3306 +MYSQL_DB=stupa +MYSQL_USER=stupa +MYSQL_PASSWORD=secure_password_here +MYSQL_ROOT_PASSWORD=secure_root_password_here +``` + +### Authentication + +| Variable | Description | Default | Required | +|----------|-------------|---------|----------| +| `MASTER_KEY` | Master key for admin access | None | Yes | + +**Security Notes:** +- Generate a strong, random master key +- Never commit the master key to version control +- Rotate the master key periodically +- Use different keys for each environment + +**Example:** +```env +MASTER_KEY=your_very_secure_master_key_here +``` + +### Rate Limiting + +| Variable | Description | Default | Required | +|----------|-------------|---------|----------| +| `RATE_IP_PER_MIN` | Requests per minute per IP | `60` | No | +| `RATE_KEY_PER_MIN` | Requests per minute per key | `30` | No | + +**Notes:** +- Rate limiting is disabled for localhost and Docker internal IPs +- Adjust based on your expected traffic +- Set to `0` to disable rate limiting (not recommended for production) + +**Example:** +```env +RATE_IP_PER_MIN=60 +RATE_KEY_PER_MIN=30 +``` + +### Application Settings + +| Variable | Description | Default | Required | +|----------|-------------|---------|----------| +| `TZ` | Timezone for the application | `Europe/Berlin` | No | +| `QSM_TEMPLATE` | Path to QSM PDF template | `/app/assets/qsm.pdf` | No | +| `VSM_TEMPLATE` | Path to VSM PDF template | `/app/assets/vsm.pdf` | No | + +**Example:** +```env +TZ=Europe/Berlin +QSM_TEMPLATE=/app/assets/qsm.pdf +VSM_TEMPLATE=/app/assets/vsm.pdf +``` + +### Frontend Configuration + +| Variable | Description | Default | Required | +|----------|-------------|---------|----------| +| `NODE_ENV` | Node environment | `production` | No | +| `VITE_API_URL` | API URL for frontend | `/api` | No | + +**Example:** +```env +NODE_ENV=production +VITE_API_URL=/api +``` + +## Advanced Configuration + +### CORS Configuration + +For production deployments, configure CORS appropriately: + +```python +# In service_api.py (for reference) +CORS_ORIGINS = os.getenv("CORS_ORIGINS", "").split(",") +# Or hardcode in production +CORS_ORIGINS = ["https://your-domain.com"] +``` + +### Database Connection Pool + +Configure connection pooling for better performance: + +```env +# Optional database pool settings +DB_POOL_SIZE=10 +DB_MAX_OVERFLOW=20 +DB_POOL_TIMEOUT=30 +DB_POOL_RECYCLE=3600 +``` + +### File Upload Limits + +Control file upload constraints: + +```env +# Maximum upload size in bytes (100MB) +MAX_UPLOAD_SIZE=104857600 +# Maximum attachments per application +MAX_ATTACHMENTS_PER_APP=30 +# Maximum size per attachment (50MB) +MAX_ATTACHMENT_SIZE=52428800 +``` + +### Logging Configuration + +Configure logging levels and outputs: + +```env +# Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL +LOG_LEVEL=INFO +# Log format: json, text +LOG_FORMAT=json +# Log file path (optional) +LOG_FILE=/var/log/stupa-api.log +# Enable access logs +ENABLE_ACCESS_LOGS=true +``` + +### Session Configuration + +Control session behavior: + +```env +# Session timeout in seconds (1 hour) +SESSION_TIMEOUT=3600 +# Session cookie settings +SESSION_COOKIE_SECURE=true +SESSION_COOKIE_HTTPONLY=true +SESSION_COOKIE_SAMESITE=strict +``` + +## Docker Compose Configuration + +### Port Mapping + +Default port configuration in `docker-compose.yml`: + +```yaml +services: + frontend: + ports: + - "3000:80" # Frontend on port 3000 + api: + ports: + - "8000:8000" # API on port 8000 + db: + ports: + - "3306:3306" # MySQL on port 3306 + adminer: + ports: + - "8080:8080" # Adminer on port 8080 +``` + +To change ports, modify the left side of the mapping: +```yaml +ports: + - "8080:80" # Change frontend to port 8080 +``` + +### Volume Configuration + +Persistent data storage: + +```yaml +volumes: + db_data: # MySQL data +``` + +For development, you can add more volumes: +```yaml +volumes: + - ./backend/src:/app/src # Hot reload for backend + - ./frontend/src:/usr/share/nginx/html # Hot reload for frontend +``` + +### Network Configuration + +Services communicate on an internal Docker network. To customize: + +```yaml +networks: + stupa_network: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 +``` + +## Production Configuration + +### SSL/TLS Configuration + +For HTTPS in production, use a reverse proxy: + +```nginx +server { + listen 443 ssl http2; + server_name your-domain.com; + + ssl_certificate /path/to/cert.pem; + ssl_certificate_key /path/to/key.pem; + + location / { + proxy_pass http://localhost:3000; + } + + location /api/ { + proxy_pass http://localhost:8000/; + } +} +``` + +### Environment-Specific Files + +Create environment-specific configuration: + +```bash +# Development +.env.development + +# Staging +.env.staging + +# Production +.env.production +``` + +Load the appropriate file: +```bash +docker compose --env-file .env.production up -d +``` + +### Security Headers + +Add security headers in production: + +```env +# Enable security headers +SECURE_HEADERS=true +# HSTS settings +HSTS_ENABLED=true +HSTS_MAX_AGE=31536000 +HSTS_INCLUDE_SUBDOMAINS=true +# CSP settings +CSP_ENABLED=true +CSP_POLICY="default-src 'self'" +``` + +### Backup Configuration + +Configure automated backups: + +```env +# Enable backups +BACKUP_ENABLED=true +# Backup schedule (cron format) +BACKUP_SCHEDULE="0 2 * * *" +# Backup retention days +BACKUP_RETENTION_DAYS=30 +# Backup destination +BACKUP_PATH=/backups +# S3 backup (optional) +BACKUP_S3_BUCKET=stupa-backups +BACKUP_S3_REGION=eu-central-1 +``` + +## Performance Tuning + +### MySQL Configuration + +Optimize MySQL for your workload: + +```cnf +# my.cnf +[mysqld] +innodb_buffer_pool_size = 1G +innodb_log_file_size = 256M +innodb_flush_method = O_DIRECT +max_connections = 200 +``` + +### API Worker Configuration + +Configure Uvicorn workers: + +```env +# Number of worker processes +WEB_CONCURRENCY=4 +# Worker class +WORKER_CLASS=uvicorn.workers.UvicornWorker +# Worker timeout +WORKER_TIMEOUT=300 +``` + +### Frontend Build Optimization + +For production builds: + +```env +# Enable production optimizations +VITE_BUILD_COMPRESS=true +VITE_BUILD_SOURCEMAP=false +VITE_BUILD_MINIFY=true +``` + +## Monitoring Configuration + +### Health Check Configuration + +Configure health check parameters: + +```env +# Health check interval in seconds +HEALTH_CHECK_INTERVAL=30 +# Health check timeout +HEALTH_CHECK_TIMEOUT=5 +# Health check retries +HEALTH_CHECK_RETRIES=3 +``` + +### Metrics Configuration + +Enable metrics collection: + +```env +# Enable Prometheus metrics +ENABLE_METRICS=true +METRICS_PORT=9090 +# Enable application metrics +COLLECT_APP_METRICS=true +``` + +## Troubleshooting Configuration Issues + +### Validation + +Validate your configuration: + +```bash +# Check Docker Compose configuration +docker compose config + +# Test environment variables +docker compose run --rm api env + +# Verify database connection +docker compose exec api python -c "from service_api import get_db; db = next(get_db()); print('DB OK')" +``` + +### Common Issues + +1. **Database Connection Failed** + - Check `MYSQL_HOST` is correct + - Ensure database service is healthy + - Verify credentials match + +2. **Rate Limiting Too Restrictive** + - Increase `RATE_IP_PER_MIN` + - Check if IP is excluded + +3. **File Upload Fails** + - Check `MAX_UPLOAD_SIZE` + - Verify disk space + - Check nginx client_max_body_size + +4. **CORS Errors** + - Configure `CORS_ORIGINS` + - Check frontend `VITE_API_URL` + +## Configuration Best Practices + +1. **Use Strong Passwords** + - Minimum 20 characters + - Use password generator + - Different for each environment + +2. **Separate Environments** + - Never use production credentials in development + - Use different master keys + - Isolate databases + +3. **Version Control** + - Commit `.env.example` + - Never commit `.env` + - Document all variables + +4. **Regular Updates** + - Review configuration quarterly + - Update dependencies + - Rotate credentials + +5. **Monitoring** + - Log configuration changes + - Alert on failures + - Track performance metrics \ No newline at end of file diff --git a/DEVELOPMENT.md b/docs/DEVELOPMENT.md similarity index 100% rename from DEVELOPMENT.md rename to docs/DEVELOPMENT.md diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md new file mode 100644 index 00000000..d211d42f --- /dev/null +++ b/docs/INSTALLATION.md @@ -0,0 +1,223 @@ +# Installation Guide + +This guide will walk you through installing and setting up the STUPA PDF API system on your local machine or server. + +## Prerequisites + +### System Requirements +- **Operating System**: Linux, macOS, or Windows (with WSL2) +- **Memory**: Minimum 4GB RAM (8GB recommended) +- **Storage**: At least 2GB free disk space +- **Network**: Internet connection for downloading dependencies + +### Required Software +- **Docker**: Version 20.10 or higher +- **Docker Compose**: Version 2.0 or higher +- **Git**: For cloning the repository +- **Text Editor**: For editing configuration files + +### Optional Software +- **Make**: For using the Makefile commands +- **Node.js**: Only if developing the frontend locally +- **Python 3.11**: Only if developing the backend locally + +## Installation Steps + +### 1. Clone the Repository + +```bash +git clone https://github.com/your-org/stupa-pdf-api.git +cd stupa-pdf-api +``` + +### 2. Create Environment Configuration + +Use the provided script to create your `.env` file: + +```bash +./scripts/create-env.sh +``` + +This script will: +- Ask for configuration values (with sensible defaults) +- Generate secure passwords automatically +- Create a `.env` file with all required variables + +Alternatively, create `.env` manually: + +```bash +cp .env.example .env +# Edit .env with your preferred editor +``` + +### 3. Build and Start Services + +```bash +# Build all services +docker compose build + +# Start all services in detached mode +docker compose up -d +``` + +This will start: +- MySQL database (port 3306) +- Backend API (port 8000) +- Frontend application (port 3000) +- Adminer database UI (port 8080) + +### 4. Initialize Database + +The database will be automatically initialized when the MySQL container starts. To run migrations manually: + +```bash +# Execute migrations +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_comparison_offers_tables.sql +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_attachments_tables.sql +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_url_to_comparison_offers.sql +docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < backend/src/migrations/add_is_preferred_to_comparison_offers.sql +``` + +### 5. Verify Installation + +Check that all services are running: + +```bash +docker compose ps +``` + +All services should show as "Up" and "Healthy". + +Test the installation: + +```bash +# Test API endpoint +curl http://localhost:8000/ + +# Test frontend +curl http://localhost:3000/ + +# You should see responses from both services +``` + +## Post-Installation + +### Access Points + +After successful installation, you can access: + +- **Frontend Application**: http://localhost:3000 +- **API Documentation**: http://localhost:8000/docs +- **Alternative API Docs**: http://localhost:8000/redoc +- **Database UI (Adminer)**: http://localhost:8080 + - Server: `db` + - Username: `root` or your configured `MYSQL_USER` + - Password: Your configured password + - Database: Your configured `MYSQL_DB` + +### Initial Setup + +1. **Test PDF Upload**: + - Navigate to http://localhost:3000 + - Upload a test PDF form + - Verify it's processed correctly + +2. **Create Test Application**: + - Use the frontend to create a new application + - Note the generated application ID and key + +3. **Verify Database**: + - Access Adminer at http://localhost:8080 + - Check that tables are created + - Verify test data is stored + +## Troubleshooting Installation + +### Common Issues + +#### Docker Compose Not Found +```bash +# Install Docker Compose V2 +docker compose version +# If not found, update Docker Desktop or install manually +``` + +#### Port Already in Use +```bash +# Find process using port (example for port 3000) +lsof -i :3000 # macOS/Linux +netstat -ano | findstr :3000 # Windows + +# Change port in docker-compose.yml or stop conflicting service +``` + +#### Permission Denied +```bash +# Add user to docker group (Linux) +sudo usermod -aG docker $USER +# Log out and back in for changes to take effect +``` + +#### Database Connection Failed +```bash +# Check MySQL container logs +docker compose logs db + +# Verify environment variables +docker compose config + +# Ensure database is healthy +docker compose ps db +``` + +### Resetting Installation + +To completely reset the installation: + +```bash +# Stop all services +docker compose down + +# Remove volumes (WARNING: Deletes all data) +docker compose down -v + +# Remove all images +docker compose down --rmi all + +# Start fresh +docker compose up -d +``` + +## Development Installation + +For local development without Docker: + +### Backend Development +```bash +cd backend +python -m venv venv +source venv/bin/activate # Linux/macOS +# or +venv\Scripts\activate # Windows + +pip install -r requirements.txt +# Set environment variables +export MYSQL_HOST=localhost +# ... other variables +uvicorn src.service_api:app --reload +``` + +### Frontend Development +```bash +cd frontend +npm install +npm run dev +``` + +See [Development Guide](./DEVELOPMENT.md) for more details. + +## Next Steps + +- Review the [Configuration Guide](./CONFIGURATION.md) for advanced settings +- Check the [Quick Start Guide](./QUICK_START.md) to begin using the system +- Read the [API Reference](./API_REFERENCE.md) for integration options \ No newline at end of file diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md new file mode 100644 index 00000000..3cd3dcba --- /dev/null +++ b/docs/QUICK_START.md @@ -0,0 +1,204 @@ +# Quick Start Guide + +Get up and running with STUPA PDF API in 5 minutes! + +## Prerequisites + +- Docker and Docker Compose installed +- Git installed +- 5 minutes of your time + +## πŸš€ Quick Setup + +### 1. Clone and Navigate + +```bash +git clone https://github.com/your-org/stupa-pdf-api.git +cd stupa-pdf-api +``` + +### 2. Generate Configuration + +```bash +# Make the script executable +chmod +x scripts/create-env.sh + +# Run the configuration script +./scripts/create-env.sh +``` + +Just press Enter to accept all defaults for a quick local setup. + +### 3. Start Everything + +```bash +docker compose up -d +``` + +Wait about 30 seconds for all services to start. + +### 4. Verify It's Working + +```bash +# Check all services are running +docker compose ps + +# Test the API +curl http://localhost:8000/ + +# Should return: {"message":"STUPA PDF API"} +``` + +## 🎯 Your First Application + +### Using the Web Interface + +1. **Open the Frontend** + - Navigate to http://localhost:3000 + - You'll see the STUPA PDF application interface + +2. **Upload a PDF Form** + - Click "Upload PDF" or drag and drop a PDF form + - The system will parse and extract data automatically + +3. **Review Application Data** + - Check the extracted information + - Edit any fields if needed + - Add comparison offers for cost positions + +4. **Save Your Work** + - Note the Application ID (e.g., "25-0001") + - Save the Application Key securely (shown once!) + +### Using the API Directly + +```bash +# Upload a PDF and create application +curl -X POST "http://localhost:8000/upload" \ + -F "file=@your-form.pdf" \ + -F "form_type=pa_form" + +# Response includes: +# - pa_id: Your application ID +# - pa_key: Your access key (save this!) +``` + +## πŸ“ Common Tasks + +### View Your Application + +```bash +# Using the web interface +http://localhost:3000/applications/YOUR_PA_ID?key=YOUR_PA_KEY + +# Using the API +curl "http://localhost:8000/applications/YOUR_PA_ID?format=json" \ + -H "X-PA-KEY: YOUR_PA_KEY" +``` + +### Generate Filled PDF + +```bash +# Download filled PDF +curl "http://localhost:8000/applications/YOUR_PA_ID?format=pdf" \ + -H "X-PA-KEY: YOUR_PA_KEY" \ + -o filled-form.pdf +``` + +### Add Attachments + +```bash +# Upload an attachment +curl -X POST "http://localhost:8000/applications/YOUR_PA_ID/attachments" \ + -H "X-PA-KEY: YOUR_PA_KEY" \ + -F "file=@receipt.pdf" +``` + +### Manage Comparison Offers + +Use the web interface to: +1. Click on any cost position +2. Add at least 3 comparison offers +3. Select your preferred offer +4. Save changes + +## πŸ› οΈ Quick Admin Tasks + +### Access the Database + +1. Open http://localhost:8080 (Adminer) +2. Login with: + - System: MySQL + - Server: `db` + - Username: `root` + - Password: (from your .env file) + - Database: `stupa` + +### View API Documentation + +- **Interactive Docs**: http://localhost:8000/docs +- **Alternative Docs**: http://localhost:8000/redoc + +### Check Logs + +```bash +# All services +docker compose logs -f + +# Specific service +docker compose logs -f api +docker compose logs -f frontend +docker compose logs -f db +``` + +## πŸ”§ Quick Troubleshooting + +### Services Won't Start + +```bash +# Check for port conflicts +docker compose ps + +# Restart everything +docker compose restart + +# Full reset +docker compose down +docker compose up -d +``` + +### Can't Access Frontend + +1. Check if port 3000 is already in use +2. Wait 30 seconds after starting services +3. Try http://127.0.0.1:3000 instead + +### API Returns 429 (Too Many Requests) + +The API has rate limiting. Default: 60 requests/minute per IP. + +### Lost Application Key + +Application keys cannot be recovered. You'll need to: +1. Use the master key (from .env) for admin access +2. Or create a new application + +## πŸ“š Next Steps + +Now that you're up and running: + +1. **Explore the Frontend**: Try all features in the web interface +2. **Read API Docs**: Check http://localhost:8000/docs +3. **Customize Settings**: Edit `.env` for your needs +4. **Add Test Data**: Create sample applications +5. **Plan Deployment**: See [Deployment Guide](./DEPLOYMENT.md) + +## πŸ†˜ Getting Help + +- Check [FAQ](./FAQ.md) for common questions +- See [Troubleshooting Guide](./TROUBLESHOOTING.md) for issues +- Review [API Reference](./API_REFERENCE.md) for integration + +--- + +**Congratulations!** πŸŽ‰ You now have a working STUPA PDF API system! \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..e80a4c8a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,98 @@ +# STUPA PDF API Documentation + +Welcome to the STUPA PDF API documentation. This directory contains comprehensive documentation for the STUPA PDF API system, which handles PDF processing, form filling, and application management for student parliament funding applications. + +## Documentation Structure + +### πŸ“š Main Documentation + +- **[Architecture Overview](./ARCHITECTURE.md)** - System architecture, components, and design decisions +- **[API Reference](./API_REFERENCE.md)** - Complete API endpoint documentation +- **[Frontend Guide](./FRONTEND_GUIDE.md)** - Frontend development and usage guide +- **[Database Schema](./DATABASE_SCHEMA.md)** - Database structure and relationships + +### πŸš€ Getting Started + +- **[Installation Guide](./INSTALLATION.md)** - Step-by-step installation instructions +- **[Configuration Guide](./CONFIGURATION.md)** - Environment variables and configuration options +- **[Quick Start](./QUICK_START.md)** - Get up and running quickly + +### πŸ’» Development + +- **[Development Guide](./DEVELOPMENT.md)** - Development workflow and best practices +- **[Contributing Guide](./CONTRIBUTING.md)** - How to contribute to the project +- **[Testing Guide](./TESTING.md)** - Testing strategies and procedures + +### πŸ”§ Features + +- **[Attachment Feature](./ATTACHMENT_FEATURE.md)** - File attachment functionality +- **[Comparison Offers Feature](./COMPARISON_OFFERS_FEATURE.md)** - Managing comparison offers +- **[PDF Processing](./PDF_PROCESSING.md)** - PDF generation and parsing + +### 🚒 Deployment + +- **[Deployment Guide](./DEPLOYMENT.md)** - Production deployment instructions +- **[Docker Guide](./DOCKER.md)** - Docker configuration and usage +- **[Security Guide](./SECURITY.md)** - Security best practices and considerations + +### πŸ” Troubleshooting + +- **[FAQ](./FAQ.md)** - Frequently asked questions +- **[Troubleshooting Guide](./TROUBLESHOOTING.md)** - Common issues and solutions +- **[Migration Guide](./MIGRATION.md)** - Database migration procedures + +## Quick Links + +- **API Base URL**: `http://localhost:8000` (development) +- **Frontend URL**: `http://localhost:3000` (development) +- **Database UI (Adminer)**: `http://localhost:8080` (development) + +## Project Overview + +The STUPA PDF API is a comprehensive system for managing student parliament funding applications. It provides: + +- **PDF Processing**: Parse uploaded PDFs and extract structured data +- **Form Generation**: Generate filled PDF forms from application data +- **Application Management**: Create, read, update, and delete applications +- **File Attachments**: Upload and manage supporting documents +- **Comparison Offers**: Manage comparison offers for cost positions +- **Authentication**: Secure access with application keys and master keys +- **Rate Limiting**: Protect against abuse with configurable rate limits + +## Technology Stack + +### Backend +- **FastAPI** - Modern Python web framework +- **SQLAlchemy** - SQL toolkit and ORM +- **MySQL** - Relational database +- **PyPDF2** - PDF processing +- **Python 3.11** - Programming language + +### Frontend +- **React 18** - UI library +- **TypeScript** - Type-safe JavaScript +- **Material-UI** - Component library +- **Zustand** - State management +- **Vite** - Build tool + +### Infrastructure +- **Docker** - Containerization +- **Docker Compose** - Multi-container orchestration +- **Nginx** - Web server and reverse proxy + +## Getting Help + +1. Check the relevant documentation section +2. Search the [FAQ](./FAQ.md) +3. Look through the [Troubleshooting Guide](./TROUBLESHOOTING.md) +4. Create an issue in the project repository + +## Documentation Updates + +This documentation is actively maintained. If you find any errors or areas that need improvement, please: + +1. Check the [Contributing Guide](./CONTRIBUTING.md) +2. Submit a pull request with your improvements +3. Or create an issue describing what needs to be updated + +Last updated: 2024 \ No newline at end of file diff --git a/scripts/create-env.sh b/scripts/create-env.sh new file mode 100755 index 00000000..b41b846e --- /dev/null +++ b/scripts/create-env.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +# STUPA PDF API Environment Setup Script +# This script helps create a .env file with all required configurations + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Default values +DEFAULT_MYSQL_DB="stupa" +DEFAULT_MYSQL_USER="stupa" +DEFAULT_MYSQL_PORT="3306" +DEFAULT_RATE_IP_PER_MIN="60" +DEFAULT_RATE_KEY_PER_MIN="30" + +echo -e "${GREEN}STUPA PDF API - Environment Configuration${NC}" +echo "==========================================" +echo "" + +# Check if .env already exists +if [ -f .env ]; then + echo -e "${YELLOW}Warning: .env file already exists!${NC}" + read -p "Do you want to overwrite it? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Aborted." + exit 1 + fi + echo "" +fi + +# Function to generate random password +generate_password() { + openssl rand -base64 32 | tr -d "=+/" | cut -c1-25 +} + +# Database Configuration +echo -e "${GREEN}Database Configuration${NC}" +echo "----------------------" +read -p "MySQL Database name [${DEFAULT_MYSQL_DB}]: " MYSQL_DB +MYSQL_DB=${MYSQL_DB:-$DEFAULT_MYSQL_DB} + +read -p "MySQL Username [${DEFAULT_MYSQL_USER}]: " MYSQL_USER +MYSQL_USER=${MYSQL_USER:-$DEFAULT_MYSQL_USER} + +read -p "MySQL Port [${DEFAULT_MYSQL_PORT}]: " MYSQL_PORT +MYSQL_PORT=${MYSQL_PORT:-$DEFAULT_MYSQL_PORT} + +# Generate secure passwords +echo "" +echo -e "${YELLOW}Generating secure passwords...${NC}" +MYSQL_PASSWORD=$(generate_password) +MYSQL_ROOT_PASSWORD=$(generate_password) +MASTER_KEY=$(generate_password) + +echo "MySQL Password: ${MYSQL_PASSWORD}" +echo "MySQL Root Password: ${MYSQL_ROOT_PASSWORD}" +echo "Master Key: ${MASTER_KEY}" +echo "" + +# Rate Limiting Configuration +echo -e "${GREEN}Rate Limiting Configuration${NC}" +echo "---------------------------" +read -p "Rate limit per IP per minute [${DEFAULT_RATE_IP_PER_MIN}]: " RATE_IP_PER_MIN +RATE_IP_PER_MIN=${RATE_IP_PER_MIN:-$DEFAULT_RATE_IP_PER_MIN} + +read -p "Rate limit per key per minute [${DEFAULT_RATE_KEY_PER_MIN}]: " RATE_KEY_PER_MIN +RATE_KEY_PER_MIN=${RATE_KEY_PER_MIN:-$DEFAULT_RATE_KEY_PER_MIN} + +# Application Configuration +echo "" +echo -e "${GREEN}Application Configuration${NC}" +echo "------------------------" +read -p "Timezone [Europe/Berlin]: " TZ +TZ=${TZ:-"Europe/Berlin"} + +# Create .env file +echo "" +echo -e "${GREEN}Creating .env file...${NC}" + +cat > .env << EOF +# STUPA PDF API Configuration +# Generated on $(date) + +# Database Configuration +MYSQL_HOST=db +MYSQL_PORT=${MYSQL_PORT} +MYSQL_DB=${MYSQL_DB} +MYSQL_USER=${MYSQL_USER} +MYSQL_PASSWORD=${MYSQL_PASSWORD} +MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + +# Authentication +MASTER_KEY=${MASTER_KEY} + +# Rate Limiting +RATE_IP_PER_MIN=${RATE_IP_PER_MIN} +RATE_KEY_PER_MIN=${RATE_KEY_PER_MIN} + +# Application Settings +TZ=${TZ} + +# PDF Templates (paths inside container) +QSM_TEMPLATE=/app/assets/qsm.pdf +VSM_TEMPLATE=/app/assets/vsm.pdf + +# Frontend Configuration +NODE_ENV=production +EOF + +echo -e "${GREEN}βœ“ .env file created successfully!${NC}" +echo "" +echo -e "${YELLOW}Important Security Notes:${NC}" +echo "1. Keep the .env file secure and never commit it to version control" +echo "2. Save the passwords in a secure password manager" +echo "3. The Master Key is used for admin access - keep it safe!" +echo "" +echo -e "${GREEN}Next Steps:${NC}" +echo "1. Review the .env file and adjust values if needed" +echo "2. Run 'docker compose up -d' to start the application" +echo "3. Access the application at http://localhost:3000" +echo "4. Access the API directly at http://localhost:8000" +echo "5. Access Adminer (database UI) at http://localhost:8080" diff --git a/scripts/dev.sh b/scripts/dev.sh new file mode 100755 index 00000000..d3eda212 --- /dev/null +++ b/scripts/dev.sh @@ -0,0 +1,321 @@ +#!/bin/bash + +# STUPA PDF API Development Helper Script +# This script provides convenient commands for development tasks + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Project directories +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BACKEND_DIR="${PROJECT_ROOT}/backend" +FRONTEND_DIR="${PROJECT_ROOT}/frontend" + +# Function to display usage +usage() { + echo -e "${GREEN}STUPA PDF API Development Helper${NC}" + echo "=================================" + echo "" + echo "Usage: $0 [command] [options]" + echo "" + echo "Commands:" + echo " start Start all services" + echo " stop Stop all services" + echo " restart Restart all services" + echo " status Show status of all services" + echo " logs [service] Show logs (optionally for specific service)" + echo " build [service] Build services (optionally specific service)" + echo " shell [service] Open shell in service container" + echo " db Open MySQL client" + echo " migrate Run database migrations" + echo " reset Reset everything (WARNING: deletes data)" + echo " test Run tests" + echo " lint Run linters" + echo " format Format code" + echo " clean Clean up temporary files and caches" + echo "" + echo "Services: api, frontend, db, adminer" + echo "" + echo "Examples:" + echo " $0 start # Start all services" + echo " $0 logs api # Show API logs" + echo " $0 shell frontend # Open shell in frontend container" + echo " $0 db # Connect to database" +} + +# Check if docker compose is available +check_docker() { + if ! command -v docker &> /dev/null; then + echo -e "${RED}Docker is not installed${NC}" + exit 1 + fi +} + +# Start services +start_services() { + echo -e "${GREEN}Starting all services...${NC}" + cd "${PROJECT_ROOT}" + docker compose up -d + echo -e "${GREEN}Services started!${NC}" + echo "" + echo "Access points:" + echo " Frontend: http://localhost:3000" + echo " API: http://localhost:8000" + echo " API Docs: http://localhost:8000/docs" + echo " Adminer: http://localhost:8080" +} + +# Stop services +stop_services() { + echo -e "${YELLOW}Stopping all services...${NC}" + cd "${PROJECT_ROOT}" + docker compose down + echo -e "${GREEN}Services stopped!${NC}" +} + +# Restart services +restart_services() { + echo -e "${YELLOW}Restarting all services...${NC}" + cd "${PROJECT_ROOT}" + docker compose restart + echo -e "${GREEN}Services restarted!${NC}" +} + +# Show status +show_status() { + echo -e "${BLUE}Service Status:${NC}" + cd "${PROJECT_ROOT}" + docker compose ps +} + +# Show logs +show_logs() { + cd "${PROJECT_ROOT}" + if [ -z "$1" ]; then + docker compose logs -f + else + docker compose logs -f "$1" + fi +} + +# Build services +build_services() { + cd "${PROJECT_ROOT}" + if [ -z "$1" ]; then + echo -e "${GREEN}Building all services...${NC}" + docker compose build + else + echo -e "${GREEN}Building $1...${NC}" + docker compose build "$1" + fi + echo -e "${GREEN}Build complete!${NC}" +} + +# Open shell in container +open_shell() { + if [ -z "$1" ]; then + echo -e "${RED}Please specify a service${NC}" + echo "Available services: api, frontend, db, adminer" + exit 1 + fi + + cd "${PROJECT_ROOT}" + case "$1" in + api) + docker compose exec api /bin/bash + ;; + frontend) + docker compose exec frontend /bin/sh + ;; + db) + docker compose exec db /bin/bash + ;; + adminer) + docker compose exec adminer /bin/sh + ;; + *) + echo -e "${RED}Unknown service: $1${NC}" + exit 1 + ;; + esac +} + +# Connect to database +connect_db() { + echo -e "${BLUE}Connecting to database...${NC}" + cd "${PROJECT_ROOT}" + + # Load .env file + if [ -f .env ]; then + export $(cat .env | grep -v '^#' | xargs) + fi + + docker compose exec db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} +} + +# Run migrations +run_migrations() { + echo -e "${GREEN}Running database migrations...${NC}" + cd "${PROJECT_ROOT}" + + # Load .env file + if [ -f .env ]; then + export $(cat .env | grep -v '^#' | xargs) + fi + + # Find all migration files + for migration in ${BACKEND_DIR}/src/migrations/*.sql; do + if [ -f "$migration" ]; then + echo -e "${BLUE}Applying $(basename "$migration")...${NC}" + docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < "$migration" 2>/dev/null || true + fi + done + + echo -e "${GREEN}Migrations complete!${NC}" +} + +# Reset everything +reset_all() { + echo -e "${RED}WARNING: This will delete all data!${NC}" + read -p "Are you sure? (yes/NO): " -r + echo + if [[ $REPLY == "yes" ]]; then + cd "${PROJECT_ROOT}" + echo -e "${YELLOW}Stopping services...${NC}" + docker compose down -v + echo -e "${YELLOW}Removing images...${NC}" + docker compose down --rmi local + echo -e "${GREEN}Reset complete!${NC}" + else + echo "Aborted." + fi +} + +# Run tests +run_tests() { + echo -e "${GREEN}Running tests...${NC}" + + # Backend tests + if [ -d "${BACKEND_DIR}/tests" ]; then + echo -e "${BLUE}Running backend tests...${NC}" + cd "${PROJECT_ROOT}" + docker compose exec api pytest + fi + + # Frontend tests + if [ -f "${FRONTEND_DIR}/package.json" ]; then + echo -e "${BLUE}Running frontend tests...${NC}" + cd "${PROJECT_ROOT}" + docker compose exec frontend npm test + fi + + echo -e "${GREEN}Tests complete!${NC}" +} + +# Run linters +run_lint() { + echo -e "${GREEN}Running linters...${NC}" + + # Backend linting + echo -e "${BLUE}Linting backend...${NC}" + cd "${PROJECT_ROOT}" + docker compose exec api flake8 src/ || true + docker compose exec api mypy src/ || true + + # Frontend linting + echo -e "${BLUE}Linting frontend...${NC}" + docker compose exec frontend npm run lint || true + + echo -e "${GREEN}Linting complete!${NC}" +} + +# Format code +format_code() { + echo -e "${GREEN}Formatting code...${NC}" + + # Backend formatting + echo -e "${BLUE}Formatting backend...${NC}" + cd "${PROJECT_ROOT}" + docker compose exec api black src/ + docker compose exec api isort src/ + + # Frontend formatting + echo -e "${BLUE}Formatting frontend...${NC}" + docker compose exec frontend npm run format || true + + echo -e "${GREEN}Formatting complete!${NC}" +} + +# Clean up +clean_up() { + echo -e "${YELLOW}Cleaning up...${NC}" + + # Python cache + find "${BACKEND_DIR}" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true + find "${BACKEND_DIR}" -type f -name "*.pyc" -delete 2>/dev/null || true + + # Node modules (if you want to clean them) + # rm -rf "${FRONTEND_DIR}/node_modules" + + # Docker cleanup + docker system prune -f + + echo -e "${GREEN}Cleanup complete!${NC}" +} + +# Main script logic +check_docker + +case "$1" in + start) + start_services + ;; + stop) + stop_services + ;; + restart) + restart_services + ;; + status) + show_status + ;; + logs) + show_logs "$2" + ;; + build) + build_services "$2" + ;; + shell) + open_shell "$2" + ;; + db) + connect_db + ;; + migrate) + run_migrations + ;; + reset) + reset_all + ;; + test) + run_tests + ;; + lint) + run_lint + ;; + format) + format_code + ;; + clean) + clean_up + ;; + *) + usage + ;; +esac diff --git a/src/migrations/add_attachments_tables.sql b/src/migrations/add_attachments_tables.sql deleted file mode 100644 index 2ee60829..00000000 --- a/src/migrations/add_attachments_tables.sql +++ /dev/null @@ -1,32 +0,0 @@ --- Migration: Add attachment tables --- Description: Add tables for storing file attachments for applications --- Date: 2024 - --- Create attachments table to store file data -CREATE TABLE IF NOT EXISTS `attachments` ( - `id` INT NOT NULL AUTO_INCREMENT, - `filename` VARCHAR(255) NOT NULL, - `content_type` VARCHAR(100) NOT NULL, - `size` INT NOT NULL, - `data` LONGTEXT NOT NULL, -- Base64 encoded file data - `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - INDEX `idx_created_at` (`created_at`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- Create junction table to link applications and attachments -CREATE TABLE IF NOT EXISTS `application_attachments` ( - `id` INT NOT NULL AUTO_INCREMENT, - `application_id` INT NOT NULL, - `attachment_id` INT NOT NULL, - `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uq_app_attachment` (`application_id`, `attachment_id`), - INDEX `idx_application_id` (`application_id`), - INDEX `idx_attachment_id` (`attachment_id`), - INDEX `idx_created_at` (`created_at`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- Note: Foreign key constraints are not added because the Application table --- doesn't have a direct foreign key relationship setup in the current schema. --- The application_id references the id column in the applications table. diff --git a/src/migrations/add_comparison_offers_tables.sql b/src/migrations/add_comparison_offers_tables.sql deleted file mode 100644 index 5cb79cb9..00000000 --- a/src/migrations/add_comparison_offers_tables.sql +++ /dev/null @@ -1,41 +0,0 @@ --- Migration: Add comparison offers tables --- Description: Add tables for storing comparison offers for cost positions --- Date: 2024 - --- Create comparison offers table -CREATE TABLE IF NOT EXISTS `comparison_offers` ( - `id` INT NOT NULL AUTO_INCREMENT, - `application_id` INT NOT NULL, - `cost_position_index` INT NOT NULL, - `supplier_name` VARCHAR(255) NOT NULL, - `amount` INT NOT NULL COMMENT 'Amount in cents', - `description` TEXT, - `attachment_id` INT, - `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uq_offer_supplier` (`application_id`, `cost_position_index`, `supplier_name`), - INDEX `idx_application_id` (`application_id`), - INDEX `idx_cost_position` (`application_id`, `cost_position_index`), - INDEX `idx_attachment_id` (`attachment_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- Create cost position justifications table -CREATE TABLE IF NOT EXISTS `cost_position_justifications` ( - `id` INT NOT NULL AUTO_INCREMENT, - `application_id` INT NOT NULL, - `cost_position_index` INT NOT NULL, - `no_offers_required` INT NOT NULL DEFAULT 0 COMMENT 'Boolean: 1 if no offers are required', - `justification` TEXT COMMENT 'Required when no_offers_required is 1', - `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uq_position_justification` (`application_id`, `cost_position_index`), - INDEX `idx_application_id` (`application_id`), - INDEX `idx_no_offers` (`no_offers_required`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- Note: Foreign key constraints are not added because the Application table --- doesn't have a direct foreign key relationship setup in the current schema. --- The application_id references the id column in the applications table. --- The attachment_id references the id column in the attachments table. diff --git a/src/migrations/add_is_preferred_to_comparison_offers.sql b/src/migrations/add_is_preferred_to_comparison_offers.sql deleted file mode 100644 index 5c48a1ed..00000000 --- a/src/migrations/add_is_preferred_to_comparison_offers.sql +++ /dev/null @@ -1,10 +0,0 @@ --- Add is_preferred column to comparison_offers table -ALTER TABLE comparison_offers -ADD COLUMN is_preferred BOOLEAN NOT NULL DEFAULT FALSE; - --- Add index for efficient queries -CREATE INDEX idx_comparison_offers_preferred -ON comparison_offers(application_id, cost_position_index, is_preferred); - --- Ensure only one offer per cost position can be preferred --- This is enforced at the application level diff --git a/src/migrations/add_url_to_comparison_offers.sql b/src/migrations/add_url_to_comparison_offers.sql deleted file mode 100644 index 1e4841f4..00000000 --- a/src/migrations/add_url_to_comparison_offers.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Migration: Add URL column to comparison_offers table --- Description: Add optional URL field to store links to online offers --- Date: 2024 - --- Add URL column to comparison_offers table -ALTER TABLE `comparison_offers` -ADD COLUMN `url` VARCHAR(500) DEFAULT NULL COMMENT 'Optional URL to offer document or webpage' -AFTER `description`; - --- Add index for URL column for better search performance -CREATE INDEX `idx_url` ON `comparison_offers` (`url`); - --- Update existing constraint to ensure either URL or attachment is provided --- Note: This is handled at application level since MySQL doesn't support complex CHECK constraints diff --git a/src/migrations/alter_attachments_data_column.sql b/src/migrations/alter_attachments_data_column.sql deleted file mode 100644 index 9312221b..00000000 --- a/src/migrations/alter_attachments_data_column.sql +++ /dev/null @@ -1,10 +0,0 @@ --- Migration: Alter attachments table data column to LONGTEXT --- Description: Change data column from TEXT to LONGTEXT to support larger files --- Date: 2024 - --- Check if the attachments table exists and alter the data column -ALTER TABLE `attachments` -MODIFY COLUMN `data` LONGTEXT NOT NULL COMMENT 'Base64 encoded file data'; - --- This migration fixes the issue where TEXT type (max 65,535 bytes) was too small --- for Base64 encoded files. LONGTEXT supports up to 4GB of data.