119 lines
2.5 KiB
Python
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))
|