Skip to content

Commit d4f635e

Browse files
committed
initial commit for adding custom callbacks
1 parent 5c3569e commit d4f635e

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

piccolo_api/fastapi/endpoints.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from fastapi.params import Query
1515
from pydantic import BaseModel as PydanticBaseModel
1616
from pydantic.main import BaseModel
17+
from starlette.responses import JSONResponse
1718

1819
from piccolo_api.crud.endpoints import PiccoloCRUD
1920

@@ -75,6 +76,14 @@ class ReferencesModel(BaseModel):
7576
references: t.List[ReferenceModel]
7677

7778

79+
class CallbackModel(BaseModel):
80+
callback_name: str
81+
82+
83+
class ExecuteCallbackModel(BaseModel):
84+
callback_response: str
85+
86+
7887
class FastAPIWrapper:
7988
"""
8089
Wraps ``PiccoloCRUD`` so it can easily be integrated into FastAPI.
@@ -94,6 +103,8 @@ class FastAPIWrapper:
94103
and ``allow_bulk_delete``.
95104
:param fastapi_kwargs:
96105
Specifies the extra kwargs to pass to FastAPI's ``add_api_route``.
106+
:param callback
107+
Callback fn passed in via create_admin TableConfig
97108
98109
"""
99110

@@ -103,13 +114,15 @@ def __init__(
103114
fastapi_app: t.Union[FastAPI, APIRouter],
104115
piccolo_crud: PiccoloCRUD,
105116
fastapi_kwargs: t.Optional[FastAPIKwargs] = None,
117+
callback: t.Optional[t.Callable] = None,
106118
):
107119
fastapi_kwargs = fastapi_kwargs or FastAPIKwargs()
108120

109121
self.root_url = root_url
110122
self.fastapi_app = fastapi_app
111123
self.piccolo_crud = piccolo_crud
112124
self.fastapi_kwargs = fastapi_kwargs
125+
self.callback = callback
113126

114127
self.ModelOut = piccolo_crud.pydantic_model_output
115128
self.ModelIn = piccolo_crud.pydantic_model
@@ -243,6 +256,57 @@ async def references(request: Request):
243256
**fastapi_kwargs.get_kwargs("get"),
244257
)
245258

259+
#######################################################################
260+
# Root - Callback
261+
262+
async def get_callback(request: Request) -> JSONResponse:
263+
"""
264+
Return the name of the callback function
265+
This is specified on the table config
266+
"""
267+
if self.callback:
268+
return JSONResponse(
269+
f"Configured callback for table: {self.callback.__name__}"
270+
)
271+
else:
272+
return JSONResponse(
273+
content="No callback configured", status_code=500
274+
)
275+
276+
if self.callback:
277+
fastapi_app.add_api_route(
278+
path=self.join_urls(root_url, "/callback"),
279+
endpoint=get_callback,
280+
methods=["GET"],
281+
response_model=CallbackModel,
282+
**fastapi_kwargs.get_kwargs("get"),
283+
)
284+
285+
#######################################################################
286+
# Root - Callback execute
287+
288+
async def run_callback(request: Request) -> JSONResponse:
289+
"""
290+
Execute the configured callback for this table
291+
:param request_params:
292+
The request params must contain the arguments
293+
required by the callback
294+
"""
295+
if self.callback:
296+
return await self.callback(request_params=request.json())
297+
else:
298+
return JSONResponse(
299+
content="No callback configured", status_code=500
300+
)
301+
302+
if self.callback:
303+
fastapi_app.add_api_route(
304+
path=self.join_urls(root_url, "/callback/execute"),
305+
endpoint=run_callback,
306+
methods=["POST"],
307+
response_model=ExecuteCallbackModel,
308+
**fastapi_kwargs.get_kwargs("post"),
309+
)
246310
#######################################################################
247311
# Root - DELETE
248312

0 commit comments

Comments
 (0)