File size: 3,710 Bytes
a7a9474
41468c2
 
9b2df1e
 
 
 
 
 
 
 
 
 
 
 
c69eff0
545cebd
41468c2
 
 
 
 
9b2df1e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41468c2
 
9b2df1e
a7a9474
9b2df1e
9c6ca56
 
 
c69eff0
9b2df1e
9c6ca56
 
9b2df1e
9c6ca56
9b2df1e
9c6ca56
 
 
9b2df1e
 
 
 
9c6ca56
 
9b2df1e
 
 
9c6ca56
 
9b2df1e
9c6ca56
18b542f
545cebd
 
 
9b2df1e
545cebd
 
 
 
 
 
 
 
 
e7befe4
 
 
 
 
 
 
 
 
 
 
 
 
 
545cebd
 
9b2df1e
 
41468c2
a7a9474
9b2df1e
a7a9474
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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)