Skip to content

Commit 13a6067

Browse files
Integrate pagination for credential, presentation and data agreement records
Signed-off-by: George J Padayatti <[email protected]>
1 parent 59e183c commit 13a6067

File tree

4 files changed

+236
-16
lines changed

4 files changed

+236
-16
lines changed

mydata_did/patched_protocols/issue_credential/v1_0/routes.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from json.decoder import JSONDecodeError
1212
from marshmallow import fields, validate
1313
import uuid
14+
import math
1415

1516
from aries_cloudagent.connections.models.connection_record import ConnectionRecord
1617
from aries_cloudagent.issuer.base import IssuerError
@@ -62,7 +63,10 @@
6263
from ....v1_0.models.data_agreement_instance_model import DataAgreementInstance, DataAgreementInstanceSchema
6364
from ....v1_0.utils.did.mydata_did import DIDMyData
6465
from ....v1_0.utils.wallet.key_type import KeyType
65-
from ....v1_0.utils.util import comma_separated_str_to_list
66+
from ....v1_0.utils.util import comma_separated_str_to_list, get_slices
67+
68+
69+
PAGINATION_PAGE_SIZE = 10
6670

6771

6872
class V10CredentialExchangeListQueryStringSchema(OpenAPISchema):
@@ -122,6 +126,18 @@ class V10CredentialExchangeListQueryStringSchema(OpenAPISchema):
122126
example="connection_id,state,presentation_exchange_id",
123127
)
124128

129+
page = fields.Int(
130+
required=False,
131+
description="Page number",
132+
example=1,
133+
)
134+
135+
page_size = fields.Int(
136+
required=False,
137+
description="Page size",
138+
example=10,
139+
)
140+
125141

126142
class V10CredentialExchangeListResultSchema(OpenAPISchema):
127143
"""Result schema for Aries#0036 v1.0 credential exchange query."""
@@ -427,10 +443,29 @@ async def credential_exchange_list(request: web.BaseRequest):
427443
if request.query.get(k, "") != ""
428444
}
429445

446+
# Pagination parameters
447+
pagination = {
448+
"totalCount": 0,
449+
"page": 0,
450+
"pageSize": PAGINATION_PAGE_SIZE,
451+
"totalPages": 0,
452+
}
453+
430454
try:
431455

432456
records = await V10CredentialExchange.query(context, tag_filter, post_filter)
433457

458+
# Page size from request.
459+
page_size = int(request.query.get("page_size", PAGINATION_PAGE_SIZE))
460+
pagination["pageSize"] = page_size
461+
462+
# Total number of records
463+
pagination["totalCount"] = len(records)
464+
465+
# Total number of pages.
466+
pagination["totalPages"] = math.ceil(
467+
pagination["totalCount"] / pagination["pageSize"])
468+
434469
# Fields to be included in the response.
435470
include_fields = request.query.get("include_fields")
436471
include_fields = comma_separated_str_to_list(
@@ -440,10 +475,26 @@ async def credential_exchange_list(request: web.BaseRequest):
440475
results = ADAManager.serialize_credential_exchange_records(
441476
records, True, include_fields)
442477

443-
except (StorageError, BaseModelError) as err:
478+
# Pagination parameters
479+
page = request.query.get("page")
480+
481+
if page:
482+
page = int(page)
483+
pagination["page"] = page
484+
485+
lower, upper = get_slices(page, pagination["pageSize"])
486+
487+
results = results[lower:upper]
488+
489+
except (StorageError, BaseModelError, ValueError) as err:
444490
raise web.HTTPBadRequest(reason=err.roll_up) from err
445491

446-
return web.json_response({"results": results})
492+
return web.json_response(
493+
{
494+
"results": results,
495+
"pagination": pagination if page else {},
496+
}
497+
)
447498

448499

449500
@docs(tags=["issue-credential"], summary="Fetch a single credential exchange record")

mydata_did/patched_protocols/present_proof/v1_0/routes.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Admin routes for presentations."""
22

33
import json
4+
import math
45

56
from aiohttp import web
67
from aiohttp_apispec import (
@@ -63,7 +64,10 @@
6364
from ....patched_protocols.issue_credential.v1_0.routes import SendDataAgreementNegotiationProblemReportRequestSchema
6465
from ....v1_0.utils.did.mydata_did import DIDMyData
6566
from ....v1_0.utils.wallet.key_type import KeyType
66-
from ....v1_0.utils.util import comma_separated_str_to_list
67+
from ....v1_0.utils.util import comma_separated_str_to_list, get_slices
68+
69+
70+
PAGINATION_PAGE_SIZE = 10
6771

6872

6973
class V10PresentationExchangeListQueryStringSchema(OpenAPISchema):
@@ -123,6 +127,18 @@ class V10PresentationExchangeListQueryStringSchema(OpenAPISchema):
123127
example="connection_id,state,presentation_exchange_id",
124128
)
125129

130+
page = fields.Int(
131+
required=False,
132+
description="Page number",
133+
example=1,
134+
)
135+
136+
page_size = fields.Int(
137+
required=False,
138+
description="Page size",
139+
example=10,
140+
)
141+
126142

127143
class V10PresentationExchangeListSchema(OpenAPISchema):
128144
"""Result schema for an Aries RFC 37 v1.0 presentation exchange query."""
@@ -507,10 +523,29 @@ async def presentation_exchange_list(request: web.BaseRequest):
507523
if request.query.get(k, "") != ""
508524
}
509525

526+
# Pagination parameters
527+
pagination = {
528+
"totalCount": 0,
529+
"page": 0,
530+
"pageSize": PAGINATION_PAGE_SIZE,
531+
"totalPages": 0,
532+
}
533+
510534
try:
511535

512536
records = await V10PresentationExchange.query(context, tag_filter, post_filter)
513537

538+
# Page size from request.
539+
page_size = int(request.query.get("page_size", PAGINATION_PAGE_SIZE))
540+
pagination["pageSize"] = page_size
541+
542+
# Total number of records
543+
pagination["totalCount"] = len(records)
544+
545+
# Total number of pages.
546+
pagination["totalPages"] = math.ceil(
547+
pagination["totalCount"] / pagination["pageSize"])
548+
514549
# Fields to be included in the response.
515550
include_fields = request.query.get("include_fields")
516551
include_fields = comma_separated_str_to_list(
@@ -520,11 +555,27 @@ async def presentation_exchange_list(request: web.BaseRequest):
520555
results = ADAManager.serialize_presentation_exchange_records(
521556
records, True, include_fields)
522557

523-
except (StorageError, BaseModelError) as err:
558+
# Pagination parameters
559+
page = request.query.get("page")
560+
561+
if page:
562+
page = int(page)
563+
pagination["page"] = page
564+
565+
lower, upper = get_slices(page, pagination["pageSize"])
566+
567+
results = results[lower:upper]
568+
569+
except (StorageError, BaseModelError, ValueError) as err:
524570

525571
raise web.HTTPBadRequest(reason=err.roll_up) from err
526572

527-
return web.json_response({"results": results})
573+
return web.json_response(
574+
{
575+
"results": results,
576+
"pagination": pagination if page else {},
577+
}
578+
)
528579

529580

530581
@docs(tags=["present-proof"], summary="Fetch a single presentation exchange record")

mydata_did/v1_0/routes.py

Lines changed: 110 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import uuid
77
import logging
88
import jwt
9+
import math
910

1011
import validators
1112

@@ -49,13 +50,15 @@
4950
from .models.diddoc_model import MyDataDIDDocSchema
5051
from .models.data_agreement_instance_model import DataAgreementInstanceSchema, DataAgreementInstance
5152

52-
from .utils.util import str_to_bool, bool_to_str, comma_separated_str_to_list
53+
from .utils.util import str_to_bool, bool_to_str, comma_separated_str_to_list, get_slices
5354
from .utils.regex import MYDATA_DID
5455
from .utils.jsonld.data_agreement import sign_data_agreement, verify_data_agreement, verify_data_agreement_with_proof_chain
5556

5657

5758
LOGGER = logging.getLogger(__name__)
5859

60+
PAGINATION_PAGE_SIZE = 10
61+
5962

6063
class SendCreateDIDMessageMatchInfoSchema(OpenAPISchema):
6164
"""
@@ -421,6 +424,18 @@ class DataAgreementQueryStringSchema(OpenAPISchema):
421424
example="connection_id,state,presentation_exchange_id",
422425
)
423426

427+
page = fields.Int(
428+
required=False,
429+
description="Page number",
430+
example=1,
431+
)
432+
433+
page_size = fields.Int(
434+
required=False,
435+
description="Page size",
436+
example=10,
437+
)
438+
424439

425440
class UpdateDataAgreementMatchInfoSchema(OpenAPISchema):
426441
"""
@@ -1658,15 +1673,53 @@ async def query_data_agreements_in_wallet(request: web.BaseRequest):
16581673
context=context
16591674
)
16601675

1661-
# Fields to be included in the response.
1662-
include_fields = request.query.get("include_fields")
1663-
include_fields = comma_separated_str_to_list(
1664-
include_fields) if include_fields else None
1676+
# Pagination parameters
1677+
pagination = {
1678+
"totalCount": 0,
1679+
"page": 0,
1680+
"pageSize": PAGINATION_PAGE_SIZE,
1681+
"totalPages": 0,
1682+
}
1683+
1684+
try:
1685+
1686+
# Fields to be included in the response.
1687+
include_fields = request.query.get("include_fields")
1688+
include_fields = comma_separated_str_to_list(
1689+
include_fields) if include_fields else None
1690+
1691+
# Query data agreements in the wallet
1692+
(data_agreement_records, resp_da_list) = await mydata_did_manager.query_data_agreements_in_wallet(tag_filter=tag_filter, include_fields=include_fields)
1693+
1694+
# Page size from request.
1695+
page_size = int(request.query.get("page_size", PAGINATION_PAGE_SIZE))
1696+
pagination["pageSize"] = page_size
1697+
1698+
# Total number of records
1699+
pagination["totalCount"] = len(resp_da_list)
1700+
1701+
# Total number of pages.
1702+
pagination["totalPages"] = math.ceil(
1703+
pagination["totalCount"] / pagination["pageSize"])
1704+
1705+
# Pagination parameters
1706+
page = request.query.get("page")
1707+
if page:
1708+
page = int(page)
1709+
pagination["page"] = page
1710+
1711+
lower, upper = get_slices(page, pagination["pageSize"])
1712+
1713+
resp_da_list = resp_da_list[lower:upper]
1714+
1715+
except (StorageError, BaseModelError, ValueError) as err:
16651716

1666-
# Query data agreements in the wallet
1667-
(data_agreement_records, resp_da_list) = await mydata_did_manager.query_data_agreements_in_wallet(tag_filter=tag_filter, include_fields=include_fields)
1717+
raise web.HTTPBadRequest(reason=err.roll_up) from err
16681718

1669-
return web.json_response(resp_da_list)
1719+
return web.json_response({
1720+
"results": resp_da_list,
1721+
"pagination": pagination if page else {},
1722+
})
16701723

16711724

16721725
@docs(
@@ -3265,6 +3318,18 @@ class ConnectionsListQueryStringSchemaV2(OpenAPISchema):
32653318
example="connection_id,state,presentation_exchange_id",
32663319
)
32673320

3321+
page = fields.Int(
3322+
required=False,
3323+
description="Page number",
3324+
example=1,
3325+
)
3326+
3327+
page_size = fields.Int(
3328+
required=False,
3329+
description="Page size",
3330+
example=10,
3331+
)
3332+
32683333

32693334
class ConnectionListSchema(OpenAPISchema):
32703335
"""Result schema for connection list."""
@@ -3322,10 +3387,30 @@ async def connections_list_v2(request: web.BaseRequest):
33223387
):
33233388
if param_name in request.query and request.query[param_name] != "":
33243389
post_filter[param_name] = request.query[param_name]
3390+
3391+
# Pagination parameters
3392+
pagination = {
3393+
"totalCount": 0,
3394+
"page": 0,
3395+
"pageSize": PAGINATION_PAGE_SIZE,
3396+
"totalPages": 0,
3397+
}
3398+
33253399
try:
33263400

33273401
records = await ConnectionRecord.query(context, tag_filter, post_filter)
33283402

3403+
# Page size from request.
3404+
page_size = int(request.query.get("page_size", PAGINATION_PAGE_SIZE))
3405+
pagination["pageSize"] = page_size
3406+
3407+
# Total number of records
3408+
pagination["totalCount"] = len(records)
3409+
3410+
# Total number of pages.
3411+
pagination["totalPages"] = math.ceil(
3412+
pagination["totalCount"] / pagination["pageSize"])
3413+
33293414
# Fields to be included in the response.
33303415
include_fields = request.query.get("include_fields")
33313416
include_fields = comma_separated_str_to_list(
@@ -3334,9 +3419,24 @@ async def connections_list_v2(request: web.BaseRequest):
33343419
results = ADAManager.serialize_connection_record(
33353420
records, True, include_fields)
33363421

3337-
except (StorageError, BaseModelError) as err:
3422+
# Pagination parameters
3423+
page = request.query.get("page")
3424+
if page:
3425+
page = int(page)
3426+
pagination["page"] = page
3427+
3428+
lower, upper = get_slices(page, pagination["pageSize"])
3429+
3430+
results = results[lower:upper]
3431+
3432+
except (StorageError, BaseModelError, ValueError) as err:
33383433
raise web.HTTPBadRequest(reason=err.roll_up) from err
3339-
return web.json_response({"results": results})
3434+
return web.json_response(
3435+
{
3436+
"results": results,
3437+
"pagination": pagination if page else {},
3438+
}
3439+
)
33403440

33413441

33423442
async def register(app: web.Application):

0 commit comments

Comments
 (0)