Product | Validator API Endpoints |
---|---|
Description | Node.JS app that provides API end points to validate IATI XML files, is used by https://validator.iatistandard.org/ |
Website | https://developer.iatistandard.org/ |
Related | IATI/validator-services, IATI/validator-web |
Documentation | https://developer.iatistandard.org/ |
Technical Issues | https://github.com/IATI/js-validator-api/issues |
Support | https://iatistandard.org/en/guidance/get-support/ |
See OpenAPI specification postman/schemas/index.yaml
. To view locally in Swagger UI, you can use the 42crunch.vscode-openapi
VSCode extension.
nvm use
which will look at .nvmrc
for the node version, if it's not installed then it will prompt you to install it with nvm install <version>
xmllint
docker compose
setup. The docker build includes the xmllint
tool. If you run it directly, you may need to install this tool.
libxml2-utils
, so you'll need something like sudo apt install libxml2-utils
. .env
file (instructions below)
redis
database.npm i
to install dependenciesnpm start
to run the Function locally using the Azure Functions Core Toolslocalhost:7071
npm run docker:start
to run the Function inside a Docker container using docker-compose.yml to create a Redis instance.localhost:8080
To test the basic setup, you can run the following command:
curl http://localhost:8080/api/pub/version
This should return a version number (change port if running directly instead of via docker).
To test the validation is working, obtain an IATI XML file, and run the following command (this is if running via the docker setup; change port to 7071
if running directly):
curl -X POST --data-binary @PATH_TO_IATI_XML http://localhost:8080/api/pub/validate
You should see something like (if the file is a valid IATI file):
{
"valid": true,
"fileType": "iati-activities",
"iatiVersion": "2.03",
"rulesetCommitSha": "2cd1a14f6c584000ae6d76e708c73ddcc12b6c40",
"codelistCommitSha": "cf571799b909eb894c071dc364cd2a4dfbcd5d7c",
"orgIdPrefixFileName": "org-id-fa56731af7.json",
"apiVersion": "2.3.2",
"summary": {
"critical": 0,
"error": 0,
"warning": 0
},
"errors": []
}
If it has warnings or errors, you'll see them listed.
cp .env.example .env
APPLICATIONINSIGHTS_CONNECTION_STRING
BASIC_GITHUB_TOKEN
IATI/IATI-Validator-Codelists
repository. Note that you cannot use a "Personal Access Token (Classic)"; you must generate a fine-grained access token.REDIS_PORT=6379
REDIS_HOSTNAME=redis
docker compose use
. If you develop outside
docker, change these settings as appropriate.VALIDATOR_SERVICES_URL=https://func-validator-services-dev.azurewebsites.net/api
VALIDATOR_SERVICES_KEY_NAME=x-functions-key
VALIDATOR_SERVICES_KEY_VALUE=
DATASTORE_SERVICES_URL=https://dev-func-datastore-services.azurewebsites.net/api DATASTORE_SERVICES_AUTH_HTTP_HEADER_NAME=x-functions-key DATASTORE_SERVICES_AUTH_HTTP_HEADER_VALUE= DATASTORE_SERVICES_IATI_IDENTIFIERS_EXIST_MAX_NUMBER_OF_IDS=5000
config/config.js
) `APP_NAME`: IATI Validator API
`VERSION`: process.env.npm_package_version
`NODE_ENV`: process.env.NODE_ENV
`APPLICATIONINSIGHTS_CONNECTION_STRING`: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING
`NS_PER_SEC`: 1e9
`VERSIONS`: process.env.VERSIONS || ['2.01', '2.02', '2.03']
`MAX_FILESIZE`: process.env.MAX_FILESIZE || 60
Add in:
/config/config.js
Import
import config from "./config.js";
let myEnvVariable = config.ENV_VAR
.vscode/settings.json
> "editor.formatOnSave": true
settingfunc new --name <routename> --template "HTTP trigger" --authlevel "Function"
config/appInsights.js
utility is available in the pvt-get/index.js
where execution time of the function is measured and then logged in 2 ways to the AppInsights Telemetry.npm run rules:test
There is a large set of Mocha unit tests for the Rulesets logic in ruleset-unit-tests
.
Locally
npm i -g newman
npm start
npm int:test
In Docker container
npm i -g newman
function.json
files to set "authLevel": "anonymous"
, don't forget to change back!npm run docker:start
npm docker:int:test
Integration tests are written in Postman v2.1 format and run with newman
Import the integration-tests/dev-func-validator.postman_collection.json
into Postman and write additional tests there
Then once you are happy, export the collection and overwrite the file, then check into git.
Using files:
~/Postman/files
integration-tests/test-files
--working-dir
cli parameter tells newman
where to lookhttps://github.com/IATI/IATI-Internal-Wiki#development-process
Schemas are stored statically in the application source code as they are versioned and rarely change.
./schemas/2.0X/*
The source is IATI-Schemas
This repo provides the "Codelist Rules" for evaluating whether the codelists used by an IATI file being validated are correct. This application dynamically loads the codelist_rules.json
file from this repo for each version-2.0X
branch. This is also stored in Redis for caching.
This repo provides the "Rulesets" for various conditional and restraint rules for IATI data. This application dynamically loads the rulsets/standard.json
file from this repo for each version-2.0X
branch. This is also stored in Redis for caching.
The rulesets contain rules that require evaluation against a list of Publisher organisation identifiers, and valid organisation identifier prefixes. link
These are sourced from the following locations:
Organisation Identifier Prefixes (Registration Agencies) - https://org-id.guide/download.json
response.lists[].code
Content-Disposition: attachment; filename="<filename>"
Published Organisation Identifiers - https://func-validator-services-dev.azurewebsites.net/api/pvt/publishers
response[].iati_id
Due to a known limitation in the core library libxml2
used to perform schema validation, if an activity has a schema error at a line greater than 65535, the value will not be accurate in the context.
If this is the case for your validation report, a message like so will be displayed in the context of the schema error:
At line greater than: 65537. Note: The validator cannot display accurate line numbers for schema errors located at a line greater than 65537 for this activity.