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.flags.endpoints import router as flags_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() 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, ) for exception, handler in handlers.exception_handlers: router.add_exception_handler(exception, partial(handler, router=router))