Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
e303687
ci(te): also expose dva-processing
MYRhouma Jul 24, 2026
7ea0f74
feat(vc): remove the ACA-Py controller svc
MYRhouma Jul 24, 2026
368900b
feat(api): remove ACA-Py coupling from dva-api
MYRhouma Jul 26, 2026
7f05201
test(karate): temporarily disable attestation tests
bzp99 Jul 29, 2026
bd09c72
feat(proc): remove ACA-Py coupling from dva-processing
bzp99 Jul 29, 2026
d1ed0a4
feat(vc): add new service skeleton
MYRhouma Jul 24, 2026
22ed572
feat(vc): verify whitelist before payload decode and handle signature…
MYRhouma Jul 27, 2026
a6aaf07
docs(vc): improve VC Manager API spec
bzp99 Jul 31, 2026
c242236
chore(vc): add ruff config and apply mechanical formatting
bzp99 Jul 31, 2026
47bccce
feat(vc): remove auth for now
bzp99 Jul 31, 2026
80ed341
refactor(vc): improve OpenAPI spec serving
bzp99 Jul 31, 2026
8a3050f
refactor(vc): remove dead code
bzp99 Jul 31, 2026
dc2505a
refactor(vc): hoist deferred imports to module level
bzp99 Jul 31, 2026
e4f9c78
feat(vc): use structlog for logging
bzp99 Jul 31, 2026
2659685
refactor(vc): build whitelist repo during app startup
bzp99 Jul 31, 2026
9737699
refactor(vc): resolve the signing key store via Depends
bzp99 Jul 31, 2026
cc5b59b
refactor(vc): read settings via pydantic-settings
bzp99 Aug 3, 2026
a105a8f
docs(vc): remove remaining refs to Kotlin modules
bzp99 Aug 3, 2026
9ed42c0
refactor(vc): improve DTO handling
bzp99 Aug 3, 2026
27c961b
fix(vc): reject non-object JWS payloads
bzp99 Aug 3, 2026
d055f66
refactor(vc): use VerifyKey in the did:key codec
bzp99 Aug 3, 2026
b7b519b
ci(vc): improve docker build setup
bzp99 Aug 6, 2026
78e921f
ci: add global dockerignore file
bzp99 Aug 6, 2026
cdcb152
refactor(vc): delegate did:key encoding to multiformats
bzp99 Aug 6, 2026
64fc557
refactor(vc): switch out httpx for httpx2
bzp99 Aug 6, 2026
8a89cf4
refactor(vc): persist only the ed25519 seed
bzp99 Aug 6, 2026
498b5ab
refactor(vc)!: replace hand-rolled JWS with joserfc
bzp99 Aug 6, 2026
7ae8317
Persist VC issuance and verification audit records
MYRhouma Aug 10, 2026
2b94952
feat(vla): add separate VLA manager backend
MYRhouma Jul 24, 2026
7b341a7
chore(vla): add ruff config and apply mechanical formatting
bzp99 Aug 12, 2026
5d432cc
feat(vla): remove auth for now
bzp99 Aug 17, 2026
631c11d
refactor(vla): remove dead code
bzp99 Aug 17, 2026
3c9c7b2
refactor(vla): hoist deferred imports to module level
bzp99 Aug 17, 2026
c68e4b6
refactor(vla): improve OpenAPI spec serving
bzp99 Aug 17, 2026
9c06e39
feat(vla): use structlog for logging
bzp99 Aug 18, 2026
8d65063
refactor(vla): read settings via pydantic-settings
bzp99 Aug 18, 2026
2995a87
refactor(vla): build repositories during app startup
bzp99 Aug 19, 2026
7cda12d
refactor(vla): improve DTO handling
bzp99 Aug 19, 2026
b814367
refactor(vla): split the repository module
bzp99 Aug 19, 2026
1af25fd
fix(vla): return spec-conformant error bodies
bzp99 Aug 19, 2026
9f3567e
docs(vla): improve VLA Manager API spec
bzp99 Aug 19, 2026
8c3aaa3
docs(vla): refresh the README
bzp99 Aug 19, 2026
e9e4447
ci(vla): improve docker build setup
bzp99 Aug 19, 2026
5d4f123
ci(vla): add build and test workflow
bzp99 Aug 19, 2026
3e6d10b
docs(vla): rm code comments referencing deprecated module
bzp99 Aug 19, 2026
6648edd
test(vla): add template endpoint unit tests
bzp99 Aug 19, 2026
6d0009c
feat(api)!: remove RMQ and VLA mgmt endpoints
MYRhouma Jul 24, 2026
4aedc8a
feat(proc)!: remove rmq integration
bzp99 Aug 21, 2026
125c008
feat(api): add sync attest and verify endpoints
MYRhouma Jul 24, 2026
73109e4
docs(api): update openapi spec for attest endpoints
MYRhouma Jul 24, 2026
1668477
docs(api): align OpenAPI specs with code and share common schemata
bzp99 Sep 9, 2026
025bd5c
test(api): install the production plugins in tests
bzp99 Sep 9, 2026
1a25041
test(api): pin that an unissued JWS is omitted instead of null
bzp99 Sep 10, 2026
53948af
feat(api): serve the DVA API spec rather than the legacy aggregate
bzp99 Sep 10, 2026
66932a5
docs(api): refer to RFC 9457 rather than the obsoleted 7807
bzp99 Sep 10, 2026
889c9be
feat(vla,vc): also serve shared schemas
bzp99 Sep 11, 2026
61e5127
feat(api): answer malformed and unreadable bodies with problem details
bzp99 Sep 11, 2026
f07cb2c
chore(proc): add ruff config and apply mechanical formatting
bzp99 Sep 12, 2026
363e59c
refactor(proc): drop the AoV handler orphaned by the RMQ removal
bzp99 Sep 12, 2026
ab49821
feat(proc): return spec-conformant error bodies
bzp99 Sep 12, 2026
c62d4c0
fix(proc): repair the JQ and JSON schema engine result handling
bzp99 Sep 12, 2026
fe26070
feat(proc): express requirements as ODCS data quality entries
bzp99 Sep 12, 2026
891f4df
feat(proc): serve the DVA Processing API spec
bzp99 Sep 12, 2026
cbbf7d4
feat(proc): add the evaluate-batch endpoint
bzp99 Sep 12, 2026
9eee1f1
feat(proc): add the evaluate-from-template endpoint
bzp99 Sep 12, 2026
7628e3b
refactor(proc): read the new settings through the config object
bzp99 Sep 12, 2026
1161d6b
test(proc): add evaluation endpoint and spec-serving unit tests
bzp99 Sep 12, 2026
f929ee7
docs(proc): refresh the README
bzp99 Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Docker reads .dockerignore from the build-context root only. The service
# Dockerfiles reference ./<service>/... paths, so the context is this
# directory and per-service .dockerignore files have no effect.

# Generic
.git/
**/.gitignore
**/Dockerfile

# JVM projects
**/.gradle/
**/.idea/
**/.kotlin/
**/build/


# Python projects
**/.venv/
**/__pycache__/
**/*.pyc
**/.pytest_cache/
**/*.egg-info/

# Node projects
**/node_modules/
60 changes: 60 additions & 0 deletions .github/workflows/build-vla-manager-api.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
name: Build and Test VLA Manager API


on:
push:
paths:
- vla-manager-api/src/**
- vla-manager-api/tests/**
- vla-manager-api/pyproject.toml
- vla-manager-api/uv.lock
- .github/workflows/build-vla-manager-api.yml
pull_request:
paths:
- vla-manager-api/src/**
- vla-manager-api/tests/**
- vla-manager-api/pyproject.toml
- vla-manager-api/uv.lock
- .github/workflows/build-vla-manager-api.yml


permissions:
contents: read


concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}


defaults:
run:
working-directory: ./vla-manager-api


jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Install uv
uses: astral-sh/setup-uv@v9.0.0
with:
enable-cache: true
working-directory: ./vla-manager-api
- name: Install dependencies
run: uv sync --locked
- name: Check formatting
run: uv run --no-sync ruff format --check src tests
- name: Lint
run: uv run --no-sync ruff check src tests
- name: Run Pytest
run: uv run --no-sync pytest --junitxml=junit.xml
- name: Upload test artefacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7
with:
name: pytest-results
path: vla-manager-api/junit.xml
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
# commitlint
node_modules/
__pycache__/
*.pyc
.DS_Store
*.egg-info/
46 changes: 2 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ At the moment, DVA has several subcomponents:
* **API server** in [`dva-api/`](dva-api/) – gateway / entry point / connector integration
* **Processing** in [`dva-processing/`](dva-processing/) – evaluates veracity requirements
* **RabbitMQ** from [`rabbitmq`](https://hub.docker.com/_/rabbitmq) – message queue facilitating communication between the API server and the processing module
* **ACA-Py Controller** in [`dva-acapy-controller/`](dva-acapy-controller/) – contains SSI/VC-related logic
* **ACA-Py Agent** from [`ghcr.io/hyperledger/aries-cloudagent-python`](https://github.com/orgs/hyperledger/packages/container/package/aries-cloudagent-python) – an SSI cloud agent (~ wallet)
* **PostgreSQL** from [`postgres`](https://hub.docker.com/_/postgres) – stores application state, events, and _logs_
* **Dashboard** in [`dva-dashboard/`](dva-dashboard/) – frontend application that displays database contents on a dashboard interface
* **VLA Manager** in [`vla-manager`](vla-manager/) – frontend application for VLAs management (creation, display, etc)
Expand All @@ -28,15 +26,13 @@ You can use the following commands to build / pull the images (from the reposito
docker buildx build -t dva-api:latest -f dva-api/Dockerfile ./
docker buildx build -t dva-processing:latest -f dva-processing/Dockerfile ./
docker pull rabbitmq:4-management-alpine
docker buildx build -t dva-aca-py-controller:latest -f dva-acapy-controller/Dockerfile ./
docker pull ghcr.io/hyperledger/aries-cloudagent-python:py3.9-0.12.6
docker pull postgres:17-alpine
docker buildx build -t dva-dashboard:latest ./dva-dashboard/
docker buildx build -t vla-manager:latest ./vla-manager/
```

> [!NOTE]
> Check the currently used RabbitMQ, PostgreSQL, and ACA-Py versions in [`test-env/common-services.yml`](test-env/common-services.yml).
> Check the currently used RabbitMQ and PostgreSQL versions in [`test-env/common-services.yml`](test-env/common-services.yml).

You normally do not have to do this however as you should be using Docker Compose to set up your DVA instance (see the [_test environment_](test-env/)).

Expand Down Expand Up @@ -88,7 +84,7 @@ Example requests to test functionality manually (non-exhaustive):
| `/vla/from-templates` | `POST` | *nothing* | a [VLA request using templates](test-env/test-data/vla-request/request-from-templates.json) | `201 CREATED` and [an ID](test-env/example-outputs/id.json) |
| `/vla/{id}` | `GET` | `id`: a VLA ID (eg `570b22e0-2e90-4e02-8c7b-1d6d274629f3`) | *empty* | `200 OK` and the VLA template ([example](test-env/example-outputs/vla-id-get.json)) |
| `/attestation` | `POST` | *nothing* | an [AoV request](test-env/test-data/aov/timestamp-in-range/request-good.json) | `200 OK` and [an ID](test-env/example-outputs/id.json) |
| `/attestation/verify` | `POST` | *nothing* | an [AoV verification request](test-env/test-data/aov/verif-req.json) | `200 OK` and an AoV JSON object from ACA-Py |
| `/attestation/verify` | `POST` | *nothing* | an [AoV verification request](test-env/test-data/aov/verif-req.json) | `200 OK` and an AoV JSON object |

> [!NOTE]
> AoV requests (`POST /attestation`) are processed asynchronously.
Expand Down Expand Up @@ -172,44 +168,6 @@ In the test output, you should see all PyTest tests passing.
```
</details>

### DVA ACA-Py Controller Module ([`dva-acapy-controller`](dva-acapy-controller/))

> [!NOTE]
> A nice way to run the tests from the repository root using Docker without having to touch your local environment:
> ```console
> docker run --rm -it -v ./dva-acapy-controller:/app ghcr.io/astral-sh/uv:debian-slim uv --directory /app/ run pytest
> ```

#### Setup test environment

Find a way to run [uv](https://docs.astral.sh/uv) → [installation instructions](https://docs.astral.sh/uv/getting-started/installation/)

#### Run tests

Set your working directory to `dva-acapy-controller/` and execute:
```console
uv run pytest
```

#### Expected results

In the test output, you should see all PyTest tests passing.

<details>
<summary>Example output segment (click to open)</summary>

```
============================================================ test session starts ============================================================
platform linux -- Python 3.12.8, pytest-8.4.1, pluggy-1.6.0
rootdir: /projects/uni/edge/data-veracity/dva-processing
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 3 items

tests/test_controller.py .. [100%]
```
</details>


## Component-level testing

Expand Down
88 changes: 88 additions & 0 deletions docs/spec/components.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
# Schemas shared between more than one DVA component. Referenced from
# the per-service specs as, eg,
# `$ref: './components.yaml#/schemas/EvaluationResult'`.
#
# This file is not an OpenAPI document of its own; it is only a $ref
# target, hence the bare top-level `schemas` key.
schemas:
QualityEngine:
description: >-
Identifier of a veracity requirement evaluation engine invoked by
the processing service.
type: string
enum: [SCHEMA, GREAT_EXPECTATIONS, JQ]
examples: [SCHEMA]

EvaluationResult:
description: >-
The result of a single veracity requirement’s evaluation, as
produced by the processing service. Relayed verbatim by the DVA
API and embedded in the AoV issued by the VC Manager.
type: object
required: [engine, timestamp, success]
properties:
engine:
description: The quality engine used to obtain this result.
$ref: '#/schemas/QualityEngine'
timestamp:
description: ISO-8601 timestamp at which the evaluation ran.
type: string
format: date-time
examples: ['2025-03-16T03:25:00Z']
success:
description: Whether the evaluated check passed.
type: boolean
examples: [true]
details:
description: >-
Human-readable success detail; absent on failure.
type: string
error:
description: >-
Human-readable failure detail; absent on success.
type: string

VerifiableCredential:
description: >-
A W3C Verifiable Credential in its JSON-LD form.
type: object
required:
- '@context'
- id
- type
- issuer
- validFrom
- credentialSubject
properties:
'@context':
type: array
items:
type: string
examples:
- [https://w3.org]
id:
type: string
format: uri
type:
type: array
items:
type: string
issuer:
type: object
required: [id]
properties:
id:
type: string
format: uri
validFrom:
type: string
format: date-time
credentialSubject:
type: object
required: [id]
properties:
id:
type: string
format: uri
additionalProperties: true
Loading
Loading