from flask import Flask, jsonify from flask_cors import CORS from dotenv import load_dotenv import os, sys, logging # Configure logging so Hugging Face (gunicorn) always shows it logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[logging.StreamHandler(sys.stdout)] ) logger = logging.getLogger(__name__) logger.info(">>> Starting app.py import...") from db import db import requests load_dotenv() app = Flask(__name__) CORS(app) # Import blueprints with error handling try: from routes.auth import auth_bp from routes.courses import courses_bp from routes.feedback import feedback_bp from routes.profile import profile_bp from routes.admin import admin_bp logger.info(">>> Successfully imported all blueprints") except Exception as e: logger.exception("!!! Failed importing blueprints") raise e # Register blueprints try: app.register_blueprint(auth_bp, url_prefix="/auth") app.register_blueprint(courses_bp, url_prefix="/courses") app.register_blueprint(feedback_bp, url_prefix="/feedback") app.register_blueprint(profile_bp, url_prefix="/profile") app.register_blueprint(admin_bp, url_prefix="/admin") logger.info(">>> All blueprints registered successfully") except Exception as e: logger.exception("!!! Failed registering blueprints") raise e @app.route("/") def home(): logger.info(">>> / endpoint called") return {"status": "Backend running"} @app.route("/seed-db") def seed_db(): try: import seed logger.info(">>> /seed-db route executed successfully") return {"status": "Seeding completed!"} except Exception as e: logger.exception("!!! /seed-db failed") return {"status": "Seeding failed", "error": str(e)} @app.route("/test-db") def test_db(): try: count_users = db["users"].count_documents({}) count_courses = db["courses"].count_documents({}) count_feedback = db["feedback"].count_documents({}) logger.info(f">>> /test-db OK → users={count_users}, courses={count_courses}, feedback={count_feedback}") return { "status": "Connected to MongoDB", "users_count": count_users, "courses_count": count_courses, "feedback_count": count_feedback } except Exception as e: logger.exception("!!! /test-db failed") return {"status": "DB connection failed", "error": str(e)} # ✅ Debug route to check env vars @app.route("/debug-env") def debug_env(): logger.info(">>> /debug-env called") return { "mongo_uri_present": bool(os.environ.get("MONGO_URI")), "mongo_db_present": bool(os.environ.get("MONGO_DB")) } # ✅ Self-test route: checks if all main routes are reachable @app.route("/self-test") def self_test(): results = {} routes = ["/", "/test-db", "/debug-env", "/auth", "/courses", "/feedback", "/profile", "/admin"] with app.test_client() as client: for r in routes: try: res = client.get(r) results[r] = { "status_code": res.status_code, "ok": res.status_code == 200, "response": res.json if res.is_json else res.data.decode("utf-8") } except Exception as e: results[r] = {"error": str(e)} return jsonify(results) logger.info(">>> Finished loading app.py (Gunicorn should now serve the app)") if __name__ == "__main__": port = int(os.environ.get("PORT", 7860)) logger.info(f">>> Running Flask dev server on 0.0.0.0:{port}") app.run(host="0.0.0.0", port=port, debug=True)