--- description: Use RPC to run a validation operation to check a resource conformance --- # Asynchronous resource validation ### Asynchronous Batch Validation `draft` {% hint style="info" %} This is a draft API. We appreciate your feedback and ideas in [this discussion](https://github.com/Aidbox/Issues/discussions/409) {% endhint %} It may happen that you updated your profiles when data is already in your database or you want to do efficiently load a batch of data and validate it later. API consists of 4 procedures and a couple of resources: * [aidbox.validation/batch-validation](asynchronous-resource-validation.md#aidbox-validation-batch-validation) **-** run validation * [aidbox.validation/resources-batch-validation-task](asynchronous-resource-validation.md#aidbox.validation-batch-validation-result) - run validation with [Aidbox Workflow](../../deprecated/deprecated/zen-related/workflow-engine/workflow/README.md) * [aidbox.validation/batch-validation-result](asynchronous-resource-validation.md#aidbox-validation-batch-validation-result) - inspect results (useful for async mode) * [aidbox.validation/clear-batch-validation](asynchronous-resource-validation.md#aidbox-validation-clear-batch-validation) - clear validation results #### Prepare data To illustrate let's create some invalid data in Aidbox: ```yaml POST /Patient content-type: text/yaml id: 'pt1' birthDate: '1980-03-05' ``` Break data from DB Console: ```sql update patient set resource = resource || '{"ups": "extra"}' where id = 'pt1' returning * ``` #### aidbox.validation/batch-validation You can validate your existing data with our new rpc `aidbox.validation/batch-validation`: ```yaml POST /rpc content-type: text/yaml method: aidbox.validation/batch-validation params: # resourceType to validate resource: Patient id: pt-validation-run-1 # you can limit number of resources to validate limit: 100 # you can stop process on specific number of invalid resources errorsThreshold: 10 # where section of resources query filter: "resource#>>'{birthDate}' is not null" ## run validation asynchronously # async: true ## specify profiles to validate # profiles: ['profile-url-1', 'profile-url-2'] # response result: id: pt-validation-run-2 valid: 0 invalid: 1 duration: 15 problems: - resource: id: pt1 ups: extra meta: createdAt: '2021-08-05T16:36:37.723008+03:00' versionId: '1224' lastUpdated: '2021-08-05T16:36:37.723008+03:00' birthDate: '1980-03-05' resourceType: Patient errors: - path: - ups message: extra property ``` #### aidbox.validation/resources-batch-validation-task You can run validation workflow with rpc method, which creates task for every resource provided in rpc's params fields `include` or `exclude`:
POST /rpc
accept: text/yaml
content-type: text/yaml
method: aidbox.validation/resources-batch-validation-task
params:
include: ['patient', 'observation']
error-threshold: 10000
# response
params:
tables:
- patient
- observation
status: in-progress
definition: aidbox.validation/resource-types-batch-validation-workflow
id: >-
7addda33-003e-4892-a1d9-0faffbedf86d
resourceType: AidboxWorkflow
{% hint style="info" %}
If you specify `include` param, only types you passed will be validated.
If you specify `exclude` param, all types will be validated except the ones you passed.
`include` and `exclude` params cannot be used together.
{% endhint %}
You can check a progress of workflow in Aidbox UI or by rpc method:
```yaml
POST /rpc
accept: text/yaml
content-type: text/yaml
method: awf.workflow/status
params:
id: 7addda33-003e-4892-a1d9-0faffbedf86d
#response
result:
resource:
params:
tables:
- patient
- observation
result: Finished
status: done
outcome: succeeded
definition: aidbox.validation/resource-types-batch-validation-workflow
id: >-
7addda33-003e-4892-a1d9-0faffbedf86d
resourceType: AidboxWorkflow
```
#### aidbox.validation/batch-validation-result
If you run validation in async mode or aidbox.validation/resources-batch-validation-task, it will respond instantly and run validation in the background. You can get validation results with RPC `aidbox.validation/batch-validation-result`
```yaml
POST /rpc?_format=yaml
content-type: text/yaml
method: aidbox.validation/batch-validation-result
params:
id: pt-validation-run-1
# response
status: 200
result:
valid: 1543
invalid: 2
duration: 3293
problems:
- resource: {....}
errors: [{...}, {...}]
```
{% hint style="info" %}
`aidbox.validation/batch-validation-result` method requires `resourceType` param, which has a default value `BatchValidationRun`.
So, if you want to get the result from aidbox.validation/resources-batch-validation-task you need pass "AidboxWorkflow" to `resourceType` param.
{% endhint %}
#### aidbox.validation/clear-batch-validation
When you do not need results of this validation you can clean up resources with:
```yaml
POST /rpc?_format=yaml
content-type: text/yaml
method: aidbox.validation/clear-batch-validation
params:
id: pt-validation-run-1
```
#### BatchValidationRun & BatchValidationError Resources
When you run validation operation aidbox internally creates resource BatchValidationRun and put errors of validation in BatchValidationError. You can access these resources through standard CRUD/Search API
```yaml
GET /BatchValidationError?.run.id=pt-validation-run-2&_format=yaml&_result=array
# response
- run:
id: pt-validation-run-2
resourceType: BatchValidationRun
errors:
- path:
- ups
message: extra property
resource:
id: pt1
resourceType: Patient
id: pt-validation-run-2-Patient-pt1
```
{% hint style="info" %}
If you restart Aidbox you have to start validation over
{% endhint %}