File size: 3,837 Bytes
17847d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f1515e9
17847d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f1dfe1c
 
17847d4
 
f1dfe1c
17847d4
 
 
 
 
8520346
 
 
 
 
 
 
 
17847d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f1515e9
17847d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
115
116
117
118
119
120
121
122
123
124
125
126
127
import os
import logging
from dotenv import load_dotenv
import dspy
from pathlib import Path
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware

# Load environment from backend/.env BEFORE importing modules that read env
_ENV_PATH = Path(__file__).resolve().parent.parent / ".env"
load_dotenv(dotenv_path=_ENV_PATH, override=False)

logging.basicConfig(
    level=logging.WARNING,  # Changed from INFO to WARNING to reduce logging
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)

from .core.db import Base, engine
from .routes.health import router as health_router
from .routes.auth import router as auth_router
from .routes.google import router as google_router
from .routes.payment import router as stripe_router
from .routes.export import router as export_router
from .routes.credits import router as credits_router
from .routes.plans import router as plans_router
from .routes.forms import router as forms_router
from .routes.responses import router as responses_router
from .routes.analytics import router as analytics_router
from .routes.users import router as users_router
from .routes.uploads import router as uploads_router

app = FastAPI(title="Backend", version="0.1.0")

default_model = os.getenv("DEFAULT_MODEL", "").lower()
if "anthropic" in default_model:
    provider = "ANTHROPIC"
elif "openai" in default_model:
    provider = "OPENAI"
elif "gemini" in default_model:
    provider = "GEMINI"
else:
    provider = "UNKNOWN"




default_lm = dspy.LM(default_model, max_tokens=3200,api_key=os.getenv(provider+'_API_KEY'), temperature=1, cache=False)

dspy.configure(lm=default_lm)

# CORS middleware - allow frontend to access backend
frontend_url = os.getenv("FRONTEND_URL", "http://localhost:5173")
# Support multiple origins (local dev + production)
allowed_origins = [origin.strip() for origin in frontend_url.split(",") if origin.strip()]
app.add_middleware(
    CORSMiddleware,
    allow_origins=allowed_origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Session support for OAuth (Authlib requires request.session)
app.add_middleware(
    SessionMiddleware,
    secret_key=os.getenv("SESSION_SECRET", "change-this-session-secret"),
    same_site="lax",
    https_only=bool(int(os.getenv("SESSION_HTTPS_ONLY", "0"))),
)


from .schemas.auth import LoginRequest

# Optional debug route to verify OAuth env at runtime (masked)
@app.get("/api/auth/debug")
def auth_debug():
    cid = os.getenv("GOOGLE_CLIENT_ID", "")
    rid = os.getenv("GOOGLE_REDIRECT_URI", "")
    return {
        "GOOGLE_CLIENT_ID_present": bool(cid),
        "GOOGLE_CLIENT_ID_prefix": cid[:10] + ("..." if cid else ""),
        "GOOGLE_REDIRECT_URI": rid,
    }


app.include_router(health_router)


# Auth routes
app.include_router(auth_router)

# Payment routes
app.include_router(google_router)
app.include_router(stripe_router)

# Export routes
app.include_router(export_router)

# Credits routes
app.include_router(credits_router)

# Plans routes
app.include_router(plans_router)

# Form routes
app.include_router(forms_router)
app.include_router(responses_router)
app.include_router(analytics_router)
app.include_router(users_router)
app.include_router(uploads_router)

# Initialize DB
if os.getenv("AUTO_MIGRATE", "1") == "1":
    Base.metadata.create_all(bind=engine)
    
    # Initialize default subscription plans
    from .services.plan_service import plan_service
    from .core.db import SessionLocal
    try:
        db = SessionLocal()
        plan_service.initialize_default_plans(db, force=False)
        db.close()
        logging.info("Default subscription plans initialized")
    except Exception as e:
        logging.error(f"Failed to initialize subscription plans: {e}")