-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
140 lines (124 loc) · 4.92 KB
/
app.py
File metadata and controls
140 lines (124 loc) · 4.92 KB
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
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import logging
from typing import Any, Dict
from fastapi import FastAPI, Request
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from slowapi.middleware import SlowAPIMiddleware
from config.config import settings, tags_metadata
from config.cors import configure_cors
from security.endpoint_validator import InMemoryIdempotencyRepo
from security.input_validator import SecurityError
from services.db_check import check_database_connection
from auth.decorators import authorize
# Enhanced error handling imports
from common.logging import setup_logging, get_logger
from common.middleware import setup_middleware
from common.exceptions import BaseRAGException
from common.responses import create_error_response
# Setup enhanced logging
setup_logging(
level="INFO",
format_type="structured"
)
RATE_LIMIT_ENABLED = os.getenv("RATE_LIMIT_ENABLED", "true").lower() == "true"
RATE_LIMIT_STORAGE_URI = os.getenv("RATE_LIMIT_STORAGE_URI") # e.g. redis://localhost:6379/0
limiter = Limiter(
key_func=get_remote_address,
headers_enabled=True,
default_limits=["200/minute"],
storage_uri=RATE_LIMIT_STORAGE_URI,
enabled=RATE_LIMIT_ENABLED,
)
logger = get_logger("main")
app = FastAPI(
title="RAG FastAPI Supabase API",
version="1.0.0",
description="RAG service using Supabase vector store and OpenAI API",
openapi_tags=tags_metadata,
)
app.state.idempotency_repo = InMemoryIdempotencyRepo()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
app.add_middleware(SlowAPIMiddleware)
setup_middleware(app)
configure_cors(app)
@app.get("/",
summary="Root endpoint",
description="Simple health check and API info"
)
async def root():
"""Root endpoint for basic health check."""
return {
"message": "RAG FastAPI Supabase API",
"version": "1.0.0",
"status": "healthy",
"docs": "/docs",
"redoc": "/redoc"
}
@app.exception_handler(SecurityError)
async def security_error_handler(request: Request, exc: SecurityError):
logger.warning(f"Security error: {exc}", extra={
"path": str(request.url.path),
"method": request.method,
"client_ip": request.client.host if request.client else None
})
return create_error_response(
error_code="SECURITY_ERROR",
message=str(exc),
status_code=400
)
@app.exception_handler(BaseRAGException)
async def rag_exception_handler(request: Request, exc: BaseRAGException):
logger.error(f"RAG exception: {exc.error_code}", extra={
"error_code": exc.error_code,
"context": exc.context,
"path": str(request.url.path),
"method": request.method
})
return create_error_response(
error_code=exc.error_code,
message=exc.detail,
status_code=exc.status_code,
context=exc.context
)
# Import routers
from api.auth import router as auth_router
from api.documents import router as documents_router
from api.rag import router as rag_router
from api.compliance_gaps import router as compliance_gaps_router
from api.compliance_domains import router as compliance_domains_router
from api.audit_sessions import router as audit_sessions_router
from api.audit_reports import router as audit_reports_router
from api.audit_logs import router as audit_logs_router
from api.history import router as history_router
from api.ingestion import router as ingestion_router
from api.iso_controls import router as iso_controls_router
from api.users import router as users_router
from api.health import router as health_router
from api.executive_summary import router as executive_summary_router
from api.threat_intelligence import router as threat_intelligence_router
from api.risk_prioritization import router as risk_prioritization_router
from api.target_audience import router as target_audience_router
# Include all routers with v1 prefix
app.include_router(auth_router, prefix="/v1")
app.include_router(documents_router, prefix="/v1")
app.include_router(rag_router, prefix="/v1")
app.include_router(compliance_gaps_router, prefix="/v1")
app.include_router(compliance_domains_router, prefix="/v1")
app.include_router(audit_sessions_router, prefix="/v1")
app.include_router(audit_reports_router, prefix="/v1")
app.include_router(audit_logs_router, prefix="/v1")
app.include_router(history_router, prefix="/v1")
app.include_router(ingestion_router, prefix="/v1")
app.include_router(iso_controls_router, prefix="/v1")
app.include_router(users_router, prefix="/v1")
app.include_router(health_router, prefix="/v1")
app.include_router(executive_summary_router, prefix="/v1")
app.include_router(threat_intelligence_router, prefix="/v1")
app.include_router(risk_prioritization_router, prefix="/v1")
app.include_router(target_audience_router, prefix="/v1")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)