1515from app import model as server_model
1616from app .adapter import jsonization
1717from app .interfaces .base import BaseWSGIApp , HTTPApiDecoder
18- from app .util .converters import IdentifierToBase64URLConverter
18+ from app .util .converters import IdentifierToBase64URLConverter , base64url_decode
1919
2020
2121class DiscoveryStore :
@@ -98,6 +98,7 @@ def __init__(self, persistent_store: DiscoveryStore, base_path: str = "/api/v3.1
9898 Submount (
9999 "/lookup/shells" ,
100100 [
101+ Rule ("/" , methods = ["GET" ], endpoint = self .get_all_aas_ids_by_asset_link ), # this route is deprecated
101102 Rule (
102103 "/<base64url:aas_id>" ,
103104 methods = ["GET" ],
@@ -118,6 +119,37 @@ def __init__(self, persistent_store: DiscoveryStore, base_path: str = "/api/v3.1
118119 strict_slashes = False ,
119120 )
120121
122+ def get_all_aas_ids_by_asset_link (
123+ self , request : Request , url_args : dict , response_t : type , ** _kwargs
124+ ) -> Response :
125+ asset_ids_param = request .args .get ("assetIds" , "" )
126+ if not asset_ids_param :
127+ raise werkzeug .exceptions .BadRequest ("Missing query parameter 'assetIds'" )
128+
129+ try :
130+ decoded_str = base64url_decode (asset_ids_param )
131+ payload = json .loads (decoded_str )
132+ except (ValueError , json .JSONDecodeError ) as exc :
133+ raise werkzeug .exceptions .BadRequest (f"Invalid query parameter 'assetIds': { exc } " ) from exc
134+
135+ if isinstance (payload , dict ):
136+ payload = [payload ]
137+
138+ if not isinstance (payload , list ):
139+ raise werkzeug .exceptions .BadRequest ("Decoded assetIds payload must be a JSON object or list" )
140+
141+ matching_aas_keys = set ()
142+ for item in payload :
143+ if not isinstance (item , dict ):
144+ raise werkzeug .exceptions .BadRequest ("Each asset link must be a JSON object" )
145+
146+ asset_link = server_model .AssetLink (item ["name" ], item ["value" ])
147+ aas_keys = self .persistent_store .search_aas_ids_by_asset_link (asset_link )
148+ matching_aas_keys .update (aas_keys )
149+
150+ paginated_slice , cursor = self ._get_slice (request , list (matching_aas_keys ))
151+ return response_t (list (paginated_slice ), cursor = cursor )
152+
121153 def search_all_aas_ids_by_asset_link (
122154 self , request : Request , url_args : dict , response_t : type , ** _kwargs
123155 ) -> Response :
0 commit comments