From 4bb65e7829f78ba521a06e11d0c69697b8cb2be9 Mon Sep 17 00:00:00 2001
From: Stavros-Anastasios Charismiadis <charismiadis@fogus.gr>
Date: Thu, 21 Nov 2024 17:41:44 +0200
Subject: [PATCH] substitute mongo projection in Discover with dictionary
 filtering

---
 .../service_apis/core/discoveredapis.py        | 18 ++++++++++++++++--
 .../service_apis/vendor_specific.py            | 10 +++++-----
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py
index 6ab0c458..f406a1e4 100644
--- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py
+++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py
@@ -8,6 +8,18 @@ import json
 from ..vendor_specific import find_attribute_in_body, filter_apis_with_vendor_specific_params
 
 
+def filter_fields(vs_filtered_apis):
+    key_filter = [
+        "api_name", "api_id", "aef_profiles", "description",
+        "supported_features", "shareable_info", "service_api_category",
+        "api_supp_feats", "pub_api_path", "ccf_id"
+    ]
+    field_filtered_api = {}
+    for key in vs_filtered_apis.keys():
+        if key in key_filter or 'vendorSpecific' in key:
+            field_filtered_api[key] = vs_filtered_apis[key]
+    return field_filtered_api
+
 class DiscoverApisOperations(Resource):
 
     def get_discoveredapis(self, api_invoker_id, query_params):
@@ -56,17 +68,19 @@ class DiscoverApisOperations(Resource):
             discoved_apis = services.find(my_query, {"_id":0})
             json_docs = []
             for discoved_api in discoved_apis:
+                current_app.logger.debug(discoved_api)
                 vendor_specific_fields_path = find_attribute_in_body(discoved_api, '')
                 if vend_spec_query_params_n_values and vendor_specific_fields_path:
                     vs_filtered_apis = filter_apis_with_vendor_specific_params(discoved_api, vend_spec_query_params_n_values, vendor_specific_fields_path)
                     if vs_filtered_apis:
-                        json_docs.append(vs_filtered_apis)
+                        json_docs.append(filter_fields(vs_filtered_apis))
                 else:
-                    json_docs.append(discoved_api)
+                    json_docs.append(filter_fields(discoved_api))
 
             if len(json_docs) == 0:
                 return not_found_error(detail="API Invoker " + api_invoker_id + " has no API Published that accomplish filter conditions", cause="No API Published accomplish filter conditions")
 
+
             apis_discovered = DiscoveredAPIs(service_api_descriptions=json_docs)
             res = make_response(object=serialize_clean_camel_case(apis_discovered), status=200)
             return res
diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/vendor_specific.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/vendor_specific.py
index d30faf3e..0bb95533 100644
--- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/vendor_specific.py
+++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/vendor_specific.py
@@ -55,7 +55,6 @@ def add_vend_spec_fields(vendor_specific, serviceapidescription_dict):
     return tmp_body
 
 def filter_apis_with_vendor_specific_params(discoved_api, vend_spec_query_params_n_values, vendor_specific_fields_path):
-    json_docs = []
     for k, v in vend_spec_query_params_n_values.items():
         parts = k.split('.')
         for path in vendor_specific_fields_path:
@@ -68,8 +67,9 @@ def filter_apis_with_vendor_specific_params(discoved_api, vend_spec_query_params
                         path_piece = int(path_piece)
                     v_2 = tmp_body[path_piece]
                     tmp_body = v_2
-                # Check if parameter exists in the field attributes!!!!
                 if parts[1] in tmp_body[vs_field].keys():
-                    if tmp_body[vs_field][parts[1]] == v:
-                        json_docs.append(discoved_api)
-    return json_docs
\ No newline at end of file
+                    if tmp_body[vs_field][parts[1]] != v:
+                        return {}
+                else:
+                    return {}
+    return discoved_api
\ No newline at end of file
-- 
GitLab