1414from fastapi .params import Query
1515from pydantic import BaseModel as PydanticBaseModel
1616from pydantic .main import BaseModel
17+ from starlette .responses import JSONResponse
1718
1819from 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+
7887class 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