""" ClaudeTools FastAPI Application Main entry point for the ClaudeTools MSP management system API """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager from api.config import get_settings settings = get_settings() from api.database import engine # Import routers from api.routers import ( machines, clients, sites, networks, tags, sessions, projects, tasks, billable_time, work_items, services, infrastructure, firewall_rules, m365_tenants, credentials, credential_audit_logs, security_incidents, conversation_contexts, context_snippets, project_states, decision_logs, bulk_import, ) # Import middleware from api.middleware.error_handler import register_exception_handlers @asynccontextmanager async def lifespan(app: FastAPI): """ Lifespan event handler for startup and shutdown operations """ # Startup print("Starting ClaudeTools API...") print(f"Database: {settings.DATABASE_NAME}") print(f"JWT Auth: {'Enabled' if settings.JWT_SECRET_KEY else 'Disabled'}") yield # Shutdown print("Shutting down ClaudeTools API...") engine.dispose() # Initialize FastAPI application app = FastAPI( title="ClaudeTools API", description="MSP Work Tracking and Infrastructure Management System", version="1.0.0", docs_url="/api/docs", redoc_url="/api/redoc", openapi_url="/api/openapi.json", lifespan=lifespan ) # Configure CORS app.add_middleware( CORSMiddleware, allow_origins=settings.ALLOWED_ORIGINS.split(",") if settings.ALLOWED_ORIGINS else ["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Register exception handlers register_exception_handlers(app) @app.get("/") async def root(): """Root endpoint - API status check""" return { "status": "online", "service": "ClaudeTools API", "version": "1.0.0", "docs": "/api/docs" } @app.get("/health") async def health_check(): """Health check endpoint for monitoring""" return { "status": "healthy", "database": "connected" } # Register routers app.include_router(machines.router, prefix="/api/machines", tags=["Machines"]) app.include_router(clients.router, prefix="/api/clients", tags=["Clients"]) app.include_router(sites.router, prefix="/api/sites", tags=["Sites"]) app.include_router(networks.router, prefix="/api/networks", tags=["Networks"]) app.include_router(tags.router, prefix="/api/tags", tags=["Tags"]) app.include_router(sessions.router, prefix="/api/sessions", tags=["Sessions"]) app.include_router(projects.router, prefix="/api/projects", tags=["Projects"]) app.include_router(tasks.router, prefix="/api/tasks", tags=["Tasks"]) app.include_router(billable_time.router, prefix="/api/billable-time", tags=["Billable Time"]) app.include_router(work_items.router, prefix="/api/work-items", tags=["Work Items"]) app.include_router(services.router, prefix="/api/services", tags=["Services"]) app.include_router(infrastructure.router, prefix="/api/infrastructure", tags=["Infrastructure"]) app.include_router(m365_tenants.router, prefix="/api/m365-tenants", tags=["M365 Tenants"]) app.include_router(firewall_rules.router, prefix="/api/firewall-rules", tags=["Firewall Rules"]) app.include_router(credentials.router, prefix="/api/credentials", tags=["Credentials"]) app.include_router(credential_audit_logs.router, prefix="/api/credential-audit-logs", tags=["Credential Audit Logs"]) app.include_router(security_incidents.router, prefix="/api/security-incidents", tags=["Security Incidents"]) app.include_router(conversation_contexts.router, prefix="/api/conversation-contexts", tags=["Conversation Contexts"]) app.include_router(context_snippets.router, prefix="/api/context-snippets", tags=["Context Snippets"]) app.include_router(project_states.router, prefix="/api/project-states", tags=["Project States"]) app.include_router(decision_logs.router, prefix="/api/decision-logs", tags=["Decision Logs"]) app.include_router(bulk_import.router, prefix="/api/bulk-import", tags=["Bulk Import"]) if __name__ == "__main__": import uvicorn uvicorn.run( "api.main:app", host="0.0.0.0", port=8000, reload=True )