import os from pathlib import Path from dotenv import load_dotenv from flask import Flask, jsonify, request from flask_cors import CORS from ai import generate_response from auth import auth_blueprint, verify_request_token BASE_DIR = Path(__file__).resolve().parent.parent ENV_PATH = BASE_DIR / ".env" load_dotenv(dotenv_path=ENV_PATH) app = Flask(__name__) CORS(app, origins=[os.getenv("FRONTEND_URL", "http://localhost:3000")]) app.register_blueprint(auth_blueprint, url_prefix="/auth") def _validate_payload(payload): if not payload: return "Missing JSON payload." if "message" not in payload: return "Missing 'message'." return None @app.route("/chat", methods=["POST"]) def chat(): token_payload, token_error = verify_request_token() if token_error: message, status = token_error return jsonify({"error": message}), status user_id = token_payload.get("user_id") if user_id is None: return jsonify({"error": "Token missing user_id."}), 401 payload = request.get_json(silent=True) error = _validate_payload(payload) if error: return jsonify({"error": error}), 400 message = payload["message"] try: reply = generate_response(user_id, message) except Exception as exc: # pragma: no cover - runtime safeguard return jsonify({"error": str(exc)}), 500 return jsonify({"reply": reply}) @app.route("/chat/history", methods=["GET"]) def chat_history(): token_payload, token_error = verify_request_token() if token_error: message, status = token_error return jsonify({"error": message}), status user_id = token_payload.get("user_id") if user_id is None: return jsonify({"error": "Token missing user_id."}), 401 history = db.get_conversation_history(str(user_id)) return jsonify({"conversations": history}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)