Skip to content

Commit 5d1eabb

Browse files
Integrate pagination for personal data API
Signed-off-by: George J Padayatti <[email protected]>
1 parent 13a6067 commit 5d1eabb

File tree

2 files changed

+101
-25
lines changed

2 files changed

+101
-25
lines changed

mydata_did/v1_0/manager.py

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4345,7 +4345,7 @@ async def query_data_agreement_version_history(self, data_agreement_id: str) ->
43454345
f"Failed to fetch all data agreements from wallet; Reason: {e.roll_up}"
43464346
)
43474347

4348-
def serialize_personal_data_record(self, *, personal_data_records: typing.List[DataAgreementPersonalDataRecord], is_list: bool = True) -> typing.List[dict]:
4348+
def serialize_personal_data_record(self, *, personal_data_records: typing.List[dict], is_list: bool = True) -> typing.List[dict]:
43494349
"""
43504350
Serialize personal data records.
43514351
@@ -4357,26 +4357,11 @@ def serialize_personal_data_record(self, *, personal_data_records: typing.List[D
43574357
Serialized personal data records.
43584358
"""
43594359

4360-
personal_data_records_list: typing.List[dict] = []
4361-
4362-
for personal_data_record in personal_data_records:
4363-
temp_personal_data_record = {
4364-
"attribute_id": personal_data_record.personal_data_id,
4365-
"attribute_name": personal_data_record.attribute_name,
4366-
"attribute_description": personal_data_record.attribute_description,
4367-
"data_agreement_template_id": personal_data_record.da_template_id,
4368-
"data_agreement_template_version": personal_data_record.da_template_version,
4369-
"created_at": str_to_epoch(personal_data_record.created_at),
4370-
"updated_at": str_to_epoch(personal_data_record.updated_at),
4371-
}
4372-
4373-
personal_data_records_list.append(temp_personal_data_record)
4374-
43754360
# Sort personal data list by created_at in descending order
4376-
personal_data_records_list = sorted(
4377-
personal_data_records_list, key=lambda k: k['created_at'], reverse=True)
4361+
personal_data_records = sorted(
4362+
personal_data_records, key=lambda k: k['created_at'], reverse=True)
43784363

4379-
return personal_data_records_list if is_list else personal_data_records_list[0]
4364+
return personal_data_records if is_list else personal_data_records[0]
43804365

43814366
async def update_personal_data_description(self, personal_data_id: str, updated_description: str) -> typing.Tuple[DataAgreementPersonalDataRecord, dict]:
43824367

@@ -4439,7 +4424,7 @@ async def update_personal_data_description(self, personal_data_id: str, updated_
44394424
except (StorageError, ValidationError) as err:
44404425
raise ADAManagerError(err_string.format(err=err)) from err
44414426

4442-
async def query_da_personal_data_in_wallet(self, personal_data_id: str = None) -> typing.Tuple[typing.List[DataAgreementPersonalDataRecord], dict]:
4427+
async def query_da_personal_data_in_wallet(self, personal_data_id: str = None, method_of_use: str = None) -> typing.List[dict]:
44434428
"""
44444429
Query personal data in the wallet.
44454430
"""
@@ -4460,8 +4445,41 @@ async def query_da_personal_data_in_wallet(self, personal_data_id: str = None) -
44604445
else:
44614446
matched_personal_data_records = personal_data_records
44624447

4463-
return matched_personal_data_records, self.serialize_personal_data_record(personal_data_records=matched_personal_data_records, is_list=True)
4464-
except StorageSearchError as e:
4448+
serialised_personal_data_records = []
4449+
4450+
# Iterate through personal data
4451+
for pd in matched_personal_data_records:
4452+
4453+
# Fetch data agreement template.
4454+
data_agreement_record: DataAgreementV1Record = await DataAgreementV1Record.retrieve_non_deleted_data_agreement_by_id(
4455+
self.context,
4456+
pd.da_template_id
4457+
)
4458+
4459+
temp_pd = {
4460+
"attribute_id": pd.personal_data_id,
4461+
"attribute_name": pd.attribute_name,
4462+
"attribute_description": pd.attribute_description,
4463+
"data_agreement": {
4464+
"data_agreement_id": data_agreement_record.data_agreement_record_id,
4465+
"method_of_use": data_agreement_record.method_of_use,
4466+
},
4467+
"created_at": str_to_epoch(pd.created_at),
4468+
"updated_at": str_to_epoch(pd.updated_at),
4469+
}
4470+
4471+
if method_of_use:
4472+
if data_agreement_record.method_of_use == method_of_use:
4473+
serialised_personal_data_records.append(temp_pd)
4474+
else:
4475+
serialised_personal_data_records.append(temp_pd)
4476+
4477+
return self.serialize_personal_data_record(
4478+
personal_data_records=serialised_personal_data_records,
4479+
is_list=True
4480+
)
4481+
4482+
except (StorageSearchError) as e:
44654483
# Raise an error
44664484
raise ADAManagerError(
44674485
f"Failed to fetch all data agreements from wallet: {e}"

mydata_did/v1_0/routes.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,6 +1863,24 @@ class QueryDaPersonalDataInWalletQueryStringSchema(OpenAPISchema):
18631863
example=UUIDFour.EXAMPLE
18641864
)
18651865

1866+
page = fields.Int(
1867+
required=False,
1868+
description="Page number",
1869+
example=1,
1870+
)
1871+
1872+
page_size = fields.Int(
1873+
required=False,
1874+
description="Page size",
1875+
example=10,
1876+
)
1877+
1878+
method_of_use = fields.Str(
1879+
required=False,
1880+
description="Method of use",
1881+
example="data-using-service",
1882+
)
1883+
18661884

18671885
@docs(
18681886
tags=["Data Agreement - Core Functions"],
@@ -1886,15 +1904,55 @@ async def query_da_personal_data_in_wallet(request: web.BaseRequest):
18861904
if "attribute_id" in request.query and request.query["attribute_id"] != "":
18871905
personal_data_id = request.query["attribute_id"]
18881906

1907+
method_of_use = None
1908+
if "method_of_use" in request.query and request.query["method_of_use"] != "":
1909+
method_of_use = request.query["method_of_use"]
1910+
1911+
# Pagination parameters
1912+
pagination = {
1913+
"totalCount": 0,
1914+
"page": 0,
1915+
"pageSize": PAGINATION_PAGE_SIZE,
1916+
"totalPages": 0,
1917+
}
1918+
18891919
try:
1920+
18901921
# Query data agreement personal data in wallet
1891-
(data_agreement_personal_data_records, data_agreement_personal_data_dict_list) = await mydata_did_manager.query_da_personal_data_in_wallet(
1892-
personal_data_id=personal_data_id
1922+
results = await mydata_did_manager.query_da_personal_data_in_wallet(
1923+
personal_data_id=personal_data_id,
1924+
method_of_use=method_of_use
18931925
)
1926+
1927+
# Page size from request.
1928+
page_size = int(request.query.get("page_size", PAGINATION_PAGE_SIZE))
1929+
pagination["pageSize"] = page_size
1930+
1931+
# Total number of records
1932+
pagination["totalCount"] = len(results)
1933+
1934+
# Total number of pages.
1935+
pagination["totalPages"] = math.ceil(
1936+
pagination["totalCount"] / pagination["pageSize"])
1937+
1938+
# Pagination parameters
1939+
page = request.query.get("page")
1940+
1941+
if page:
1942+
page = int(page)
1943+
pagination["page"] = page
1944+
1945+
lower, upper = get_slices(page, pagination["pageSize"])
1946+
1947+
results = results[lower:upper]
1948+
18941949
except ADAManagerError as err:
18951950
raise web.HTTPBadRequest(reason=err.roll_up) from err
18961951

1897-
return web.json_response(data_agreement_personal_data_dict_list)
1952+
return web.json_response({
1953+
"results": results,
1954+
"pagination": pagination if page else {}
1955+
})
18981956

18991957

19001958
class UpdateDaPersonalDataInWalletMatchInfoSchema(OpenAPISchema):

0 commit comments

Comments
 (0)