@@ -85,7 +85,7 @@ def __init__(self, table: Table):
8585 self .table = table
8686
8787 def get_immunization_by_identifier (
88- self , identifier_pk : str , imms_vax_type_perms : str
88+ self , identifier_pk : str , imms_vax_type_perms : list [ str ]
8989 ) -> Optional [dict ]:
9090 response = self .table .query (
9191 IndexName = "IdentifierGSI" , KeyConditionExpression = Key ("IdentifierPK" ).eq (identifier_pk )
@@ -94,7 +94,7 @@ def get_immunization_by_identifier(
9494 item = response ["Items" ][0 ]
9595 resp = dict ()
9696 vaccine_type = self ._vaccine_type (item ["PatientSK" ])
97- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
97+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
9898 vax_type_perm = self ._vaccine_permission (vaccine_type , "search" )
9999 self ._check_permission (vax_type_perm , vax_type_perms )
100100 resource = json .loads (item ["Resource" ])
@@ -112,7 +112,7 @@ def get_immunization_by_id(self, imms_id: str, imms_vax_type_perms: str) -> Opti
112112 if "DeletedAt" in response ["Item" ]:
113113 if response ["Item" ]["DeletedAt" ] == "reinstated" :
114114 vaccine_type = self ._vaccine_type (response ["Item" ]["PatientSK" ])
115- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
115+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
116116 vax_type_perm = self ._vaccine_permission (vaccine_type , "read" )
117117 self ._check_permission (vax_type_perm , vax_type_perms )
118118 resp ["Resource" ] = json .loads (response ["Item" ]["Resource" ])
@@ -122,7 +122,7 @@ def get_immunization_by_id(self, imms_id: str, imms_vax_type_perms: str) -> Opti
122122 return None
123123 else :
124124 vaccine_type = self ._vaccine_type (response ["Item" ]["PatientSK" ])
125- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
125+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
126126 vax_type_perm = self ._vaccine_permission (vaccine_type , "read" )
127127 self ._check_permission (vax_type_perm , vax_type_perms )
128128 resp ["Resource" ] = json .loads (response ["Item" ]["Resource" ])
@@ -170,7 +170,7 @@ def create_immunization(
170170 new_id = str (uuid .uuid4 ())
171171 immunization ["id" ] = new_id
172172 attr = RecordAttributes (immunization , patient )
173- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
173+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
174174 vax_type_perm = self ._vaccine_permission (attr .vaccine_type , "create" )
175175 self ._check_permission (vax_type_perm , vax_type_perms )
176176 query_response = _query_identifier (self .table , "IdentifierGSI" , "IdentifierPK" , attr .identifier )
@@ -273,7 +273,7 @@ def update_reinstated_immunization(
273273 )
274274
275275 def _handle_permissions (self , imms_vax_type_perms : str , attr : RecordAttributes ):
276- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
276+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
277277 vax_type_perm = self ._vaccine_permission (attr .vaccine_type , "update" )
278278 self ._check_permission (vax_type_perm , vax_type_perms )
279279
@@ -370,12 +370,12 @@ def delete_immunization(
370370 if "DeletedAt" in resp ["Item" ]:
371371 if resp ["Item" ]["DeletedAt" ] == "reinstated" :
372372 vaccine_type = self ._vaccine_type (resp ["Item" ]["PatientSK" ])
373- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
373+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
374374 vax_type_perm = self ._vaccine_permission (vaccine_type , "delete" )
375375 self ._check_permission (vax_type_perm , vax_type_perms )
376376 else :
377377 vaccine_type = self ._vaccine_type (resp ["Item" ]["PatientSK" ])
378- vax_type_perms = self ._parse_vaccine_permissions (imms_vax_type_perms )
378+ vax_type_perms = self ._expand_permissions (imms_vax_type_perms )
379379 vax_type_perm = self ._vaccine_permission (vaccine_type , "delete" )
380380 self ._check_permission (vax_type_perm , vax_type_perms )
381381
@@ -432,9 +432,26 @@ def _handle_dynamo_response(response):
432432
433433 @staticmethod
434434 def _vaccine_permission (vaccine_type , operation ) -> set :
435+ mapped_operations = {
436+ "create" : "c" ,
437+ "read" : "r" ,
438+ "update" : "u" ,
439+ "delete" : "d" ,
440+ "search" : "s"
441+ }
442+
443+ operation = mapped_operations .get (operation .lower ())
444+ if not operation :
445+ raise ValueError (f"Unsupported operation: { operation } " )
446+
435447 vaccine_permission = set ()
436- vaccine_permission .add (str .lower (f"{ vaccine_type } :{ operation } " ))
437- return vaccine_permission
448+ if isinstance (vaccine_type , list ):
449+ for x in vaccine_type :
450+ vaccine_permission .add (str .lower (f"{ x } .{ operation } " ))
451+ return vaccine_permission
452+ else :
453+ vaccine_permission .add (str .lower (f"{ vaccine_type } .{ operation } " ))
454+ return vaccine_permission
438455
439456 @staticmethod
440457 def _parse_vaccine_permissions (imms_vax_type_perms ) -> set :
@@ -443,6 +460,22 @@ def _parse_vaccine_permissions(imms_vax_type_perms) -> set:
443460 for s in parsed :
444461 vaccine_permissions .add (s )
445462 return vaccine_permissions
463+
464+ @staticmethod
465+ def _expand_permissions (supplier_permissions : list [str ]) -> set [str ]:
466+ expanded = set ()
467+ for permissions in supplier_permissions :
468+ if '.' not in permissions :
469+ continue # skip invalid format
470+ vaccineType , allowed_operations = permissions .split ('.' , 1 )
471+ print (f"Vax_type: { vaccineType } , Ops: { allowed_operations } " )
472+ vaccineType = vaccineType .lower ()
473+ for operation in allowed_operations .lower ():
474+ if operation not in {'c' , 'r' , 'u' , 'd' , 's' }:
475+ raise ValueError (f"Unknown operation code: { operation } in a permission { permissions } " )
476+ expanded .add (f"{ vaccineType } .{ operation } " )
477+ print (f"Expanded permissions: { expanded } " )
478+ return expanded
446479
447480 @staticmethod
448481 def _check_permission (requested : set , allowed : set ) -> set :
0 commit comments