|
| 1 | +import uuid |
| 2 | + |
| 3 | +import cherrypy |
| 4 | +from sqlalchemy.orm import Query |
| 5 | + |
| 6 | +from deli_counter.http.mounts.root.routes.v1.validation_models.keypairs import RequestCreateKeypair, \ |
| 7 | + ParamsListKeypair, ParamsKeypair, ResponseKeypair |
| 8 | +from ingredients_db.models.keypair import Keypair |
| 9 | +from ingredients_http.request_methods import RequestMethods |
| 10 | +from ingredients_http.route import Route |
| 11 | +from ingredients_http.router import Router |
| 12 | + |
| 13 | + |
| 14 | +class KeypairsRouter(Router): |
| 15 | + def __init__(self): |
| 16 | + super().__init__(uri_base='keypairs') |
| 17 | + |
| 18 | + @Route(methods=[RequestMethods.POST]) |
| 19 | + @cherrypy.tools.project_scope() |
| 20 | + @cherrypy.tools.model_in(cls=RequestCreateKeypair) |
| 21 | + @cherrypy.tools.model_out(cls=ResponseKeypair) |
| 22 | + @cherrypy.tools.enforce_policy(policy_name="keypairs:create") |
| 23 | + def create(self): |
| 24 | + request: RequestCreateKeypair = cherrypy.request.model |
| 25 | + project = cherrypy.request.project |
| 26 | + |
| 27 | + with cherrypy.request.db_session() as session: |
| 28 | + keypair = session.query(Keypair).filter(Keypair.name == request.name).first() |
| 29 | + |
| 30 | + if keypair is not None: |
| 31 | + raise cherrypy.HTTPError(409, "A keypair with the requested name already exists.") |
| 32 | + |
| 33 | + keypair = Keypair() |
| 34 | + keypair.name = request.name |
| 35 | + keypair.public_key = request.public_key |
| 36 | + keypair.project_id = project.id |
| 37 | + session.add(keypair) |
| 38 | + session.commit() |
| 39 | + session.refresh(keypair) |
| 40 | + return ResponseKeypair.from_database(keypair) |
| 41 | + |
| 42 | + @Route(route='{keypair_id}') |
| 43 | + @cherrypy.tools.project_scope() |
| 44 | + @cherrypy.tools.model_params(cls=ParamsKeypair) |
| 45 | + @cherrypy.tools.model_out(cls=ResponseKeypair) |
| 46 | + @cherrypy.tools.resource_object(id_param="keypair_id", cls=Keypair) |
| 47 | + @cherrypy.tools.enforce_policy(policy_name="keypairs:get") |
| 48 | + def get(self, keypair_id: uuid.UUID): |
| 49 | + return ResponseKeypair.from_database(cherrypy.request.resource_object) |
| 50 | + |
| 51 | + @Route() |
| 52 | + @cherrypy.tools.project_scope() |
| 53 | + @cherrypy.tools.model_params(cls=ParamsListKeypair) |
| 54 | + @cherrypy.tools.model_out_pagination(cls=ResponseKeypair) |
| 55 | + @cherrypy.tools.enforce_policy(policy_name="keypairs:list") |
| 56 | + def list(self, limit: int, marker: uuid.UUID): |
| 57 | + project = cherrypy.request.project |
| 58 | + starting_query = Query(Keypair).filter(Keypair.project_id == project.id) |
| 59 | + return self.paginate(Keypair, ResponseKeypair, limit, marker, starting_query=starting_query) |
| 60 | + |
| 61 | + @Route(route='{keypair_id}', methods=[RequestMethods.DELETE]) |
| 62 | + @cherrypy.tools.project_scope() |
| 63 | + @cherrypy.tools.model_params(cls=ParamsKeypair) |
| 64 | + @cherrypy.tools.resource_object(id_param="keypair_id", cls=Keypair) |
| 65 | + @cherrypy.tools.enforce_policy(policy_name="keypairs:delete") |
| 66 | + def delete(self, keypair_id: uuid.UUID): |
| 67 | + cherrypy.response.status = 204 |
| 68 | + # Fix for https://github.com/cherrypy/cherrypy/issues/1657 |
| 69 | + del cherrypy.response.headers['Content-Type'] |
| 70 | + |
| 71 | + with cherrypy.request.db_session() as session: |
| 72 | + keypair: Keypair = session.merge(cherrypy.request.resource_object, load=False) |
| 73 | + session.delete(keypair) |
| 74 | + session.commit() |
0 commit comments