File size: 3,496 Bytes
d6d292e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse, RedirectResponse
import os

from config import settings
from database import init_db, SessionLocal, User

app = FastAPI(title=settings.APP_NAME, description=settings.APP_DESCRIPTION)

app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/uploads", StaticFiles(directory=settings.UPLOAD_DIR), name="uploads")

templates = Jinja2Templates(directory="templates")

from routes_auth import router as auth_router
from routes_profiles import router as profiles_router
from routes_chat import router as chat_router
from routes_search import router as search_router
from routes_admin import router as admin_router
from routes_voice import router as voice_router

app.include_router(auth_router)
app.include_router(profiles_router)
app.include_router(chat_router)
app.include_router(search_router)
app.include_router(admin_router)
app.include_router(voice_router)


@app.on_event("startup")
async def startup():
    init_db()
    os.makedirs(settings.UPLOAD_DIR, exist_ok=True)
    os.makedirs("static", exist_ok=True)
    os.makedirs("static/js", exist_ok=True)
    os.makedirs("static/css", exist_ok=True)
    os.makedirs("templates", exist_ok=True)


@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
    from auth import get_user_from_request
    db = SessionLocal()
    try:
        user = get_user_from_request(request, db)
        if user:
            return RedirectResponse(url="/dashboard", status_code=302)
        return RedirectResponse(url="/auth/login", status_code=302)
    finally:
        db.close()


@app.get("/dashboard", response_class=HTMLResponse)
async def dashboard(request: Request):
    from auth import get_user_from_request
    db = SessionLocal()
    try:
        user = get_user_from_request(request, db)
        if not user:
            return RedirectResponse(url="/auth/login", status_code=302)

        from database import MemoryProfile, Conversation, MemoryFile
        profiles = db.query(MemoryProfile).filter(MemoryProfile.user_id == user.id).all()
        total_conversations = db.query(Conversation).filter(Conversation.user_id == user.id).count()
        total_files = db.query(MemoryFile).join(MemoryProfile).filter(MemoryProfile.user_id == user.id).count()
        recent_conversations = db.query(Conversation).filter(
            Conversation.user_id == user.id
        ).order_by(Conversation.updated_at.desc()).limit(5).all()

        recent_conv_profiles = {}
        for rc in recent_conversations:
            p = db.query(MemoryProfile).filter(MemoryProfile.id == rc.profile_id).first()
            if p:
                recent_conv_profiles[rc.id] = p.name

        return templates.TemplateResponse("dashboard.html", {
            "request": request, "user": user, "profiles": profiles,
            "total_conversations": total_conversations,
            "total_files": total_files,
            "recent_conversations": recent_conversations,
            "recent_conv_profiles": recent_conv_profiles,
        })
    finally:
        db.close()


@app.exception_handler(302)
async def redirect_handler(request: Request, exc):
    return RedirectResponse(url=exc.headers.get("Location", "/"), status_code=302)


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)