Files
Lotty/src/backend/api/v1/router.py
T

119 lines
2.5 KiB
Python

from decimal import Decimal
from functools import partial
from typing import Any, override
import orjson
from django.http import HttpRequest
from ninja import NinjaAPI, Schema
from ninja.renderers import BaseRenderer
from api.v1 import handlers
from api.v1.auth.endpoints import router as auth_router
from api.v1.conflicts.endpoints import router as conflicts_router
from api.v1.decision.endpoints import router as decision_router
from api.v1.events.endpoints import router as events_router
from api.v1.experiments.endpoints import router as experiments_router
from api.v1.flags.endpoints import router as flags_router
from api.v1.guardrails.endpoints import router as guardrails_router
from api.v1.learnings.endpoints import router as learnings_router
from api.v1.metrics.endpoints import router as metrics_router
from api.v1.notifications.endpoints import router as notifications_router
from api.v1.reports.endpoints import router as reports_router
from api.v1.reviews.endpoints import router as reviews_router
from api.v1.users.endpoints import router as users_router
class ORJSONRenderer(BaseRenderer):
media_type: str | None = "application/json"
@override
def render(
self, request: HttpRequest, data: Any, *, response_status: int
) -> Any:
return orjson.dumps(data, default=self.default)
def default(self, obj: Any) -> Any:
if isinstance(obj, Schema):
return obj.model_dump()
if isinstance(obj, Decimal):
return float(obj)
raise TypeError
router = NinjaAPI(
title="Lotty API",
version="1",
description="API docs for Lotty A/B platform",
openapi_url="/docs/openapi.json",
renderer=ORJSONRenderer(),
)
router.add_router(
"auth",
auth_router,
)
router.add_router(
"flags",
flags_router,
)
router.add_router(
"users",
users_router,
)
router.add_router(
"reviews",
reviews_router,
)
router.add_router(
"experiments",
experiments_router,
)
router.add_router(
"decide",
decision_router,
)
router.add_router(
"events",
events_router,
)
router.add_router(
"",
reports_router,
)
router.add_router(
"",
metrics_router,
)
router.add_router(
"",
guardrails_router,
)
router.add_router(
"",
notifications_router,
)
router.add_router(
"",
learnings_router,
)
router.add_router(
"conflicts",
conflicts_router,
)
for exception, handler in handlers.exception_handlers:
router.add_exception_handler(exception, partial(handler, router=router))