claude-code-tracker/app/dashboard/routes.py

134 lines
4.9 KiB
Python
Raw Permalink Normal View History

"""
Dashboard web interface routes.
"""
from fastapi import APIRouter, Request, Depends
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
from sqlalchemy.ext.asyncio import AsyncSession
from app.database.connection import get_db
dashboard_router = APIRouter()
templates = Jinja2Templates(directory="app/dashboard/templates")
@dashboard_router.get("/dashboard", response_class=HTMLResponse)
async def dashboard_home(request: Request, db: AsyncSession = Depends(get_db)):
"""Main dashboard page."""
return templates.TemplateResponse("dashboard.html", {
"request": request,
"title": "Claude Code Project Tracker"
})
@dashboard_router.get("/dashboard/projects", response_class=HTMLResponse)
async def dashboard_projects(request: Request, db: AsyncSession = Depends(get_db)):
"""Projects overview page."""
return templates.TemplateResponse("projects.html", {
"request": request,
"title": "Projects - Claude Code Tracker"
})
@dashboard_router.get("/dashboard/analytics", response_class=HTMLResponse)
async def dashboard_analytics(request: Request, db: AsyncSession = Depends(get_db)):
"""Analytics and insights page."""
return templates.TemplateResponse("analytics.html", {
"request": request,
"title": "Analytics - Claude Code Tracker"
})
@dashboard_router.get("/dashboard/conversations", response_class=HTMLResponse)
async def dashboard_conversations(request: Request, db: AsyncSession = Depends(get_db)):
"""Conversation search and history page."""
return templates.TemplateResponse("conversations.html", {
"request": request,
"title": "Conversations - Claude Code Tracker"
})
@dashboard_router.get("/dashboard/import", response_class=HTMLResponse)
async def dashboard_import(request: Request, db: AsyncSession = Depends(get_db)):
"""Data import page."""
return templates.TemplateResponse("import.html", {
"request": request,
"title": "Import Data - Claude Code Tracker"
})
@dashboard_router.get("/dashboard/projects/{project_id}/timeline", response_class=HTMLResponse)
async def dashboard_project_timeline(request: Request, project_id: int, db: AsyncSession = Depends(get_db)):
"""Project timeline page."""
return templates.TemplateResponse("project_timeline.html", {
"request": request,
"title": f"Timeline - Project {project_id}",
"project_id": project_id
})
@dashboard_router.get("/dashboard/projects/{project_id}/stats", response_class=HTMLResponse)
async def dashboard_project_stats(request: Request, project_id: int, db: AsyncSession = Depends(get_db)):
"""Project statistics page."""
return templates.TemplateResponse("project_stats.html", {
"request": request,
"title": f"Statistics - Project {project_id}",
"project_id": project_id
})
@dashboard_router.get("/dashboard/docs", response_class=HTMLResponse)
async def dashboard_docs(request: Request, db: AsyncSession = Depends(get_db)):
"""Documentation overview page."""
return templates.TemplateResponse("docs/index.html", {
"request": request,
"title": "Documentation - Claude Code Tracker"
})
@dashboard_router.get("/dashboard/docs/{section}", response_class=HTMLResponse)
async def dashboard_docs_section(request: Request, section: str, db: AsyncSession = Depends(get_db)):
"""Documentation section pages."""
# Map section names to templates and titles
sections = {
"getting-started": {
"template": "docs/getting-started.html",
"title": "Getting Started - Claude Code Tracker"
},
"data-import": {
"template": "docs/data-import.html",
"title": "Data Import Guide - Claude Code Tracker"
},
"docker-deployment": {
"template": "docs/docker-deployment.html",
"title": "Docker Deployment Guide - Claude Code Tracker"
},
"hook-setup": {
"template": "docs/hook-setup.html",
"title": "Hook Setup Guide - Claude Code Tracker"
},
"hook-reference": {
"template": "docs/hook-reference.html",
"title": "Complete Hook Reference - Claude Code Tracker"
},
"api-reference": {
"template": "docs/api-reference.html",
"title": "API Reference - Claude Code Tracker"
},
"faq": {
"template": "docs/faq.html",
"title": "FAQ - Claude Code Tracker"
}
}
if section not in sections:
from fastapi import HTTPException
raise HTTPException(status_code=404, detail=f"Documentation section '{section}' not found")
section_info = sections[section]
return templates.TemplateResponse(section_info["template"], {
"request": request,
"title": section_info["title"],
"section": section
})