2121
2222from minos .api_gateway .rest .database .models import (
2323 AuthRule ,
24+ AutzRule ,
2425)
2526from minos .api_gateway .rest .urlmatch .authmatch import (
2627 AuthMatch ,
@@ -56,7 +57,7 @@ async def orchestrate(request: web.Request) -> web.Response:
5657
5758
5859async def check_auth (request : web .Request , service : str , url : str , method : str ) -> bool :
59- records = Repository (request .app ["db_engine" ]).get_by_service (service )
60+ records = Repository (request .app ["db_engine" ]).get_auth_rule_by_service (service )
6061 return AuthMatch .match (url = url , method = method , records = records )
6162
6263
@@ -239,9 +240,26 @@ async def get_endpoints(request: web.Request) -> web.Response:
239240 {"error" : "The requested endpoint is not available." }, status = web .HTTPServiceUnavailable .status_code
240241 )
241242
243+ @staticmethod
244+ async def get_roles (request : web .Request ) -> web .Response :
245+ auth_host = request .app ["config" ].rest .auth .host
246+ auth_port = request .app ["config" ].rest .auth .port
247+ auth_path = request .app ["config" ].rest .auth .path
248+
249+ url = URL .build (scheme = "http" , host = auth_host , port = auth_port , path = f"{ auth_path } /roles" )
250+
251+ try :
252+ async with ClientSession () as session :
253+ async with session .get (url = url ) as response :
254+ return await _clone_response (response )
255+ except ClientConnectorError :
256+ return web .json_response (
257+ {"error" : "The requested endpoint is not available." }, status = web .HTTPServiceUnavailable .status_code
258+ )
259+
242260 @staticmethod
243261 async def get_rules (request : web .Request ) -> web .Response :
244- records = Repository (request .app ["db_engine" ]).get_all ()
262+ records = Repository (request .app ["db_engine" ]).get_auth_rules ()
245263 return web .json_response (records )
246264
247265 @staticmethod
@@ -265,7 +283,7 @@ async def create_rule(request: web.Request) -> web.Response:
265283 updated_at = now ,
266284 )
267285
268- record = Repository (request .app ["db_engine" ]).create (rule )
286+ record = Repository (request .app ["db_engine" ]).create_auth_rule (rule )
269287
270288 return web .json_response (record )
271289 except Exception as e :
@@ -276,7 +294,17 @@ async def update_rule(request: web.Request) -> web.Response:
276294 try :
277295 id = int (request .url .name )
278296 content = await request .json ()
279- Repository (request .app ["db_engine" ]).update (id = id , ** content )
297+ Repository (request .app ["db_engine" ]).update_auth_rule (id = id , ** content )
298+ return web .json_response (status = web .HTTPOk .status_code )
299+ except Exception as e :
300+ return web .json_response ({"error" : str (e )}, status = web .HTTPBadRequest .status_code )
301+
302+ @staticmethod
303+ async def update_autz_rule (request : web .Request ) -> web .Response :
304+ try :
305+ id = int (request .url .name )
306+ content = await request .json ()
307+ Repository (request .app ["db_engine" ]).update_autz_rule (id = id , ** content )
280308 return web .json_response (status = web .HTTPOk .status_code )
281309 except Exception as e :
282310 return web .json_response ({"error" : str (e )}, status = web .HTTPBadRequest .status_code )
@@ -285,7 +313,54 @@ async def update_rule(request: web.Request) -> web.Response:
285313 async def delete_rule (request : web .Request ) -> web .Response :
286314 try :
287315 id = int (request .url .name )
288- Repository (request .app ["db_engine" ]).delete (id )
316+ Repository (request .app ["db_engine" ]).delete_auth_rule (id )
317+ return web .json_response (status = web .HTTPOk .status_code )
318+ except Exception as e :
319+ return web .json_response ({"error" : str (e )}, status = web .HTTPBadRequest .status_code )
320+
321+ @staticmethod
322+ async def delete_autz_rule (request : web .Request ) -> web .Response :
323+ try :
324+ id = int (request .url .name )
325+ Repository (request .app ["db_engine" ]).delete_autz_rule (id )
289326 return web .json_response (status = web .HTTPOk .status_code )
290327 except Exception as e :
291328 return web .json_response ({"error" : str (e )}, status = web .HTTPBadRequest .status_code )
329+
330+ @staticmethod
331+ async def create_autz_rule (request : web .Request ) -> web .Response :
332+ try :
333+ content = await request .json ()
334+
335+ if (
336+ "service" not in content
337+ and "rule" not in content
338+ and "roles" not in content
339+ and "methods" not in content
340+ ):
341+ return web .json_response (
342+ {"error" : "Wrong data. Provide 'service', 'rule', 'roles' and 'methods' parameters." },
343+ status = web .HTTPBadRequest .status_code ,
344+ )
345+
346+ now = datetime .now ()
347+
348+ rule = AutzRule (
349+ service = content ["service" ],
350+ rule = content ["rule" ],
351+ roles = content ["roles" ],
352+ methods = content ["methods" ],
353+ created_at = now ,
354+ updated_at = now ,
355+ )
356+
357+ record = Repository (request .app ["db_engine" ]).create_autz_rule (rule )
358+
359+ return web .json_response (record )
360+ except Exception as e :
361+ return web .json_response ({"error" : str (e )}, status = web .HTTPBadRequest .status_code )
362+
363+ @staticmethod
364+ async def get_autz_rules (request : web .Request ) -> web .Response :
365+ records = Repository (request .app ["db_engine" ]).get_autz_rules ()
366+ return web .json_response (records )
0 commit comments