75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
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
|