Skip to content

Commit 59e183c

Browse files
Query API(s) support include_fields query params to reduce response footprint.
Following API(s) support `include_fields`: 1. Connections 2. Presentation exchange 3. Credential exchange 4. Data agreements Signed-off-by: George J Padayatti <[email protected]>
1 parent 5157b5f commit 59e183c

File tree

6 files changed

+344
-51
lines changed

6 files changed

+344
-51
lines changed

mydata_did/patched_protocols/issue_credential/v1_0/models/credential_exchange.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,74 +193,93 @@ class Meta:
193193
description="Credential exchange identifier",
194194
example=UUIDFour.EXAMPLE,
195195
)
196+
196197
connection_id = fields.Str(
197198
required=False, description="Connection identifier", example=UUIDFour.EXAMPLE
198199
)
200+
199201
thread_id = fields.Str(
200202
required=False, description="Thread identifier", example=UUIDFour.EXAMPLE
201203
)
204+
202205
parent_thread_id = fields.Str(
203206
required=False, description="Parent thread identifier", example=UUIDFour.EXAMPLE
204207
)
208+
205209
initiator = fields.Str(
206210
required=False,
207211
description="Issue-credential exchange initiator: self or external",
208212
example=V10CredentialExchange.INITIATOR_SELF,
209213
validate=validate.OneOf(["self", "external"]),
210214
)
215+
211216
role = fields.Str(
212217
required=False,
213218
description="Issue-credential exchange role: holder or issuer",
214219
example=V10CredentialExchange.ROLE_ISSUER,
215220
validate=validate.OneOf(["holder", "issuer"]),
216221
)
222+
217223
state = fields.Str(
218224
required=False,
219225
description="Issue-credential exchange state",
220226
example=V10CredentialExchange.STATE_ACKED,
221227
)
228+
222229
credential_definition_id = fields.Str(
223230
required=False,
224231
description="Credential definition identifier",
225232
**INDY_CRED_DEF_ID,
226233
)
234+
227235
schema_id = fields.Str(
228236
required=False, description="Schema identifier", **INDY_SCHEMA_ID
229237
)
238+
230239
credential_proposal_dict = fields.Dict(
231240
required=False, description="Serialized credential proposal message"
232241
)
242+
233243
credential_offer_dict = fields.Dict(
234244
required=False, description="Serialized credential offer message"
235245
)
246+
236247
credential_offer = fields.Dict(
237248
required=False, description="(Indy) credential offer"
238249
)
250+
239251
credential_request = fields.Dict(
240252
required=False, description="(Indy) credential request"
241253
)
254+
242255
credential_request_metadata = fields.Dict(
243256
required=False, description="(Indy) credential request metadata"
244257
)
258+
245259
credential_id = fields.Str(
246260
required=False, description="Credential identifier", example=UUIDFour.EXAMPLE
247261
)
262+
248263
raw_credential = fields.Dict(
249264
required=False,
250265
description="Credential as received, prior to storage in holder wallet",
251266
)
267+
252268
credential = fields.Dict(
253269
required=False, description="Credential as stored")
270+
254271
auto_offer = fields.Bool(
255272
required=False,
256273
description="Holder choice to accept offer in this credential exchange",
257274
example=False,
258275
)
276+
259277
auto_issue = fields.Bool(
260278
required=False,
261279
description="Issuer choice to issue to request in this credential exchange",
262280
example=False,
263281
)
282+
264283
auto_remove = fields.Bool(
265284
required=False,
266285
default=True,
@@ -269,14 +288,17 @@ class Meta:
269288
),
270289
example=False,
271290
)
291+
272292
error_msg = fields.Str(
273293
required=False,
274294
description="Error message",
275295
example="credential definition identifier is not set in proposal",
276296
)
297+
277298
revoc_reg_id = fields.Str(
278299
required=False, description="Revocation registry identifier"
279300
)
301+
280302
revocation_id = fields.Str(
281303
required=False, description="Credential identifier within revocation registry"
282304
)

mydata_did/patched_protocols/issue_credential/v1_0/routes.py

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
from ....v1_0.models.data_agreement_instance_model import DataAgreementInstance, DataAgreementInstanceSchema
6363
from ....v1_0.utils.did.mydata_did import DIDMyData
6464
from ....v1_0.utils.wallet.key_type import KeyType
65+
from ....v1_0.utils.util import comma_separated_str_to_list
66+
6567

6668
class V10CredentialExchangeListQueryStringSchema(OpenAPISchema):
6769
"""Parameters and validators for credential exchange list query."""
@@ -113,6 +115,13 @@ class V10CredentialExchangeListQueryStringSchema(OpenAPISchema):
113115
example=UUIDFour.EXAMPLE,
114116
)
115117

118+
# Response fields
119+
include_fields = fields.Str(
120+
required=False,
121+
description="Comma separated fields to be included in the response.",
122+
example="connection_id,state,presentation_exchange_id",
123+
)
124+
116125

117126
class V10CredentialExchangeListResultSchema(OpenAPISchema):
118127
"""Result schema for Aries#0036 v1.0 credential exchange query."""
@@ -384,11 +393,14 @@ class DataAgreementBoundCredentialOfferMatchInfoSchema(OpenAPISchema):
384393
example=UUIDFour.EXAMPLE
385394
)
386395

396+
387397
class SendDataAgreementNegotiationProblemReportRequestSchema(OpenAPISchema):
388398
"""Request schema for sending problem report."""
389399

390-
explain = fields.Str(description="Describe the problem", required=True, example="Data agreement context decorator not found in the didcomm message.")
391-
problem_code = fields.Str(description="Problem code", required=True, example=DataAgreementNegotiationProblemReportReason.DATA_AGREEMENT_CONTEXT_INVALID.value)
400+
explain = fields.Str(description="Describe the problem", required=True,
401+
example="Data agreement context decorator not found in the didcomm message.")
402+
problem_code = fields.Str(description="Problem code", required=True,
403+
example=DataAgreementNegotiationProblemReportReason.DATA_AGREEMENT_CONTEXT_INVALID.value)
392404

393405

394406
@docs(tags=["issue-credential"], summary="Fetch all credential exchange records")
@@ -416,8 +428,18 @@ async def credential_exchange_list(request: web.BaseRequest):
416428
}
417429

418430
try:
431+
419432
records = await V10CredentialExchange.query(context, tag_filter, post_filter)
420-
results = [record.serialize() for record in records]
433+
434+
# Fields to be included in the response.
435+
include_fields = request.query.get("include_fields")
436+
include_fields = comma_separated_str_to_list(
437+
include_fields) if include_fields else None
438+
439+
# Serialise presentation exchange records and customize it based on include_fields.
440+
results = ADAManager.serialize_credential_exchange_records(
441+
records, True, include_fields)
442+
421443
except (StorageError, BaseModelError) as err:
422444
raise web.HTTPBadRequest(reason=err.roll_up) from err
423445

@@ -1539,11 +1561,12 @@ async def send_data_agreement_reject_message_for_credential_offer(request: web.B
15391561

15401562
await outbound_handler(data_agreement_negotiation_reject_message, connection_id=cred_ex_record.connection_id)
15411563

1542-
except (ADAManagerError,StorageError) as err:
1564+
except (ADAManagerError, StorageError) as err:
15431565
raise web.HTTPBadRequest(reason=err.roll_up) from err
15441566

15451567
return web.json_response(cred_ex_record.serialize())
15461568

1569+
15471570
@docs(
15481571
tags=["issue-credential"], summary="Send data agreement negotiation problem report message"
15491572
)
@@ -1579,11 +1602,9 @@ async def send_data_agreement_negotiation_problem_report(request: web.BaseReques
15791602
)
15801603
except StorageNotFoundError as err:
15811604
raise web.HTTPNotFound(reason=err.roll_up) from err
1582-
15831605

15841606
if not cred_ex_record.data_agreement:
15851607
raise web.HTTPBadRequest(reason=f"Data agreement is not available.")
1586-
15871608

15881609
# Initialize ADA manager
15891610
ada_manager = ADAManager(context)
@@ -1597,7 +1618,6 @@ async def send_data_agreement_negotiation_problem_report(request: web.BaseReques
15971618
if not connection_record.is_ready:
15981619
raise web.HTTPForbidden(
15991620
reason=f"Connection {connection_id} not ready")
1600-
16011621

16021622
data_agreement_negotiation_problem_report = await ada_manager.construct_data_agreement_negotiation_problem_report_message(
16031623
connection_record=connection_record,
@@ -1611,7 +1631,7 @@ async def send_data_agreement_negotiation_problem_report(request: web.BaseReques
16111631
data_agreement_negotiation_problem_report_message=data_agreement_negotiation_problem_report,
16121632
)
16131633

1614-
except (ADAManagerError,StorageError) as err:
1634+
except (ADAManagerError, StorageError) as err:
16151635
raise web.HTTPBadRequest(reason=err.roll_up) from err
16161636

16171637
return web.json_response({})
@@ -1675,19 +1695,18 @@ async def send_data_agreement_termination_message(request: web.BaseRequest):
16751695
if not connection_record.is_ready:
16761696
raise web.HTTPForbidden(
16771697
reason=f"Connection {connection_id} not ready")
1678-
1698+
16791699
# Fetch wallet from context
16801700
wallet: IndyWallet = await context.inject(BaseWallet)
1681-
1701+
16821702
pairwise_local_did_record = await wallet.get_local_did(connection_record.my_did)
16831703
principle_did = DIDMyData.from_public_key_b58(
16841704
pairwise_local_did_record.verkey, key_type=KeyType.ED25519)
1685-
1705+
16861706
if data_agreement_instance.principle_did != principle_did.did:
16871707
raise web.HTTPBadRequest(
16881708
reason=f"Only the principle can terminate the data agreement."
16891709
)
1690-
16911710

16921711
(data_agreement_instance, data_agreement_terminate_message) = await ada_manager.construct_data_agreement_termination_terminate_message(
16931712
data_agreement_instance=data_agreement_instance,
@@ -1702,11 +1721,12 @@ async def send_data_agreement_termination_message(request: web.BaseRequest):
17021721

17031722
await outbound_handler(data_agreement_terminate_message, connection_id=cred_ex_record.connection_id)
17041723

1705-
except (ADAManagerError,StorageError) as err:
1724+
except (ADAManagerError, StorageError) as err:
17061725
raise web.HTTPBadRequest(reason=err.roll_up) from err
17071726

17081727
return web.json_response(cred_ex_record.serialize())
17091728

1729+
17101730
async def register(app: web.Application):
17111731
"""Register routes."""
17121732

0 commit comments

Comments
 (0)