Get Dynamic Change Requests
GET /obp/v7.0.0/management/dynamic-change-requests
OBPv7.0.0-getDynamicChangeRequests Roles: CanGetDynamicChangeRequests Dynamic-Change-RequestDynamic
Returns all Dynamic Change Requests, newest first. The table is never pruned: it is the audit log of every proposed, approved, rejected, withdrawn, expired and failed change.
Optional query parameters: status (INITIATED, APPROVED, REJECTED, WITHDRAWN, EXPIRED, FAILED), target_type, target_id, requestor_user_id.
Maker/checker for runtime-supplied code and configuration (dynamic resource docs, connector methods, dynamic message docs, ABAC rules).
When dynamic_code_requires_approval is true and the target type is listed in dynamic_code_approval_target_types, the v4.0.0 / v6.0.0 create, update and delete endpoints validate and compile the body as before but return 202 Accepted with a Dynamic Change Request instead of applying it. A DIFFERENT user holding CanApproveDynamicChangeRequest approves the request by its payload_hash; only then is the change applied, and the runtime executes only rows whose body hash equals the approved hash.
Approval is system level. Dynamic code runs in the shared JVM, so a bank-level artefact is approved by the same system-level checker; there are no bank-level change request endpoints.
User Authentication is Required. The User must be logged in. The Application must also be authenticated.
JSON response body fields (19)
- actioned_at
- actioned_at
- business_justification
- business_justification
- checker_comment
- checker_comment
- checker_user_id
- checker_user_id
- created_at
- created_at
- current_payload
- current_payload
- current_payload_hash
- current_payload_hash
- dynamic_change_request_id
- dynamic_change_request_id
- dynamic_change_requests
- dynamic_change_requests
- expires_at
- expires_at
- operation
- operation
- payload_hash
- payload_hash
- proposed_payload
- proposed_payload
- request_path
- request_path
- request_verb
- POST
- requestor_user_id
- requestor_user_id
- status
- target_id
- target_id
- target_type
- target_type
Example success response
{
"dynamic_change_requests": [
{
"dynamic_change_request_id": "0d1c9e3c-6c2b-4c1e-9a53-2d5b2f0d7f11",
"target_type": "DYNAMIC_RESOURCE_DOC",
"target_id": "",
"operation": "CREATE",
"status": "INITIATED",
"request_verb": "POST",
"request_path": "/obp/v4.0.0/management/dynamic-resource-docs",
"payload_hash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"current_payload_hash": "",
"proposed_payload": {
"request_url": "/my_user/MY_USER_ID",
"success_response_body": {
"my_user_id": "some_id_value",
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"example_request_body": {
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"programming_lang": "Scala",
"bank_id": "gh.29.uk",
"roles": "CanCreateMyUser",
"summary": "Create My User",
"error_response_bodies": "OBP-50000: Unknown Error.,OBP-20001: User not logged in. Authentication is required!,OBP-20006: User is missing one or more roles: ,OBP-10001: Incorrect json format.",
"request_verb": "POST",
"description": "Create one User",
"tags": "Create-My-User",
"method_body": "%20%20%20%20val%20Some(resourceDoc)%20%3D%20callContext.resourceDocument%0A%20%20%20%20val%20hasRequestBody%20%3D%20callContext.httpBody.exists(_.nonEmpty)%0A%0A%20%20%20%20%2F%2F%20get%20Path%20Parameters%2C%20example%3A%0A%20%20%20%20%2F%2F%20if%20the%20requestUrl%20of%20resourceDoc%20is%20%2Fhello%2Fbanks%2FBANK_ID%2Fworld%0A%20%20%20%20%2F%2F%20the%20request%20path%20is%20%2Fhello%2Fbanks%2Fbank_x%2Fworld%0A%20%20%20%20%2F%2FpathParams.get(%22BANK_ID%22)%20will%20get%20Option(%22bank_x%22)%20value%0A%0A%20%20%20%20val%20myUserId%20%3D%20pathParams(%22MY_USER_ID%22)%0A%0A%0A%20%20%20%20val%20requestEntity%20%3D%20callContext.httpBody.filter(_.nonEmpty)%20match%20%7B%0A%20%20%20%20%20%20case%20Some(rawBody)%20%3D%3E%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20com.openbankproject.commons.util.JsonAliases.parse(rawBody).extract%5BRequestRootJsonClass%5D%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20e%3A%20MappingException%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidJsonFormat%20%24%7Be.msg%7D%22)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20None%20%3D%3E%0A%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidRequestPayload%20Current%20request%20has%20no%20payload%22)%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%2F%2F%20please%20add%20business%20logic%20here%0A%20%20%20%20val%20responseBody%3AResponseRootJsonClass%20%3D%20ResponseRootJsonClass(s%22%24%7BmyUserId%7D_from_path%22%2C%20requestEntity.name%2C%20requestEntity.age%2C%20requestEntity.hobby)%0A%20%20%20%20Future.successful%20%7B%0A%20%20%20%20%20%20(responseBody%2C%20HttpCode.%60200%60(callContext.callContext))%0A%20%20%20%20%7D",
"dynamic_resource_doc_id": "vce035ca-9a0f-4bfa-b30b-9003aa467f51",
"partial_function_name": "createUser"
},
"requestor_user_id": "9ca9a7e4-6d02-40e3-a129-0b2bf89de9b1",
"business_justification": "Expose the new loan quote endpoint for the mobile app.",
"checker_user_id": "",
"checker_comment": "",
"created_at": "1100-01-01T01:01:01.000Z",
"actioned_at": "",
"expires_at": "1100-01-01T01:01:01.000Z"
}
]
}Possible errors (3)
- OBP-20001: User not logged in. Authentication is required!
- OBP-20006: User is missing one or more roles:
- OBP-50000: Unknown Error.