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
|
2025-09-16 00:46:09 +02:00
|
|
|
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
|
2025-09-16 00:46:09 +02:00
|
|
|
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")
|
2025-09-16 00:46:09 +02:00
|
|
|
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
|
2025-09-16 00:46:09 +02:00
|
|
|
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)
|