This commit is contained in:
2025-11-14 12:51:18 +01:00
parent 433a16ee0e
commit 869ca3a894
20 changed files with 1606 additions and 38 deletions

View File

@@ -0,0 +1,74 @@
from flask import Blueprint, jsonify
from database import db
import redis
import os
import json
transport_bp = Blueprint('transport', __name__)
REDIS_URL = os.getenv('REDIS_URL', 'redis://redis:6379')
def get_redis_client():
"""Get Redis client"""
return redis.from_url(REDIS_URL, decode_responses=True)
@transport_bp.route('/api/transport/crawl', methods=['POST'])
def trigger_transport_crawl():
"""Trigger transport disruption crawl asynchronously via Redis queue"""
try:
r = get_redis_client()
# Publish message to Redis queue
message = {
'task': 'crawl_transport',
'timestamp': str(os.times())
}
r.lpush('transport_crawl_queue', json.dumps(message))
# Return immediately without waiting
return jsonify({
'status': 'success',
'message': 'Transport crawl task queued'
}), 202 # 202 Accepted
except Exception as e:
return jsonify({
'status': 'error',
'message': 'Failed to queue transport crawl',
'details': str(e)
}), 500
@transport_bp.route('/api/transport/disruptions', methods=['GET'])
def get_transport_disruptions():
"""Get current transport disruptions from MongoDB"""
try:
collection = db['transport_alerts']
# Get active disruptions
disruptions = list(collection.find(
{'is_active': True},
{'_id': 0}
).sort('updated_at', -1))
# Convert datetime to ISO format
for d in disruptions:
if d.get('start_time'):
d['start_time'] = d['start_time'].isoformat()
if d.get('end_time'):
d['end_time'] = d['end_time'].isoformat()
if d.get('updated_at'):
d['updated_at'] = d['updated_at'].isoformat()
return jsonify({
'total': len(disruptions),
'disruptions': disruptions
}), 200
except Exception as e:
return jsonify({
'error': 'Failed to fetch disruptions from database',
'details': str(e)
}), 500