This commit is contained in:
2025-12-22 14:47:25 -05:00
parent d4e859f9a7
commit 00e9eb8986
81 changed files with 13933 additions and 0 deletions

84
backend/config.py Normal file
View File

@@ -0,0 +1,84 @@
import os
from pathlib import Path
# Base directory
BASE_DIR = Path(__file__).parent.parent
class Config:
"""Base configuration"""
SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-in-production'
# Database configuration
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \
f'sqlite:///{(BASE_DIR / "backend" / "instance" / "trivia.db").absolute()}'
SQLALCHEMY_TRACK_MODIFICATIONS = False
# File upload configuration
UPLOAD_FOLDER = BASE_DIR / "backend" / "static" / "images"
MAX_CONTENT_LENGTH = 5 * 1024 * 1024 # 5MB max file size
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
# Audio upload configuration
AUDIO_FOLDER = BASE_DIR / "backend" / "static" / "audio"
ALLOWED_AUDIO_EXTENSIONS = {'mp3', 'm4a', 'aac', 'wav'}
MAX_AUDIO_LENGTH = 300 # 5 minutes in seconds
MAX_AUDIO_SIZE = 50 * 1024 * 1024 # 50MB
# Celery configuration
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0')
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0')
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 600 # 10 minutes max per task
# yt-dlp configuration
YTDLP_FORMAT = 'bestaudio/best'
YTDLP_POSTPROCESSOR = 'mp3'
YTDLP_QUALITY = '192' # kbps
# CORS configuration
CORS_ORIGINS = os.environ.get('CORS_ORIGINS', '*').split(',')
CORS_SUPPORTS_CREDENTIALS = True
# OIDC/Authelia configuration
OIDC_ISSUER = os.environ.get('OIDC_ISSUER')
OIDC_CLIENT_ID = os.environ.get('OIDC_CLIENT_ID', 'trivia-app')
OIDC_CLIENT_SECRET = os.environ.get('OIDC_CLIENT_SECRET')
OIDC_REDIRECT_URI = os.environ.get('OIDC_REDIRECT_URI', 'http://localhost:5001/api/auth/callback')
OIDC_AUDIENCE = os.environ.get('OIDC_AUDIENCE', OIDC_CLIENT_ID)
FRONTEND_URL = os.environ.get('FRONTEND_URL', 'http://localhost:3000')
OIDC_JWKS_URI = os.environ.get('OIDC_JWKS_URI') # Optional, auto-fetched if not set
# Cookie security
SESSION_COOKIE_SECURE = os.environ.get('SESSION_COOKIE_SECURE', 'false').lower() == 'true'
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Strict'
class DevelopmentConfig(Config):
"""Development configuration"""
DEBUG = True
FLASK_ENV = 'development'
class ProductionConfig(Config):
"""Production configuration"""
DEBUG = False
FLASK_ENV = 'production'
SECRET_KEY = os.environ.get('SECRET_KEY') # Must be set in production
class TestConfig(Config):
"""Test configuration"""
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
WTF_CSRF_ENABLED = False
# Configuration dictionary
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'test': TestConfig,
'default': DevelopmentConfig
}