-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathapi_server_main.py
More file actions
72 lines (56 loc) · 2.19 KB
/
api_server_main.py
File metadata and controls
72 lines (56 loc) · 2.19 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
import os
import traceback
import fastapi
from cloud_pipelines_backend import api_router
from cloud_pipelines_backend import database_ops
from cloud_pipelines_backend.instrumentation import api_tracing
from cloud_pipelines_backend.instrumentation import contextual_logging
from cloud_pipelines_backend.instrumentation import opentelemetry as otel
app = fastapi.FastAPI(
title="Cloud Pipelines API",
version="0.0.1",
separate_input_output_schemas=False,
)
otel.setup_providers()
otel.instrument_fastapi(app)
# Add request context middleware for automatic request_id generation
app.add_middleware(api_tracing.RequestContextMiddleware)
@app.exception_handler(Exception)
def handle_error(request: fastapi.Request, exc: BaseException):
exception_str = traceback.format_exception(type(exc), exc, exc.__traceback__)
response = fastapi.responses.JSONResponse(
status_code=503,
content={"exception": exception_str},
)
request_id = contextual_logging.get_context_metadata("request_id")
if request_id:
response.headers["x-tangle-request-id"] = request_id
return response
DEFAULT_DATABASE_URI = "sqlite:///db.sqlite"
database_uri = (
os.environ.get("DATABASE_URI")
or os.environ.get("DATABASE_URL")
or DEFAULT_DATABASE_URI
)
db_engine = database_ops.create_db_engine_and_migrate_db(
database_uri=database_uri,
)
ADMIN_USER_NAME = "admin"
# ! This function is just a placeholder for user authentication and authorization so that every request has a user name and permissions.
# ! This placeholder function authenticates the user as user with name "admin" and read/write/admin permissions.
# ! In a real multi-user deployment, the `get_user_details` function MUST be replaced with real authentication/authorization based on OAuth or another auth system.
def get_user_details(request: fastapi.Request):
return api_router.UserDetails(
name=ADMIN_USER_NAME,
permissions=api_router.Permissions(
read=True,
write=True,
admin=True,
),
)
api_router.setup_routes(
app=app,
db_engine=db_engine,
user_details_getter=get_user_details,
default_component_library_owner_username=ADMIN_USER_NAME,
)