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))