from flask import Flask, jsonify, request, send_from_directory from flask_cors import CORS from polygon_api import PolygonAPI from chat_routes import register_chat_routes from sentiment_routes import sentiment_bp from forecast_routes import forecast_bp import os import atexit app = Flask(__name__, static_folder='../fe', static_url_path='') CORS(app) polygon = PolygonAPI() @app.route('/') def index(): return send_from_directory(app.static_folder, 'index.html') @app.route('/company_tickers.json') def get_tickers(): return send_from_directory('../', 'company_tickers.json') @app.route('/api/ticker//details', methods=['GET']) def get_ticker_details(ticker): try: data = polygon.get_ticker_details(ticker.upper()) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//previous-close', methods=['GET']) def get_previous_close(ticker): try: data = polygon.get_previous_close(ticker.upper()) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//aggregates', methods=['GET']) def get_aggregates(ticker): try: from_date = request.args.get('from') to_date = request.args.get('to') timespan = request.args.get('timespan', 'day') data = polygon.get_aggregates(ticker.upper(), timespan, from_date, to_date) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//news', methods=['GET']) def get_news(ticker): try: limit = request.args.get('limit', 10, type=int) data = polygon.get_ticker_news(ticker.upper(), limit) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//financials', methods=['GET']) def get_financials(ticker): try: data = polygon.get_financials(ticker.upper()) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//snapshot', methods=['GET']) def get_snapshot(ticker): try: data = polygon.get_snapshot(ticker.upper()) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//dividends', methods=['GET']) def get_dividends(ticker): try: limit = request.args.get('limit', 10, type=int) data = polygon.get_dividends(ticker.upper(), limit) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/ticker//splits', methods=['GET']) def get_splits(ticker): try: limit = request.args.get('limit', 10, type=int) data = polygon.get_splits(ticker.upper(), limit) return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/market-status', methods=['GET']) def get_market_status(): try: data = polygon.get_market_status() return jsonify(data) except Exception as e: return jsonify({"error": str(e)}), 500 # Register chat routes register_chat_routes(app) # Register sentiment routes app.register_blueprint(sentiment_bp) # Register forecast routes app.register_blueprint(forecast_bp) # Graceful shutdown handler for FAISS from chat_routes import agent_service def shutdown_handler(): """Save FAISS index on graceful shutdown""" print("Shutting down gracefully, saving FAISS index...") try: agent_service.vector_store.save() print("FAISS index saved successfully") except Exception as e: print(f"Error saving FAISS index on shutdown: {e}") atexit.register(shutdown_handler) if __name__ == '__main__': from config import PORT app.run(debug=False, port=PORT)