33from dataclasses import dataclass
44from datetime import UTC , datetime
55
6- from sanic import HTTPResponse , Request , json
6+ from sanic import HTTPResponse , Request
77from sanic .response import JSONResponse
88from sanic_ext import validate
99from ulid import ULID
1212from renku_data_services import errors
1313from renku_data_services .base_api .auth import authenticate , only_authenticated
1414from renku_data_services .base_api .blueprint import BlueprintFactoryResponse , CustomBlueprint
15+ from renku_data_services .base_models .validation import validated_json
1516from renku_data_services .session import apispec , models
1617from renku_data_services .session .db import SessionRepository
1718
@@ -28,9 +29,7 @@ def get_all(self) -> BlueprintFactoryResponse:
2829
2930 async def _get_all (_ : Request ) -> JSONResponse :
3031 environments = await self .session_repo .get_environments ()
31- return json (
32- [apispec .Environment .model_validate (e ).model_dump (exclude_none = True , mode = "json" ) for e in environments ]
33- )
32+ return validated_json (apispec .EnvironmentList , environments )
3433
3534 return "/environments" , ["GET" ], _get_all
3635
@@ -39,7 +38,7 @@ def get_one(self) -> BlueprintFactoryResponse:
3938
4039 async def _get_one (_ : Request , environment_id : ULID ) -> JSONResponse :
4140 environment = await self .session_repo .get_environment (environment_id = environment_id )
42- return json (apispec .Environment . model_validate ( environment ). model_dump ( exclude_none = True , mode = "json" ) )
41+ return validated_json (apispec .Environment , environment )
4342
4443 return "/environments/<environment_id:ulid>" , ["GET" ], _get_one
4544
@@ -59,7 +58,7 @@ async def _post(_: Request, user: base_models.APIUser, body: apispec.Environment
5958 creation_date = datetime .now (UTC ).replace (microsecond = 0 ),
6059 )
6160 environment = await self .session_repo .insert_environment (user = user , new_environment = environment_model )
62- return json (apispec .Environment . model_validate ( environment ). model_dump ( exclude_none = True , mode = "json" ) , 201 )
61+ return validated_json (apispec .Environment , environment , 201 )
6362
6463 return "/environments" , ["POST" ], _post
6564
@@ -75,7 +74,7 @@ async def _patch(
7574 environment = await self .session_repo .update_environment (
7675 user = user , environment_id = environment_id , ** body_dict
7776 )
78- return json (apispec .Environment . model_validate ( environment ). model_dump ( exclude_none = True , mode = "json" ) )
77+ return validated_json (apispec .Environment , environment )
7978
8079 return "/environments/<environment_id:ulid>" , ["PATCH" ], _patch
8180
@@ -103,12 +102,7 @@ def get_all(self) -> BlueprintFactoryResponse:
103102 @authenticate (self .authenticator )
104103 async def _get_all (_ : Request , user : base_models .APIUser ) -> JSONResponse :
105104 launchers = await self .session_repo .get_launchers (user = user )
106- return json (
107- [
108- apispec .SessionLauncher .model_validate (item ).model_dump (exclude_none = True , mode = "json" )
109- for item in launchers
110- ]
111- )
105+ return validated_json (apispec .SessionLaunchersList , launchers )
112106
113107 return "/session_launchers" , ["GET" ], _get_all
114108
@@ -118,7 +112,7 @@ def get_one(self) -> BlueprintFactoryResponse:
118112 @authenticate (self .authenticator )
119113 async def _get_one (_ : Request , user : base_models .APIUser , launcher_id : ULID ) -> JSONResponse :
120114 launcher = await self .session_repo .get_launcher (user = user , launcher_id = launcher_id )
121- return json (apispec .SessionLauncher . model_validate ( launcher ). model_dump ( exclude_none = True , mode = "json" ) )
115+ return validated_json (apispec .SessionLauncher , launcher )
122116
123117 return "/session_launchers/<launcher_id:ulid>" , ["GET" ], _get_one
124118
@@ -150,9 +144,7 @@ async def _post(_: Request, user: base_models.APIUser, body: apispec.SessionLaun
150144 creation_date = datetime .now (UTC ).replace (microsecond = 0 ),
151145 )
152146 launcher = await self .session_repo .insert_launcher (user = user , new_launcher = launcher_model )
153- return json (
154- apispec .SessionLauncher .model_validate (launcher ).model_dump (exclude_none = True , mode = "json" ), 201
155- )
147+ return validated_json (apispec .SessionLauncher , launcher , 201 )
156148
157149 return "/session_launchers" , ["POST" ], _post
158150
@@ -166,7 +158,7 @@ async def _patch(
166158 ) -> JSONResponse :
167159 body_dict = body .model_dump (exclude_none = True )
168160 launcher = await self .session_repo .update_launcher (user = user , launcher_id = launcher_id , ** body_dict )
169- return json (apispec .SessionLauncher . model_validate ( launcher ). model_dump ( exclude_none = True , mode = "json" ) )
161+ return validated_json (apispec .SessionLauncher , launcher )
170162
171163 return "/session_launchers/<launcher_id:ulid>" , ["PATCH" ], _patch
172164
@@ -186,11 +178,6 @@ def get_project_launchers(self) -> BlueprintFactoryResponse:
186178 @authenticate (self .authenticator )
187179 async def _get_launcher (_ : Request , user : base_models .APIUser , project_id : ULID ) -> JSONResponse :
188180 launchers = await self .session_repo .get_project_launchers (user = user , project_id = project_id )
189- return json (
190- [
191- apispec .SessionLauncher .model_validate (item ).model_dump (exclude_none = True , mode = "json" )
192- for item in launchers
193- ]
194- )
181+ return validated_json (apispec .SessionLaunchersList , launchers )
195182
196183 return "/projects/<project_id:ulid>/session_launchers" , ["GET" ], _get_launcher
0 commit comments