oedb-backend/backend.py

118 lines
4.8 KiB
Python
Raw Normal View History

2025-09-15 23:25:11 +02:00
#!/usr/bin/env python3
"""
OpenEventDatabase Backend
2016-04-14 17:46:30 +02:00
2025-09-15 23:25:11 +02:00
This is the main entry point for the OpenEventDatabase backend.
It initializes the Falcon application and sets up the routes.
"""
2016-05-13 21:11:33 +02:00
2025-09-15 23:25:11 +02:00
import sys
2025-09-21 16:57:24 +02:00
import os
2016-04-14 17:46:30 +02:00
import falcon
2025-09-15 23:25:11 +02:00
# Import utility modules
from oedb.utils.logging import logger
2025-09-22 11:44:25 +02:00
from oedb.utils.db import check_db_connection, load_env_from_file
2025-09-15 23:25:11 +02:00
# Import middleware
from oedb.middleware.headers import HeaderMiddleware
from oedb.middleware.cache import CacheMiddleware
from oedb.middleware.rate_limit import RateLimitMiddleware
2025-09-15 23:25:11 +02:00
# Import resources
from oedb.resources.event import event
from oedb.resources.stats import StatsResource
from oedb.resources.search import EventSearch
2025-09-15 23:54:04 +02:00
from oedb.resources.root import root
2025-09-22 11:44:25 +02:00
from oedb.resources.demo import demo, demo_stats
2025-09-26 11:57:54 +02:00
from oedb.resources.live import live
from oedb.resources.rss import rss_latest, rss_by_family
from oedb.resources.event_form import event_form
2025-09-26 15:08:33 +02:00
from oedb.resources.db_dump import db_dump_list, db_dump_create
2025-09-27 01:10:47 +02:00
from oedb.resources.quality_assurance import quality_assurance
2025-09-15 23:25:11 +02:00
def create_app():
"""
Create and configure the Falcon application.
Returns:
falcon.App: The configured Falcon application.
"""
2025-09-22 11:44:25 +02:00
# Load environment variables from .env (if present)
load_env_from_file()
2025-09-15 23:25:11 +02:00
# Create the Falcon application with middleware
logger.info("Initializing Falcon application")
app = falcon.App(middleware=[
HeaderMiddleware(),
CacheMiddleware(),
RateLimitMiddleware()
])
2025-09-15 23:25:11 +02:00
2025-09-21 16:57:24 +02:00
# Add static file serving
logger.info("Setting up static file serving")
static_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'oedb', 'resources', 'demo', 'static'))
app.add_static_route('/static/', static_dir)
2025-09-22 11:44:25 +02:00
# Check environment variables
required_env = [
'DB_NAME', 'DB_HOST', 'DB_USER', 'POSTGRES_PASSWORD',
'CLIENT_ID', 'CLIENT_SECRET', 'CLIENT_REDIRECT', 'CLIENT_AUTHORIZATIONS'
]
optional_env = [
'PANORAMAX_UPLOAD_URL', 'PANORAMAX_TOKEN'
]
missing_required = [k for k in required_env if not os.getenv(k)]
missing_optional = [k for k in optional_env if not os.getenv(k)]
if missing_required:
logger.warning(f"Missing required environment variables: {', '.join(missing_required)}")
if missing_optional:
logger.info(f"Optional environment variables not set: {', '.join(missing_optional)}")
2025-09-15 23:25:11 +02:00
# Check database connection before continuing
if not check_db_connection():
logger.error("Cannot start server - PostgreSQL database is not responding")
sys.exit(1)
# Create resource instances
stats = StatsResource()
event_search = EventSearch()
# Add routes
logger.info("Setting up API routes")
2025-09-15 23:54:04 +02:00
app.add_route('/', root) # Handle root requests
app.add_route('/event/search', event_search) # Handle event search requests
2025-09-15 23:25:11 +02:00
app.add_route('/event/{id}', event) # Handle single event requests
app.add_route('/event', event) # Handle event collection requests
app.add_route('/stats', stats) # Handle stats requests
2025-09-27 01:10:47 +02:00
app.add_route('/quality_assurance', quality_assurance) # Handle quality assurance requests
2025-09-16 00:04:53 +02:00
app.add_route('/demo', demo) # Handle demo page requests
app.add_route('/demo/add', event_form) # Handle event submission form
2025-09-16 01:01:32 +02:00
app.add_route('/demo/by-what', demo, suffix='by_what') # Handle events by type page
app.add_route('/demo/map-by-what', demo, suffix='map_by_what') # Handle map by event type page
2025-09-26 17:38:30 +02:00
app.add_route('/demo/map-by-what/{event_type}', demo, suffix='map_by_what_type') # Handle map by specific event type
2025-09-16 01:09:20 +02:00
app.add_route('/demo/edit/{id}', demo, suffix='edit') # Handle event editing page
2025-09-26 11:57:54 +02:00
app.add_route('/demo/by_id/{id}', demo, suffix='by_id') # Handle view single event by id
2025-09-21 12:27:00 +02:00
app.add_route('/demo/traffic', demo, suffix='traffic') # Handle traffic jam reporting page
2025-09-21 13:35:01 +02:00
app.add_route('/demo/view-events', demo, suffix='view_events') # Handle view saved events page
2025-09-22 11:44:25 +02:00
app.add_route('/demo/stats', demo_stats) # Handle stats by what page
2025-09-27 01:10:47 +02:00
app.add_route('/demo/property-stats', demo, suffix='property_stats') # Handle property statistics page
2025-09-26 11:57:54 +02:00
app.add_route('/demo/live', live) # Live page
app.add_route('/rss', rss_latest) # RSS latest 200
app.add_route('/rss/by/{family}', rss_by_family) # RSS by family
2025-09-26 15:08:33 +02:00
app.add_route('/db/dumps', db_dump_list) # List database dumps
app.add_route('/db/dumps/create', db_dump_create) # Create database dumps
2025-09-15 23:25:11 +02:00
logger.success("Application initialized successfully")
return app
# Create the WSGI application
app = create_app()
if __name__ == '__main__':
# This block is executed when the script is run directly
import waitress
2025-09-18 19:09:25 +02:00
logger.info(" -------------- Starting server on http://127.0.0.1:8080 ------------")
2025-09-15 23:25:11 +02:00
waitress.serve(app, host='127.0.0.1', port=8080)