diff --git a/.nvmrc b/.nvmrc
index 4adfbc35317..a77793ecc52 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.3.0
+lts/hydrogen
diff --git a/README.md b/README.md
index 6e03416d40d..be92920edd5 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,27 @@
+# Gataca Swagger-UI
+Files to be modified
+- dev-helper-initializer.js (For DEV purposes)
+- Swagger-initializer.js (For production purposes)
+
+## Launch of DEV
+```
+yarn
+yarn dev
+```
+
+## Deployment
+```
+yarn build
+```
+Copy all the files included into `/dist` into S3 (api.gataca.io)
+
+Execute CloudFront invalidation `/*`
+
+## Update specification
+
+For update just the component specification, it's not necessary necessary to upload the new file version to the `/docs` folder. Then it's necessary to reset the CloudFront cache (Execute invalidation).
+
+
#
[](http://badge.fury.io/js/swagger-ui)
diff --git a/dev-helpers/dev-helper-initializer.js b/dev-helpers/dev-helper-initializer.js
index ec330dc6249..eb255fcc002 100644
--- a/dev-helpers/dev-helper-initializer.js
+++ b/dev-helpers/dev-helper-initializer.js
@@ -4,7 +4,13 @@ window.onload = function() {
window["SwaggerUIStandalonePreset"] = window["swagger-ui-standalone-preset"]
// Build a system
const ui = SwaggerUIBundle({
- url: "https://petstore.swagger.io/v2/swagger.json",
+ url: "/docs/studio-swagger.json",
+ urls: [
+ {url: "./docs/studio-swagger.json", name: "Gataca Studio"},
+ {url: "./docs/nucleus-swagger.json", name: "Gataca Nucleus"},
+ {url: "./docs/connect-swagger.json", name: "Gataca Connect"},
+ {url: "/docs/certify-swagger.json", name: "Gataca Certify"},
+ ],
dom_id: "#swagger-ui",
presets: [
SwaggerUIBundle.presets.apis,
diff --git a/dev-helpers/docs/certify-swagger.json b/dev-helpers/docs/certify-swagger.json
new file mode 100644
index 00000000000..dd7790bb421
--- /dev/null
+++ b/dev-helpers/docs/certify-swagger.json
@@ -0,0 +1,3512 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is the full API of the Gataca Certify Issuer component for DeID\nThis API contains all the methods exposed, both for configuration and integration",
+ "title": "Gataca Certify API",
+ "termsOfService": "http://swagger.io/terms/",
+ "contact": {
+ "name": "Gataca",
+ "url": "https://gataca.io",
+ "email": "support@gataca.io"
+ },
+ "version": "3.1.0"
+ },
+ "host": "certify.gataca.io",
+ "paths": {
+ "/admin/v1/certificates": {
+ "get": {
+ "description": "Operation to recover a certificate stored by his identifier",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Certificates"
+ ],
+ "summary": "Get All Certificates",
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ },
+ "404": {
+ "description": "Not Found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Operation to import a certificate in format PFX/P12",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Certificates"
+ ],
+ "summary": "Import Certificate",
+ "parameters": [
+ {
+ "description": "certificate",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ },
+ "409": {
+ "description": "Already exist",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/certificates/:id": {
+ "get": {
+ "description": "Operation to recover a certificate stored by his identifier",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Certificates"
+ ],
+ "summary": "Get Certificate by ID",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ },
+ "404": {
+ "description": "Not Found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "description": "Operation to update a certificate format PFX/P12",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Certificates"
+ ],
+ "summary": "Update Certificate",
+ "parameters": [
+ {
+ "description": "certificate",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ },
+ {
+ "type": "string",
+ "description": "id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/models.Certificate"
+ }
+ },
+ "409": {
+ "description": "Already exist",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "description": "Operation to Delete a certificate by Id",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Certificates"
+ ],
+ "summary": "Delete Certificate",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "404": {
+ "description": "Not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/credentials": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the credentials issued by the issuer and filtered by status.\nThe status can be PENDING, READY, VALIDATED or ACTIVE.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Get credential list. This endpoint its paginated",
+ "responses": {
+ "200": {
+ "description": "Credentials requested.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ExtendedVerifiableCredential"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to get credential list.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/credentials/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the credential identified by the ID",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Get credential by identifier",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Credential Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Credential requested.",
+ "schema": {
+ "$ref": "#/definitions/models.ExtendedVerifiableCredential"
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to get credential list.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Not found.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify values of a concrete credential (identified by the ID).\nCurrently, is just allowed to change the status.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Update credential",
+ "responses": {
+ "200": {
+ "description": "Credential updated successfully.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to update credentials.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/credentials/{id}/issuanceRequest": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get all the credentials associated by the same issuance ID",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Get all the credentials by issuance identifier",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Credential requested.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ExtendedVerifiableCredential"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to get credential list.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Not found.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify values of all the credentials matching the same issuance Id provided.\nCurrently, just allowed to change the status.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Update credential by issuance Request",
+ "responses": {
+ "200": {
+ "description": "Credentials updated successfully.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to update credentials.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceConfigs": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will get all issuance configs.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Configs"
+ ],
+ "summary": "Create the issuance config request . This endpoint supports pagination",
+ "responses": {
+ "200": {
+ "description": "List of Issuance Configs",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.IssuanceConfig"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will create an issuance config.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Configs"
+ ],
+ "summary": "Create the issuance config request .",
+ "parameters": [
+ {
+ "description": "Issuance Config",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceConfig"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Presentation response",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceConfigs/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will get the request issuance config.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Configs"
+ ],
+ "summary": "Retrieve a specific issuance config.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Config Id",
+ "name": "configId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Requested Issuance Configs",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceConfig"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance config doesn't exist",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will update an issuance config.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Configs"
+ ],
+ "summary": "Update the issuance config request.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Config Id",
+ "name": "configId",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Updated Issuance Config data",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Config updated"
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will delete an issuance config.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Configs"
+ ],
+ "summary": "Delete the issuance config request.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Config Id",
+ "name": "configId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Config deleted"
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceRequests": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the Issuance Requests filtered by status. The status can be PENDING, READY, VALIDATED or ACTIVE.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Get the Issuance Requests filtered by status. This endpoints supports pagination.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Status type",
+ "name": "status",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceRequests/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the Issuance Requests filtered by Id.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Get the Issuance Requests filtered by Id.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request identifier",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceRequests/{id}/credentials": {
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will verify the credential schema, sign the credentials and update the database with the new credentials and the issuance request filled with those too.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Fill the issuance request credentials.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Request id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "list of Credentials to attach to issuance request",
+ "name": "credentials",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {}
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Issuance Request",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceRequests/{id}/presentationRequest": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the Presentation request for a concrete Issuance Requests.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Get the Presentation Request for a concrete Issuance Request.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Request id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation request",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuanceRequests/{id}/validator": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the Presentation response for a concrete Issuance Requests.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Get the Presentation Response for a concrete Issuance Request.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Request id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation response",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tir-info": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will create a new entry with VC in the body for the DID in the body on the EBSI TIR\nIf the DID its not published in the EBSI TIR endpoint will fail.\n",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Trusted Issuer"
+ ],
+ "summary": "Insert info on the Trusted Issuer Registry",
+ "parameters": [
+ {
+ "description": "TI Config",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.TIConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "TI Config",
+ "schema": {
+ "$ref": "#/definitions/models.TIConfig"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "DID not present on the TIR",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tir-info/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will recover the entry matching the did provider on the param id from the request.\nIf the DID its not published in the EBSI TIR endpoint will fail.\n",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Trusted Issuer"
+ ],
+ "summary": "Get info on the Trusted Issuer Registry",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "DID to search",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "TI Config",
+ "schema": {
+ "$ref": "#/definitions/models.TIConfig"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "DID not present on the TIR",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will update a the entry defined by the id in the param id, with the VC in the body for the DID in the body on the EBSI TIR\nIf the DID its not published in the EBSI TIR endpoint will fail.\n",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Trusted Issuer"
+ ],
+ "summary": "Update info on the Trusted Issuer Registry",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Id of the entry to update inside the TIR",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "TI Config",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.TIConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "TI Config update",
+ "schema": {
+ "$ref": "#/definitions/models.TIConfig"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "DID not present on the TIR",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/issuanceRequests/:id/credentials": {
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will verify the credential schema, sign the credentials and update the database with the new credentials and the issuance request filled with those too.\nThe v2 introduce the validation of the context of each credential send to this endpoint",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Fill the issuance request credentials.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Request id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "list of Credentials to attach to issuance request",
+ "name": "credentials",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {}
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation response",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/issuanceRequests/:id/status/:status": {
+ "patch": {
+ "description": "Change the status of an issuance request. Currently, it's only available to reject issuance requests in status, pending and ready",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Change the status of an issuance request",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Value of the status to be set in the issuance request",
+ "name": "status",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "given param is not valid",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "your requested item is not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v3/issuanceRequests/:id/credentials": {
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The process will verify the credential schema, sign the credentials and update the database with the new credentials and the issuance request filled with those too.\nThe v3 introduce the validation of the context of each credential send to this endpoint",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Fill the issuance request credentials.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance Request id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "list of Credentials to attach to issuance request",
+ "name": "credentials",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {}
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation response",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v3/issuanceRequests/:id/status/:status": {
+ "patch": {
+ "description": "Change the status of an issuance request. Currently, it's only available to reject issuance requests in status, pending and ready",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Change the status of an issuance request",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Value of the status to be set in the issuance request",
+ "name": "status",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ }
+ },
+ "400": {
+ "description": "given param is not valid",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "your requested item is not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/:id": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will delete the credential associated with the id on the path",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Credentials"
+ ],
+ "summary": "Delete the credentials by id",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Credential Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/issuanceRequests": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new issuance request from a previously defined Issuance Config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Create an issuance request.",
+ "parameters": [
+ {
+ "description": "Issuance Config Id",
+ "name": "group",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.IssuanceRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/issuanceRequests/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Ossue the credentials signed, previously validated.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Issue the credentials signed.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request identifier",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/issuanceRequests/:id/presentationRequests": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Recover a presentation request from his identifier with pending status.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Recover a presentation request.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request identifier",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/issuanceRequests/:id/presentationResponses": {
+ "post": {
+ "security": [
+ {
+ "Token, AppToken": []
+ }
+ ],
+ "description": "Fill an issuance request with the credentials requested previously defined as verifiablePresentation.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuance Requests"
+ ],
+ "summary": "Fill with the credentials requested.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Issuance request identifier",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Presentation",
+ "name": "pr",
+ "in": "body",
+ "required": true,
+ "schema": {}
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.ValidationProcessResponse"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/status/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will return all the info for the credential associated with the id on the path",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Status"
+ ],
+ "summary": "Recover the credentials status by id",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Credential Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.VerifiableStatus"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/status/:id/status": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will return all the info for the credential associated with the group on the path",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Status"
+ ],
+ "summary": "Recover the credentials status by group",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Group Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.VerifiableStatus"
+ }
+ },
+ "400": {
+ "description": "Invalid data send",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Issuance request not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_certify_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "big.Int": {
+ "type": "object"
+ },
+ "controller.IssuanceRequest": {
+ "type": "object",
+ "properties": {
+ "group": {
+ "type": "string"
+ }
+ }
+ },
+ "github_com_gataca-io_certify_models.ResponseMessage": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Some description message"
+ }
+ }
+ },
+ "models.Certificate": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string"
+ },
+ "caCerts": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/x509.Certificate"
+ }
+ },
+ "certificate": {
+ "$ref": "#/definitions/x509.Certificate"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "updateAt": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Claim": {
+ "type": "object",
+ "properties": {
+ "currentStatus": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "statusReason": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Constraints": {
+ "type": "object",
+ "properties": {
+ "fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Field"
+ }
+ },
+ "limit_disclosure": {
+ "type": "boolean"
+ },
+ "subject_is_holder": {
+ "$ref": "#/definitions/models.Preference"
+ },
+ "subject_is_issuer": {
+ "$ref": "#/definitions/models.Preference"
+ }
+ }
+ },
+ "models.CredentialRequest": {
+ "type": "object",
+ "properties": {
+ "mandatory": {
+ "type": "boolean",
+ "example": true
+ },
+ "purpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "trustLevel": {
+ "type": "integer",
+ "example": 1
+ },
+ "type": {
+ "type": "string",
+ "example": "emailCredential"
+ }
+ }
+ },
+ "models.DataAgreement": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "data_holder": {
+ "type": "string"
+ },
+ "data_receiver": {
+ "$ref": "#/definitions/models.DataReceiver"
+ },
+ "data_subject": {
+ "type": "string"
+ },
+ "dpia": {
+ "$ref": "#/definitions/models.Dpia"
+ },
+ "event": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Event"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "personal_data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PersonalDatum"
+ }
+ },
+ "purposes": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Purpose"
+ }
+ },
+ "template_id": {
+ "type": "string"
+ },
+ "template_version": {
+ "type": "string"
+ },
+ "termination_timestamp": {
+ "type": "integer"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataAgreementRef": {
+ "type": "object",
+ "properties": {
+ "dataAgreement": {
+ "$ref": "#/definitions/models.DataAgreement"
+ },
+ "ref": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataPolicy": {
+ "type": "object",
+ "properties": {
+ "data_retention_period": {
+ "type": "integer"
+ },
+ "geographic_restriction": {
+ "type": "string"
+ },
+ "industry_scope": {
+ "type": "string"
+ },
+ "jurisdictions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "policy_URL": {
+ "type": "string"
+ },
+ "storage_location": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataReceiver": {
+ "type": "object",
+ "properties": {
+ "consent_duration": {
+ "type": "integer"
+ },
+ "form_of_consent": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "service": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Dpia": {
+ "type": "object",
+ "properties": {
+ "dpia_date": {
+ "type": "string"
+ },
+ "dpia_summary_url": {
+ "type": "string"
+ }
+ }
+ },
+ "models.EBSIClaims": {
+ "type": "object",
+ "properties": {
+ "encryption_key": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "id_token": {
+ "$ref": "#/definitions/models.IdToken"
+ },
+ "verified_claims": {
+ "type": "string"
+ },
+ "vp_token": {
+ "$ref": "#/definitions/models.VpToken"
+ }
+ }
+ },
+ "models.Event": {
+ "type": "object",
+ "properties": {
+ "principle_did": {
+ "type": "string"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "state": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "integer"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "models.ExtendedVerifiableCredential": {
+ "type": "object",
+ "properties": {
+ "coreModels.VerifiableCredential": {},
+ "createdAt": {
+ "type": "string",
+ "example": "27-11-2020T12:45:23"
+ },
+ "group": {
+ "type": "string",
+ "example": "university-1"
+ },
+ "issuanceRequest": {
+ "$ref": "#/definitions/models.IssuanceRequest"
+ },
+ "status": {
+ "type": "string",
+ "example": "ISSUED"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "06-12-2020T17:22:06"
+ },
+ "vcFormat": {
+ "$ref": "#/definitions/models.VCFormat"
+ }
+ }
+ },
+ "models.Field": {
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "filter": {
+ "$ref": "#/definitions/models.Filter"
+ },
+ "path": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "predicate": {
+ "$ref": "#/definitions/models.Preference"
+ },
+ "purpose": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Filter": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "const": {},
+ "enum": {
+ "type": "array",
+ "items": {}
+ },
+ "exclusiveMaximum": {},
+ "exclusiveMinimum": {},
+ "format": {
+ "type": "string"
+ },
+ "maxLength": {
+ "type": "integer"
+ },
+ "maximum": {},
+ "minLength": {
+ "type": "integer"
+ },
+ "minimum": {},
+ "not": {
+ "$ref": "#/definitions/models.Filter"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Format": {
+ "type": "object",
+ "properties": {
+ "jwt": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "jwt_vc": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "jwt_vp": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "ldp": {
+ "$ref": "#/definitions/models.LDPType"
+ },
+ "ldp_vc": {
+ "$ref": "#/definitions/models.LDPType"
+ },
+ "ldp_vp": {
+ "$ref": "#/definitions/models.LDPType"
+ }
+ }
+ },
+ "models.IdToken": {
+ "type": "object",
+ "properties": {
+ "acr": {},
+ "verifiable_presentations": {
+ "type": "object",
+ "properties": {
+ "presentation_definition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ }
+ }
+ },
+ "models.InputDescriptor": {
+ "type": "object",
+ "required": [
+ "id",
+ "schema"
+ ],
+ "properties": {
+ "constraints": {
+ "$ref": "#/definitions/models.Constraints"
+ },
+ "group": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "metadata": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "schema": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/definitions/models.Schema"
+ }
+ }
+ }
+ },
+ "models.IssuanceConfig": {
+ "type": "object",
+ "properties": {
+ "credentialGroup": {
+ "type": "string"
+ },
+ "credentialTypes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "eidasSignature": {
+ "type": "boolean"
+ },
+ "evidence": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "expirationTime": {
+ "type": "integer"
+ },
+ "feedbackHook": {
+ "type": "string"
+ },
+ "feedbackMessage": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "pollingFrequency": {
+ "type": "integer"
+ },
+ "pollingMaxTime": {
+ "type": "integer"
+ },
+ "prConfig": {
+ "$ref": "#/definitions/models.PrConfig"
+ },
+ "sendNotification": {
+ "type": "boolean"
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "validFrom": {
+ "type": "string"
+ },
+ "validationHook": {
+ "type": "string"
+ }
+ }
+ },
+ "models.IssuanceRequest": {
+ "type": "object",
+ "properties": {
+ "auth_request": {
+ "$ref": "#/definitions/models.JWTEBSIClaims"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "data": {
+ "type": "array",
+ "items": {}
+ },
+ "expiredAt": {
+ "$ref": "#/definitions/pq.NullTime"
+ },
+ "group": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "presentationRequest": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ },
+ "status": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "validator": {
+ "$ref": "#/definitions/models.PresentationResponse"
+ }
+ }
+ },
+ "models.JWK": {
+ "type": "object",
+ "properties": {
+ "alg": {
+ "type": "string",
+ "example": "jwa values: https://www.rfc-editor.org/rfc/rfc7518.html#page-6"
+ },
+ "crv": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string"
+ },
+ "k": {
+ "type": "string"
+ },
+ "kid": {
+ "type": "string"
+ },
+ "kty": {
+ "type": "string"
+ },
+ "n": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ },
+ "use": {
+ "type": "string",
+ "example": "sig,enc"
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ }
+ }
+ },
+ "models.JWTEBSIClaims": {
+ "type": "object",
+ "properties": {
+ "aud": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "claims": {
+ "$ref": "#/definitions/models.EBSIClaims"
+ },
+ "client_id": {
+ "type": "string"
+ },
+ "exp": {
+ "type": "integer"
+ },
+ "iat": {
+ "type": "integer"
+ },
+ "iss": {
+ "type": "string"
+ },
+ "jti": {
+ "type": "string"
+ },
+ "nbf": {
+ "type": "integer"
+ },
+ "nonce": {
+ "type": "string"
+ },
+ "redirect_uri": {
+ "type": "string"
+ },
+ "registration": {
+ "type": "string"
+ },
+ "response_mode": {
+ "type": "string"
+ },
+ "response_type": {
+ "type": "string"
+ },
+ "scope": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ },
+ "sub": {
+ "type": "string"
+ },
+ "sub_did_verification_method_uri": {
+ "type": "string"
+ },
+ "sub_jwk": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "vc": {},
+ "vp": {}
+ }
+ },
+ "models.JWTType": {
+ "type": "object",
+ "required": [
+ "alg"
+ ],
+ "properties": {
+ "alg": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.LDPType": {
+ "type": "object",
+ "required": [
+ "proof_type"
+ ],
+ "properties": {
+ "proof_type": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.LDPVerifiableCredential": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "credentialSchema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "credentialStatus": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "evidence": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "expirationDate": {
+ "type": "string",
+ "example": "2019-10-01T12:12:15.999Z"
+ },
+ "id": {
+ "type": "string",
+ "example": "cred:gatc:2798d86b-21ce-4794-a06a-275d12b43e48"
+ },
+ "issuanceDate": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "issued": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "issuer": {
+ "type": "string",
+ "example": "did:gatc:OWM3MzQ1NzYzZilliM2Q2MTg5NGYwNTQ3"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "type": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "emailCredential"
+ ]
+ },
+ "validFrom": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.MechanismId": {
+ "type": "integer",
+ "enum": [
+ 1,
+ 2,
+ 3
+ ],
+ "x-enum-varnames": [
+ "AuthNFactor",
+ "AppAuth",
+ "Credential"
+ ]
+ },
+ "models.PersonalDatum": {
+ "type": "object",
+ "properties": {
+ "attribute_id": {
+ "type": "string"
+ },
+ "attribute_location": {
+ "type": "string"
+ },
+ "attribute_name": {
+ "type": "string"
+ },
+ "attribute_sensitive": {
+ "type": "boolean"
+ },
+ "purposes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.PrConfig": {
+ "type": "object",
+ "properties": {
+ "certificateId": {
+ "type": "string"
+ },
+ "credentials": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.CredentialRequest"
+ }
+ },
+ "domain": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "security": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SecMechanism"
+ }
+ },
+ "sessionTTL": {
+ "type": "integer"
+ },
+ "vmethodId": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Preference": {
+ "type": "string",
+ "enum": [
+ "required",
+ "preferred"
+ ],
+ "x-enum-varnames": [
+ "Required",
+ "Preferred"
+ ]
+ },
+ "models.PresentationDefinition": {
+ "type": "object",
+ "required": [
+ "id",
+ "input_descriptors"
+ ],
+ "properties": {
+ "dataAgreement": {
+ "$ref": "#/definitions/models.DataAgreementRef"
+ },
+ "format": {
+ "$ref": "#/definitions/models.Format"
+ },
+ "id": {
+ "type": "string"
+ },
+ "input_descriptors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.InputDescriptor"
+ }
+ },
+ "locale": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "submission_requirements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SubmissionRequirement"
+ }
+ }
+ }
+ },
+ "models.PresentationRequest": {
+ "type": "object",
+ "properties": {
+ "additionalData": {},
+ "auth": {
+ "description": "String to represent a concrete client",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SecMechanism"
+ }
+ },
+ "callback": {
+ "description": "For retro-comp",
+ "type": "string",
+ "example": "https://connect.gataca.io:9090"
+ },
+ "id": {
+ "type": "string",
+ "example": "pres:gatc:AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "redirect_uri": {
+ "type": "string"
+ },
+ "requested": {
+ "description": "Session identifier",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.CredentialRequest"
+ }
+ }
+ }
+ },
+ "models.PresentationResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "example": "pres:gatc:AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "securityMechanisms": {
+ "description": "Assuming always ldp_vp because this is v1 Gatc and will be deprecated"
+ },
+ "verifiablePresentation": {}
+ }
+ },
+ "models.Proof": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "cades": {
+ "type": "string",
+ "example": "308204c906092a864886f70d010702...266ad9fee3375d8095"
+ },
+ "challenge": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "created": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "creator": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "proofPurpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "proofValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "signatureValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "type": {
+ "type": "string",
+ "example": "Ed25519Signature2018"
+ },
+ "verificationMethod": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ }
+ }
+ },
+ "models.Purpose": {
+ "type": "object",
+ "properties": {
+ "data_policy": {
+ "$ref": "#/definitions/models.DataPolicy"
+ },
+ "id": {
+ "type": "string"
+ },
+ "legal_basis": {
+ "type": "string"
+ },
+ "method_of_use": {
+ "type": "string"
+ },
+ "purpose_category": {
+ "type": "string"
+ },
+ "purpose_description": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SSIContext": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string"
+ },
+ "contexts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.SSIProof": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "$ref": "#/definitions/models.Proof"
+ },
+ "values": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Proof"
+ }
+ }
+ }
+ },
+ "models.Schema": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "type": "boolean"
+ },
+ "uri": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SecMechanism": {
+ "type": "object",
+ "properties": {
+ "accepted": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "$ref": "#/definitions/models.MechanismId"
+ }
+ }
+ },
+ "models.Selection": {
+ "type": "string",
+ "enum": [
+ "all",
+ "pick"
+ ],
+ "x-enum-varnames": [
+ "All",
+ "Pick"
+ ]
+ },
+ "models.SubmissionRequirement": {
+ "type": "object",
+ "required": [
+ "rule"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "from": {
+ "type": "string"
+ },
+ "from_nested": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SubmissionRequirement"
+ }
+ },
+ "max": {
+ "type": "integer"
+ },
+ "min": {
+ "description": "Can be zero",
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "rule": {
+ "$ref": "#/definitions/models.Selection"
+ }
+ }
+ },
+ "models.TIConfig": {
+ "type": "object",
+ "properties": {
+ "did": {
+ "type": "string"
+ },
+ "resultingHash": {
+ "type": "string"
+ },
+ "vc": {
+ "$ref": "#/definitions/models.LDPVerifiableCredential"
+ }
+ }
+ },
+ "models.VCFormat": {
+ "type": "string",
+ "enum": [
+ "ldp_vc",
+ "jwt_vc"
+ ],
+ "x-enum-varnames": [
+ "VCLDP",
+ "VCJWT"
+ ]
+ },
+ "models.ValidationProcessResponse": {
+ "type": "object",
+ "properties": {
+ "feedbackHook": {
+ "type": "string"
+ },
+ "feedbackMessage": {
+ "type": "string"
+ },
+ "pollingFrequency": {
+ "description": "seconds",
+ "type": "integer"
+ },
+ "pollingMaxTime": {
+ "description": "seconds",
+ "type": "string"
+ },
+ "token": {
+ "description": "JWT",
+ "type": "string"
+ }
+ }
+ },
+ "models.VerifiableCredentialStatus": {
+ "type": "object",
+ "properties": {
+ "claim": {
+ "$ref": "#/definitions/models.Claim"
+ },
+ "issued": {
+ "type": "string"
+ },
+ "issuer": {
+ "type": "string"
+ },
+ "proof": {
+ "type": "string"
+ },
+ "updated": {
+ "type": "string"
+ }
+ }
+ },
+ "models.VerifiableStatus": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "issued": {
+ "type": "string"
+ },
+ "verifiableCredential": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerifiableCredentialStatus"
+ }
+ }
+ }
+ },
+ "models.VpToken": {
+ "type": "object",
+ "properties": {
+ "presentation_definition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ },
+ "net.IPNet": {
+ "type": "object",
+ "properties": {
+ "ip": {
+ "description": "network number",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "mask": {
+ "description": "network mask",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "pkix.AttributeTypeAndValue": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "value": {}
+ }
+ },
+ "pkix.Extension": {
+ "type": "object",
+ "properties": {
+ "critical": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "value": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "pkix.Name": {
+ "type": "object",
+ "properties": {
+ "country": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "extraNames": {
+ "description": "ExtraNames contains attributes to be copied, raw, into any marshaled\ndistinguished names. Values override any attributes with the same OID.\nThe ExtraNames field is not populated when parsing, see Names.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pkix.AttributeTypeAndValue"
+ }
+ },
+ "locality": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "names": {
+ "description": "Names contains all parsed attributes. When parsing distinguished names,\nthis can be used to extract non-standard attributes that are not parsed\nby this package. When marshaling to RDNSequences, the Names field is\nignored, see ExtraNames.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pkix.AttributeTypeAndValue"
+ }
+ },
+ "serialNumber": {
+ "type": "string"
+ },
+ "streetAddress": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "pq.NullTime": {
+ "type": "object",
+ "properties": {
+ "time": {
+ "type": "string"
+ },
+ "valid": {
+ "description": "Valid is true if Time is not NULL",
+ "type": "boolean"
+ }
+ }
+ },
+ "url.URL": {
+ "type": "object",
+ "properties": {
+ "forceQuery": {
+ "description": "append a query ('?') even if RawQuery is empty",
+ "type": "boolean"
+ },
+ "fragment": {
+ "description": "fragment for references, without '#'",
+ "type": "string"
+ },
+ "host": {
+ "description": "host or host:port",
+ "type": "string"
+ },
+ "opaque": {
+ "description": "encoded opaque data",
+ "type": "string"
+ },
+ "path": {
+ "description": "path (relative paths may omit leading slash)",
+ "type": "string"
+ },
+ "rawFragment": {
+ "description": "encoded fragment hint (see EscapedFragment method)",
+ "type": "string"
+ },
+ "rawPath": {
+ "description": "encoded path hint (see EscapedPath method)",
+ "type": "string"
+ },
+ "rawQuery": {
+ "description": "encoded query values, without '?'",
+ "type": "string"
+ },
+ "scheme": {
+ "type": "string"
+ },
+ "user": {
+ "description": "username and password information",
+ "allOf": [
+ {
+ "$ref": "#/definitions/url.Userinfo"
+ }
+ ]
+ }
+ }
+ },
+ "url.Userinfo": {
+ "type": "object"
+ },
+ "x509.Certificate": {
+ "type": "object",
+ "properties": {
+ "authorityKeyId": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "basicConstraintsValid": {
+ "description": "BasicConstraintsValid indicates whether IsCA, MaxPathLen,\nand MaxPathLenZero are valid.",
+ "type": "boolean"
+ },
+ "crldistributionPoints": {
+ "description": "CRL Distribution Points",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dnsnames": {
+ "description": "Subject Alternate Name values. (Note that these values may not be valid\nif invalid values were contained within a parsed certificate. For\nexample, an element of DNSNames may not be a valid DNS domain name.)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "emailAddresses": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "excludedDNSDomains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "excludedEmailAddresses": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "excludedIPRanges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/net.IPNet"
+ }
+ },
+ "excludedURIDomains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "extKeyUsage": {
+ "description": "Sequence of extended key usages.",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "extensions": {
+ "description": "Extensions contains raw X.509 extensions. When parsing certificates,\nthis can be used to extract non-critical extensions that are not\nparsed by this package. When marshaling certificates, the Extensions\nfield is ignored, see ExtraExtensions.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pkix.Extension"
+ }
+ },
+ "extraExtensions": {
+ "description": "ExtraExtensions contains extensions to be copied, raw, into any\nmarshaled certificates. Values override any extensions that would\notherwise be produced based on the other fields. The ExtraExtensions\nfield is not populated when parsing certificates, see Extensions.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/pkix.Extension"
+ }
+ },
+ "ipaddresses": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "isCA": {
+ "type": "boolean"
+ },
+ "issuer": {
+ "$ref": "#/definitions/pkix.Name"
+ },
+ "issuingCertificateURL": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "keyUsage": {
+ "type": "integer"
+ },
+ "maxPathLen": {
+ "description": "MaxPathLen and MaxPathLenZero indicate the presence and\nvalue of the BasicConstraints' \"pathLenConstraint\".\n\nWhen parsing a certificate, a positive non-zero MaxPathLen\nmeans that the field was specified, -1 means it was unset,\nand MaxPathLenZero being true mean that the field was\nexplicitly set to zero. The case of MaxPathLen==0 with MaxPathLenZero==false\nshould be treated equivalent to -1 (unset).\n\nWhen generating a certificate, an unset pathLenConstraint\ncan be requested with either MaxPathLen == -1 or using the\nzero value for both MaxPathLen and MaxPathLenZero.",
+ "type": "integer"
+ },
+ "maxPathLenZero": {
+ "description": "MaxPathLenZero indicates that BasicConstraintsValid==true\nand MaxPathLen==0 should be interpreted as an actual\nmaximum path length of zero. Otherwise, that combination is\ninterpreted as MaxPathLen not being set.",
+ "type": "boolean"
+ },
+ "notBefore": {
+ "description": "Validity bounds.",
+ "type": "string"
+ },
+ "ocspserver": {
+ "description": "RFC 5280, 4.2.2.1 (Authority Information Access)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permittedDNSDomains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permittedDNSDomainsCritical": {
+ "description": "Name constraints",
+ "type": "boolean"
+ },
+ "permittedEmailAddresses": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permittedIPRanges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/net.IPNet"
+ }
+ },
+ "permittedURIDomains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "policyIdentifiers": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "publicKey": {},
+ "publicKeyAlgorithm": {
+ "type": "integer"
+ },
+ "raw": {
+ "description": "Complete ASN.1 DER content (certificate, signature algorithm and signature).",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "rawIssuer": {
+ "description": "DER encoded Issuer",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "rawSubject": {
+ "description": "DER encoded Subject",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "rawSubjectPublicKeyInfo": {
+ "description": "DER encoded SubjectPublicKeyInfo.",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "rawTBSCertificate": {
+ "description": "Certificate part of raw ASN.1 DER content.",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "serialNumber": {
+ "$ref": "#/definitions/big.Int"
+ },
+ "signature": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "signatureAlgorithm": {
+ "type": "integer"
+ },
+ "subject": {
+ "$ref": "#/definitions/pkix.Name"
+ },
+ "subjectKeyId": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "unhandledCriticalExtensions": {
+ "description": "UnhandledCriticalExtensions contains a list of extension IDs that\nwere not (fully) processed when parsing. Verify will fail if this\nslice is non-empty, unless verification is delegated to an OS\nlibrary which understands all the critical extensions.\n\nUsers can access these extensions using Extensions and can remove\nelements from this slice if they believe that they have been\nhandled.",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "unknownExtKeyUsage": {
+ "description": "Encountered extended key usages unknown to this package.",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "uris": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/url.URL"
+ }
+ },
+ "version": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "BasicAuth": {
+ "type": "basic"
+ },
+ "Token": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ },
+ "tags": [
+ {
+ "description": "API to manage Certificates",
+ "name": "Certificates"
+ },
+ {
+ "description": "API to manage Credentials",
+ "name": "Credentials"
+ },
+ {
+ "description": "API to manage Issuance Configs",
+ "name": "Issuance Configs"
+ },
+ {
+ "description": "API to manage Issuance Requests",
+ "name": "Issuance Requests"
+ },
+ {
+ "description": "API to manage Status",
+ "name": "Status"
+ },
+ {
+ "description": "API to manage Trusted Issuer",
+ "name": "Trusted Issuer"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-helpers/docs/connect-swagger.json b/dev-helpers/docs/connect-swagger.json
new file mode 100644
index 00000000000..bff2a83032a
--- /dev/null
+++ b/dev-helpers/docs/connect-swagger.json
@@ -0,0 +1,2941 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is the full API of the Gataca Connect Verifier component for DeID\nThis API contains all the methods exposed, both for configuration and integration",
+ "title": "Gataca Connect API",
+ "contact": {
+ "name": "Gataca",
+ "url": "https://gataca.io",
+ "email": "it@gataca.io"
+ },
+ "version": "4.0.2"
+ },
+ "host": "https://connect.gataca.io",
+ "paths": {
+ "/admin/v1/config": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Declare a new Tenant to request a new type of Presentation Requests with all the associated requirements and configuration.\nThis API is not necessary for integration. Tenants can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Configs"
+ ],
+ "summary": "Create a new Tenant Configuration",
+ "parameters": [
+ {
+ "description": "Tenant Configuration",
+ "name": "prConfig",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/models.PEXConfig"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Tenant configuration created.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid new Tenant configuration.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to manage that tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Invalid new Tenant configuration.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/config/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Each Tenant represents a unique specific configuration for a Presentation Request. You can get one specific tenant or all your tenants.\nThis API is not necessary for integration. Tenants can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Configs"
+ ],
+ "summary": "Get Tenant Configurations",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Tenant Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant configurations requested.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PEXConfig"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to manage that tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid requested configurations.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Remove an existing tenant configuration and make it further unusable.\nThis API is not necessary for integration. Tenants can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Configs"
+ ],
+ "summary": "Delete a Tenant Configuration",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Tenant configuration deleted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid selected tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to manage that tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid selected tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify the Presentation Request configuration of an existing tenant.\nThis API is not necessary for integration. Tenants can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Configs"
+ ],
+ "summary": "Update an existing Tenant Configuration",
+ "parameters": [
+ {
+ "description": "Tenant Configuration",
+ "name": "prConfig",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/models.PEXConfig"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant configuration updated.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid new Tenant configuration.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to manage that tenant.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid new Tenant configuration.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Invalid new Tenant configuration.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Returns all the consents you are allowed to see in your tenant or DID.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve all datta agreements \u0026 consents. This endpoints allows pagination.",
+ "responses": {
+ "200": {
+ "description": "Consents and data agreements accepted, stored and signed by the verifier",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "403": {
+ "description": "Not Authorized to query a consent or data agreement.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements/purpose_templates": {
+ "get": {
+ "description": "Retrieve all of Purpose templates stored by tenant.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve all Purpose template.",
+ "responses": {
+ "200": {
+ "description": "Collection of Purpose templates",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements/purpose_templates/{id}": {
+ "get": {
+ "description": "Retrieve a purpose template by id.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve an existing purpose template",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Purpose template Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Purpose with that Id",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Purpose"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements/purpose_templates{id}": {
+ "delete": {
+ "description": "Use case not implemented yet",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Update a collection of purpose templates",
+ "parameters": [
+ {
+ "description": "Purpose templates collection",
+ "name": "id",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Purpose"
+ }
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated purpose template",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Returns all the consents you are allowed to see in your tenant or DID.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve info about a specific data agreement",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Consent or data agreement Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Consents and data agreements accepted",
+ "schema": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to query a consent or data agreement.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Returns all the consents you are allowed to see in your tenant or DID.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve all datta agreements \u0026 consents",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Purpose template Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Consents and data agreements accepted, stored and signed by the verifier",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "403": {
+ "description": "Not Authorized to query a consent or data agreement.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v2/data_agreements/{id}/data": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve the last version of the data associated with a specific data agreement or consent",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Get the data allowed on a data agreement",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Consent or data agreement Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Most recent data from the required consent",
+ "schema": {}
+ },
+ "403": {
+ "description": "Not Authorized to query a consent or data agreement.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Data is not present in the server any more.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/consents": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Consents of use of verifiable credentials are needed to validate sessions containing those VCs. The Consent must be published using the same token allowing to patch the session.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Consents"
+ ],
+ "summary": "Create a new consent document",
+ "parameters": [
+ {
+ "description": "Consent signed by the end user and the Pairwise DID",
+ "name": "consent",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.VerifiableConsent"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Consent accepted, stored and signed by the verifier",
+ "schema": {
+ "$ref": "#/definitions/models.VerifiableConsent"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to create a consent.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/sessions": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "To request user's data in the form of Verifiable Credentials, a specific session must be created.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Create a new unique Connect Session to perform a Presentation Exchange.",
+ "responses": {
+ "201": {
+ "description": "Session created",
+ "schema": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ },
+ "headers": {
+ "Set_Cookie": {
+ "type": "string",
+ "description": "Store the token as a cookie."
+ },
+ "Token": {
+ "type": "string",
+ "description": "Token to consult the session status."
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Not Authorized to create sessions.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/sessions/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "To retrieve the user's data from a Session, the verification status must be queried.\nThere are three possibilities:\n1. The user has not shared his information yet\n2. The information was shared and valid (conforming to the requested)\n3. The information was shared but invalid",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Get the verification status and data of a credential sharing session",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Session data validated successfully",
+ "schema": {
+ "$ref": "#/definitions/models.Session"
+ }
+ },
+ "204": {
+ "description": "Empty response: Session data pending to be filled",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Given Param is not valid",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Sessions may be deleted after usage to avoid long term persistence of the shared data.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Delete a session",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Session Deleted Ok",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to delete the session.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The user should fill the session data with a Presentation Response matching the requirements of the corresponding Presentation Request. He must use the corresponding token retrieved on the GetSessionToken operation.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Fill the session data with VCs",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "AppAuthentication Signed Token",
+ "name": "AppAuthentication",
+ "in": "header"
+ },
+ {
+ "description": "Presentation Response matching the requirements of the Presentation Request",
+ "name": "presentationResponse",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.PresentationResponse"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.Session"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to fill the session.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/sessions/{id}/token": {
+ "get": {
+ "description": "By receiving a Session Id, a Wallet can retrieve the full presentation request by querying this endpoint. A User token will be attached to allow updating the session with the requested data.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Retrieve a presentation request and a user token from an Id.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Token to consult the session status."
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/authentication_requests/{id}": {
+ "get": {
+ "description": "While using oidc, you can refer a request with its URI",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Authentication Requests"
+ ],
+ "summary": "Get OIDC Request",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Auth request Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant configurations requested.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.JWTEBSIClaims"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/authentication_requests/{id}/claims": {
+ "get": {
+ "description": "While using oidc, you can refer to the claims of a presentation just by its id",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Authentication Requests"
+ ],
+ "summary": "Get OIDC Claims",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Auth request Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Authentication request claims",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.EBSIClaims"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/authentication_responses": {
+ "post": {
+ "description": "A Holder may submit a verifiable presentation in response to a given authentication_request in order to finish the exchange.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Authentication Responses"
+ ],
+ "summary": "Submit a Verifiable Presentation under the siop standard",
+ "parameters": [
+ {
+ "description": "Verifiable Presentation token for DID SIOP",
+ "name": "submission",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.sIOPSubmission"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Verification result.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "400": {
+ "description": "Request body malformed",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to submit a presentation exchanges.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "406": {
+ "description": "Presentation submission not acceptable",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be modified",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/data_agreements": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new data agreement to record by the Verifier, in order to hold the service",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Create Data Agreement",
+ "parameters": [
+ {
+ "description": "Data Agreement of this service",
+ "name": "dataAgreement",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Updated Data Agreement",
+ "schema": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ },
+ "400": {
+ "description": "Invalid input data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to create data agreements.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/data_agreements/{id}": {
+ "delete": {
+ "description": "Use case not implemented yet",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Delete a current data agreement",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Data agreement Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Revocated Data Agreement",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "description": "Use cases not implemented yet",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Modify an existing data agreement",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Data agreement Id",
+ "name": "id",
+ "in": "path"
+ },
+ {
+ "description": "Data Agreement of this service",
+ "name": "dataAgreement",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated data agreement",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/data_agreements/{id}/{version}": {
+ "get": {
+ "description": "Retrieve the last version of a Data Agreement with all the corresponding events.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Data Agreements"
+ ],
+ "summary": "Retrieve an existing Data Agreement",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Data agreement Id",
+ "name": "id",
+ "in": "path"
+ },
+ {
+ "type": "string",
+ "description": "Optional: Version of the data agreement to recover. Default: last",
+ "name": "version",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Data Agreement with that Id",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/presentations": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new presentation exchange process by providing it's presentation definition. Relying parties with due authentication can perform this operation.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Presentations"
+ ],
+ "summary": "Create Presentation Exchange",
+ "parameters": [
+ {
+ "description": "Presentation definition of this exchange",
+ "name": "presentationDefinition",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Reference to the exchange process",
+ "schema": {
+ "$ref": "#/definitions/controller.PECreationResponse"
+ }
+ },
+ "400": {
+ "description": "Invalid input data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to create exchanges.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/presentations/{id}": {
+ "get": {
+ "description": "The relying party may at any time query the status of a given exchange at any time to see if the data has been validated.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Presentations"
+ ],
+ "summary": "Check the status of a presentation exchange",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Presentation exchange Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Valid verification result.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "202": {
+ "description": "Pending verification result. No submission in the exchange yet.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "400": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to retrieve the presentation exchange",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "406": {
+ "description": "Presentation submission in valid",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/presentations/{id}/data_agreement": {
+ "get": {
+ "description": "When expanding a presentation, the verifier may just offer the URI to the data agreement template linked to that service",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Presentations"
+ ],
+ "summary": "Get the data agreement template of a Presentation",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Presentation exchange Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Data agreement requested.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.DataAgreement"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/presentations/{id}/definition": {
+ "get": {
+ "description": "Upon scanning a QR, a Holder may retrieve the presentation definition associated to the process identifier in order to perform an exchange.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Presentations"
+ ],
+ "summary": "Get a Presentation Definition",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Presentation exchange Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation Definition",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/presentations/{id}/submission": {
+ "post": {
+ "description": "A Holder may submit a verifiable presentation in response to a given definition in order to fulfill the exchange.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Presentations"
+ ],
+ "summary": "Submit a Verifiable Presentation",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Presentation exchange Id",
+ "name": "id",
+ "in": "path"
+ },
+ {
+ "description": "Verifiable Presentation",
+ "name": "submission",
+ "in": "body",
+ "required": true,
+ "schema": {}
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Verification result.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "400": {
+ "description": "Request body malformed",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to submit a presentation exchanges.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "406": {
+ "description": "Presentation submission not acceptable",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Process Id cannot be modified",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/sessions": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This updates the previously existing endpoint by switching the data model and protocol to DIF PE + DIF Data Agreements.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Create a new presentation definition and data agreement to perform a new exchange.",
+ "responses": {
+ "201": {
+ "description": "Session created",
+ "schema": {
+ "$ref": "#/definitions/controller.CreateSessionv2Response"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to create sessions.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v2/sessions/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The relying party may at any time query the status of a given exchange at any time to see if the data has been validated.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Check the status of a presentation exchange",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Presentation exchange Id",
+ "name": "id",
+ "in": "path"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Presentation Exchange Data.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PExchange"
+ }
+ }
+ },
+ "202": {
+ "description": "Pending verification result. No submission in the exchange yet.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "400": {
+ "description": "Process Id cannot be retrieved",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to retrieve the presentation exchange",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Inexistent process Id",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "406": {
+ "description": "Presentation submission in valid",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This allows to clean all data of a presentation exchange after it has been successfully performed.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Sessions"
+ ],
+ "summary": "Clean data of presentation exchange after validation",
+ "responses": {
+ "200": {
+ "description": "Session Deleted Ok",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Not Authorized to delete the session.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_connect-api_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "controller.CreateSessionv2Response": {
+ "type": "object",
+ "properties": {
+ "authentication_request": {
+ "type": "string",
+ "example": "openid://scope=openid\u0026response_type=id_token\u0026response_mode=post\u0026client_id=https%3A%2F%2Fapi.test.intebsi.xyz%2Fconformance%2Fv1%2Fverifier-mock%2Fauthentication-responses\u0026redirect_uri=https%3A%2F%2Fapi.test.intebsi.xyz%2Fconformance%2Fv1%2Fverifier-mock%2Fauthentication-responses\u0026claims=%5Bobject+Object%5D"
+ },
+ "presentation_definition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ },
+ "controller.PECreationResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "example": "32f54163-7166-48f1-93d8-ff217bdb0653"
+ },
+ "uri": {
+ "type": "string",
+ "example": "https://vui.gataca.io/api/presentations/v2/32f54163-7166-48f1-93d8-ff217bdb0653/definition"
+ }
+ }
+ },
+ "controller.sIOPSubmission": {
+ "type": "object"
+ },
+ "github_com_gataca-io_connect-api_models.ResponseMessage": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Some description message"
+ }
+ }
+ },
+ "models.ConsentClaims": {
+ "type": "object",
+ "properties": {
+ "credentialId": {
+ "type": "string",
+ "example": "cred:gatc:xxxxxxxxxxxxxx"
+ },
+ "location": {
+ "type": "string",
+ "example": "https://hub.gataca.io/api/v1/data/VzhKSzZ1R2xaQ0ExLy9wU1Yram9SN2hI"
+ },
+ "purpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "type": {
+ "type": "string",
+ "example": "emailCredential"
+ }
+ }
+ },
+ "models.Constraints": {
+ "type": "object",
+ "properties": {
+ "fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Field"
+ }
+ },
+ "limit_disclosure": {
+ "type": "boolean"
+ },
+ "subject_is_holder": {
+ "$ref": "#/definitions/models.Preference"
+ },
+ "subject_is_issuer": {
+ "$ref": "#/definitions/models.Preference"
+ }
+ }
+ },
+ "models.CredentialRequest": {
+ "type": "object",
+ "properties": {
+ "mandatory": {
+ "type": "boolean",
+ "example": true
+ },
+ "purpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "trustLevel": {
+ "type": "integer",
+ "example": 1
+ },
+ "type": {
+ "type": "string",
+ "example": "emailCredential"
+ }
+ }
+ },
+ "models.DataAgreement": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "data_holder": {
+ "type": "string"
+ },
+ "data_receiver": {
+ "$ref": "#/definitions/models.DataReceiver"
+ },
+ "data_subject": {
+ "type": "string"
+ },
+ "dpia": {
+ "$ref": "#/definitions/models.Dpia"
+ },
+ "event": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Event"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "personal_data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PersonalDatum"
+ }
+ },
+ "purposes": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Purpose"
+ }
+ },
+ "template_id": {
+ "type": "string"
+ },
+ "template_version": {
+ "type": "string"
+ },
+ "termination_timestamp": {
+ "type": "integer"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataAgreementRef": {
+ "type": "object",
+ "properties": {
+ "dataAgreement": {
+ "$ref": "#/definitions/models.DataAgreement"
+ },
+ "ref": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataPolicy": {
+ "type": "object",
+ "properties": {
+ "data_retention_period": {
+ "type": "integer"
+ },
+ "geographic_restriction": {
+ "type": "string"
+ },
+ "industry_scope": {
+ "type": "string"
+ },
+ "jurisdictions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "policy_URL": {
+ "type": "string"
+ },
+ "storage_location": {
+ "type": "string"
+ }
+ }
+ },
+ "models.DataReceiver": {
+ "type": "object",
+ "properties": {
+ "consent_duration": {
+ "type": "integer"
+ },
+ "form_of_consent": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "service": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Dpia": {
+ "type": "object",
+ "properties": {
+ "dpia_date": {
+ "type": "string"
+ },
+ "dpia_summary_url": {
+ "type": "string"
+ }
+ }
+ },
+ "models.EBSIClaims": {
+ "type": "object",
+ "properties": {
+ "encryption_key": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "id_token": {
+ "$ref": "#/definitions/models.IdToken"
+ },
+ "verified_claims": {
+ "type": "string"
+ },
+ "vp_token": {
+ "$ref": "#/definitions/models.VpToken"
+ }
+ }
+ },
+ "models.Event": {
+ "type": "object",
+ "properties": {
+ "principle_did": {
+ "type": "string"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "state": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "integer"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Field": {
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "filter": {
+ "$ref": "#/definitions/models.Filter"
+ },
+ "path": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "predicate": {
+ "$ref": "#/definitions/models.Preference"
+ },
+ "purpose": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Filter": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "const": {},
+ "enum": {
+ "type": "array",
+ "items": {}
+ },
+ "exclusiveMaximum": {},
+ "exclusiveMinimum": {},
+ "format": {
+ "type": "string"
+ },
+ "maxLength": {
+ "type": "integer"
+ },
+ "maximum": {},
+ "minLength": {
+ "type": "integer"
+ },
+ "minimum": {},
+ "not": {
+ "$ref": "#/definitions/models.Filter"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Format": {
+ "type": "object",
+ "properties": {
+ "jwt": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "jwt_vc": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "jwt_vp": {
+ "$ref": "#/definitions/models.JWTType"
+ },
+ "ldp": {
+ "$ref": "#/definitions/models.LDPType"
+ },
+ "ldp_vc": {
+ "$ref": "#/definitions/models.LDPType"
+ },
+ "ldp_vp": {
+ "$ref": "#/definitions/models.LDPType"
+ }
+ }
+ },
+ "models.IdToken": {
+ "type": "object",
+ "properties": {
+ "acr": {},
+ "verifiable_presentations": {
+ "type": "object",
+ "properties": {
+ "presentation_definition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ }
+ }
+ },
+ "models.InputDescriptor": {
+ "type": "object",
+ "required": [
+ "id",
+ "schema"
+ ],
+ "properties": {
+ "constraints": {
+ "$ref": "#/definitions/models.Constraints"
+ },
+ "group": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "metadata": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "schema": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/definitions/models.Schema"
+ }
+ }
+ }
+ },
+ "models.JWK": {
+ "type": "object",
+ "properties": {
+ "alg": {
+ "type": "string",
+ "example": "jwa values: https://www.rfc-editor.org/rfc/rfc7518.html#page-6"
+ },
+ "crv": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string"
+ },
+ "k": {
+ "type": "string"
+ },
+ "kid": {
+ "type": "string"
+ },
+ "kty": {
+ "type": "string"
+ },
+ "n": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ },
+ "use": {
+ "type": "string",
+ "example": "sig,enc"
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ }
+ }
+ },
+ "models.JWTEBSIClaims": {
+ "type": "object",
+ "properties": {
+ "aud": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "claims": {
+ "$ref": "#/definitions/models.EBSIClaims"
+ },
+ "client_id": {
+ "type": "string"
+ },
+ "exp": {
+ "type": "integer"
+ },
+ "iat": {
+ "type": "integer"
+ },
+ "iss": {
+ "type": "string"
+ },
+ "jti": {
+ "type": "string"
+ },
+ "nbf": {
+ "type": "integer"
+ },
+ "nonce": {
+ "type": "string"
+ },
+ "redirect_uri": {
+ "type": "string"
+ },
+ "registration": {
+ "type": "string"
+ },
+ "response_mode": {
+ "type": "string"
+ },
+ "response_type": {
+ "type": "string"
+ },
+ "scope": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ },
+ "sub": {
+ "type": "string"
+ },
+ "sub_did_verification_method_uri": {
+ "type": "string"
+ },
+ "sub_jwk": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "vc": {},
+ "vp": {}
+ }
+ },
+ "models.JWTType": {
+ "type": "object",
+ "required": [
+ "alg"
+ ],
+ "properties": {
+ "alg": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.LDPType": {
+ "type": "object",
+ "required": [
+ "proof_type"
+ ],
+ "properties": {
+ "proof_type": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.MechanismId": {
+ "type": "integer",
+ "enum": [
+ 1,
+ 2,
+ 3
+ ],
+ "x-enum-varnames": [
+ "AuthNFactor",
+ "AppAuth",
+ "Credential"
+ ]
+ },
+ "models.PEXConfig": {
+ "type": "object",
+ "properties": {
+ "advancedDefinition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ },
+ "callback": {
+ "type": "string"
+ },
+ "credentials": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.CredentialRequest"
+ }
+ },
+ "dataAgreementTemplate": {
+ "$ref": "#/definitions/models.DataAgreement"
+ },
+ "domain": {
+ "type": "string",
+ "example": "https://host.domain.com"
+ },
+ "id": {
+ "type": "string",
+ "example": "my-tenant"
+ },
+ "qrId": {
+ "type": "string"
+ },
+ "security": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SecMechanism"
+ }
+ },
+ "service": {
+ "type": "string"
+ },
+ "sessionTTL": {
+ "type": "integer"
+ },
+ "vmethodId": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxx"
+ }
+ }
+ },
+ "models.PExchange": {
+ "type": "object",
+ "properties": {
+ "authRequest": {
+ "$ref": "#/definitions/models.JWTEBSIClaims"
+ },
+ "callback": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "deletedAt": {
+ "$ref": "#/definitions/pq.NullTime"
+ },
+ "expiredAt": {
+ "type": "string"
+ },
+ "id": {
+ "description": "Session identifier",
+ "type": "string"
+ },
+ "presentationDefinition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ },
+ "presentationSubmission": {},
+ "presentationSubmissionFormat": {
+ "$ref": "#/definitions/models.VPFormat"
+ },
+ "requestedAt": {
+ "type": "string"
+ },
+ "sourceWallet": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "validations": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "models.PersonalDatum": {
+ "type": "object",
+ "properties": {
+ "attribute_id": {
+ "type": "string"
+ },
+ "attribute_location": {
+ "type": "string"
+ },
+ "attribute_name": {
+ "type": "string"
+ },
+ "attribute_sensitive": {
+ "type": "boolean"
+ },
+ "purposes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.Preference": {
+ "type": "string",
+ "enum": [
+ "required",
+ "preferred"
+ ],
+ "x-enum-varnames": [
+ "Required",
+ "Preferred"
+ ]
+ },
+ "models.PresentationDefinition": {
+ "type": "object",
+ "required": [
+ "id",
+ "input_descriptors"
+ ],
+ "properties": {
+ "dataAgreement": {
+ "$ref": "#/definitions/models.DataAgreementRef"
+ },
+ "format": {
+ "$ref": "#/definitions/models.Format"
+ },
+ "id": {
+ "type": "string"
+ },
+ "input_descriptors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.InputDescriptor"
+ }
+ },
+ "locale": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "submission_requirements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SubmissionRequirement"
+ }
+ }
+ }
+ },
+ "models.PresentationRequest": {
+ "type": "object",
+ "properties": {
+ "additionalData": {},
+ "auth": {
+ "description": "String to represent a concrete client",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SecMechanism"
+ }
+ },
+ "callback": {
+ "description": "For retro-comp",
+ "type": "string",
+ "example": "https://connect.gataca.io:9090"
+ },
+ "id": {
+ "type": "string",
+ "example": "pres:gatc:AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "redirect_uri": {
+ "type": "string"
+ },
+ "requested": {
+ "description": "Session identifier",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.CredentialRequest"
+ }
+ }
+ }
+ },
+ "models.PresentationResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "example": "pres:gatc:AzUcl2VkM1hSO7tmYjuisGpsjCbeiDrG"
+ },
+ "securityMechanisms": {
+ "description": "Assuming always ldp_vp because this is v1 Gatc and will be deprecated"
+ },
+ "verifiablePresentation": {}
+ }
+ },
+ "models.Proof": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "cades": {
+ "type": "string",
+ "example": "308204c906092a864886f70d010702...266ad9fee3375d8095"
+ },
+ "challenge": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "created": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "creator": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "proofPurpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "proofValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "signatureValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "type": {
+ "type": "string",
+ "example": "Ed25519Signature2018"
+ },
+ "verificationMethod": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ }
+ }
+ },
+ "models.Purpose": {
+ "type": "object",
+ "properties": {
+ "data_policy": {
+ "$ref": "#/definitions/models.DataPolicy"
+ },
+ "id": {
+ "type": "string"
+ },
+ "legal_basis": {
+ "type": "string"
+ },
+ "method_of_use": {
+ "type": "string"
+ },
+ "purpose_category": {
+ "type": "string"
+ },
+ "purpose_description": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SSIContext": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string"
+ },
+ "contexts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.SSIProof": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "$ref": "#/definitions/models.Proof"
+ },
+ "values": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Proof"
+ }
+ }
+ }
+ },
+ "models.Schema": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "type": "boolean"
+ },
+ "uri": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SecMechanism": {
+ "type": "object",
+ "properties": {
+ "accepted": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "$ref": "#/definitions/models.MechanismId"
+ }
+ }
+ },
+ "models.Selection": {
+ "type": "string",
+ "enum": [
+ "all",
+ "pick"
+ ],
+ "x-enum-varnames": [
+ "All",
+ "Pick"
+ ]
+ },
+ "models.Session": {
+ "type": "object",
+ "properties": {
+ "callback": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "data": {},
+ "dataFormat": {
+ "$ref": "#/definitions/models.VPFormat"
+ },
+ "expiredAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:08.999Z"
+ },
+ "id": {
+ "description": "Session identifier",
+ "type": "string",
+ "example": "U7wDbXbwsGjbNr3nIDpZuwC94PiDzXLL"
+ },
+ "nonce": {
+ "description": "Session nonce",
+ "type": "string",
+ "example": "j0mLD5K3x7yXjyAv1ZhWFzi22NIf5iZn"
+ },
+ "presentationRequest": {
+ "$ref": "#/definitions/models.PresentationRequest"
+ },
+ "sourceWallet": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:16.396Z"
+ },
+ "valid": {
+ "type": "boolean"
+ },
+ "validations": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ }
+ },
+ "models.SubmissionRequirement": {
+ "type": "object",
+ "required": [
+ "rule"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "from": {
+ "type": "string"
+ },
+ "from_nested": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.SubmissionRequirement"
+ }
+ },
+ "max": {
+ "type": "integer"
+ },
+ "min": {
+ "description": "Can be zero",
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "purpose": {
+ "type": "string"
+ },
+ "rule": {
+ "$ref": "#/definitions/models.Selection"
+ }
+ }
+ },
+ "models.VPFormat": {
+ "type": "string",
+ "enum": [
+ "ldp_vp",
+ "jwt_vp"
+ ],
+ "x-enum-varnames": [
+ "VPLDP",
+ "VPJWT"
+ ]
+ },
+ "models.VerifiableConsent": {
+ "type": "object",
+ "properties": {
+ "approverSubject": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxx"
+ },
+ "authorizedEntity": {
+ "type": "string",
+ "example": "did:example:yyyyyyyyyyyy"
+ },
+ "claims": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ConsentClaims"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "id": {
+ "type": "string",
+ "example": "did:example:zzzzzzzz"
+ },
+ "proofChain": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Proof"
+ }
+ }
+ }
+ },
+ "models.VerificationResult": {
+ "type": "object",
+ "properties": {
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['proof']"
+ ]
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[]"
+ ]
+ },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['Context not verified']"
+ ]
+ }
+ }
+ },
+ "models.VpToken": {
+ "type": "object",
+ "properties": {
+ "presentation_definition": {
+ "$ref": "#/definitions/models.PresentationDefinition"
+ }
+ }
+ },
+ "pq.NullTime": {
+ "type": "object",
+ "properties": {
+ "time": {
+ "type": "string"
+ },
+ "valid": {
+ "description": "Valid is true if Time is not NULL",
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "BasicAuth": {
+ "type": "basic"
+ },
+ "Token": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ },
+ "tags": [
+ {
+ "description": "API to manage Authentication Requests",
+ "name": "Authentication Requests"
+ },
+ {
+ "description": "API to manage Authentication Responses",
+ "name": "Authentication Responses"
+ },
+ {
+ "description": "API to manage Connect Tenants",
+ "name": "Configs"
+ },
+ {
+ "description": "API to manage Verifiable Consents",
+ "name": "Consents"
+ },
+ {
+ "description": "API to manage Data Agreements",
+ "name": "Data Agreements"
+ },
+ {
+ "description": "API to manage Presentations",
+ "name": "Presentations"
+ },
+ {
+ "description": "API to manage presentation exchange Sessions",
+ "name": "Sessions"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-helpers/docs/core-swagger.json b/dev-helpers/docs/core-swagger.json
new file mode 100644
index 00000000000..804e64c002c
--- /dev/null
+++ b/dev-helpers/docs/core-swagger.json
@@ -0,0 +1,3704 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is the full API of the GATACA Core Library.\nThis API contains common models, data and information to be used by GATACA Components.",
+ "title": "GATACA Core API",
+ "contact": {
+ "name": "GATACA",
+ "url": "https://gataca.io",
+ "email": "it@gataca.io"
+ },
+ "version": "1.0"
+ },
+ "host": "connect.gataca.io:9090",
+ "paths": {
+ "/admin/v1/api_keys": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the loggable entities (Admin ApiKeys and Applications) that can be managed by the logged in Administrator.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.\nQuery params allowed: did, ssiConfig.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Get all the managed Admin ApiKeys and Applications. This endpoint is paginated and has filters.",
+ "responses": {
+ "200": {
+ "description": "List of api_keys managed by the requester.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new ApiKey using a previously obtained registration token.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Sign Up a new ApiKey.",
+ "parameters": [
+ {
+ "description": "ApiKey",
+ "name": "apiKey",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Admin apiKeys correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Access token for the new created apiKey"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/login": {
+ "post": {
+ "security": [
+ {
+ "BasicAuth": []
+ }
+ ],
+ "description": "Login for aplications using an API_KEY with Basic Auth",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Basic Admin Login with Api_Key_id:Api_Key",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "SSI Config to login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Login Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "ApiKey Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/{id}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the data of a given Admin apiKey or Application to change his login, roles or tenants.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Update an Admin ApiKey or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "ApiKey Data",
+ "name": "newApiKeyData",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "ApiKey updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to update that apiKey",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete all the data of a given Admin apiKey or Application making him unable to login again.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Delete an Admin ApiKey or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "ApiKey deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to delete that ApiKey or Application",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/{id}/password": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the password of the logged ApiKey (if his an admin) by proving the knowledge of the existent one, or change the password of any managed application by an Administrator.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Update the password of an Admin ApiKey or Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Password updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage that apiKey",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/keys": {
+ "get": {
+ "description": "Retrieve the JSON representation of all the keys that can be used for signing the tokens issued by the component",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Retrieve all present Json Web Keys",
+ "responses": {
+ "200": {
+ "description": "All Json Web Keys",
+ "schema": {
+ "$ref": "#/definitions/models.JWKeySet"
+ }
+ },
+ "404": {
+ "description": "No keys found",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving the keys. Possible misconfiguration.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/keys/{keyid}": {
+ "get": {
+ "description": "Retrieve the JSON representation of all the keys that can be used for signing the tokens issued by the component",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Retrieve all present Json Web Keys",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "JWK Id",
+ "name": "keyid",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Configuration Modified",
+ "schema": {}
+ },
+ "404": {
+ "description": "Non existing Keyid",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving the Key. Possible missconfiguration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/login/basic": {
+ "post": {
+ "security": [
+ {
+ "BasicAuth": []
+ }
+ ],
+ "description": "Login for aplications using an API_KEY with Basic Auth",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Basic Admin Login with Api_Key_id:Api_Key",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "SSI Config to login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Login Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "ApiKey Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/login/gataca": {
+ "post": {
+ "description": "Validate the second step of the Gataca login process and obtain a valid access Token\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Finish the GatacaLogin process",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session Id",
+ "name": "session_id",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Session Id",
+ "name": "connect_token",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "User Tenant to Login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Authentication succesfull for this user",
+ "schema": {
+ "$ref": "#/definitions/controller.GatacaLoginResponse"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin Access Token"
+ },
+ "Token_Type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid authentication.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "428": {
+ "description": "Authentication still in process.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/login/request": {
+ "get": {
+ "description": "Admin Users can access using GATACA Login. That login process is performed in two-steps, where you have first to request a login session and then validate it.\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Start a new GatacaLogin process",
+ "responses": {
+ "200": {
+ "description": "Requested Session generated",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "headers": {
+ "connect_token": {
+ "type": "string",
+ "description": "Ciphered connect Token"
+ },
+ "session_id": {
+ "type": "string",
+ "description": "Session Id"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/providers": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Retrieve the list of all existing providers",
+ "responses": {
+ "200": {
+ "description": "Names of all the providers",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing providers.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenanst.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing providers.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Recover all the roles in the tenant.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get all custom roles in tenant.",
+ "responses": {
+ "200": {
+ "description": "Role for the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id already exist, if not created it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Register a new custom role.",
+ "parameters": [
+ {
+ "description": "Role",
+ "name": "role",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Role"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Custom role correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id exist.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get a new custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role ID",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Role for the Id.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id already exist and updates it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Update an existing custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role Id",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Role",
+ "name": "role",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Role"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Custom role correctly updated.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role exists, and delete it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Delete a custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role ID",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Custom role correctly deleted.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles/scopes": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Recover all the valid scopes for the current user requesting it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get all valid scopes.",
+ "responses": {
+ "200": {
+ "description": "Scopes for the user.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the current configurations\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Get all the current setups. This endpoints allows pagination.",
+ "responses": {
+ "200": {
+ "description": "Current configurations.",
+ "schema": {
+ "$ref": "#/definitions/controller.SetupResponse"
+ }
+ },
+ "206": {
+ "description": "VM Configurations only.",
+ "schema": {
+ "$ref": "#/definitions/controller.SetupResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error checking the application. Possible misconfiguration.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "503": {
+ "description": "Application not initialized.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify the current setup of the application.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Update the current Setup",
+ "parameters": [
+ {
+ "description": "Application Configuration",
+ "name": "Setup",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.SetupRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Generated DID Document",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage configurations.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/auto": {
+ "post": {
+ "description": "Create a new Setup with autogenerated keys. Keys will be stored on the database.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.\nOnly tenant and backbone token are mandatory.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Automatically generate a new Setup",
+ "parameters": [
+ {
+ "description": "AutoSetupRequest",
+ "name": "AutoConfig",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.DidRequest"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Registration token for the DID",
+ "name": "backbone_token",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application Setup automatically",
+ "schema": {
+ "$ref": "#/definitions/models.DIDDocument"
+ }
+ },
+ "400": {
+ "description": "Invalid setup request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/did": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new DID configuration and register the DID document and the new did will be enrolled with the license + tenant.\nIf the app hasn't been initialized yet, no authentication is required.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Create and register a new DID",
+ "parameters": [
+ {
+ "description": "DID Configuration",
+ "name": "alias",
+ "in": "body",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Registration token for the DID",
+ "name": "backbone_token",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Generated DID Document",
+ "schema": {
+ "$ref": "#/definitions/models.DIDDocument"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/did/{did}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update a configuration associated to an existing DID. This does not modify the registered DID Document.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Update an existing DID Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "did",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "DID Configuration",
+ "name": "DIDConfig",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.DidConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Configuration Modified",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete and revoke an existing DID. This makes the did not reusable anymore.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Remove an existing DID Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "did",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/eos/:did": {
+ "post": {
+ "description": "This endpoints allows to set a did as an ebsi eos, or swap the actual value for new one provided on the request.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Swap the did configured as ebsi eos.",
+ "responses": {
+ "200": {
+ "description": "Did swapped",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "404": {
+ "description": "not found.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "409": {
+ "description": "conflict",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/init": {
+ "post": {
+ "description": "Generate a first setup only if the application has never been initialized before. Configuration can be specifically specified.\nThe specified DID must have been previously created.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Create a first Setup Configuration",
+ "parameters": [
+ {
+ "description": "Application Configuration",
+ "name": "Setup",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.SetupRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application Configured",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "403": {
+ "description": "Application already initialized: not authorized to reinitialize it",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/keys": {
+ "get": {
+ "description": "Tool to generate an ED25519 Keypair\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Generate a keypair",
+ "responses": {
+ "200": {
+ "description": "PublicKey and SecretKey base58 encoded.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the keys the application.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/secret": {
+ "get": {
+ "description": "Tool to create a secret for symmetric encryption\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Generate a secret",
+ "responses": {
+ "200": {
+ "description": "Secret",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/status": {
+ "get": {
+ "description": "Check if the application has been initialized and is ready to be used.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Check the status of the current setup.",
+ "responses": {
+ "200": {
+ "description": "Application initialized.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "503": {
+ "description": "Application not initialized.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tenants": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Retrieve the list of all existing tenants",
+ "responses": {
+ "200": {
+ "description": "Names of all the tenants",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenants.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenanst.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenants.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new tenant with empty data.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Create a new tenant.",
+ "parameters": [
+ {
+ "description": "New tenant data",
+ "name": "tenant",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant data",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tenants/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Retrieve the information of a given tenant",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant information",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a Tenant and all information related to it.\nThis deletes users, applications, sessions, dids, configurations and all the information related.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Remove an existing tenant.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant deleted correctly",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify the contents of a given Tenant.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Modify a tenant.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "New tenant data",
+ "name": "tenant",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant data updated",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the loggable entities (Admin Users and Applications) that can be managed by the logged in Administrator.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Get all teh managed Admin Users and Applications.",
+ "responses": {
+ "200": {
+ "description": "List of users managed by the requester.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new Admin User or an Application using a previously obtained registration token.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Sign Up a new Admin User or Application.",
+ "parameters": [
+ {
+ "description": "User",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Admin users correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Access token for the new created user"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid user data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/login": {
+ "post": {
+ "security": [
+ {
+ "BasicAuth": []
+ }
+ ],
+ "description": "Login for admin users with Basic Auth\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Basic Admin Login with User:Password",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Tenant to login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Login Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin User Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/login/switch": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Endpoint to switch the tenant of the current session for the new one provided.\nThis API is not necessary for integration.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Switch tenant for the current user loged.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Tenant to switch",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Switch Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin User Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/register": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "In order to signup a new Admin User or an Application, a token must be first obtained.\nThe token will indicate his roles and tenants, so that the User himself can set up freely the rest of his data upon Registration\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Obtain a signup token for an Admin User or an Appplication",
+ "parameters": [
+ {
+ "description": "Tenant for the new user",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Token succesfully generated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Registration token for the new user"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid requested user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to signup other users",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/status": {
+ "get": {
+ "description": "Check if there are registered users in order to create a first one or not.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Check the status of the current Admin Users.",
+ "responses": {
+ "200": {
+ "description": "Admin users correctly initialized.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ },
+ "503": {
+ "description": "No Admin users initialized",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Registration token to create the first admin User"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/{id}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the data of a given Admin user or Application to change his login, roles or tenants.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update an Admin User or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "User Data",
+ "name": "newUserData",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to update that user",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete all the data of a given Admin user or Application making him unable to login again.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Delete an Admin User or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to delete that User or Application",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/{id}/password": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the password of the logged User (if his an admin) by proving the knowledge of the existent one, or change the password of any managed application by an Administrator.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update the password of an Admin User or Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Password updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage that user",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/derive": {
+ "post": {
+ "description": "Derive a credential and its proofs for selective disclosure. This Function is not available yet.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Holder"
+ ],
+ "summary": "Derive a credential.",
+ "responses": {
+ "201": {
+ "description": "Credential derived successfully.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "501": {
+ "description": "Not implemented",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/issue": {
+ "post": {
+ "description": "Sign and issue a new credential received on the body.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Issuer"
+ ],
+ "summary": "Sign and issue a new credential.",
+ "responses": {
+ "201": {
+ "description": "Credential issued correctly.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/status": {
+ "post": {
+ "description": "Modify the status of a credential following the [Revocation List 2020](https://w3c-ccg.github.io/vc-status-rl-2020) standard. This is not available yet.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Issuer"
+ ],
+ "summary": "Modify the status of a credential.",
+ "responses": {
+ "200": {
+ "description": "Credential status updated correctly.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Credential not found",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "501": {
+ "description": "Not implemented",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/verify": {
+ "post": {
+ "description": "Verify a single verifiable credential validity.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Verifier"
+ ],
+ "summary": "Verify cryptographically a credential.",
+ "responses": {
+ "200": {
+ "description": "Credential validated successfully.",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/health": {
+ "get": {
+ "description": "For monitoring purposes. Returns 200 if the service is up and running.",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Monitoring"
+ ],
+ "summary": "Check the health of the server.",
+ "responses": {
+ "200": {
+ "description": "RUNNING",
+ "schema": {
+ "$ref": "#/definitions/controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/presentations/prove": {
+ "post": {
+ "description": "Verify a single verifiable credential validity.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Holder"
+ ],
+ "summary": "Sign a verifiable presentation.",
+ "responses": {
+ "201": {
+ "description": "Presentation proved by holder.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/presentations/verify": {
+ "post": {
+ "description": "Verify the validity of a presentation with all its credentials.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs",
+ "Core",
+ "Verifier"
+ ],
+ "summary": "Verify cryptographically a presentation.",
+ "responses": {
+ "200": {
+ "description": "Presentation verified correctly.",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "400": {
+ "description": "Invalid or malformed input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "413": {
+ "description": "Payload too large",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "429": {
+ "description": "Rate Limit exceeded",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/qrconfigs": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new QR Config and indicate the permissions to update it or delete it",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Create QR Config.",
+ "parameters": [
+ {
+ "description": "Config to create",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Created configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error creating your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/qrconfigs/{id}": {
+ "get": {
+ "description": "Retrieve an existing qr config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Get QR Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Current configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update an existing QR Config.",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Update QR Config.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "New config data",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete an existing QR Config.",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Delete QR Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success message",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/version": {
+ "get": {
+ "description": "For monitoring purposes. Returns the current version of the service",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Monitoring"
+ ],
+ "summary": "Check the current version of the service.",
+ "responses": {
+ "200": {
+ "description": "1.0.0",
+ "schema": {
+ "$ref": "#/definitions/controller.VersionResponse"
+ }
+ }
+ }
+ }
+ },
+ "/ws/v1/login/gataca": {
+ "post": {
+ "description": "Perform a full login using web sockets",
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Perform a gataca login using websockets",
+ "responses": {}
+ }
+ }
+ },
+ "definitions": {
+ "controller.DidRequest": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string"
+ },
+ "omitempty": {
+ "$ref": "#/definitions/models.VerificationMethodConfig"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "tenant": {
+ "type": "string"
+ }
+ }
+ },
+ "controller.GatacaLoginResponse": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "string",
+ "example": "admin@domain.com"
+ }
+ }
+ },
+ "controller.SetupResponse": {
+ "type": "object",
+ "properties": {
+ "connectLoginConfig": {
+ "$ref": "#/definitions/models.ConnectLoginConfig"
+ },
+ "defaultDid": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxxxx"
+ },
+ "didConfigs": {}
+ }
+ },
+ "controller.StatusResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "example": "Ok"
+ }
+ }
+ },
+ "controller.VersionResponse": {
+ "type": "object",
+ "properties": {
+ "releaseDate": {
+ "type": "string",
+ "example": "2021-08-11T11:05:20Z"
+ },
+ "version": {
+ "type": "string",
+ "example": "1.0.0"
+ }
+ }
+ },
+ "models.ActorType": {
+ "type": "string",
+ "enum": [
+ "ADMIN_USER",
+ "ADMIN_APP",
+ "ISSUER",
+ "VERIFIER",
+ "VALIDATOR",
+ "HOLDER",
+ "SERVICE_PROVIDER"
+ ],
+ "x-enum-varnames": [
+ "ActorUser",
+ "ActorApp",
+ "ActorIssuer",
+ "ActorVerifier",
+ "ActorValidator",
+ "ActorHolder",
+ "ActorServiceProvider"
+ ]
+ },
+ "models.ApiKey": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string",
+ "example": "MyAPIKey"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "did": {
+ "type": "string",
+ "example": "did:gatc:4yu9274yq9gr8yw9423"
+ },
+ "id": {
+ "type": "string",
+ "example": "iqZRLv6L071bwXcJaQdj0msi3pflDxaH"
+ },
+ "password": {
+ "type": "string",
+ "example": "S3cuR3p4$sW0rD!"
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"verifications-qr1\"",
+ " \"issuance-qr2\"]"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "example": "ACTIVE"
+ },
+ "tenant": {
+ "description": "This should not be necessary, the tenant is managed by context. It's just for info and traceability.",
+ "type": "string",
+ "example": "gataca"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.ConnectLoginConfig": {
+ "type": "object",
+ "properties": {
+ "connectClient": {
+ "type": "string",
+ "example": "GatacaConnect"
+ },
+ "connectHost": {
+ "type": "string",
+ "example": "https://connect.gataca.io"
+ },
+ "connectSecret": {
+ "type": "string",
+ "example": "************"
+ },
+ "connectTenant": {
+ "type": "string",
+ "example": "Admin"
+ },
+ "secret": {
+ "description": "For Gataca Login",
+ "type": "string",
+ "example": "VZGUJw6eAzRP3APQyyEWPShJ6ex0AI7X"
+ }
+ }
+ },
+ "models.DIDDocument": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "assertionMethod": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "authentication": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "capabilityDelegation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "capabilityInvocation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "ebsiToken": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx"
+ },
+ "keyAgreement": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "publicKey": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PublicKey"
+ }
+ },
+ "verificationMethod": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PublicKey"
+ }
+ }
+ }
+ },
+ "models.DidConfig": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string",
+ "example": "Service_X"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "default": {
+ "type": "boolean",
+ "example": false
+ },
+ "didId": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx"
+ },
+ "isEbsiEOS": {
+ "type": "boolean"
+ },
+ "ledger": {
+ "type": "string",
+ "example": "ETH"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.JWK": {
+ "type": "object",
+ "properties": {
+ "alg": {
+ "type": "string",
+ "example": "jwa values: https://www.rfc-editor.org/rfc/rfc7518.html#page-6"
+ },
+ "crv": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string"
+ },
+ "k": {
+ "type": "string"
+ },
+ "kid": {
+ "type": "string"
+ },
+ "kty": {
+ "type": "string"
+ },
+ "n": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ },
+ "use": {
+ "type": "string",
+ "example": "sig,enc"
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ }
+ }
+ },
+ "models.JWKeySet": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.JWK"
+ }
+ }
+ }
+ },
+ "models.Permission": {
+ "type": "object",
+ "properties": {
+ "actor": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/models.ActorType"
+ }
+ ],
+ "example": "ADMIN_USER"
+ },
+ "api_keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dids": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "org": {
+ "type": "string"
+ },
+ "role": {
+ "$ref": "#/definitions/models.RoleID"
+ },
+ "scopes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tenant": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Proof": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "cades": {
+ "type": "string",
+ "example": "308204c906092a864886f70d010702...266ad9fee3375d8095"
+ },
+ "challenge": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "created": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "creator": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "proofPurpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "proofValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "signatureValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "type": {
+ "type": "string",
+ "example": "Ed25519Signature2018"
+ },
+ "verificationMethod": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ }
+ }
+ },
+ "models.PublicKey": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "controller": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx"
+ },
+ "ethereumAddress": {
+ "type": "string",
+ "example": "0x89a932207c485f85226d86f7cd486a89a24fcc12"
+ },
+ "id": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx#keys-1"
+ },
+ "publicKeyBase58": {
+ "type": "string",
+ "example": "2pju8d2E3LWkDJaJpm6BBf73v5DzSRyVNVf3JQwgV7DW"
+ },
+ "publicKeyGpg": {
+ "type": "string",
+ "example": "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js v4.9.0\r\nComment: https://openpgpjs.org\r\n\r\nxjMEXkm5LRYJKwYBBAHaRw8BAQdASmfrjYr7vrjwHNiBsdcImK397Vc3t4BL\r\nE8rnN......v6\r\nDw==\r\n=wSoi\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n"
+ },
+ "publicKeyHex": {
+ "description": "Unsupported on DID-Core but widely used",
+ "type": "string"
+ },
+ "publicKeyJwk": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "publicKeyPem": {
+ "type": "string"
+ },
+ "type": {
+ "description": "Ed25519VerificationKey2018",
+ "type": "string",
+ "example": "Ed25519VerificationKey2018"
+ },
+ "usage": {
+ "type": "string",
+ "example": "signing,recovery"
+ }
+ }
+ },
+ "models.QRConfig": {
+ "type": "object",
+ "properties": {
+ "autorefresh": {
+ "type": "boolean"
+ },
+ "autostart": {
+ "type": "boolean"
+ },
+ "buttonText": {
+ "description": "Just for buttons",
+ "type": "string"
+ },
+ "callbackServer": {
+ "description": "Just for v1",
+ "type": "string"
+ },
+ "checkStatus": {
+ "type": "string"
+ },
+ "createSession": {
+ "type": "string"
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dynamicLink": {
+ "type": "boolean"
+ },
+ "errorCallback": {
+ "type": "string"
+ },
+ "hideBrandTitle": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "string"
+ },
+ "permissions": {
+ "$ref": "#/definitions/models.Permission"
+ },
+ "pollingFrequency": {
+ "description": "Just for Polling",
+ "type": "integer"
+ },
+ "qrModalDescription": {
+ "type": "string"
+ },
+ "qrModalTitle": {
+ "type": "string"
+ },
+ "qrRole": {
+ "description": "Common for any QR",
+ "allOf": [
+ {
+ "$ref": "#/definitions/models.QRRole"
+ }
+ ]
+ },
+ "sessionTimeout": {
+ "description": "Recommended on v1, mandatory on v2",
+ "type": "integer"
+ },
+ "socketEndpoint": {
+ "description": "Just for websockets",
+ "type": "string"
+ },
+ "successCallback": {
+ "type": "string"
+ },
+ "useButton": {
+ "type": "boolean"
+ },
+ "useWs": {
+ "type": "boolean"
+ },
+ "v2": {
+ "description": "Just for v2",
+ "type": "boolean"
+ },
+ "wsOnMessage": {
+ "type": "string"
+ },
+ "wsOnOpen": {
+ "type": "string"
+ }
+ }
+ },
+ "models.QRRole": {
+ "type": "string",
+ "enum": [
+ "connect",
+ "certify"
+ ],
+ "x-enum-varnames": [
+ "ConnectRole",
+ "CertifyRole"
+ ]
+ },
+ "models.ResponseMessage": {
+ "type": "object",
+ "properties": {
+ "errorCode": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string",
+ "example": "Some description message"
+ }
+ }
+ },
+ "models.Role": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "role_id": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/models.RoleID"
+ }
+ ],
+ "example": "iqZRLv6L071bwXcJaQdj0msi3pflDxaH"
+ },
+ "scopes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[create_apikeys",
+ " delete_apikeys",
+ " modify_apikeys]"
+ ]
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.RoleID": {
+ "type": "string",
+ "enum": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ],
+ "x-enum-varnames": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ]
+ },
+ "models.SSIContext": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string"
+ },
+ "contexts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.SSIProof": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "$ref": "#/definitions/models.Proof"
+ },
+ "values": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Proof"
+ }
+ }
+ }
+ },
+ "models.SetupRequest": {
+ "type": "object",
+ "properties": {
+ "connectLogin": {
+ "$ref": "#/definitions/models.ConnectLoginConfig"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "tenant_id": {
+ "type": "string"
+ },
+ "vmConfigs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethodConfig"
+ }
+ }
+ }
+ },
+ "models.Tenant": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "dids": {
+ "description": "Tenant DIDs are not the same as license DIDs. Tenants are the ones present on this database. License DIDs are all dids for the license. An OnPremise may not have any dids in SaaS Tenant.",
+ "type": "string",
+ "example": "[Admin, MyTenant]"
+ },
+ "id": {
+ "type": "string",
+ "example": "gataca"
+ },
+ "isDefault": {
+ "type": "boolean",
+ "example": false
+ },
+ "provider": {
+ "type": "string",
+ "example": "Gataca"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.User": {
+ "type": "object",
+ "properties": {
+ "api_keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"iqZRLv6L071bwXcJaQdj0msi3pflDxaH\"",
+ " \"MDFVdHhnSm82VDFtMkVtdm5BN0hhMGpC\"]"
+ ]
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "dids": {
+ "type": "string",
+ "example": "[did:gatc:4yu9274yq9gr8yw9423, did:gatc:V1U3V0x1b2hEVDJscGZXYXhaa0thMWRn]"
+ },
+ "email": {
+ "type": "string",
+ "example": "admin@domain.com"
+ },
+ "orgId": {
+ "type": "string",
+ "example": "ADDWQEWQE-QWEQ-QWEE-EEQQ-12312312312"
+ },
+ "password": {
+ "type": "string",
+ "example": "S3cuR3p4$sW0rD!"
+ },
+ "phone": {
+ "type": "string",
+ "example": "+34 666 66 66 66"
+ },
+ "provider": {
+ "type": "string",
+ "example": "Gataca"
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/models.RoleID"
+ }
+ ],
+ "example": "ADMIN"
+ },
+ "sandbox_id": {
+ "type": "string",
+ "example": "A3FB058B-821D-4CFC-8D3F-67567BBA3E1C"
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"verifications-qr1\"",
+ " \"issuance-qr2\"]"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "example": "ACTIVE"
+ },
+ "tenants": {
+ "type": "string",
+ "example": "[gataca]"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.VerificationMethod": {
+ "type": "object",
+ "properties": {
+ "method": {
+ "$ref": "#/definitions/models.PublicKey"
+ },
+ "reference": {
+ "type": "string"
+ }
+ }
+ },
+ "models.VerificationMethodConfig": {
+ "type": "object",
+ "properties": {
+ "did": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx#keys-1"
+ },
+ "didId": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx"
+ },
+ "privateKeyAlg": {
+ "type": "string",
+ "example": "RSAPrivate,ECDSAPrivate"
+ },
+ "privateKeyData": {
+ "description": "Do not expose private keys on API!",
+ "type": "string",
+ "example": "/secrets/secret.pem"
+ },
+ "privateKeyType": {
+ "type": "string",
+ "example": "FILE,DB"
+ },
+ "publicKey": {
+ "type": "string",
+ "example": "3scaYXugqXQdG4QpVFYbzanT3bmxZQfXbg8B69T4ZZWJKrZnahZ48Hw3SKctAQU1bnMBNwt6Gb6Es4ALqfAiNRmn"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.VerificationResult": {
+ "type": "object",
+ "properties": {
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['proof']"
+ ]
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[]"
+ ]
+ },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['Context not verified']"
+ ]
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "BasicAuth": {
+ "type": "basic"
+ },
+ "Token": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ },
+ "tags": [
+ {
+ "description": "API to manage Access to the Administration Module",
+ "name": "Access"
+ },
+ {
+ "description": "API to manage Admin Users and Applications",
+ "name": "Users"
+ },
+ {
+ "description": "API to retrieve manage the public and private Issuers and Schemas Catalogs",
+ "name": "Catalog"
+ },
+ {
+ "description": "API to manage the component DIDs and configuration",
+ "name": "Setup"
+ },
+ {
+ "description": "All common APIs",
+ "name": "Core"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-helpers/docs/nucleus-swagger.json b/dev-helpers/docs/nucleus-swagger.json
new file mode 100644
index 00000000000..ea112d30a3f
--- /dev/null
+++ b/dev-helpers/docs/nucleus-swagger.json
@@ -0,0 +1,4045 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is the full API of the Nucleus Management component.\nThis API contains common models, data and information to be used to manage any Gataca Component.",
+ "title": "Gataca Nucleus API",
+ "contact": {
+ "name": "Gataca",
+ "url": "https://gataca.io",
+ "email": "it@gataca.io"
+ },
+ "version": "1.1.4"
+ },
+ "host": "nucleus.gataca.io",
+ "paths": {
+ "/admin/v1/api_keys": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the loggable entities (Admin ApiKeys and Applications) that can be managed by the logged in Administrator.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.\nQuery params allowed: did, ssiConfig.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Get all the managed Admin ApiKeys and Applications. This endpoint is paginated and has filters.",
+ "responses": {
+ "200": {
+ "description": "List of api_keys managed by the requester.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new ApiKey using a previously obtained registration token.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Sign Up a new ApiKey.",
+ "parameters": [
+ {
+ "description": "ApiKey",
+ "name": "apiKey",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Admin apiKeys correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Access token for the new created apiKey"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/login": {
+ "post": {
+ "security": [
+ {
+ "BasicAuth": []
+ }
+ ],
+ "description": "Login for aplications using an API_KEY with Basic Auth",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Basic Admin Login with Api_Key_id:Api_Key",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "SSI Config to login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Login Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "ApiKey Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/{id}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the data of a given Admin apiKey or Application to change his login, roles or tenants.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Update an Admin ApiKey or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "ApiKey Data",
+ "name": "newApiKeyData",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.ApiKey"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "ApiKey updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to update that apiKey",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete all the data of a given Admin apiKey or Application making him unable to login again.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Delete an Admin ApiKey or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "ApiKey deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to delete that ApiKey or Application",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/api_keys/{id}/password": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the password of the logged ApiKey (if his an admin) by proving the knowledge of the existent one, or change the password of any managed application by an Administrator.\nThis API is not necessary for integration. ApiKeys can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Api-Keys"
+ ],
+ "summary": "Update the password of an Admin ApiKey or Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "ApiKey Id",
+ "name": "apiKeyID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Password updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid apiKey data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage that apiKey",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/auth": {
+ "get": {
+ "description": "Check if you are authenticated and get the current authentication info\nThis API is not necessary for integration.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Check the information about the currently authenticated user",
+ "responses": {
+ "200": {
+ "description": "Authentication Data",
+ "schema": {
+ "$ref": "#/definitions/models.TokenClaims"
+ }
+ },
+ "403": {
+ "description": "User not authenticated",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/catalog": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve the merge of the public and private catalogs for all catalog\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Catalog"
+ ],
+ "summary": "Retrieve the status of full Catalog",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.FullCatalog"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/catalog/{key}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve the merge of the public and private catalogs for one specific catalog\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Catalog"
+ ],
+ "summary": "Retrieve the status of a single Catalogs",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Catalog Id",
+ "name": "key",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Merged private and public Catalogs in case",
+ "schema": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/keys": {
+ "get": {
+ "description": "Retrieve the JSON representation of all the keys that can be used for signing the tokens issued by the component",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Retrieve all present Json Web Keys",
+ "responses": {
+ "200": {
+ "description": "All Json Web Keys",
+ "schema": {
+ "$ref": "#/definitions/models.JWKeySet"
+ }
+ },
+ "404": {
+ "description": "No keys found",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving the keys. Possible misconfiguration.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/keys/{keyid}": {
+ "get": {
+ "description": "Retrieve the JSON representation of all the keys that can be used for signing the tokens issued by the component",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Retrieve all present Json Web Keys",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "JWK Id",
+ "name": "keyid",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Configuration Modified",
+ "schema": {}
+ },
+ "404": {
+ "description": "Non existing Keyid",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving the Key. Possible missconfiguration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/login/gataca": {
+ "post": {
+ "description": "Validate the second step of the Gataca login process and obtain a valid access Token\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Finish the GatacaLogin process",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Session Id",
+ "name": "session_id",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Session Id",
+ "name": "connect_token",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "User Tenant to Login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Authentication succesfull for this user",
+ "schema": {
+ "$ref": "#/definitions/controller.GatacaLoginResponse"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin Access Token"
+ },
+ "Token_Type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid authentication.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "428": {
+ "description": "Authentication still in process.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/login/request": {
+ "get": {
+ "description": "Admin Users can access using Gataca Login. That login process is performed in two-steps, where you have first to request a login session and then validate it.\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Start a new GatacaLogin process",
+ "responses": {
+ "200": {
+ "description": "Requested Session generated",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "headers": {
+ "connect_token": {
+ "type": "string",
+ "description": "Ciphered connect Token"
+ },
+ "session_id": {
+ "type": "string",
+ "description": "Session Id"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/private/catalog": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve just the private catalogs for all catalogs\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Catalog"
+ ],
+ "summary": "Retrieve the status of full private Catalog",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.FullCatalog"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/private/catalog/{key}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve just the private catalogs for one specific catalog\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Catalog"
+ ],
+ "summary": "Retrieve the status of your private version of a single Catalog",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Catalog Id",
+ "name": "key",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Merged private and public Catalogs in case",
+ "schema": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing Catalog.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/providers": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Providers"
+ ],
+ "summary": "Retrieve the list of all existing providers",
+ "responses": {
+ "200": {
+ "description": "Names of all the providers",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing providers.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenanst.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing providers.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Recover all the roles in the tenant.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get all custom roles in tenant.",
+ "responses": {
+ "200": {
+ "description": "Role for the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id already exist, if not created it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Register a new custom role.",
+ "parameters": [
+ {
+ "description": "Role",
+ "name": "role",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/permissions.Role"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Custom role correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id exist.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get a new custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role ID",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Role for the Id.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role with the same id already exist and updates it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Update an existing custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role Id",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Role",
+ "name": "role",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/permissions.Role"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Custom role correctly updated.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Check if a role exists, and delete it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Delete a custom role.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Role ID",
+ "name": "roleId",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Custom role correctly deleted.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/roles/scopes": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Recover all the valid scopes for the current user requesting it.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Roles"
+ ],
+ "summary": "Get all valid scopes.",
+ "responses": {
+ "200": {
+ "description": "Scopes for the user.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid role data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the current configurations\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Get all the current setups. This endpoints allows pagination.",
+ "responses": {
+ "200": {
+ "description": "Current configurations.",
+ "schema": {
+ "$ref": "#/definitions/controller.SetupResponse"
+ }
+ },
+ "206": {
+ "description": "VM Configurations only.",
+ "schema": {
+ "$ref": "#/definitions/controller.SetupResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error checking the application. Possible misconfiguration.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "503": {
+ "description": "Application not initialized.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify the current setup of the application.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Update the current Setup",
+ "parameters": [
+ {
+ "description": "Application Configuration",
+ "name": "Setup",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.SetupRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Generated DID Document",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage configurations.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/auto": {
+ "post": {
+ "description": "Create a new Setup with autogenerated keys. Keys will be stored on the database.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.\nOnly tenant and backbone token are mandatory.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Automatically generate a new Setup",
+ "parameters": [
+ {
+ "description": "AutoSetupRequest",
+ "name": "AutoConfig",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.DidRequest"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Registration token for the DID",
+ "name": "backbone_token",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application Setup automatically",
+ "schema": {
+ "$ref": "#/definitions/models.DIDDocument"
+ }
+ },
+ "400": {
+ "description": "Invalid setup request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/auto/login": {
+ "post": {
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.\nOnly tenant and backbone token are mandatory.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Automatically generate a config for connect config",
+ "parameters": [
+ {
+ "description": "AutoLogin Setup request",
+ "name": "AutoLoginConfig",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.DidRequest"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Registration token for the DID",
+ "name": "backbone_token",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application Login Setup automatically",
+ "schema": {
+ "$ref": "#/definitions/models.DIDDocument"
+ }
+ },
+ "400": {
+ "description": "Invalid setup request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/did": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new DID configuration and register the DID document and the new did will be enrolled with the license + tenant.\nIf the app hasn't been initialized yet, no authentication is required.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Create and register a new DID",
+ "parameters": [
+ {
+ "description": "DID Configuration",
+ "name": "alias",
+ "in": "body",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "string",
+ "description": "Registration token for the DID",
+ "name": "backbone_token",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Generated DID Document",
+ "schema": {
+ "$ref": "#/definitions/models.DIDDocument"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/did/{did}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update a configuration associated to an existing DID. This does not modify the registered DID Document.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Update an existing DID Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "did",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "DID Configuration",
+ "name": "DIDConfig",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.DidConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Configuration Modified",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete and revoke an existing DID. This makes the did not reusable anymore.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Remove an existing DID Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "did",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "DID Deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage DIDs.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/eos/:did": {
+ "post": {
+ "description": "This endpoints allows to set a did as an ebsi eos, or swap the actual value for new one provided on the request.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Swap the did configured as ebsi eos.",
+ "responses": {
+ "200": {
+ "description": "Did swapped",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "404": {
+ "description": "not found.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "409": {
+ "description": "conflict",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/init": {
+ "post": {
+ "description": "Generate a first setup only if the application has never been initialized before. Configuration can be specifically specified.\nThe specified DID must have been previously created.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Create a first Setup Configuration",
+ "parameters": [
+ {
+ "description": "Application Configuration",
+ "name": "Setup",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.SetupRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application Configured",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid configuration",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "403": {
+ "description": "Application already initialized: not authorized to reinitialize it",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the DID. Possible invalid registration token.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/keys": {
+ "get": {
+ "description": "Tool to generate an ED25519 Keypair\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Generate a keypair",
+ "responses": {
+ "200": {
+ "description": "PublicKey and SecretKey base58 encoded.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error generating the keys the application.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/secret": {
+ "get": {
+ "description": "Tool to create a secret for symmetric encryption\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Generate a secret",
+ "responses": {
+ "200": {
+ "description": "Secret",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/setup/status": {
+ "get": {
+ "description": "Check if the application has been initialized and is ready to be used.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Setup"
+ ],
+ "summary": "Check the status of the current setup.",
+ "responses": {
+ "200": {
+ "description": "Application initialized.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "503": {
+ "description": "Application not initialized.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tenants": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Retrieve the list of all existing tenants",
+ "responses": {
+ "200": {
+ "description": "Names of all the tenants",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenants.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenanst.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenants.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new tenant with empty data.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Create a new tenant.",
+ "parameters": [
+ {
+ "description": "New tenant data",
+ "name": "tenant",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant data",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/tenants/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Retrieve the information of a given tenant",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant information",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to obtain the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a Tenant and all information related to it.\nThis deletes users, applications, sessions, dids, configurations and all the information related.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Remove an existing tenant.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant deleted correctly",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Modify the contents of a given Tenant.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tenants"
+ ],
+ "summary": "Modify a tenant.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tenant Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "New tenant data",
+ "name": "tenant",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Tenant data updated",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Tenant"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to modify the tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Invalid or non-existing tenant.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieve all the loggable entities (Admin Users and Applications) that can be managed by the logged in Administrator.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Get all the managed Admin Users and Applications.",
+ "responses": {
+ "200": {
+ "description": "List of users managed by the requester.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new Admin User or an Application using a previously obtained registration token.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Sign Up a new Admin User or Application.",
+ "parameters": [
+ {
+ "description": "User",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Admin users correctly created.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Access token for the new created user"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid user data.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid registration token",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/login": {
+ "post": {
+ "security": [
+ {
+ "BasicAuth": []
+ }
+ ],
+ "description": "Login for admin users with Basic Auth\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Basic Admin Login with User:Password",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Tenant to login",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Login Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin User Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/login/switch": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Endpoint to switch the tenant of the current session for the new one provided.\nThis API is not necessary for integration.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Switch tenant for the current user loged.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Tenant to switch",
+ "name": "tenant",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Switch Succesful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Admin User Token"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/logout": {
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Logout for admin users with their authentication\nThis API is not necessary for integration. Access can be managed on the Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Logout from session",
+ "responses": {
+ "200": {
+ "description": "Logout Successful",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid credentials",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/register": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "In order to signup a new Admin User or an Application, a token must be first obtained.\nThe token will indicate his roles and tenants, so that the User himself can set up freely the rest of his data upon Registration\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Obtain a signup token for an Admin User or an Appplication",
+ "parameters": [
+ {
+ "description": "Tenant for the new user",
+ "name": "user",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Token succesfully generated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Registration token for the new user"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid requested user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to signup other users",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/status": {
+ "get": {
+ "description": "Check if there are registered users in order to create a first one or not.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Check the status of the current Admin Users.",
+ "responses": {
+ "200": {
+ "description": "Admin users correctly initialized.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ }
+ },
+ "503": {
+ "description": "No Admin users initialized",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Registration token to create the first admin User"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "This API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Get the requested user data.",
+ "responses": {
+ "200": {
+ "description": "Requested user",
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the data of a given Admin user or Application to change his login, roles or tenants.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update an Admin User or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "User Data",
+ "name": "newUserData",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to update that user",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete all the data of a given Admin user or Application making him unable to login again.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Delete an Admin User or an Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User deleted",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Unauthorized to delete that User or Application",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/{id}/password": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the password of the logged User (if his an admin) by proving the knowledge of the existent one, or change the password of any managed application by an Administrator.\nThis API is not necessary for integration. Users can be managed through Gataca Admin Portal.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update the password of an Admin User or Application",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "User Id",
+ "name": "userID",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Password updated",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid user data",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to manage that user",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/derive": {
+ "post": {
+ "description": "Derive a credential and its proofs for selective disclosure. This Function is not available yet.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Derive a credential.",
+ "responses": {
+ "201": {
+ "description": "Credential derived successfully.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "501": {
+ "description": "Not implemented",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/issue": {
+ "post": {
+ "description": "Sign and issue a new credential received on the body.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Sign and issue a new credential.",
+ "responses": {
+ "201": {
+ "description": "Credential issued correctly.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/status": {
+ "post": {
+ "description": "Modify the status of a credential following the [Revocation List 2020](https://w3c-ccg.github.io/vc-status-rl-2020) standard. This is not available yet.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Modify the status of a credential.",
+ "responses": {
+ "200": {
+ "description": "Credential status updated correctly.",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Credential not found",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "501": {
+ "description": "Not implemented",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/credentials/verify": {
+ "post": {
+ "description": "Verify a single verifiable credential validity.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Verify cryptographically a credential.",
+ "responses": {
+ "200": {
+ "description": "Credential validated successfully.",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/presentations/prove": {
+ "post": {
+ "description": "Verify a single verifiable credential validity.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Sign a verifiable presentation.",
+ "responses": {
+ "201": {
+ "description": "Presentation proved by holder.",
+ "schema": {}
+ },
+ "400": {
+ "description": "Invalid input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/presentations/verify": {
+ "post": {
+ "description": "Verify the validity of a presentation with all its credentials.\nThis API follows the [VC-HTTP-APIs](https://w3c-ccg.github.io/vc-http-api) standard. It is not necessary for integration, but may be used for interoperability with other providers.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "VCAPIs"
+ ],
+ "summary": "Verify cryptographically a presentation.",
+ "responses": {
+ "200": {
+ "description": "Presentation verified correctly.",
+ "schema": {
+ "$ref": "#/definitions/models.VerificationResult"
+ }
+ },
+ "400": {
+ "description": "Invalid or malformed input",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "413": {
+ "description": "Payload too large",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "429": {
+ "description": "Rate Limit exceeded",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/qrconfigs": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a new QR Config and indicate the permissions to update it or delete it",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Create QR Config.",
+ "parameters": [
+ {
+ "description": "Config to create",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Created configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error creating your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/qrconfigs/{id}": {
+ "get": {
+ "description": "Retrieve an existing qr config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Get QR Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Current configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update an existing QR Config.",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Update QR Config.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "New config data",
+ "name": "config",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated configuration",
+ "schema": {
+ "$ref": "#/definitions/models.QRConfig"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete an existing QR Config.",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "QRConfigs"
+ ],
+ "summary": "Delete QR Config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Config Id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success message",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authorization to create that config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Config not existing",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error retrieving your config",
+ "schema": {
+ "$ref": "#/definitions/models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/ws/v1/login/gataca": {
+ "post": {
+ "description": "Perform a full login using web sockets",
+ "tags": [
+ "Auth"
+ ],
+ "summary": "Perform a gataca login using websockets",
+ "responses": {}
+ }
+ }
+ },
+ "definitions": {
+ "controller.DidRequest": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string"
+ },
+ "omitempty": {
+ "$ref": "#/definitions/models.VerificationMethodConfig"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "tenant": {
+ "type": "string"
+ }
+ }
+ },
+ "controller.GatacaLoginResponse": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "string",
+ "example": "admin@domain.com"
+ }
+ }
+ },
+ "controller.SetupResponse": {
+ "type": "object",
+ "properties": {
+ "connectLoginConfig": {
+ "$ref": "#/definitions/models.ConnectLoginConfig"
+ },
+ "defaultDid": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxxxx"
+ },
+ "didConfigs": {}
+ }
+ },
+ "github_com_gataca-io_nucleus_apps_admin_controller.StatusResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "example": "Ok"
+ }
+ }
+ },
+ "models.ApiKey": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string",
+ "example": "MyAPIKey"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "did": {
+ "type": "string",
+ "example": "did:gatc:4yu9274yq9gr8yw9423"
+ },
+ "id": {
+ "type": "string",
+ "example": "iqZRLv6L071bwXcJaQdj0msi3pflDxaH"
+ },
+ "password": {
+ "type": "string",
+ "example": "S3cuR3p4$sW0rD!"
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"verifications-qr1\"",
+ " \"issuance-qr2\"]"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "example": "ACTIVE"
+ },
+ "tenant": {
+ "description": "This should not be necessary, the tenant is managed by context. It's just for info and traceability.",
+ "type": "string",
+ "example": "gataca"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.ConnectLoginConfig": {
+ "type": "object",
+ "properties": {
+ "connectClient": {
+ "type": "string",
+ "example": "GatacaConnect"
+ },
+ "connectHost": {
+ "type": "string",
+ "example": "https://connect.gataca.io"
+ },
+ "connectSecret": {
+ "type": "string",
+ "example": "************"
+ },
+ "connectTenant": {
+ "type": "string",
+ "example": "Admin"
+ },
+ "provider": {
+ "type": "string",
+ "example": "gataca"
+ },
+ "secret": {
+ "description": "For Gataca Login",
+ "type": "string",
+ "example": "VZGUJw6eAzRP3APQyyEWPShJ6ex0AI7X"
+ }
+ }
+ },
+ "models.DIDDocument": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "assertionMethod": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "authentication": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "capabilityDelegation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "capabilityInvocation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "ebsiToken": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx"
+ },
+ "keyAgreement": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethod"
+ }
+ },
+ "proof": {
+ "$ref": "#/definitions/models.SSIProof"
+ },
+ "publicKey": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PublicKey"
+ }
+ },
+ "verificationMethod": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.PublicKey"
+ }
+ }
+ }
+ },
+ "models.DidConfig": {
+ "type": "object",
+ "properties": {
+ "alias": {
+ "type": "string",
+ "example": "Service_X"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "default": {
+ "type": "boolean",
+ "example": false
+ },
+ "didId": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx"
+ },
+ "isEbsiEOS": {
+ "type": "boolean"
+ },
+ "ledger": {
+ "type": "string",
+ "example": "ETH"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.FullCatalog": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "models.JWK": {
+ "type": "object",
+ "properties": {
+ "alg": {
+ "type": "string",
+ "example": "jwa values: https://www.rfc-editor.org/rfc/rfc7518.html#page-6"
+ },
+ "crv": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string"
+ },
+ "k": {
+ "type": "string"
+ },
+ "kid": {
+ "type": "string"
+ },
+ "kty": {
+ "type": "string"
+ },
+ "n": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ },
+ "use": {
+ "type": "string",
+ "example": "sig,enc"
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ }
+ }
+ },
+ "models.JWKeySet": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.JWK"
+ }
+ }
+ }
+ },
+ "models.Proof": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "cades": {
+ "type": "string",
+ "example": "308204c906092a864886f70d010702...266ad9fee3375d8095"
+ },
+ "challenge": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "created": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "creator": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "nonce": {
+ "type": "string",
+ "example": "TyYfomXjwPaQoSRzCZk7CxFYR8DwAigt"
+ },
+ "proofPurpose": {
+ "type": "string",
+ "example": "Authentication"
+ },
+ "proofValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "signatureValue": {
+ "type": "string",
+ "example": "bQ5AimlvOv6p5wa9pVlmjWgPMr7j9rKw_yjUL6yHlQNwnKk7HL8VQzIT0Xx"
+ },
+ "type": {
+ "type": "string",
+ "example": "Ed25519Signature2018"
+ },
+ "verificationMethod": {
+ "type": "string",
+ "example": "did:gatc:yyyyyyyyyyyy#keys-1"
+ }
+ }
+ },
+ "models.PublicKey": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "$ref": "#/definitions/models.SSIContext"
+ },
+ "controller": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx"
+ },
+ "ethereumAddress": {
+ "type": "string",
+ "example": "0x89a932207c485f85226d86f7cd486a89a24fcc12"
+ },
+ "id": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxxxxxx#keys-1"
+ },
+ "publicKeyBase58": {
+ "type": "string",
+ "example": "2pju8d2E3LWkDJaJpm6BBf73v5DzSRyVNVf3JQwgV7DW"
+ },
+ "publicKeyGpg": {
+ "type": "string",
+ "example": "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js v4.9.0\r\nComment: https://openpgpjs.org\r\n\r\nxjMEXkm5LRYJKwYBBAHaRw8BAQdASmfrjYr7vrjwHNiBsdcImK397Vc3t4BL\r\nE8rnN......v6\r\nDw==\r\n=wSoi\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n"
+ },
+ "publicKeyHex": {
+ "description": "Unsupported on DID-Core but widely used",
+ "type": "string"
+ },
+ "publicKeyJwk": {
+ "$ref": "#/definitions/models.JWK"
+ },
+ "publicKeyPem": {
+ "type": "string"
+ },
+ "type": {
+ "description": "Ed25519VerificationKey2018",
+ "type": "string",
+ "example": "Ed25519VerificationKey2018"
+ },
+ "usage": {
+ "type": "string",
+ "example": "signing,recovery"
+ }
+ }
+ },
+ "models.QRConfig": {
+ "type": "object",
+ "properties": {
+ "autorefresh": {
+ "type": "boolean"
+ },
+ "autostart": {
+ "type": "boolean"
+ },
+ "buttonText": {
+ "description": "Just for buttons",
+ "type": "string"
+ },
+ "callbackServer": {
+ "description": "Just for v1",
+ "type": "string"
+ },
+ "checkStatus": {
+ "type": "string"
+ },
+ "createSession": {
+ "type": "string"
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dynamicLink": {
+ "type": "boolean"
+ },
+ "errorCallback": {
+ "type": "string"
+ },
+ "hideBrandTitle": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "string"
+ },
+ "permissions": {
+ "$ref": "#/definitions/permissions.Permission"
+ },
+ "pollingFrequency": {
+ "description": "Just for Polling",
+ "type": "integer"
+ },
+ "qrModalDescription": {
+ "type": "string"
+ },
+ "qrModalTitle": {
+ "type": "string"
+ },
+ "qrRole": {
+ "description": "Common for any QR",
+ "allOf": [
+ {
+ "$ref": "#/definitions/models.QRRole"
+ }
+ ]
+ },
+ "sessionTimeout": {
+ "description": "Recommended on v1, mandatory on v2",
+ "type": "integer"
+ },
+ "socketEndpoint": {
+ "description": "Just for websockets",
+ "type": "string"
+ },
+ "successCallback": {
+ "type": "string"
+ },
+ "useButton": {
+ "type": "boolean"
+ },
+ "useWs": {
+ "type": "boolean"
+ },
+ "v2": {
+ "description": "Just for v2",
+ "type": "boolean"
+ },
+ "wsOnMessage": {
+ "type": "string"
+ },
+ "wsOnOpen": {
+ "type": "string"
+ }
+ }
+ },
+ "models.QRRole": {
+ "type": "string",
+ "enum": [
+ "connect",
+ "certify"
+ ],
+ "x-enum-varnames": [
+ "ConnectRole",
+ "CertifyRole"
+ ]
+ },
+ "models.ResponseMessage": {
+ "type": "object",
+ "properties": {
+ "errorCode": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string",
+ "example": "Some description message"
+ }
+ }
+ },
+ "models.SSIContext": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string"
+ },
+ "contexts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.SSIProof": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "$ref": "#/definitions/models.Proof"
+ },
+ "values": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Proof"
+ }
+ }
+ }
+ },
+ "models.SetupRequest": {
+ "type": "object",
+ "properties": {
+ "connectLogin": {
+ "$ref": "#/definitions/models.ConnectLoginConfig"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "tenant_id": {
+ "type": "string"
+ },
+ "vmConfigs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.VerificationMethodConfig"
+ }
+ }
+ }
+ },
+ "models.Tenant": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "dids": {
+ "description": "Tenant DIDs are not the same as license DIDs. Tenants are the ones present on this database. License DIDs are all dids for the license. An OnPremise may not have any dids in SaaS Tenant.",
+ "type": "string",
+ "example": "[Admin, MyTenant]"
+ },
+ "id": {
+ "type": "string",
+ "example": "gataca"
+ },
+ "isDefault": {
+ "type": "boolean",
+ "example": false
+ },
+ "provider": {
+ "type": "string",
+ "example": "Gataca"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.TokenClaims": {
+ "type": "object",
+ "properties": {
+ "account_id": {
+ "type": "string"
+ },
+ "act": {
+ "type": "string"
+ },
+ "aud": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "callback": {
+ "type": "string"
+ },
+ "exp": {
+ "type": "integer"
+ },
+ "iat": {
+ "type": "integer"
+ },
+ "iss": {
+ "type": "string"
+ },
+ "jti": {
+ "type": "string"
+ },
+ "nbf": {
+ "type": "integer"
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "permissions": {
+ "$ref": "#/definitions/permissions.Permission"
+ },
+ "sbx": {
+ "type": "string"
+ },
+ "sub": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "wallet_aud": {
+ "type": "string"
+ }
+ }
+ },
+ "models.User": {
+ "type": "object",
+ "properties": {
+ "api_keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"iqZRLv6L071bwXcJaQdj0msi3pflDxaH\"",
+ " \"MDFVdHhnSm82VDFtMkVtdm5BN0hhMGpC\"]"
+ ]
+ },
+ "createdAt": {
+ "description": "SandboxId string `gorm:\"\" json:\"sandbox_id\" example:\"A3FB058B-821D-4CFC-8D3F-67567BBA3E1C\" description:\"Sandbox identifier\"`\nOrgId string `gorm:\"\" json:\"orgId\" example:\"ADDWQEWQE-QWEQ-QWEE-EEQQ-12312312312\" description:\"Org identifier used on Gaas\"`",
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "dids": {
+ "type": "string",
+ "example": "[did:gatc:4yu9274yq9gr8yw9423, did:gatc:V1U3V0x1b2hEVDJscGZXYXhaa0thMWRn]"
+ },
+ "email": {
+ "type": "string",
+ "example": "admin@domain.com"
+ },
+ "password": {
+ "type": "string",
+ "example": "S3cuR3p4$sW0rD!"
+ },
+ "phone": {
+ "type": "string",
+ "example": "+34 666 66 66 66"
+ },
+ "provider": {
+ "type": "string",
+ "example": "Gataca"
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/permissions.RoleID"
+ }
+ ],
+ "example": "ADMIN"
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"verifications-qr1\"",
+ " \"issuance-qr2\"]"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "example": "ACTIVE"
+ },
+ "tenants": {
+ "type": "string",
+ "example": "[gataca]"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.VerificationMethod": {
+ "type": "object",
+ "properties": {
+ "method": {
+ "$ref": "#/definitions/models.PublicKey"
+ },
+ "reference": {
+ "type": "string"
+ }
+ }
+ },
+ "models.VerificationMethodConfig": {
+ "type": "object",
+ "properties": {
+ "did": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx#keys-1"
+ },
+ "didId": {
+ "type": "string",
+ "example": "did:example:xxxxxxxxx"
+ },
+ "privateKeyAlg": {
+ "type": "string",
+ "example": "RSAPrivate,ECDSAPrivate"
+ },
+ "privateKeyData": {
+ "description": "Do not expose private keys on API!",
+ "type": "string",
+ "example": "/secrets/secret.pem"
+ },
+ "privateKeyType": {
+ "type": "string",
+ "example": "FILE,DB"
+ },
+ "publicKey": {
+ "type": "string",
+ "example": "3scaYXugqXQdG4QpVFYbzanT3bmxZQfXbg8B69T4ZZWJKrZnahZ48Hw3SKctAQU1bnMBNwt6Gb6Es4ALqfAiNRmn"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.VerificationResult": {
+ "type": "object",
+ "properties": {
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['proof']"
+ ]
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[]"
+ ]
+ },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "['Context not verified']"
+ ]
+ }
+ }
+ },
+ "permissions.ActorType": {
+ "type": "string",
+ "enum": [
+ "ADMIN_USER",
+ "ADMIN_APP",
+ "ISSUER",
+ "VERIFIER",
+ "VALIDATOR",
+ "HOLDER",
+ "SERVICE_PROVIDER"
+ ],
+ "x-enum-varnames": [
+ "ActorUser",
+ "ActorApp",
+ "ActorIssuer",
+ "ActorVerifier",
+ "ActorValidator",
+ "ActorHolder",
+ "ActorServiceProvider"
+ ]
+ },
+ "permissions.Permission": {
+ "type": "object",
+ "properties": {
+ "actor": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/permissions.ActorType"
+ }
+ ],
+ "example": "ADMIN_USER"
+ },
+ "api_keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dids": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "org": {
+ "type": "string"
+ },
+ "role": {
+ "$ref": "#/definitions/permissions.RoleID"
+ },
+ "scopes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tenant": {
+ "type": "string"
+ }
+ }
+ },
+ "permissions.Role": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "role_id": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/permissions.RoleID"
+ }
+ ],
+ "example": "iqZRLv6L071bwXcJaQdj0msi3pflDxaH"
+ },
+ "scopes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[create_apikeys",
+ " delete_apikeys",
+ " modify_apikeys]"
+ ]
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "permissions.RoleID": {
+ "type": "string",
+ "enum": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ],
+ "x-enum-varnames": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ]
+ }
+ },
+ "securityDefinitions": {
+ "BasicAuth": {
+ "type": "basic"
+ },
+ "Token": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ },
+ "tags": [
+ {
+ "description": "API to manage API-Keys",
+ "name": "Api-Keys"
+ },
+ {
+ "description": "API to manage Authentication flows",
+ "name": "Auth"
+ },
+ {
+ "description": "API to manage the catalog",
+ "name": "Catalog"
+ },
+ {
+ "description": "API to manage the VCAPIs",
+ "name": "VCAPIs"
+ },
+ {
+ "description": "API to manage the providers",
+ "name": "Providers"
+ },
+ {
+ "description": "API to manage the QRConfigs",
+ "name": "QRConfigs"
+ },
+ {
+ "description": "API to manage the Roles",
+ "name": "Roles"
+ },
+ {
+ "description": "API to manage the component DIDs and configuration",
+ "name": "Setup"
+ },
+ {
+ "description": "API to manage the tenants",
+ "name": "Tenants"
+ },
+ {
+ "description": "API to manage Admin Users and Applications",
+ "name": "Users"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-helpers/docs/studio-swagger.json b/dev-helpers/docs/studio-swagger.json
new file mode 100644
index 00000000000..06b705102e4
--- /dev/null
+++ b/dev-helpers/docs/studio-swagger.json
@@ -0,0 +1,3492 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is the full API of the Gataca Studio",
+ "title": "Gataca Studio API",
+ "termsOfService": "https://www.gataca.io/terms-of-service-studio",
+ "contact": {
+ "name": "Gataca",
+ "url": "https://gataca.io",
+ "email": "help@gataca.io"
+ },
+ "version": "3.0.3"
+ },
+ "host": "studio.gataca.io",
+ "basePath": "/api/v1",
+ "paths": {
+ "/admin/v1/events": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get a list of events filtering by tenant or author",
+ "tags": [
+ "Events"
+ ],
+ "summary": "Get a list of events.",
+ "responses": {
+ "200": {
+ "description": "List of Events",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.Event"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/events/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the data of a concrete event",
+ "tags": [
+ "Events"
+ ],
+ "summary": "Get a concrete event",
+ "responses": {
+ "200": {
+ "description": "Event data",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.Event"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/gaas/did/:id": {
+ "delete": {
+ "description": "Delete did\nThis operation removes the did from the license and tenant too.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Gaas"
+ ],
+ "summary": "Delete did",
+ "responses": {
+ "200": {
+ "description": "Did deleted",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "Did not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/gaas/signup": {
+ "post": {
+ "description": "Operation to register a new user in Studio\nThis operation must be called when the user does not exist in the platform",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Gaas"
+ ],
+ "summary": "Sign up",
+ "parameters": [
+ {
+ "description": "User",
+ "name": "user",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User signed up",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Duplicate user",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/gaas/user-invitation": {
+ "post": {
+ "description": "Operation to invite a new user to an org on Studio\nThis operation must be called when the user does not exist in the platform",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Gaas"
+ ],
+ "summary": "Invite user",
+ "parameters": [
+ {
+ "description": "User",
+ "name": "user",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/models.User"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User invited",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Duplicate user",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/groups/private": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create or update a credential group in his own private catalog.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Groups"
+ ],
+ "summary": "Upsert a credential group in his private catalog",
+ "parameters": [
+ {
+ "description": "Group",
+ "name": "authority",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.CredentialGroup"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Group correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "422": {
+ "description": "Invalid Group data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/groups/private/:id": {
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a credential group from his own private catalog.",
+ "tags": [
+ "Groups"
+ ],
+ "summary": "Delete a credential group entry from his private catalog",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "id of the group",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Group correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "missing id param",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuers/private": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create or update an issuer in his own private catalog.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Issuers"
+ ],
+ "summary": "Upsert an issuer in his private catalog",
+ "parameters": [
+ {
+ "description": "Authority",
+ "name": "authority",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Authority"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Issuer correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "422": {
+ "description": "Invalid issuer data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/issuers/private/:id": {
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a issuer from his own private catalog.",
+ "tags": [
+ "Issuers"
+ ],
+ "summary": "Delete a issuer from his private catalog",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Did of the entity",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Provider correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "missing id param",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/licenses": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get all the licenses that you are allow to see.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Licenses"
+ ],
+ "summary": "Get all the licenses.",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.License"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/licenses/:id/did/:did": {
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will remove the did from the license.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Licenses"
+ ],
+ "summary": "Remove a did from license.",
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/licenses/{id}": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get the license matching the id. Íf not id provided, it will get the one on the authorization token.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Licenses"
+ ],
+ "summary": "Get the license by the id provided",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "OrgId",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.License"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/licenses/{id}/tenant": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get the license matching the id. Íf not id provided, it will get the one on the authorization token.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Licenses"
+ ],
+ "summary": "Get the license by the id provided",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Tenant",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.License"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/licenses/{id}/usage": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Send a new telemetry value voluntarely to allow updating the computed value of the license",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Licenses"
+ ],
+ "summary": "Update the license usage",
+ "parameters": [
+ {
+ "description": "Telemetry",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Telemetry"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated license usage",
+ "schema": {
+ "$ref": "#/definitions/models.LicenseUsage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/limits": {
+ "get": {
+ "description": "By receiving a valid orgId as param, this endpoint will update or create the custom limits of the license associated to the orgId provided.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Limits"
+ ],
+ "summary": "Retrieve all the license limits of the platform",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.LicenseLimits"
+ }
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Token to consult the limits."
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "By receiving a definition of license limit, we will update, if code + type already present, or create the new limit.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Limits"
+ ],
+ "summary": "Create or update the custom base limits for license by Gataca.",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.LicenseLimits"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/limits/{id}": {
+ "put": {
+ "description": "By calling this endpoint, you will get all the license limits configured, even if they are no longer active.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Limits"
+ ],
+ "summary": "Update or create the custom limits for a license",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "OrgId",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.LicenseLimits"
+ }
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Token to upsert the limits."
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "JWT"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The endpoint will return a valid signed Verifiable Authorization from a valid va_init provided through the authorization header token\nThe verifiable authorization its mainly used by the EBSI Onboarding Service to serve as login to recover an authorization token to perform write operations.\nThe endpoint will be consumed programatically, does not need further integration.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Get a Verifiable Authorization from a va_init.",
+ "responses": {
+ "200": {
+ "description": "Verifiable Authorization",
+ "schema": {}
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards/enroll": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "If the user logged its a SaaS user, the did will be created and enrolled on license automatically. If on premise, this endpoint will return a token in the response header for the UI to be displayed.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Create a request for the logged user to create a new did.",
+ "parameters": [
+ {
+ "description": "Organization",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Sandbox Invitation",
+ "schema": {
+ "$ref": "#/definitions/controller.SandboxInvitation"
+ }
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards/enroll/:orgId": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The did will be linked to the license of the organization of the logged user. This endpoint will be consumed by the components automatically.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Enroll a did to a valid License.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "OrgId",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Did to be enrolled",
+ "name": "did",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created"
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards/on-premise": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The OnPremise user uses a different flow than the rest of the licenses.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Create a user with an organization and on premise license.",
+ "parameters": [
+ {
+ "description": "Payload",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.enrollEntity"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created"
+ },
+ "400": {
+ "description": "Invalid data",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards/provider": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The provider user needs a different flow than the rest of the clients.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Create a provider with an organization and on premise license and did.",
+ "parameters": [
+ {
+ "description": "Payload",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.enrollEntity"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created"
+ },
+ "400": {
+ "description": "Invalid data",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/onboards/sandbox": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "The invitation may be displayed on a QR inside the gaas and read by the wallet to request to join the onboard.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Onboards"
+ ],
+ "summary": "Create an invitation for a given wallet to join your sandbox",
+ "parameters": [
+ {
+ "description": "Organization",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Sandbox Invitation",
+ "schema": {
+ "$ref": "#/definitions/controller.SandboxInvitation"
+ }
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/organizations": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get all organizations.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Organizations"
+ ],
+ "summary": "Get all organizations",
+ "responses": {
+ "201": {
+ "description": "Organization correctly created.",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a organization. If the org exists already in the database, the service return error.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Organizations"
+ ],
+ "summary": "Create organization",
+ "parameters": [
+ {
+ "description": "Organization",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Organization correctly created.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ },
+ "headers": {
+ "Token": {
+ "type": "string",
+ "description": "Updated access token for the user"
+ },
+ "Token_type": {
+ "type": "string",
+ "description": "jwt"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/organizations/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get a organization by his ID. If the org Id its invalid or does not exist, a error will be returned.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Organizations"
+ ],
+ "summary": "Get organization by Id",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Organization id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Organization data",
+ "schema": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "NotFound organization.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a organization by his ID. If the org Id its invalid or does not exist, a error will be returned.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Organizations"
+ ],
+ "summary": "Delete organization by Id",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Organization id",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "NotFound organization.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/organizations/:oid": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update a organization. If the org does not exists already in the database, the service return error.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Organizations"
+ ],
+ "summary": "Update organization",
+ "parameters": [
+ {
+ "description": "Organization",
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Organization"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "400": {
+ "description": "Invalid organization data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "NotFound organization.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/providers/private": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create or update a service provider in his own private catalog. ServiceProvider.Id its mandatory. ServiceProdiver.Endpoint should be present.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Providers"
+ ],
+ "summary": "Upsert a service provider in his private catalog",
+ "parameters": [
+ {
+ "description": "Provider",
+ "name": "authority",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.ServiceProvider"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Provider correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "422": {
+ "description": "Invalid provider data.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/providers/private/:id": {
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a service provider from his own private catalog.",
+ "tags": [
+ "Providers"
+ ],
+ "summary": "Delete a service provider from his private catalog",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Did of the entity",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Provider correctly upserted.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "400": {
+ "description": "missing id param",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/subscriptions/:id/cancel": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will cancel the current subscription at the current period end",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Cancel subscription at period end",
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "404": {
+ "description": "Subscription not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/subscriptions/:id/period": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will establish an active subscription and new period end optional.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Confirm the subscription for an orgId",
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "422": {
+ "description": "Stripe error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/subscriptions/products": {
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will establish a list of products with prices to be use by subscriptions.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Create the list of products for the provider",
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/token": {
+ "post": {
+ "description": "Operation to authenticate",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Token"
+ ],
+ "summary": "TokenPost",
+ "parameters": [
+ {
+ "description": "Token request",
+ "name": "user",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/models.TokenRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "User signed up",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "409": {
+ "description": "Duplicate user",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/admin/v1/users/{{id}}/profile": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Retrieves the profile from the user invoking the request",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Get the user profile",
+ "responses": {
+ "200": {
+ "description": "User profile",
+ "schema": {
+ "$ref": "#/definitions/models.UserProfile"
+ }
+ },
+ "400": {
+ "description": "Request is malformed",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "User not authenticated",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "User not existing in db",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the profile of the currently authenticated used with no data",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update your profile",
+ "responses": {
+ "200": {
+ "description": "Updated User profile",
+ "schema": {
+ "$ref": "#/definitions/models.UserProfile"
+ }
+ },
+ "400": {
+ "description": "Request is malformed",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "User not authenticated",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "User not existing in db",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Update the profile of the currently authenticated used with no data",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Users"
+ ],
+ "summary": "Update your profile",
+ "parameters": [
+ {
+ "description": "New User Profile",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.UserProfile"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Updated User profile",
+ "schema": {
+ "$ref": "#/definitions/models.UserProfile"
+ }
+ },
+ "400": {
+ "description": "Request is malformed",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "User not authenticated",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "User not existing in db",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/events": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get a list of events filtering by tenant or author",
+ "tags": [
+ "Events"
+ ],
+ "summary": "Get a list of events.",
+ "responses": {
+ "200": {
+ "description": "list of events",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.Event"
+ }
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/events/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the data of a concrete event",
+ "tags": [
+ "Events"
+ ],
+ "summary": "Get a concrete event",
+ "responses": {
+ "200": {
+ "description": "event data",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.Event"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "not found",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/products": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get all the products that you are allow to see.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Products"
+ ],
+ "summary": "Get all the products.",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Product"
+ }
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/requests": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get all the information associated to the requests generated in a concrete tenant",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Requests"
+ ],
+ "summary": "Get all the requests associated to a tenant",
+ "responses": {
+ "200": {
+ "description": "request list",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Request"
+ }
+ }
+ },
+ "400": {
+ "description": "invalid request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "serverside error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Create a request to perform an operation not allowed to perform automatically.\nRequests are analyzed by the administrators and then they are performed accordingly to the organization.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Requests"
+ ],
+ "summary": "Create a request to perform an operation",
+ "parameters": [
+ {
+ "description": "Request",
+ "name": "request",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/models.Request"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created",
+ "schema": {
+ "$ref": "#/definitions/models.Request"
+ }
+ },
+ "400": {
+ "description": "invalid request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "serverside error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/requests/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Get the information associated to a concrete request",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Requests"
+ ],
+ "summary": "Get the information fo a concrete request",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Request ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "request data",
+ "schema": {
+ "$ref": "#/definitions/models.Request"
+ }
+ },
+ "400": {
+ "description": "invalid request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "serverside error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "Delete a request",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Requests"
+ ],
+ "summary": "Delete a request",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Request ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "request data",
+ "schema": {
+ "$ref": "#/definitions/models.Request"
+ }
+ },
+ "400": {
+ "description": "invalid request",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "serverside error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/statistics": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get all the statistics for the current user's organization.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Returns all the statistics for the current user.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Organization Id",
+ "name": "org",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Begin date of the time window",
+ "name": "begin",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "End date of the time window",
+ "name": "end",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.Statistics"
+ }
+ },
+ "400": {
+ "description": "Invalid Metric Code.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "NotFound metrics for organization.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/statistics/:id": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get all the historic with time of the requested metric code.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Returns the historic for the given metric.",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Metric Code",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Organization Id",
+ "name": "org",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Begin date of the time window",
+ "name": "begin",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "End date of the time window",
+ "name": "end",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.MetricStatistics"
+ }
+ },
+ "400": {
+ "description": "Invalid Metric Code.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "403": {
+ "description": "Invalid authentication",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "404": {
+ "description": "NotFound metrics for organization.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/subscriptions": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will get info about the subscription of the current user",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Get subscription info",
+ "responses": {
+ "200": {
+ "description": "Subscription data",
+ "schema": {
+ "$ref": "#/definitions/models.SubscriptionInfo"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/subscriptions/card": {
+ "get": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will cancel the current subscription at the current period end",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Cancel subscription at period end",
+ "responses": {
+ "200": {
+ "description": "OK"
+ },
+ "422": {
+ "description": "Stripe error",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will set the payment method for the client",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Set the payment method.",
+ "responses": {
+ "200": {
+ "description": "Card",
+ "schema": {
+ "type": "string"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/subscriptions/{id}": {
+ "put": {
+ "security": [
+ {
+ "Token": []
+ }
+ ],
+ "description": "By calling this endpoint, you will change your price for a higher interval or another product on your subscription.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Subscriptions"
+ ],
+ "summary": "Update the subscription with the new price.",
+ "parameters": [
+ {
+ "description": "License",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/controller.updateLicenseData"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/models.SubscriptionInfo"
+ }
+ },
+ "500": {
+ "description": "Serverside error processing the request.",
+ "schema": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.ResponseMessage"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "controller.SandboxInvitation": {
+ "type": "object",
+ "properties": {
+ "invitation": {
+ "type": "string"
+ },
+ "sandboxId": {
+ "type": "string"
+ }
+ }
+ },
+ "controller.enrollEntity": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ },
+ "orgInfo": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.OrganizationInfo"
+ },
+ "password": {
+ "type": "string"
+ },
+ "providerId": {
+ "type": "string"
+ }
+ }
+ },
+ "controller.updateLicenseData": {
+ "type": "object",
+ "properties": {
+ "priceId": {
+ "type": "string"
+ }
+ }
+ },
+ "github_com_gataca-io_gaas_models.Event": {
+ "type": "object",
+ "properties": {
+ "author": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "elementId": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "tenant": {
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/models.EventType"
+ }
+ }
+ },
+ "github_com_gataca-io_gaas_models.OrganizationInfo": {
+ "type": "object",
+ "properties": {
+ "EORI": {
+ "type": "string"
+ },
+ "LEI": {
+ "type": "string"
+ },
+ "SEED": {
+ "type": "string"
+ },
+ "SIC": {
+ "type": "string"
+ },
+ "areaGroup": {
+ "type": "string"
+ },
+ "discoveryURL": {
+ "type": "string"
+ },
+ "display": {
+ "$ref": "#/definitions/models.PreferredDisplay"
+ },
+ "domainName": {
+ "type": "string",
+ "example": "education"
+ },
+ "identifierBag": {
+ "type": "string"
+ },
+ "legalPersonalIdentifier": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "services": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.ServiceEndpoint"
+ }
+ }
+ }
+ },
+ "github_com_gataca-io_gaas_models.ResponseMessage": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Some description message"
+ }
+ }
+ },
+ "models.Authority": {
+ "type": "object",
+ "properties": {
+ "address": {
+ "type": "string"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "ledger": {
+ "type": "string"
+ },
+ "level": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.Background": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "type": "string"
+ },
+ "uri": {
+ "type": "string"
+ }
+ }
+ },
+ "models.BillingInfo": {
+ "type": "object",
+ "properties": {
+ "LegalAddress": {
+ "type": "string"
+ },
+ "LegalName": {
+ "type": "string"
+ },
+ "legalAddress": {
+ "$ref": "#/definitions/models.LegalAddress"
+ },
+ "taxReference": {
+ "type": "string"
+ },
+ "vatRegistration": {
+ "type": "string"
+ }
+ }
+ },
+ "models.CatalogChanges": {
+ "type": "object",
+ "properties": {
+ "catalogType": {
+ "$ref": "#/definitions/models.CatalogKey"
+ },
+ "elementId": {
+ "type": "string"
+ }
+ }
+ },
+ "models.CatalogKey": {
+ "type": "string",
+ "enum": [
+ "authority",
+ "credentialType",
+ "credentialGroup",
+ "serviceProvider"
+ ],
+ "x-enum-comments": {
+ "CredentialGroup_Key": "#nosec G101",
+ "CredentialType_Key": "#nosec G101"
+ },
+ "x-enum-varnames": [
+ "Authority_Key",
+ "CredentialType_Key",
+ "CredentialGroup_Key",
+ "ServiceProvider_Key"
+ ]
+ },
+ "models.CredentialGroup": {
+ "type": "object",
+ "properties": {
+ "hidden": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "string"
+ },
+ "issuerList": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Issuer"
+ }
+ },
+ "mainClaim": {
+ "type": "string"
+ },
+ "mainCredential": {
+ "type": "string"
+ },
+ "name": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.CustomLimits": {
+ "type": "object",
+ "properties": {
+ "limits": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.LicenseLimits"
+ }
+ },
+ "validFrom": {
+ "$ref": "#/definitions/models.TimeWithFormat"
+ },
+ "validUntil": {
+ "$ref": "#/definitions/models.TimeWithFormat"
+ }
+ }
+ },
+ "models.EventType": {
+ "type": "string",
+ "enum": [
+ "OrganizationCreation",
+ "OrganizationModification",
+ "OrganizationDeletion",
+ "TenantCreation",
+ "TenantModification",
+ "TenantDeletion",
+ "DidCreation",
+ "DidModification",
+ "DidDeletion",
+ "RequestCatalogModification",
+ "ApproveCatalogModification",
+ "RejectCatalogModification",
+ "RequestExternalProviderSubscriptionModification",
+ "ApproveExternalProviderSubscriptionModification",
+ "RejectExternalProviderSubscriptionModification",
+ "RequestSubscriptionStripeTroubleshooting",
+ "CancelRequest"
+ ],
+ "x-enum-varnames": [
+ "EventOrganizationCreation",
+ "EventOrganizationModification",
+ "EventOrganizationDeletion",
+ "EventTenantCreation",
+ "EventTenantModification",
+ "EventTenantDeletion",
+ "EventDidCreation",
+ "EventDidModification",
+ "EventDidDeletion",
+ "EventRequestCatalogModification",
+ "EventApproveCatalogModification",
+ "EventRejectCatalogModification",
+ "EventRequestExternalProviderSubscriptionModification",
+ "EventApproveExternalProviderSubscriptionModification",
+ "EventRejectExternalProviderSubscriptionModification",
+ "EventRequestSubscriptionStripeTroubleshooting",
+ "EventCancelRequest"
+ ]
+ },
+ "models.Issuer": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "publicRequest": {}
+ }
+ },
+ "models.LegalAddress": {
+ "type": "object",
+ "properties": {
+ "country": {
+ "type": "string"
+ },
+ "locality": {
+ "type": "string"
+ },
+ "number": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string"
+ },
+ "region": {
+ "type": "string"
+ },
+ "street": {
+ "type": "string"
+ },
+ "suite": {
+ "type": "string"
+ }
+ }
+ },
+ "models.License": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "customLimits": {
+ "$ref": "#/definitions/models.CustomLimits"
+ },
+ "dids": {
+ "description": "ScheduledType LicenseType `json:\"scheduledType,omitempty\"`\nTenant DIDs are not the same as license DIDs. Tenants are the ones present on this database. License DIDs are all dids for the license. An OnPremise may not have any dids in SaaS Tenant but the license must have all its dids.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "licenseType": {
+ "description": "Deprecated, use subscription model instead. Left here to be migrated",
+ "type": "string"
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "paymentOutside": {
+ "type": "boolean"
+ },
+ "providerId": {
+ "type": "string"
+ },
+ "sbxId": {
+ "type": "string"
+ },
+ "tenants": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[gataca]"
+ ]
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "usage": {
+ "$ref": "#/definitions/models.LicenseUsage"
+ }
+ }
+ },
+ "models.LicenseLimits": {
+ "type": "object",
+ "properties": {
+ "active": {
+ "type": "boolean"
+ },
+ "code": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "timeRange": {
+ "$ref": "#/definitions/models.TimeRange"
+ },
+ "type": {
+ "type": "string"
+ },
+ "value": {
+ "description": "Assuming only int limits for the moment.",
+ "type": "integer"
+ }
+ }
+ },
+ "models.LicenseUsage": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/models.Usage"
+ }
+ },
+ "models.MetricStatistic": {
+ "type": "object",
+ "properties": {
+ "time": {
+ "$ref": "#/definitions/models.TimeWithFormat"
+ },
+ "value": {
+ "type": "integer"
+ }
+ }
+ },
+ "models.MetricStatistics": {
+ "type": "object",
+ "properties": {
+ "begin": {
+ "$ref": "#/definitions/models.TimeWithFormat"
+ },
+ "end": {
+ "$ref": "#/definitions/models.TimeWithFormat"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "values": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.MetricStatistic"
+ }
+ }
+ }
+ },
+ "models.Organization": {
+ "type": "object",
+ "properties": {
+ "billingInfo": {
+ "$ref": "#/definitions/models.BillingInfo"
+ },
+ "createdAt": {
+ "description": "PaymentMethod *PaymentMethod `gorm:\"embedded;embeddedPrefix:payment_\" json:\"paymentMethod,omitempty\"`",
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "orgInfo": {
+ "$ref": "#/definitions/github_com_gataca-io_gaas_models.OrganizationInfo"
+ },
+ "providerId": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "models.PaymentMethod": {
+ "type": "object",
+ "properties": {
+ "ccvCheck": {
+ "type": "string"
+ },
+ "creditCardNumber": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string"
+ },
+ "expiration": {
+ "type": "string",
+ "example": "01/2050"
+ },
+ "holderName": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ }
+ }
+ },
+ "models.PreferredDisplay": {
+ "type": "object",
+ "properties": {
+ "background": {
+ "$ref": "#/definitions/models.Background"
+ },
+ "logo": {
+ "type": "string"
+ },
+ "preferredName": {
+ "type": "string"
+ },
+ "style": {
+ "$ref": "#/definitions/models.Style"
+ }
+ }
+ },
+ "models.Price": {
+ "type": "object",
+ "properties": {
+ "amount": {
+ "type": "integer"
+ },
+ "currency": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "recurringInterval": {
+ "$ref": "#/definitions/models.PriceRecurringInterval"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "models.PriceRecurringInterval": {
+ "type": "string",
+ "enum": [
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "x-enum-varnames": [
+ "PriceRecurringIntervalDay",
+ "PriceRecurringIntervalWeek",
+ "PriceRecurringIntervalMonth",
+ "PriceRecurringIntervalYear"
+ ]
+ },
+ "models.Product": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "licenseType": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "prices": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.Price"
+ }
+ },
+ "provider": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Request": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "data": {
+ "$ref": "#/definitions/models.RequestData"
+ },
+ "id": {
+ "type": "string"
+ },
+ "processedAt": {
+ "type": "string"
+ },
+ "processor": {
+ "type": "string"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "requester": {
+ "type": "string"
+ },
+ "status": {
+ "$ref": "#/definitions/models.RequestStatus"
+ },
+ "tenant": {
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/models.RequestType"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "models.RequestData": {
+ "type": "object",
+ "properties": {
+ "currentLicense": {
+ "type": "string"
+ },
+ "licenseId": {
+ "type": "string"
+ },
+ "modifications": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/models.CatalogChanges"
+ }
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "priceId": {
+ "type": "string"
+ },
+ "problemDescription": {
+ "type": "string"
+ },
+ "requestedLicense": {
+ "type": "string"
+ },
+ "sbxId": {
+ "type": "string"
+ }
+ }
+ },
+ "models.RequestStatus": {
+ "type": "string",
+ "enum": [
+ "PENDING",
+ "APPLIED",
+ "REJECTED"
+ ],
+ "x-enum-varnames": [
+ "RequestStatusPending",
+ "RequestStatusApplied",
+ "RequestStatusRejected"
+ ]
+ },
+ "models.RequestType": {
+ "type": "string",
+ "enum": [
+ "SubscriptionStripeTroubleshooting",
+ "CatalogModification",
+ "SubscriptionExternalProviderManagement",
+ "DeleteRequest"
+ ],
+ "x-enum-varnames": [
+ "RequestTypeSubscriptionStripeTroubleshooting",
+ "RequestTypeCatalogModification",
+ "RequestTypeSubscriptionExternalProviderManagement",
+ "RequestTypeDelete"
+ ]
+ },
+ "models.ServiceEndpoint": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "serviceEndpoint": {
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/models.ServiceType"
+ }
+ }
+ },
+ "models.ServiceProvider": {
+ "type": "object",
+ "properties": {
+ "address": {
+ "type": "string"
+ },
+ "advertised": {
+ "type": "boolean"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "endpoint": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "ledger": {
+ "type": "string"
+ },
+ "name": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "models.ServiceType": {
+ "type": "string",
+ "enum": [
+ "Verifier",
+ "Issuer"
+ ],
+ "x-enum-varnames": [
+ "ServiceTypeVerifier",
+ "ServiceTypeIssuer"
+ ]
+ },
+ "models.Statistics": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/models.MetricStatistics"
+ }
+ },
+ "models.Style": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "type": "string"
+ },
+ "fontFamily": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SubscriptionInfo": {
+ "type": "object",
+ "properties": {
+ "cancelAtPeriodEnd": {
+ "type": "boolean"
+ },
+ "currentLicenseType": {
+ "type": "string"
+ },
+ "currentPeriodEnd": {
+ "type": "string"
+ },
+ "currentPeriodStart": {
+ "type": "string"
+ },
+ "currentPriceId": {
+ "type": "string"
+ },
+ "currentProductId": {
+ "type": "string"
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "paymentMethod": {
+ "$ref": "#/definitions/models.PaymentMethod"
+ },
+ "paymentOutsideStripe": {
+ "type": "boolean"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "subscriptionSchedule": {
+ "$ref": "#/definitions/models.SubscriptionSchedule"
+ },
+ "subscriptionStatus": {
+ "$ref": "#/definitions/models.SubscriptionStatus"
+ }
+ }
+ },
+ "models.SubscriptionSchedule": {
+ "type": "object",
+ "properties": {
+ "scheduledLicenseType": {
+ "type": "string"
+ },
+ "scheduledPriceId": {
+ "type": "string"
+ },
+ "scheduledProductId": {
+ "type": "string"
+ }
+ }
+ },
+ "models.SubscriptionStatus": {
+ "type": "string",
+ "enum": [
+ "active",
+ "canceled",
+ "incomplete",
+ "incomplete_expired",
+ "past_due",
+ "trialing",
+ "unpaid"
+ ],
+ "x-enum-comments": {
+ "SubscriptionStatusIncompleteExpired": "This is a terminal state for Stripe."
+ },
+ "x-enum-varnames": [
+ "SubscriptionStatusActive",
+ "SubscriptionStatusCanceled",
+ "SubscriptionStatusIncomplete",
+ "SubscriptionStatusIncompleteExpired",
+ "SubscriptionStatusPastDue",
+ "SubscriptionStatusTrialing",
+ "SubscriptionStatusUnpaid"
+ ]
+ },
+ "models.Telemetry": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer"
+ }
+ },
+ "models.TimeRange": {
+ "type": "string",
+ "enum": [
+ "Hourly",
+ "DAILY",
+ "WEEKLY",
+ "MONTHLY",
+ "QUARTERLY",
+ "YEARLY"
+ ],
+ "x-enum-comments": {
+ "Quarterly": "Quarters begin first day of Jan, Apr, Jul \u0026 Oct"
+ },
+ "x-enum-varnames": [
+ "Hourly",
+ "Daily",
+ "Weekly",
+ "Monthly",
+ "Quarterly",
+ "Yearly"
+ ]
+ },
+ "models.TimeWithFormat": {
+ "type": "object",
+ "properties": {
+ "tenants": {
+ "description": "embedded time value",
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.TokenRequest": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "scope": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ }
+ },
+ "models.Usage": {
+ "type": "object",
+ "properties": {
+ "current": {
+ "type": "integer"
+ },
+ "max": {
+ "type": "integer"
+ }
+ }
+ },
+ "models.User": {
+ "type": "object",
+ "properties": {
+ "api_keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"iqZRLv6L071bwXcJaQdj0msi3pflDxaH\"",
+ " \"MDFVdHhnSm82VDFtMkVtdm5BN0hhMGpC\"]"
+ ]
+ },
+ "createdAt": {
+ "description": "SandboxId string `gorm:\"\" json:\"sandbox_id\" example:\"A3FB058B-821D-4CFC-8D3F-67567BBA3E1C\" description:\"Sandbox identifier\"`\nOrgId string `gorm:\"\" json:\"orgId\" example:\"ADDWQEWQE-QWEQ-QWEE-EEQQ-12312312312\" description:\"Org identifier used on Gaas\"`",
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ },
+ "dids": {
+ "type": "string",
+ "example": "[did:gatc:4yu9274yq9gr8yw9423, did:gatc:V1U3V0x1b2hEVDJscGZXYXhaa0thMWRn]"
+ },
+ "email": {
+ "type": "string",
+ "example": "admin@domain.com"
+ },
+ "password": {
+ "type": "string",
+ "example": "S3cuR3p4$sW0rD!"
+ },
+ "phone": {
+ "type": "string",
+ "example": "+34 666 66 66 66"
+ },
+ "provider": {
+ "type": "string",
+ "example": "Gataca"
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/permissions.RoleID"
+ }
+ ],
+ "example": "ADMIN"
+ },
+ "ssi_operations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "[\"verifications-qr1\"",
+ " \"issuance-qr2\"]"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "example": "ACTIVE"
+ },
+ "tenants": {
+ "type": "string",
+ "example": "[gataca]"
+ },
+ "updatedAt": {
+ "type": "string",
+ "example": "2019-10-01T12:12:05.999Z"
+ }
+ }
+ },
+ "models.UserProfile": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/models.User"
+ },
+ "email": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "profilePic": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "permissions.RoleID": {
+ "type": "string",
+ "enum": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ],
+ "x-enum-varnames": [
+ "SuperAdmin",
+ "ProviderAdmin",
+ "TenantAdmin",
+ "DIDOwner",
+ "SSIConfigManager",
+ "APIKeyManager",
+ "OrganizationOwner",
+ "ClientApplication",
+ "HolderWallet",
+ "Operator"
+ ]
+ }
+ },
+ "securityDefinitions": {
+ "BasicAuth": {
+ "type": "basic"
+ },
+ "Token": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ },
+ "tags": [
+ {
+ "description": "API to manage the events",
+ "name": "Events"
+ },
+ {
+ "description": "API to manage the Gaas",
+ "name": "Gaas"
+ },
+ {
+ "description": "API to manage the groups",
+ "name": "Groups"
+ },
+ {
+ "description": "API to manage the issuers",
+ "name": "Issuers"
+ },
+ {
+ "description": "API to manage the licence",
+ "name": "Licenses"
+ },
+ {
+ "description": "API to manage the licence limits",
+ "name": "Limits"
+ },
+ {
+ "description": "API to manage the onboards",
+ "name": "Onboards"
+ },
+ {
+ "description": "API to manage the organization configuration",
+ "name": "Organizations"
+ },
+ {
+ "description": "API to manage the products",
+ "name": "Products"
+ },
+ {
+ "description": "API to manage the providers",
+ "name": "Providers"
+ },
+ {
+ "description": "API to manage the statistics",
+ "name": "Statistics"
+ },
+ {
+ "description": "API to manage the subscriptions",
+ "name": "Subscriptions"
+ },
+ {
+ "description": "API to manage the requests",
+ "name": "Requests"
+ },
+ {
+ "description": "API to manage tokens. NOT AVAILABLE YET",
+ "name": "Token"
+ },
+ {
+ "description": "API to manage the users",
+ "name": "Users"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dist/swagger-initializer.js b/dist/swagger-initializer.js
index 8ea0ea3afc3..f38c2421dc8 100644
--- a/dist/swagger-initializer.js
+++ b/dist/swagger-initializer.js
@@ -3,7 +3,13 @@ window.onload = function() {
// the following lines will be replaced by docker/configurator, when it runs in a docker-container
window.ui = SwaggerUIBundle({
- url: "https://petstore.swagger.io/v2/swagger.json",
+ url: "/docs/studio-swagger.json",
+ urls: [
+ {url: "./docs/studio-swagger.json", name: "Gataca Studio"},
+ {url: "./docs/nucleus-swagger.json", name: "Gataca Nucleus"},
+ {url: "./docs/connect-swagger.json", name: "Gataca Connect"},
+ {url: "/docs/certify-swagger.json", name: "Gataca Certify"},
+ ],
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
diff --git a/dist/swagger-ui-bundle.js b/dist/swagger-ui-bundle.js
index 8dbca51ef4c..e66cdd1c17f 100644
--- a/dist/swagger-ui-bundle.js
+++ b/dist/swagger-ui-bundle.js
@@ -1,3 +1,3 @@
/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */
-!function webpackUniversalModuleDefinition(i,s){"object"==typeof exports&&"object"==typeof module?module.exports=s():"function"==typeof define&&define.amd?define([],s):"object"==typeof exports?exports.SwaggerUIBundle=s():i.SwaggerUIBundle=s()}(this,(()=>(()=>{var i={17967:(i,s)=>{"use strict";s.Nm=s.Rq=void 0;var u=/^([^\w]*)(javascript|data|vbscript)/im,m=/(\w+)(^\w|;)?/g,v=/&(newline|tab);/gi,_=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,j=/^.+(:|:)/gim,M=[".","/"];s.Rq="about:blank",s.Nm=function sanitizeUrl(i){if(!i)return s.Rq;var $=function decodeHtmlCharacters(i){return i.replace(_,"").replace(m,(function(i,s){return String.fromCharCode(s)}))}(i).replace(v,"").replace(_,"").trim();if(!$)return s.Rq;if(function isRelativeUrlWithoutProtocol(i){return M.indexOf(i[0])>-1}($))return $;var W=$.match(j);if(!W)return $;var X=W[0];return u.test(X)?s.Rq:$}},79742:(i,s)=>{"use strict";s.byteLength=function byteLength(i){var s=getLens(i),u=s[0],m=s[1];return 3*(u+m)/4-m},s.toByteArray=function toByteArray(i){var s,u,_=getLens(i),j=_[0],M=_[1],$=new v(function _byteLength(i,s,u){return 3*(s+u)/4-u}(0,j,M)),W=0,X=M>0?j-4:j;for(u=0;u>16&255,$[W++]=s>>8&255,$[W++]=255&s;2===M&&(s=m[i.charCodeAt(u)]<<2|m[i.charCodeAt(u+1)]>>4,$[W++]=255&s);1===M&&(s=m[i.charCodeAt(u)]<<10|m[i.charCodeAt(u+1)]<<4|m[i.charCodeAt(u+2)]>>2,$[W++]=s>>8&255,$[W++]=255&s);return $},s.fromByteArray=function fromByteArray(i){for(var s,m=i.length,v=m%3,_=[],j=16383,M=0,$=m-v;M<$;M+=j)_.push(encodeChunk(i,M,M+j>$?$:M+j));1===v?(s=i[m-1],_.push(u[s>>2]+u[s<<4&63]+"==")):2===v&&(s=(i[m-2]<<8)+i[m-1],_.push(u[s>>10]+u[s>>4&63]+u[s<<2&63]+"="));return _.join("")};for(var u=[],m=[],v="undefined"!=typeof Uint8Array?Uint8Array:Array,_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",j=0;j<64;++j)u[j]=_[j],m[_.charCodeAt(j)]=j;function getLens(i){var s=i.length;if(s%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=i.indexOf("=");return-1===u&&(u=s),[u,u===s?0:4-u%4]}function encodeChunk(i,s,m){for(var v,_,j=[],M=s;M>18&63]+u[_>>12&63]+u[_>>6&63]+u[63&_]);return j.join("")}m["-".charCodeAt(0)]=62,m["_".charCodeAt(0)]=63},48764:(i,s,u)=>{"use strict";const m=u(79742),v=u(80645),_="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;s.Buffer=Buffer,s.SlowBuffer=function SlowBuffer(i){+i!=i&&(i=0);return Buffer.alloc(+i)},s.INSPECT_MAX_BYTES=50;const j=2147483647;function createBuffer(i){if(i>j)throw new RangeError('The value "'+i+'" is invalid for option "size"');const s=new Uint8Array(i);return Object.setPrototypeOf(s,Buffer.prototype),s}function Buffer(i,s,u){if("number"==typeof i){if("string"==typeof s)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(i)}return from(i,s,u)}function from(i,s,u){if("string"==typeof i)return function fromString(i,s){"string"==typeof s&&""!==s||(s="utf8");if(!Buffer.isEncoding(s))throw new TypeError("Unknown encoding: "+s);const u=0|byteLength(i,s);let m=createBuffer(u);const v=m.write(i,s);v!==u&&(m=m.slice(0,v));return m}(i,s);if(ArrayBuffer.isView(i))return function fromArrayView(i){if(isInstance(i,Uint8Array)){const s=new Uint8Array(i);return fromArrayBuffer(s.buffer,s.byteOffset,s.byteLength)}return fromArrayLike(i)}(i);if(null==i)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i);if(isInstance(i,ArrayBuffer)||i&&isInstance(i.buffer,ArrayBuffer))return fromArrayBuffer(i,s,u);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(i,SharedArrayBuffer)||i&&isInstance(i.buffer,SharedArrayBuffer)))return fromArrayBuffer(i,s,u);if("number"==typeof i)throw new TypeError('The "value" argument must not be of type number. Received type number');const m=i.valueOf&&i.valueOf();if(null!=m&&m!==i)return Buffer.from(m,s,u);const v=function fromObject(i){if(Buffer.isBuffer(i)){const s=0|checked(i.length),u=createBuffer(s);return 0===u.length||i.copy(u,0,0,s),u}if(void 0!==i.length)return"number"!=typeof i.length||numberIsNaN(i.length)?createBuffer(0):fromArrayLike(i);if("Buffer"===i.type&&Array.isArray(i.data))return fromArrayLike(i.data)}(i);if(v)return v;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof i[Symbol.toPrimitive])return Buffer.from(i[Symbol.toPrimitive]("string"),s,u);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i)}function assertSize(i){if("number"!=typeof i)throw new TypeError('"size" argument must be of type number');if(i<0)throw new RangeError('The value "'+i+'" is invalid for option "size"')}function allocUnsafe(i){return assertSize(i),createBuffer(i<0?0:0|checked(i))}function fromArrayLike(i){const s=i.length<0?0:0|checked(i.length),u=createBuffer(s);for(let m=0;m=j)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+j.toString(16)+" bytes");return 0|i}function byteLength(i,s){if(Buffer.isBuffer(i))return i.length;if(ArrayBuffer.isView(i)||isInstance(i,ArrayBuffer))return i.byteLength;if("string"!=typeof i)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof i);const u=i.length,m=arguments.length>2&&!0===arguments[2];if(!m&&0===u)return 0;let v=!1;for(;;)switch(s){case"ascii":case"latin1":case"binary":return u;case"utf8":case"utf-8":return utf8ToBytes(i).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*u;case"hex":return u>>>1;case"base64":return base64ToBytes(i).length;default:if(v)return m?-1:utf8ToBytes(i).length;s=(""+s).toLowerCase(),v=!0}}function slowToString(i,s,u){let m=!1;if((void 0===s||s<0)&&(s=0),s>this.length)return"";if((void 0===u||u>this.length)&&(u=this.length),u<=0)return"";if((u>>>=0)<=(s>>>=0))return"";for(i||(i="utf8");;)switch(i){case"hex":return hexSlice(this,s,u);case"utf8":case"utf-8":return utf8Slice(this,s,u);case"ascii":return asciiSlice(this,s,u);case"latin1":case"binary":return latin1Slice(this,s,u);case"base64":return base64Slice(this,s,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,s,u);default:if(m)throw new TypeError("Unknown encoding: "+i);i=(i+"").toLowerCase(),m=!0}}function swap(i,s,u){const m=i[s];i[s]=i[u],i[u]=m}function bidirectionalIndexOf(i,s,u,m,v){if(0===i.length)return-1;if("string"==typeof u?(m=u,u=0):u>2147483647?u=2147483647:u<-2147483648&&(u=-2147483648),numberIsNaN(u=+u)&&(u=v?0:i.length-1),u<0&&(u=i.length+u),u>=i.length){if(v)return-1;u=i.length-1}else if(u<0){if(!v)return-1;u=0}if("string"==typeof s&&(s=Buffer.from(s,m)),Buffer.isBuffer(s))return 0===s.length?-1:arrayIndexOf(i,s,u,m,v);if("number"==typeof s)return s&=255,"function"==typeof Uint8Array.prototype.indexOf?v?Uint8Array.prototype.indexOf.call(i,s,u):Uint8Array.prototype.lastIndexOf.call(i,s,u):arrayIndexOf(i,[s],u,m,v);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(i,s,u,m,v){let _,j=1,M=i.length,$=s.length;if(void 0!==m&&("ucs2"===(m=String(m).toLowerCase())||"ucs-2"===m||"utf16le"===m||"utf-16le"===m)){if(i.length<2||s.length<2)return-1;j=2,M/=2,$/=2,u/=2}function read(i,s){return 1===j?i[s]:i.readUInt16BE(s*j)}if(v){let m=-1;for(_=u;_M&&(u=M-$),_=u;_>=0;_--){let u=!0;for(let m=0;m<$;m++)if(read(i,_+m)!==read(s,m)){u=!1;break}if(u)return _}return-1}function hexWrite(i,s,u,m){u=Number(u)||0;const v=i.length-u;m?(m=Number(m))>v&&(m=v):m=v;const _=s.length;let j;for(m>_/2&&(m=_/2),j=0;j>8,v=u%256,_.push(v),_.push(m);return _}(s,i.length-u),i,u,m)}function base64Slice(i,s,u){return 0===s&&u===i.length?m.fromByteArray(i):m.fromByteArray(i.slice(s,u))}function utf8Slice(i,s,u){u=Math.min(i.length,u);const m=[];let v=s;for(;v239?4:s>223?3:s>191?2:1;if(v+j<=u){let u,m,M,$;switch(j){case 1:s<128&&(_=s);break;case 2:u=i[v+1],128==(192&u)&&($=(31&s)<<6|63&u,$>127&&(_=$));break;case 3:u=i[v+1],m=i[v+2],128==(192&u)&&128==(192&m)&&($=(15&s)<<12|(63&u)<<6|63&m,$>2047&&($<55296||$>57343)&&(_=$));break;case 4:u=i[v+1],m=i[v+2],M=i[v+3],128==(192&u)&&128==(192&m)&&128==(192&M)&&($=(15&s)<<18|(63&u)<<12|(63&m)<<6|63&M,$>65535&&$<1114112&&(_=$))}}null===_?(_=65533,j=1):_>65535&&(_-=65536,m.push(_>>>10&1023|55296),_=56320|1023&_),m.push(_),v+=j}return function decodeCodePointsArray(i){const s=i.length;if(s<=M)return String.fromCharCode.apply(String,i);let u="",m=0;for(;mm.length?(Buffer.isBuffer(s)||(s=Buffer.from(s)),s.copy(m,v)):Uint8Array.prototype.set.call(m,s,v);else{if(!Buffer.isBuffer(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(m,v)}v+=s.length}return m},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const i=this.length;if(i%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let s=0;su&&(i+=" ... "),""},_&&(Buffer.prototype[_]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(i,s,u,m,v){if(isInstance(i,Uint8Array)&&(i=Buffer.from(i,i.offset,i.byteLength)),!Buffer.isBuffer(i))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof i);if(void 0===s&&(s=0),void 0===u&&(u=i?i.length:0),void 0===m&&(m=0),void 0===v&&(v=this.length),s<0||u>i.length||m<0||v>this.length)throw new RangeError("out of range index");if(m>=v&&s>=u)return 0;if(m>=v)return-1;if(s>=u)return 1;if(this===i)return 0;let _=(v>>>=0)-(m>>>=0),j=(u>>>=0)-(s>>>=0);const M=Math.min(_,j),$=this.slice(m,v),W=i.slice(s,u);for(let i=0;i>>=0,isFinite(u)?(u>>>=0,void 0===m&&(m="utf8")):(m=u,u=void 0)}const v=this.length-s;if((void 0===u||u>v)&&(u=v),i.length>0&&(u<0||s<0)||s>this.length)throw new RangeError("Attempt to write outside buffer bounds");m||(m="utf8");let _=!1;for(;;)switch(m){case"hex":return hexWrite(this,i,s,u);case"utf8":case"utf-8":return utf8Write(this,i,s,u);case"ascii":case"latin1":case"binary":return asciiWrite(this,i,s,u);case"base64":return base64Write(this,i,s,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,i,s,u);default:if(_)throw new TypeError("Unknown encoding: "+m);m=(""+m).toLowerCase(),_=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const M=4096;function asciiSlice(i,s,u){let m="";u=Math.min(i.length,u);for(let v=s;vm)&&(u=m);let v="";for(let m=s;mu)throw new RangeError("Trying to access beyond buffer length")}function checkInt(i,s,u,m,v,_){if(!Buffer.isBuffer(i))throw new TypeError('"buffer" argument must be a Buffer instance');if(s>v||s<_)throw new RangeError('"value" argument is out of bounds');if(u+m>i.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(i,s,u,m,v){checkIntBI(s,m,v,i,u,7);let _=Number(s&BigInt(4294967295));i[u++]=_,_>>=8,i[u++]=_,_>>=8,i[u++]=_,_>>=8,i[u++]=_;let j=Number(s>>BigInt(32)&BigInt(4294967295));return i[u++]=j,j>>=8,i[u++]=j,j>>=8,i[u++]=j,j>>=8,i[u++]=j,u}function wrtBigUInt64BE(i,s,u,m,v){checkIntBI(s,m,v,i,u,7);let _=Number(s&BigInt(4294967295));i[u+7]=_,_>>=8,i[u+6]=_,_>>=8,i[u+5]=_,_>>=8,i[u+4]=_;let j=Number(s>>BigInt(32)&BigInt(4294967295));return i[u+3]=j,j>>=8,i[u+2]=j,j>>=8,i[u+1]=j,j>>=8,i[u]=j,u+8}function checkIEEE754(i,s,u,m,v,_){if(u+m>i.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("Index out of range")}function writeFloat(i,s,u,m,_){return s=+s,u>>>=0,_||checkIEEE754(i,0,u,4),v.write(i,s,u,m,23,4),u+4}function writeDouble(i,s,u,m,_){return s=+s,u>>>=0,_||checkIEEE754(i,0,u,8),v.write(i,s,u,m,52,8),u+8}Buffer.prototype.slice=function slice(i,s){const u=this.length;(i=~~i)<0?(i+=u)<0&&(i=0):i>u&&(i=u),(s=void 0===s?u:~~s)<0?(s+=u)<0&&(s=0):s>u&&(s=u),s>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i],v=1,_=0;for(;++_>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i+--s],v=1;for(;s>0&&(v*=256);)m+=this[i+--s]*v;return m},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(i,s){return i>>>=0,s||checkOffset(i,1,this.length),this[i]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(i,s){return i>>>=0,s||checkOffset(i,2,this.length),this[i]|this[i+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(i,s){return i>>>=0,s||checkOffset(i,2,this.length),this[i]<<8|this[i+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),(this[i]|this[i+1]<<8|this[i+2]<<16)+16777216*this[i+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),16777216*this[i]+(this[i+1]<<16|this[i+2]<<8|this[i+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(i){validateNumber(i>>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=s+256*this[++i]+65536*this[++i]+this[++i]*2**24,v=this[++i]+256*this[++i]+65536*this[++i]+u*2**24;return BigInt(m)+(BigInt(v)<>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=s*2**24+65536*this[++i]+256*this[++i]+this[++i],v=this[++i]*2**24+65536*this[++i]+256*this[++i]+u;return(BigInt(m)<>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i],v=1,_=0;for(;++_=v&&(m-=Math.pow(2,8*s)),m},Buffer.prototype.readIntBE=function readIntBE(i,s,u){i>>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=s,v=1,_=this[i+--m];for(;m>0&&(v*=256);)_+=this[i+--m]*v;return v*=128,_>=v&&(_-=Math.pow(2,8*s)),_},Buffer.prototype.readInt8=function readInt8(i,s){return i>>>=0,s||checkOffset(i,1,this.length),128&this[i]?-1*(255-this[i]+1):this[i]},Buffer.prototype.readInt16LE=function readInt16LE(i,s){i>>>=0,s||checkOffset(i,2,this.length);const u=this[i]|this[i+1]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt16BE=function readInt16BE(i,s){i>>>=0,s||checkOffset(i,2,this.length);const u=this[i+1]|this[i]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt32LE=function readInt32LE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),this[i]|this[i+1]<<8|this[i+2]<<16|this[i+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),this[i]<<24|this[i+1]<<16|this[i+2]<<8|this[i+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(i){validateNumber(i>>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=this[i+4]+256*this[i+5]+65536*this[i+6]+(u<<24);return(BigInt(m)<>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=(s<<24)+65536*this[++i]+256*this[++i]+this[++i];return(BigInt(m)<>>=0,s||checkOffset(i,4,this.length),v.read(this,i,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),v.read(this,i,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(i,s){return i>>>=0,s||checkOffset(i,8,this.length),v.read(this,i,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(i,s){return i>>>=0,s||checkOffset(i,8,this.length),v.read(this,i,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(i,s,u,m){if(i=+i,s>>>=0,u>>>=0,!m){checkInt(this,i,s,u,Math.pow(2,8*u)-1,0)}let v=1,_=0;for(this[s]=255&i;++_>>=0,u>>>=0,!m){checkInt(this,i,s,u,Math.pow(2,8*u)-1,0)}let v=u-1,_=1;for(this[s+v]=255&i;--v>=0&&(_*=256);)this[s+v]=i/_&255;return s+u},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,1,255,0),this[s]=255&i,s+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,65535,0),this[s]=255&i,this[s+1]=i>>>8,s+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,65535,0),this[s]=i>>>8,this[s+1]=255&i,s+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,4294967295,0),this[s+3]=i>>>24,this[s+2]=i>>>16,this[s+1]=i>>>8,this[s]=255&i,s+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,4294967295,0),this[s]=i>>>24,this[s+1]=i>>>16,this[s+2]=i>>>8,this[s+3]=255&i,s+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(i,s=0){return wrtBigUInt64LE(this,i,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(i,s=0){return wrtBigUInt64BE(this,i,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(i,s,u,m){if(i=+i,s>>>=0,!m){const m=Math.pow(2,8*u-1);checkInt(this,i,s,u,m-1,-m)}let v=0,_=1,j=0;for(this[s]=255&i;++v>0)-j&255;return s+u},Buffer.prototype.writeIntBE=function writeIntBE(i,s,u,m){if(i=+i,s>>>=0,!m){const m=Math.pow(2,8*u-1);checkInt(this,i,s,u,m-1,-m)}let v=u-1,_=1,j=0;for(this[s+v]=255&i;--v>=0&&(_*=256);)i<0&&0===j&&0!==this[s+v+1]&&(j=1),this[s+v]=(i/_>>0)-j&255;return s+u},Buffer.prototype.writeInt8=function writeInt8(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,1,127,-128),i<0&&(i=255+i+1),this[s]=255&i,s+1},Buffer.prototype.writeInt16LE=function writeInt16LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,32767,-32768),this[s]=255&i,this[s+1]=i>>>8,s+2},Buffer.prototype.writeInt16BE=function writeInt16BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,32767,-32768),this[s]=i>>>8,this[s+1]=255&i,s+2},Buffer.prototype.writeInt32LE=function writeInt32LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,2147483647,-2147483648),this[s]=255&i,this[s+1]=i>>>8,this[s+2]=i>>>16,this[s+3]=i>>>24,s+4},Buffer.prototype.writeInt32BE=function writeInt32BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,2147483647,-2147483648),i<0&&(i=4294967295+i+1),this[s]=i>>>24,this[s+1]=i>>>16,this[s+2]=i>>>8,this[s+3]=255&i,s+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(i,s=0){return wrtBigUInt64LE(this,i,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(i,s=0){return wrtBigUInt64BE(this,i,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(i,s,u){return writeFloat(this,i,s,!0,u)},Buffer.prototype.writeFloatBE=function writeFloatBE(i,s,u){return writeFloat(this,i,s,!1,u)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(i,s,u){return writeDouble(this,i,s,!0,u)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(i,s,u){return writeDouble(this,i,s,!1,u)},Buffer.prototype.copy=function copy(i,s,u,m){if(!Buffer.isBuffer(i))throw new TypeError("argument should be a Buffer");if(u||(u=0),m||0===m||(m=this.length),s>=i.length&&(s=i.length),s||(s=0),m>0&&m=this.length)throw new RangeError("Index out of range");if(m<0)throw new RangeError("sourceEnd out of bounds");m>this.length&&(m=this.length),i.length-s>>=0,u=void 0===u?this.length:u>>>0,i||(i=0),"number"==typeof i)for(v=s;v=m+4;u-=3)s=`_${i.slice(u-3,u)}${s}`;return`${i.slice(0,u)}${s}`}function checkIntBI(i,s,u,m,v,_){if(i>u||i3?0===s||s===BigInt(0)?`>= 0${m} and < 2${m} ** ${8*(_+1)}${m}`:`>= -(2${m} ** ${8*(_+1)-1}${m}) and < 2 ** ${8*(_+1)-1}${m}`:`>= ${s}${m} and <= ${u}${m}`,new $.ERR_OUT_OF_RANGE("value",v,i)}!function checkBounds(i,s,u){validateNumber(s,"offset"),void 0!==i[s]&&void 0!==i[s+u]||boundsError(s,i.length-(u+1))}(m,v,_)}function validateNumber(i,s){if("number"!=typeof i)throw new $.ERR_INVALID_ARG_TYPE(s,"number",i)}function boundsError(i,s,u){if(Math.floor(i)!==i)throw validateNumber(i,u),new $.ERR_OUT_OF_RANGE(u||"offset","an integer",i);if(s<0)throw new $.ERR_BUFFER_OUT_OF_BOUNDS;throw new $.ERR_OUT_OF_RANGE(u||"offset",`>= ${u?1:0} and <= ${s}`,i)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(i){return i?`${i} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(i,s){return`The "${i}" argument must be of type number. Received type ${typeof s}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(i,s,u){let m=`The value of "${i}" is out of range.`,v=u;return Number.isInteger(u)&&Math.abs(u)>2**32?v=addNumericalSeparator(String(u)):"bigint"==typeof u&&(v=String(u),(u>BigInt(2)**BigInt(32)||u<-(BigInt(2)**BigInt(32)))&&(v=addNumericalSeparator(v)),v+="n"),m+=` It must be ${s}. Received ${v}`,m}),RangeError);const W=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(i,s){let u;s=s||1/0;const m=i.length;let v=null;const _=[];for(let j=0;j55295&&u<57344){if(!v){if(u>56319){(s-=3)>-1&&_.push(239,191,189);continue}if(j+1===m){(s-=3)>-1&&_.push(239,191,189);continue}v=u;continue}if(u<56320){(s-=3)>-1&&_.push(239,191,189),v=u;continue}u=65536+(v-55296<<10|u-56320)}else v&&(s-=3)>-1&&_.push(239,191,189);if(v=null,u<128){if((s-=1)<0)break;_.push(u)}else if(u<2048){if((s-=2)<0)break;_.push(u>>6|192,63&u|128)}else if(u<65536){if((s-=3)<0)break;_.push(u>>12|224,u>>6&63|128,63&u|128)}else{if(!(u<1114112))throw new Error("Invalid code point");if((s-=4)<0)break;_.push(u>>18|240,u>>12&63|128,u>>6&63|128,63&u|128)}}return _}function base64ToBytes(i){return m.toByteArray(function base64clean(i){if((i=(i=i.split("=")[0]).trim().replace(W,"")).length<2)return"";for(;i.length%4!=0;)i+="=";return i}(i))}function blitBuffer(i,s,u,m){let v;for(v=0;v=s.length||v>=i.length);++v)s[v+u]=i[v];return v}function isInstance(i,s){return i instanceof s||null!=i&&null!=i.constructor&&null!=i.constructor.name&&i.constructor.name===s.name}function numberIsNaN(i){return i!=i}const X=function(){const i="0123456789abcdef",s=new Array(256);for(let u=0;u<16;++u){const m=16*u;for(let v=0;v<16;++v)s[m+v]=i[u]+i[v]}return s}();function defineBigIntMethod(i){return"undefined"==typeof BigInt?BufferBigIntNotDefined:i}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},21924:(i,s,u)=>{"use strict";var m=u(40210),v=u(55559),_=v(m("String.prototype.indexOf"));i.exports=function callBoundIntrinsic(i,s){var u=m(i,!!s);return"function"==typeof u&&_(i,".prototype.")>-1?v(u):u}},55559:(i,s,u)=>{"use strict";var m=u(58612),v=u(40210),_=v("%Function.prototype.apply%"),j=v("%Function.prototype.call%"),M=v("%Reflect.apply%",!0)||m.call(j,_),$=v("%Object.getOwnPropertyDescriptor%",!0),W=v("%Object.defineProperty%",!0),X=v("%Math.max%");if(W)try{W({},"a",{value:1})}catch(i){W=null}i.exports=function callBind(i){var s=M(m,j,arguments);$&&W&&($(s,"length").configurable&&W(s,"length",{value:1+X(0,i.length-(arguments.length-1))}));return s};var Y=function applyBind(){return M(m,_,arguments)};W?W(i.exports,"apply",{value:Y}):i.exports.apply=Y},94184:(i,s)=>{var u;!function(){"use strict";var m={}.hasOwnProperty;function classNames(){for(var i=[],s=0;s{"use strict";s.parse=function parse(i,s){if("string"!=typeof i)throw new TypeError("argument str must be a string");var u={},m=(s||{}).decode||decode,v=0;for(;v{"use strict";var m=u(11742),v={"text/plain":"Text","text/html":"Url",default:"Text"};i.exports=function copy(i,s){var u,_,j,M,$,W,X=!1;s||(s={}),u=s.debug||!1;try{if(j=m(),M=document.createRange(),$=document.getSelection(),(W=document.createElement("span")).textContent=i,W.ariaHidden="true",W.style.all="unset",W.style.position="fixed",W.style.top=0,W.style.clip="rect(0, 0, 0, 0)",W.style.whiteSpace="pre",W.style.webkitUserSelect="text",W.style.MozUserSelect="text",W.style.msUserSelect="text",W.style.userSelect="text",W.addEventListener("copy",(function(m){if(m.stopPropagation(),s.format)if(m.preventDefault(),void 0===m.clipboardData){u&&console.warn("unable to use e.clipboardData"),u&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var _=v[s.format]||v.default;window.clipboardData.setData(_,i)}else m.clipboardData.clearData(),m.clipboardData.setData(s.format,i);s.onCopy&&(m.preventDefault(),s.onCopy(m.clipboardData))})),document.body.appendChild(W),M.selectNodeContents(W),$.addRange(M),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");X=!0}catch(m){u&&console.error("unable to copy using execCommand: ",m),u&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(s.format||"text",i),s.onCopy&&s.onCopy(window.clipboardData),X=!0}catch(m){u&&console.error("unable to copy using clipboardData: ",m),u&&console.error("falling back to prompt"),_=function format(i){var s=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return i.replace(/#{\s*key\s*}/g,s)}("message"in s?s.message:"Copy to clipboard: #{key}, Enter"),window.prompt(_,i)}}finally{$&&("function"==typeof $.removeRange?$.removeRange(M):$.removeAllRanges()),W&&document.body.removeChild(W),j()}return X}},44101:(i,s,u)=>{var m=u(18957);i.exports=m},90093:(i,s,u)=>{var m=u(28196);i.exports=m},65362:(i,s,u)=>{var m=u(63383);i.exports=m},50415:(i,s,u)=>{u(61181),u(47627),u(24415),u(66274),u(77971);var m=u(54058);i.exports=m.AggregateError},27700:(i,s,u)=>{u(73381);var m=u(35703);i.exports=m("Function").bind},16246:(i,s,u)=>{var m=u(7046),v=u(27700),_=Function.prototype;i.exports=function(i){var s=i.bind;return i===_||m(_,i)&&s===_.bind?v:s}},45999:(i,s,u)=>{u(49221);var m=u(54058);i.exports=m.Object.assign},16121:(i,s,u)=>{i.exports=u(38644)},14122:(i,s,u)=>{i.exports=u(89097)},60269:(i,s,u)=>{i.exports=u(76936)},38644:(i,s,u)=>{u(89731);var m=u(44101);i.exports=m},89097:(i,s,u)=>{var m=u(90093);i.exports=m},76936:(i,s,u)=>{var m=u(65362);i.exports=m},24883:(i,s,u)=>{var m=u(57475),v=u(69826),_=TypeError;i.exports=function(i){if(m(i))return i;throw _(v(i)+" is not a function")}},11851:(i,s,u)=>{var m=u(57475),v=String,_=TypeError;i.exports=function(i){if("object"==typeof i||m(i))return i;throw _("Can't set "+v(i)+" as a prototype")}},18479:i=>{i.exports=function(){}},96059:(i,s,u)=>{var m=u(10941),v=String,_=TypeError;i.exports=function(i){if(m(i))return i;throw _(v(i)+" is not an object")}},31692:(i,s,u)=>{var m=u(74529),v=u(59413),_=u(10623),createMethod=function(i){return function(s,u,j){var M,$=m(s),W=_($),X=v(j,W);if(i&&u!=u){for(;W>X;)if((M=$[X++])!=M)return!0}else for(;W>X;X++)if((i||X in $)&&$[X]===u)return i||X||0;return!i&&-1}};i.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},93765:(i,s,u)=>{var m=u(95329);i.exports=m([].slice)},82532:(i,s,u)=>{var m=u(95329),v=m({}.toString),_=m("".slice);i.exports=function(i){return _(v(i),8,-1)}},9697:(i,s,u)=>{var m=u(22885),v=u(57475),_=u(82532),j=u(99813)("toStringTag"),M=Object,$="Arguments"==_(function(){return arguments}());i.exports=m?_:function(i){var s,u,m;return void 0===i?"Undefined":null===i?"Null":"string"==typeof(u=function(i,s){try{return i[s]}catch(i){}}(s=M(i),j))?u:$?_(s):"Object"==(m=_(s))&&v(s.callee)?"Arguments":m}},23489:(i,s,u)=>{var m=u(90953),v=u(31136),_=u(49677),j=u(65988);i.exports=function(i,s,u){for(var M=v(s),$=j.f,W=_.f,X=0;X{var m=u(95981);i.exports=!m((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},23538:i=>{i.exports=function(i,s){return{value:i,done:s}}},32029:(i,s,u)=>{var m=u(55746),v=u(65988),_=u(31887);i.exports=m?function(i,s,u){return v.f(i,s,_(1,u))}:function(i,s,u){return i[s]=u,i}},31887:i=>{i.exports=function(i,s){return{enumerable:!(1&i),configurable:!(2&i),writable:!(4&i),value:s}}},95929:(i,s,u)=>{var m=u(32029);i.exports=function(i,s,u,v){return v&&v.enumerable?i[s]=u:m(i,s,u),i}},75609:(i,s,u)=>{var m=u(21899),v=Object.defineProperty;i.exports=function(i,s){try{v(m,i,{value:s,configurable:!0,writable:!0})}catch(u){m[i]=s}return s}},55746:(i,s,u)=>{var m=u(95981);i.exports=!m((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},76616:i=>{var s="object"==typeof document&&document.all,u=void 0===s&&void 0!==s;i.exports={all:s,IS_HTMLDDA:u}},61333:(i,s,u)=>{var m=u(21899),v=u(10941),_=m.document,j=v(_)&&v(_.createElement);i.exports=function(i){return j?_.createElement(i):{}}},63281:i=>{i.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},2861:i=>{i.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},53385:(i,s,u)=>{var m,v,_=u(21899),j=u(2861),M=_.process,$=_.Deno,W=M&&M.versions||$&&$.version,X=W&&W.v8;X&&(v=(m=X.split("."))[0]>0&&m[0]<4?1:+(m[0]+m[1])),!v&&j&&(!(m=j.match(/Edge\/(\d+)/))||m[1]>=74)&&(m=j.match(/Chrome\/(\d+)/))&&(v=+m[1]),i.exports=v},35703:(i,s,u)=>{var m=u(54058);i.exports=function(i){return m[i+"Prototype"]}},56759:i=>{i.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},53995:(i,s,u)=>{var m=u(95329),v=Error,_=m("".replace),j=String(v("zxcasd").stack),M=/\n\s*at [^:]*:[^\n]*/,$=M.test(j);i.exports=function(i,s){if($&&"string"==typeof i&&!v.prepareStackTrace)for(;s--;)i=_(i,M,"");return i}},79585:(i,s,u)=>{var m=u(32029),v=u(53995),_=u(18780),j=Error.captureStackTrace;i.exports=function(i,s,u,M){_&&(j?j(i,s):m(i,"stack",v(u,M)))}},18780:(i,s,u)=>{var m=u(95981),v=u(31887);i.exports=!m((function(){var i=Error("a");return!("stack"in i)||(Object.defineProperty(i,"stack",v(1,7)),7!==i.stack)}))},76887:(i,s,u)=>{"use strict";var m=u(21899),v=u(79730),_=u(97484),j=u(57475),M=u(49677).f,$=u(37252),W=u(54058),X=u(86843),Y=u(32029),Z=u(90953),wrapConstructor=function(i){var Wrapper=function(s,u,m){if(this instanceof Wrapper){switch(arguments.length){case 0:return new i;case 1:return new i(s);case 2:return new i(s,u)}return new i(s,u,m)}return v(i,this,arguments)};return Wrapper.prototype=i.prototype,Wrapper};i.exports=function(i,s){var u,v,ee,ae,ie,le,ce,pe,de,fe=i.target,ye=i.global,be=i.stat,_e=i.proto,we=ye?m:be?m[fe]:(m[fe]||{}).prototype,Se=ye?W:W[fe]||Y(W,fe,{})[fe],xe=Se.prototype;for(ae in s)v=!(u=$(ye?ae:fe+(be?".":"#")+ae,i.forced))&&we&&Z(we,ae),le=Se[ae],v&&(ce=i.dontCallGetSet?(de=M(we,ae))&&de.value:we[ae]),ie=v&&ce?ce:s[ae],v&&typeof le==typeof ie||(pe=i.bind&&v?X(ie,m):i.wrap&&v?wrapConstructor(ie):_e&&j(ie)?_(ie):ie,(i.sham||ie&&ie.sham||le&&le.sham)&&Y(pe,"sham",!0),Y(Se,ae,pe),_e&&(Z(W,ee=fe+"Prototype")||Y(W,ee,{}),Y(W[ee],ae,ie),i.real&&xe&&(u||!xe[ae])&&Y(xe,ae,ie)))}},95981:i=>{i.exports=function(i){try{return!!i()}catch(i){return!0}}},79730:(i,s,u)=>{var m=u(18285),v=Function.prototype,_=v.apply,j=v.call;i.exports="object"==typeof Reflect&&Reflect.apply||(m?j.bind(_):function(){return j.apply(_,arguments)})},86843:(i,s,u)=>{var m=u(97484),v=u(24883),_=u(18285),j=m(m.bind);i.exports=function(i,s){return v(i),void 0===s?i:_?j(i,s):function(){return i.apply(s,arguments)}}},18285:(i,s,u)=>{var m=u(95981);i.exports=!m((function(){var i=function(){}.bind();return"function"!=typeof i||i.hasOwnProperty("prototype")}))},98308:(i,s,u)=>{"use strict";var m=u(95329),v=u(24883),_=u(10941),j=u(90953),M=u(93765),$=u(18285),W=Function,X=m([].concat),Y=m([].join),Z={};i.exports=$?W.bind:function bind(i){var s=v(this),u=s.prototype,m=M(arguments,1),$=function bound(){var u=X(m,M(arguments));return this instanceof $?function(i,s,u){if(!j(Z,s)){for(var m=[],v=0;v{var m=u(18285),v=Function.prototype.call;i.exports=m?v.bind(v):function(){return v.apply(v,arguments)}},79417:(i,s,u)=>{var m=u(55746),v=u(90953),_=Function.prototype,j=m&&Object.getOwnPropertyDescriptor,M=v(_,"name"),$=M&&"something"===function something(){}.name,W=M&&(!m||m&&j(_,"name").configurable);i.exports={EXISTS:M,PROPER:$,CONFIGURABLE:W}},45526:(i,s,u)=>{var m=u(95329),v=u(24883);i.exports=function(i,s,u){try{return m(v(Object.getOwnPropertyDescriptor(i,s)[u]))}catch(i){}}},97484:(i,s,u)=>{var m=u(82532),v=u(95329);i.exports=function(i){if("Function"===m(i))return v(i)}},95329:(i,s,u)=>{var m=u(18285),v=Function.prototype,_=v.call,j=m&&v.bind.bind(_,_);i.exports=m?j:function(i){return function(){return _.apply(i,arguments)}}},626:(i,s,u)=>{var m=u(54058),v=u(21899),_=u(57475),aFunction=function(i){return _(i)?i:void 0};i.exports=function(i,s){return arguments.length<2?aFunction(m[i])||aFunction(v[i]):m[i]&&m[i][s]||v[i]&&v[i][s]}},22902:(i,s,u)=>{var m=u(9697),v=u(14229),_=u(82119),j=u(12077),M=u(99813)("iterator");i.exports=function(i){if(!_(i))return v(i,M)||v(i,"@@iterator")||j[m(i)]}},53476:(i,s,u)=>{var m=u(78834),v=u(24883),_=u(96059),j=u(69826),M=u(22902),$=TypeError;i.exports=function(i,s){var u=arguments.length<2?M(i):s;if(v(u))return _(m(u,i));throw $(j(i)+" is not iterable")}},14229:(i,s,u)=>{var m=u(24883),v=u(82119);i.exports=function(i,s){var u=i[s];return v(u)?void 0:m(u)}},21899:function(i,s,u){var check=function(i){return i&&i.Math==Math&&i};i.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof u.g&&u.g)||function(){return this}()||this||Function("return this")()},90953:(i,s,u)=>{var m=u(95329),v=u(89678),_=m({}.hasOwnProperty);i.exports=Object.hasOwn||function hasOwn(i,s){return _(v(i),s)}},27748:i=>{i.exports={}},15463:(i,s,u)=>{var m=u(626);i.exports=m("document","documentElement")},2840:(i,s,u)=>{var m=u(55746),v=u(95981),_=u(61333);i.exports=!m&&!v((function(){return 7!=Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a}))},37026:(i,s,u)=>{var m=u(95329),v=u(95981),_=u(82532),j=Object,M=m("".split);i.exports=v((function(){return!j("z").propertyIsEnumerable(0)}))?function(i){return"String"==_(i)?M(i,""):j(i)}:j},70926:(i,s,u)=>{var m=u(57475),v=u(10941),_=u(88929);i.exports=function(i,s,u){var j,M;return _&&m(j=s.constructor)&&j!==u&&v(M=j.prototype)&&M!==u.prototype&&_(i,M),i}},53794:(i,s,u)=>{var m=u(10941),v=u(32029);i.exports=function(i,s){m(s)&&"cause"in s&&v(i,"cause",s.cause)}},45402:(i,s,u)=>{var m,v,_,j=u(47093),M=u(21899),$=u(10941),W=u(32029),X=u(90953),Y=u(63030),Z=u(44262),ee=u(27748),ae="Object already initialized",ie=M.TypeError,le=M.WeakMap;if(j||Y.state){var ce=Y.state||(Y.state=new le);ce.get=ce.get,ce.has=ce.has,ce.set=ce.set,m=function(i,s){if(ce.has(i))throw ie(ae);return s.facade=i,ce.set(i,s),s},v=function(i){return ce.get(i)||{}},_=function(i){return ce.has(i)}}else{var pe=Z("state");ee[pe]=!0,m=function(i,s){if(X(i,pe))throw ie(ae);return s.facade=i,W(i,pe,s),s},v=function(i){return X(i,pe)?i[pe]:{}},_=function(i){return X(i,pe)}}i.exports={set:m,get:v,has:_,enforce:function(i){return _(i)?v(i):m(i,{})},getterFor:function(i){return function(s){var u;if(!$(s)||(u=v(s)).type!==i)throw ie("Incompatible receiver, "+i+" required");return u}}}},6782:(i,s,u)=>{var m=u(99813),v=u(12077),_=m("iterator"),j=Array.prototype;i.exports=function(i){return void 0!==i&&(v.Array===i||j[_]===i)}},57475:(i,s,u)=>{var m=u(76616),v=m.all;i.exports=m.IS_HTMLDDA?function(i){return"function"==typeof i||i===v}:function(i){return"function"==typeof i}},37252:(i,s,u)=>{var m=u(95981),v=u(57475),_=/#|\.prototype\./,isForced=function(i,s){var u=M[j(i)];return u==W||u!=$&&(v(s)?m(s):!!s)},j=isForced.normalize=function(i){return String(i).replace(_,".").toLowerCase()},M=isForced.data={},$=isForced.NATIVE="N",W=isForced.POLYFILL="P";i.exports=isForced},82119:i=>{i.exports=function(i){return null==i}},10941:(i,s,u)=>{var m=u(57475),v=u(76616),_=v.all;i.exports=v.IS_HTMLDDA?function(i){return"object"==typeof i?null!==i:m(i)||i===_}:function(i){return"object"==typeof i?null!==i:m(i)}},82529:i=>{i.exports=!0},56664:(i,s,u)=>{var m=u(626),v=u(57475),_=u(7046),j=u(32302),M=Object;i.exports=j?function(i){return"symbol"==typeof i}:function(i){var s=m("Symbol");return v(s)&&_(s.prototype,M(i))}},93091:(i,s,u)=>{var m=u(86843),v=u(78834),_=u(96059),j=u(69826),M=u(6782),$=u(10623),W=u(7046),X=u(53476),Y=u(22902),Z=u(7609),ee=TypeError,Result=function(i,s){this.stopped=i,this.result=s},ae=Result.prototype;i.exports=function(i,s,u){var ie,le,ce,pe,de,fe,ye,be=u&&u.that,_e=!(!u||!u.AS_ENTRIES),we=!(!u||!u.IS_RECORD),Se=!(!u||!u.IS_ITERATOR),xe=!(!u||!u.INTERRUPTED),Pe=m(s,be),stop=function(i){return ie&&Z(ie,"normal",i),new Result(!0,i)},callFn=function(i){return _e?(_(i),xe?Pe(i[0],i[1],stop):Pe(i[0],i[1])):xe?Pe(i,stop):Pe(i)};if(we)ie=i.iterator;else if(Se)ie=i;else{if(!(le=Y(i)))throw ee(j(i)+" is not iterable");if(M(le)){for(ce=0,pe=$(i);pe>ce;ce++)if((de=callFn(i[ce]))&&W(ae,de))return de;return new Result(!1)}ie=X(i,le)}for(fe=we?i.next:ie.next;!(ye=v(fe,ie)).done;){try{de=callFn(ye.value)}catch(i){Z(ie,"throw",i)}if("object"==typeof de&&de&&W(ae,de))return de}return new Result(!1)}},7609:(i,s,u)=>{var m=u(78834),v=u(96059),_=u(14229);i.exports=function(i,s,u){var j,M;v(i);try{if(!(j=_(i,"return"))){if("throw"===s)throw u;return u}j=m(j,i)}catch(i){M=!0,j=i}if("throw"===s)throw u;if(M)throw j;return v(j),u}},53847:(i,s,u)=>{"use strict";var m=u(35143).IteratorPrototype,v=u(29290),_=u(31887),j=u(90904),M=u(12077),returnThis=function(){return this};i.exports=function(i,s,u,$){var W=s+" Iterator";return i.prototype=v(m,{next:_(+!$,u)}),j(i,W,!1,!0),M[W]=returnThis,i}},75105:(i,s,u)=>{"use strict";var m=u(76887),v=u(78834),_=u(82529),j=u(79417),M=u(57475),$=u(53847),W=u(249),X=u(88929),Y=u(90904),Z=u(32029),ee=u(95929),ae=u(99813),ie=u(12077),le=u(35143),ce=j.PROPER,pe=j.CONFIGURABLE,de=le.IteratorPrototype,fe=le.BUGGY_SAFARI_ITERATORS,ye=ae("iterator"),be="keys",_e="values",we="entries",returnThis=function(){return this};i.exports=function(i,s,u,j,ae,le,Se){$(u,s,j);var xe,Pe,Ie,getIterationMethod=function(i){if(i===ae&&Ve)return Ve;if(!fe&&i in qe)return qe[i];switch(i){case be:return function keys(){return new u(this,i)};case _e:return function values(){return new u(this,i)};case we:return function entries(){return new u(this,i)}}return function(){return new u(this)}},Te=s+" Iterator",Re=!1,qe=i.prototype,ze=qe[ye]||qe["@@iterator"]||ae&&qe[ae],Ve=!fe&&ze||getIterationMethod(ae),We="Array"==s&&qe.entries||ze;if(We&&(xe=W(We.call(new i)))!==Object.prototype&&xe.next&&(_||W(xe)===de||(X?X(xe,de):M(xe[ye])||ee(xe,ye,returnThis)),Y(xe,Te,!0,!0),_&&(ie[Te]=returnThis)),ce&&ae==_e&&ze&&ze.name!==_e&&(!_&&pe?Z(qe,"name",_e):(Re=!0,Ve=function values(){return v(ze,this)})),ae)if(Pe={values:getIterationMethod(_e),keys:le?Ve:getIterationMethod(be),entries:getIterationMethod(we)},Se)for(Ie in Pe)(fe||Re||!(Ie in qe))&&ee(qe,Ie,Pe[Ie]);else m({target:s,proto:!0,forced:fe||Re},Pe);return _&&!Se||qe[ye]===Ve||ee(qe,ye,Ve,{name:ae}),ie[s]=Ve,Pe}},35143:(i,s,u)=>{"use strict";var m,v,_,j=u(95981),M=u(57475),$=u(10941),W=u(29290),X=u(249),Y=u(95929),Z=u(99813),ee=u(82529),ae=Z("iterator"),ie=!1;[].keys&&("next"in(_=[].keys())?(v=X(X(_)))!==Object.prototype&&(m=v):ie=!0),!$(m)||j((function(){var i={};return m[ae].call(i)!==i}))?m={}:ee&&(m=W(m)),M(m[ae])||Y(m,ae,(function(){return this})),i.exports={IteratorPrototype:m,BUGGY_SAFARI_ITERATORS:ie}},12077:i=>{i.exports={}},10623:(i,s,u)=>{var m=u(43057);i.exports=function(i){return m(i.length)}},35331:i=>{var s=Math.ceil,u=Math.floor;i.exports=Math.trunc||function trunc(i){var m=+i;return(m>0?u:s)(m)}},14649:(i,s,u)=>{var m=u(85803);i.exports=function(i,s){return void 0===i?arguments.length<2?"":s:m(i)}},24420:(i,s,u)=>{"use strict";var m=u(55746),v=u(95329),_=u(78834),j=u(95981),M=u(14771),$=u(87857),W=u(36760),X=u(89678),Y=u(37026),Z=Object.assign,ee=Object.defineProperty,ae=v([].concat);i.exports=!Z||j((function(){if(m&&1!==Z({b:1},Z(ee({},"a",{enumerable:!0,get:function(){ee(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var i={},s={},u=Symbol(),v="abcdefghijklmnopqrst";return i[u]=7,v.split("").forEach((function(i){s[i]=i})),7!=Z({},i)[u]||M(Z({},s)).join("")!=v}))?function assign(i,s){for(var u=X(i),v=arguments.length,j=1,Z=$.f,ee=W.f;v>j;)for(var ie,le=Y(arguments[j++]),ce=Z?ae(M(le),Z(le)):M(le),pe=ce.length,de=0;pe>de;)ie=ce[de++],m&&!_(ee,le,ie)||(u[ie]=le[ie]);return u}:Z},29290:(i,s,u)=>{var m,v=u(96059),_=u(59938),j=u(56759),M=u(27748),$=u(15463),W=u(61333),X=u(44262),Y="prototype",Z="script",ee=X("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(i){return"<"+Z+">"+i+""+Z+">"},NullProtoObjectViaActiveX=function(i){i.write(scriptTag("")),i.close();var s=i.parentWindow.Object;return i=null,s},NullProtoObject=function(){try{m=new ActiveXObject("htmlfile")}catch(i){}var i,s,u;NullProtoObject="undefined"!=typeof document?document.domain&&m?NullProtoObjectViaActiveX(m):(s=W("iframe"),u="java"+Z+":",s.style.display="none",$.appendChild(s),s.src=String(u),(i=s.contentWindow.document).open(),i.write(scriptTag("document.F=Object")),i.close(),i.F):NullProtoObjectViaActiveX(m);for(var v=j.length;v--;)delete NullProtoObject[Y][j[v]];return NullProtoObject()};M[ee]=!0,i.exports=Object.create||function create(i,s){var u;return null!==i?(EmptyConstructor[Y]=v(i),u=new EmptyConstructor,EmptyConstructor[Y]=null,u[ee]=i):u=NullProtoObject(),void 0===s?u:_.f(u,s)}},59938:(i,s,u)=>{var m=u(55746),v=u(83937),_=u(65988),j=u(96059),M=u(74529),$=u(14771);s.f=m&&!v?Object.defineProperties:function defineProperties(i,s){j(i);for(var u,m=M(s),v=$(s),W=v.length,X=0;W>X;)_.f(i,u=v[X++],m[u]);return i}},65988:(i,s,u)=>{var m=u(55746),v=u(2840),_=u(83937),j=u(96059),M=u(83894),$=TypeError,W=Object.defineProperty,X=Object.getOwnPropertyDescriptor,Y="enumerable",Z="configurable",ee="writable";s.f=m?_?function defineProperty(i,s,u){if(j(i),s=M(s),j(u),"function"==typeof i&&"prototype"===s&&"value"in u&&ee in u&&!u[ee]){var m=X(i,s);m&&m[ee]&&(i[s]=u.value,u={configurable:Z in u?u[Z]:m[Z],enumerable:Y in u?u[Y]:m[Y],writable:!1})}return W(i,s,u)}:W:function defineProperty(i,s,u){if(j(i),s=M(s),j(u),v)try{return W(i,s,u)}catch(i){}if("get"in u||"set"in u)throw $("Accessors not supported");return"value"in u&&(i[s]=u.value),i}},49677:(i,s,u)=>{var m=u(55746),v=u(78834),_=u(36760),j=u(31887),M=u(74529),$=u(83894),W=u(90953),X=u(2840),Y=Object.getOwnPropertyDescriptor;s.f=m?Y:function getOwnPropertyDescriptor(i,s){if(i=M(i),s=$(s),X)try{return Y(i,s)}catch(i){}if(W(i,s))return j(!v(_.f,i,s),i[s])}},10946:(i,s,u)=>{var m=u(55629),v=u(56759).concat("length","prototype");s.f=Object.getOwnPropertyNames||function getOwnPropertyNames(i){return m(i,v)}},87857:(i,s)=>{s.f=Object.getOwnPropertySymbols},249:(i,s,u)=>{var m=u(90953),v=u(57475),_=u(89678),j=u(44262),M=u(91310),$=j("IE_PROTO"),W=Object,X=W.prototype;i.exports=M?W.getPrototypeOf:function(i){var s=_(i);if(m(s,$))return s[$];var u=s.constructor;return v(u)&&s instanceof u?u.prototype:s instanceof W?X:null}},7046:(i,s,u)=>{var m=u(95329);i.exports=m({}.isPrototypeOf)},55629:(i,s,u)=>{var m=u(95329),v=u(90953),_=u(74529),j=u(31692).indexOf,M=u(27748),$=m([].push);i.exports=function(i,s){var u,m=_(i),W=0,X=[];for(u in m)!v(M,u)&&v(m,u)&&$(X,u);for(;s.length>W;)v(m,u=s[W++])&&(~j(X,u)||$(X,u));return X}},14771:(i,s,u)=>{var m=u(55629),v=u(56759);i.exports=Object.keys||function keys(i){return m(i,v)}},36760:(i,s)=>{"use strict";var u={}.propertyIsEnumerable,m=Object.getOwnPropertyDescriptor,v=m&&!u.call({1:2},1);s.f=v?function propertyIsEnumerable(i){var s=m(this,i);return!!s&&s.enumerable}:u},88929:(i,s,u)=>{var m=u(45526),v=u(96059),_=u(11851);i.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var i,s=!1,u={};try{(i=m(Object.prototype,"__proto__","set"))(u,[]),s=u instanceof Array}catch(i){}return function setPrototypeOf(u,m){return v(u),_(m),s?i(u,m):u.__proto__=m,u}}():void 0)},95623:(i,s,u)=>{"use strict";var m=u(22885),v=u(9697);i.exports=m?{}.toString:function toString(){return"[object "+v(this)+"]"}},39811:(i,s,u)=>{var m=u(78834),v=u(57475),_=u(10941),j=TypeError;i.exports=function(i,s){var u,M;if("string"===s&&v(u=i.toString)&&!_(M=m(u,i)))return M;if(v(u=i.valueOf)&&!_(M=m(u,i)))return M;if("string"!==s&&v(u=i.toString)&&!_(M=m(u,i)))return M;throw j("Can't convert object to primitive value")}},31136:(i,s,u)=>{var m=u(626),v=u(95329),_=u(10946),j=u(87857),M=u(96059),$=v([].concat);i.exports=m("Reflect","ownKeys")||function ownKeys(i){var s=_.f(M(i)),u=j.f;return u?$(s,u(i)):s}},54058:i=>{i.exports={}},9056:(i,s,u)=>{var m=u(65988).f;i.exports=function(i,s,u){u in i||m(i,u,{configurable:!0,get:function(){return s[u]},set:function(i){s[u]=i}})}},48219:(i,s,u)=>{var m=u(82119),v=TypeError;i.exports=function(i){if(m(i))throw v("Can't call method on "+i);return i}},90904:(i,s,u)=>{var m=u(22885),v=u(65988).f,_=u(32029),j=u(90953),M=u(95623),$=u(99813)("toStringTag");i.exports=function(i,s,u,W){if(i){var X=u?i:i.prototype;j(X,$)||v(X,$,{configurable:!0,value:s}),W&&!m&&_(X,"toString",M)}}},44262:(i,s,u)=>{var m=u(68726),v=u(99418),_=m("keys");i.exports=function(i){return _[i]||(_[i]=v(i))}},63030:(i,s,u)=>{var m=u(21899),v=u(75609),_="__core-js_shared__",j=m[_]||v(_,{});i.exports=j},68726:(i,s,u)=>{var m=u(82529),v=u(63030);(i.exports=function(i,s){return v[i]||(v[i]=void 0!==s?s:{})})("versions",[]).push({version:"3.31.1",mode:m?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.31.1/LICENSE",source:"https://github.com/zloirock/core-js"})},64620:(i,s,u)=>{var m=u(95329),v=u(62435),_=u(85803),j=u(48219),M=m("".charAt),$=m("".charCodeAt),W=m("".slice),createMethod=function(i){return function(s,u){var m,X,Y=_(j(s)),Z=v(u),ee=Y.length;return Z<0||Z>=ee?i?"":void 0:(m=$(Y,Z))<55296||m>56319||Z+1===ee||(X=$(Y,Z+1))<56320||X>57343?i?M(Y,Z):m:i?W(Y,Z,Z+2):X-56320+(m-55296<<10)+65536}};i.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},63405:(i,s,u)=>{var m=u(53385),v=u(95981),_=u(21899).String;i.exports=!!Object.getOwnPropertySymbols&&!v((function(){var i=Symbol();return!_(i)||!(Object(i)instanceof Symbol)||!Symbol.sham&&m&&m<41}))},59413:(i,s,u)=>{var m=u(62435),v=Math.max,_=Math.min;i.exports=function(i,s){var u=m(i);return u<0?v(u+s,0):_(u,s)}},74529:(i,s,u)=>{var m=u(37026),v=u(48219);i.exports=function(i){return m(v(i))}},62435:(i,s,u)=>{var m=u(35331);i.exports=function(i){var s=+i;return s!=s||0===s?0:m(s)}},43057:(i,s,u)=>{var m=u(62435),v=Math.min;i.exports=function(i){return i>0?v(m(i),9007199254740991):0}},89678:(i,s,u)=>{var m=u(48219),v=Object;i.exports=function(i){return v(m(i))}},46935:(i,s,u)=>{var m=u(78834),v=u(10941),_=u(56664),j=u(14229),M=u(39811),$=u(99813),W=TypeError,X=$("toPrimitive");i.exports=function(i,s){if(!v(i)||_(i))return i;var u,$=j(i,X);if($){if(void 0===s&&(s="default"),u=m($,i,s),!v(u)||_(u))return u;throw W("Can't convert object to primitive value")}return void 0===s&&(s="number"),M(i,s)}},83894:(i,s,u)=>{var m=u(46935),v=u(56664);i.exports=function(i){var s=m(i,"string");return v(s)?s:s+""}},22885:(i,s,u)=>{var m={};m[u(99813)("toStringTag")]="z",i.exports="[object z]"===String(m)},85803:(i,s,u)=>{var m=u(9697),v=String;i.exports=function(i){if("Symbol"===m(i))throw TypeError("Cannot convert a Symbol value to a string");return v(i)}},69826:i=>{var s=String;i.exports=function(i){try{return s(i)}catch(i){return"Object"}}},99418:(i,s,u)=>{var m=u(95329),v=0,_=Math.random(),j=m(1..toString);i.exports=function(i){return"Symbol("+(void 0===i?"":i)+")_"+j(++v+_,36)}},32302:(i,s,u)=>{var m=u(63405);i.exports=m&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},83937:(i,s,u)=>{var m=u(55746),v=u(95981);i.exports=m&&v((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},47093:(i,s,u)=>{var m=u(21899),v=u(57475),_=m.WeakMap;i.exports=v(_)&&/native code/.test(String(_))},99813:(i,s,u)=>{var m=u(21899),v=u(68726),_=u(90953),j=u(99418),M=u(63405),$=u(32302),W=m.Symbol,X=v("wks"),Y=$?W.for||W:W&&W.withoutSetter||j;i.exports=function(i){return _(X,i)||(X[i]=M&&_(W,i)?W[i]:Y("Symbol."+i)),X[i]}},62864:(i,s,u)=>{"use strict";var m=u(626),v=u(90953),_=u(32029),j=u(7046),M=u(88929),$=u(23489),W=u(9056),X=u(70926),Y=u(14649),Z=u(53794),ee=u(79585),ae=u(55746),ie=u(82529);i.exports=function(i,s,u,le){var ce="stackTraceLimit",pe=le?2:1,de=i.split("."),fe=de[de.length-1],ye=m.apply(null,de);if(ye){var be=ye.prototype;if(!ie&&v(be,"cause")&&delete be.cause,!u)return ye;var _e=m("Error"),we=s((function(i,s){var u=Y(le?s:i,void 0),m=le?new ye(i):new ye;return void 0!==u&&_(m,"message",u),ee(m,we,m.stack,2),this&&j(be,this)&&X(m,this,we),arguments.length>pe&&Z(m,arguments[pe]),m}));if(we.prototype=be,"Error"!==fe?M?M(we,_e):$(we,_e,{name:!0}):ae&&ce in ye&&(W(we,ye,ce),W(we,ye,"prepareStackTrace")),$(we,ye),!ie)try{be.name!==fe&&_(be,"name",fe),be.constructor=we}catch(i){}return we}}},24415:(i,s,u)=>{var m=u(76887),v=u(626),_=u(79730),j=u(95981),M=u(62864),$="AggregateError",W=v($),X=!j((function(){return 1!==W([1]).errors[0]}))&&j((function(){return 7!==W([1],$,{cause:7}).cause}));m({global:!0,constructor:!0,arity:2,forced:X},{AggregateError:M($,(function(i){return function AggregateError(s,u){return _(i,this,arguments)}}),X,!0)})},49812:(i,s,u)=>{"use strict";var m=u(76887),v=u(7046),_=u(249),j=u(88929),M=u(23489),$=u(29290),W=u(32029),X=u(31887),Y=u(53794),Z=u(79585),ee=u(93091),ae=u(14649),ie=u(99813)("toStringTag"),le=Error,ce=[].push,pe=function AggregateError(i,s){var u,m=v(de,this);j?u=j(le(),m?_(this):de):(u=m?this:$(de),W(u,ie,"Error")),void 0!==s&&W(u,"message",ae(s)),Z(u,pe,u.stack,1),arguments.length>2&&Y(u,arguments[2]);var M=[];return ee(i,ce,{that:M}),W(u,"errors",M),u};j?j(pe,le):M(pe,le,{name:!0});var de=pe.prototype=$(le.prototype,{constructor:X(1,pe),message:X(1,""),name:X(1,"AggregateError")});m({global:!0,constructor:!0,arity:2},{AggregateError:pe})},47627:(i,s,u)=>{u(49812)},66274:(i,s,u)=>{"use strict";var m=u(74529),v=u(18479),_=u(12077),j=u(45402),M=u(65988).f,$=u(75105),W=u(23538),X=u(82529),Y=u(55746),Z="Array Iterator",ee=j.set,ae=j.getterFor(Z);i.exports=$(Array,"Array",(function(i,s){ee(this,{type:Z,target:m(i),index:0,kind:s})}),(function(){var i=ae(this),s=i.target,u=i.kind,m=i.index++;return!s||m>=s.length?(i.target=void 0,W(void 0,!0)):W("keys"==u?m:"values"==u?s[m]:[m,s[m]],!1)}),"values");var ie=_.Arguments=_.Array;if(v("keys"),v("values"),v("entries"),!X&&Y&&"values"!==ie.name)try{M(ie,"name",{value:"values"})}catch(i){}},61181:(i,s,u)=>{var m=u(76887),v=u(21899),_=u(79730),j=u(62864),M="WebAssembly",$=v[M],W=7!==Error("e",{cause:7}).cause,exportGlobalErrorCauseWrapper=function(i,s){var u={};u[i]=j(i,s,W),m({global:!0,constructor:!0,arity:1,forced:W},u)},exportWebAssemblyErrorCauseWrapper=function(i,s){if($&&$[i]){var u={};u[i]=j(M+"."+i,s,W),m({target:M,stat:!0,constructor:!0,arity:1,forced:W},u)}};exportGlobalErrorCauseWrapper("Error",(function(i){return function Error(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("EvalError",(function(i){return function EvalError(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("RangeError",(function(i){return function RangeError(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("ReferenceError",(function(i){return function ReferenceError(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("SyntaxError",(function(i){return function SyntaxError(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("TypeError",(function(i){return function TypeError(s){return _(i,this,arguments)}})),exportGlobalErrorCauseWrapper("URIError",(function(i){return function URIError(s){return _(i,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("CompileError",(function(i){return function CompileError(s){return _(i,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("LinkError",(function(i){return function LinkError(s){return _(i,this,arguments)}})),exportWebAssemblyErrorCauseWrapper("RuntimeError",(function(i){return function RuntimeError(s){return _(i,this,arguments)}}))},73381:(i,s,u)=>{var m=u(76887),v=u(98308);m({target:"Function",proto:!0,forced:Function.bind!==v},{bind:v})},49221:(i,s,u)=>{var m=u(76887),v=u(24420);m({target:"Object",stat:!0,arity:2,forced:Object.assign!==v},{assign:v})},77971:(i,s,u)=>{"use strict";var m=u(64620).charAt,v=u(85803),_=u(45402),j=u(75105),M=u(23538),$="String Iterator",W=_.set,X=_.getterFor($);j(String,"String",(function(i){W(this,{type:$,string:v(i),index:0})}),(function next(){var i,s=X(this),u=s.string,v=s.index;return v>=u.length?M(void 0,!0):(i=m(u,v),s.index+=i.length,M(i,!1))}))},89731:(i,s,u)=>{u(47627)},7634:(i,s,u)=>{u(66274);var m=u(63281),v=u(21899),_=u(9697),j=u(32029),M=u(12077),$=u(99813)("toStringTag");for(var W in m){var X=v[W],Y=X&&X.prototype;Y&&_(Y)!==$&&j(Y,$,W),M[W]=M.Array}},18957:(i,s,u)=>{u(89731);var m=u(50415);u(7634),i.exports=m},28196:(i,s,u)=>{var m=u(16246);i.exports=m},63383:(i,s,u)=>{var m=u(45999);i.exports=m},8269:function(i,s,u){var m;m=void 0!==u.g?u.g:this,i.exports=function(i){if(i.CSS&&i.CSS.escape)return i.CSS.escape;var cssEscape=function(i){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var s,u=String(i),m=u.length,v=-1,_="",j=u.charCodeAt(0);++v=1&&s<=31||127==s||0==v&&s>=48&&s<=57||1==v&&s>=48&&s<=57&&45==j?"\\"+s.toString(16)+" ":0==v&&1==m&&45==s||!(s>=128||45==s||95==s||s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122)?"\\"+u.charAt(v):u.charAt(v):_+="�";return _};return i.CSS||(i.CSS={}),i.CSS.escape=cssEscape,cssEscape}(m)},27698:(i,s,u)=>{"use strict";var m=u(48764).Buffer;function isSpecificValue(i){return i instanceof m||i instanceof Date||i instanceof RegExp}function cloneSpecificValue(i){if(i instanceof m){var s=m.alloc?m.alloc(i.length):new m(i.length);return i.copy(s),s}if(i instanceof Date)return new Date(i.getTime());if(i instanceof RegExp)return new RegExp(i);throw new Error("Unexpected situation")}function deepCloneArray(i){var s=[];return i.forEach((function(i,u){"object"==typeof i&&null!==i?Array.isArray(i)?s[u]=deepCloneArray(i):isSpecificValue(i)?s[u]=cloneSpecificValue(i):s[u]=v({},i):s[u]=i})),s}function safeGetProperty(i,s){return"__proto__"===s?void 0:i[s]}var v=i.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var i,s,u=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(m){"object"!=typeof m||null===m||Array.isArray(m)||Object.keys(m).forEach((function(_){return s=safeGetProperty(u,_),(i=safeGetProperty(m,_))===u?void 0:"object"!=typeof i||null===i?void(u[_]=i):Array.isArray(i)?void(u[_]=deepCloneArray(i)):isSpecificValue(i)?void(u[_]=cloneSpecificValue(i)):"object"!=typeof s||null===s||Array.isArray(s)?void(u[_]=v({},i)):void(u[_]=v(s,i))}))})),u}},9996:i=>{"use strict";var s=function isMergeableObject(i){return function isNonNullObject(i){return!!i&&"object"==typeof i}(i)&&!function isSpecial(i){var s=Object.prototype.toString.call(i);return"[object RegExp]"===s||"[object Date]"===s||function isReactElement(i){return i.$$typeof===u}(i)}(i)};var u="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(i,s){return!1!==s.clone&&s.isMergeableObject(i)?deepmerge(function emptyTarget(i){return Array.isArray(i)?[]:{}}(i),i,s):i}function defaultArrayMerge(i,s,u){return i.concat(s).map((function(i){return cloneUnlessOtherwiseSpecified(i,u)}))}function getKeys(i){return Object.keys(i).concat(function getEnumerableOwnPropertySymbols(i){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(i).filter((function(s){return Object.propertyIsEnumerable.call(i,s)})):[]}(i))}function propertyIsOnObject(i,s){try{return s in i}catch(i){return!1}}function mergeObject(i,s,u){var m={};return u.isMergeableObject(i)&&getKeys(i).forEach((function(s){m[s]=cloneUnlessOtherwiseSpecified(i[s],u)})),getKeys(s).forEach((function(v){(function propertyIsUnsafe(i,s){return propertyIsOnObject(i,s)&&!(Object.hasOwnProperty.call(i,s)&&Object.propertyIsEnumerable.call(i,s))})(i,v)||(propertyIsOnObject(i,v)&&u.isMergeableObject(s[v])?m[v]=function getMergeFunction(i,s){if(!s.customMerge)return deepmerge;var u=s.customMerge(i);return"function"==typeof u?u:deepmerge}(v,u)(i[v],s[v],u):m[v]=cloneUnlessOtherwiseSpecified(s[v],u))})),m}function deepmerge(i,u,m){(m=m||{}).arrayMerge=m.arrayMerge||defaultArrayMerge,m.isMergeableObject=m.isMergeableObject||s,m.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var v=Array.isArray(u);return v===Array.isArray(i)?v?m.arrayMerge(i,u,m):mergeObject(i,u,m):cloneUnlessOtherwiseSpecified(u,m)}deepmerge.all=function deepmergeAll(i,s){if(!Array.isArray(i))throw new Error("first argument should be an array");return i.reduce((function(i,u){return deepmerge(i,u,s)}),{})};var m=deepmerge;i.exports=m},27856:function(i){i.exports=function(){"use strict";const{entries:i,setPrototypeOf:s,isFrozen:u,getPrototypeOf:m,getOwnPropertyDescriptor:v}=Object;let{freeze:_,seal:j,create:M}=Object,{apply:$,construct:W}="undefined"!=typeof Reflect&&Reflect;_||(_=function freeze(i){return i}),j||(j=function seal(i){return i}),$||($=function apply(i,s,u){return i.apply(s,u)}),W||(W=function construct(i,s){return new i(...s)});const X=unapply(Array.prototype.forEach),Y=unapply(Array.prototype.pop),Z=unapply(Array.prototype.push),ee=unapply(String.prototype.toLowerCase),ae=unapply(String.prototype.toString),ie=unapply(String.prototype.match),le=unapply(String.prototype.replace),ce=unapply(String.prototype.indexOf),pe=unapply(String.prototype.trim),de=unapply(RegExp.prototype.test),fe=unconstruct(TypeError);function unapply(i){return function(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v2&&void 0!==arguments[2]?arguments[2]:ee;s&&s(i,null);let _=m.length;for(;_--;){let s=m[_];if("string"==typeof s){const i=v(s);i!==s&&(u(m)||(m[_]=i),s=i)}i[s]=!0}return i}function clone(s){const u=M(null);for(const[m,_]of i(s))void 0!==v(s,m)&&(u[m]=_);return u}function lookupGetter(i,s){for(;null!==i;){const u=v(i,s);if(u){if(u.get)return unapply(u.get);if("function"==typeof u.value)return unapply(u.value)}i=m(i)}function fallbackValue(i){return console.warn("fallback value for",i),null}return fallbackValue}const ye=_(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),be=_(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),_e=_(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),we=_(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Se=_(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),xe=_(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Pe=_(["#text"]),Ie=_(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),Te=_(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Re=_(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),qe=_(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),ze=j(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Ve=j(/<%[\w\W]*|[\w\W]*%>/gm),We=j(/\${[\w\W]*}/gm),He=j(/^data-[\-\w.\u00B7-\uFFFF]/),Xe=j(/^aria-[\-\w]+$/),Ye=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Qe=j(/^(?:\w+script|data):/i),et=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),tt=j(/^html$/i);var rt=Object.freeze({__proto__:null,MUSTACHE_EXPR:ze,ERB_EXPR:Ve,TMPLIT_EXPR:We,DATA_ATTR:He,ARIA_ATTR:Xe,IS_ALLOWED_URI:Ye,IS_SCRIPT_OR_DATA:Qe,ATTR_WHITESPACE:et,DOCTYPE_NAME:tt});const nt=function getGlobal(){return"undefined"==typeof window?null:window},ot=function _createTrustedTypesPolicy(i,s){if("object"!=typeof i||"function"!=typeof i.createPolicy)return null;let u=null;const m="data-tt-policy-suffix";s&&s.hasAttribute(m)&&(u=s.getAttribute(m));const v="dompurify"+(u?"#"+u:"");try{return i.createPolicy(v,{createHTML:i=>i,createScriptURL:i=>i})}catch(i){return console.warn("TrustedTypes policy "+v+" could not be created."),null}};function createDOMPurify(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:nt();const DOMPurify=i=>createDOMPurify(i);if(DOMPurify.version="3.0.6",DOMPurify.removed=[],!s||!s.document||9!==s.document.nodeType)return DOMPurify.isSupported=!1,DOMPurify;let{document:u}=s;const m=u,v=m.currentScript,{DocumentFragment:j,HTMLTemplateElement:$,Node:W,Element:ze,NodeFilter:Ve,NamedNodeMap:We=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:He,DOMParser:Xe,trustedTypes:Qe}=s,et=ze.prototype,at=lookupGetter(et,"cloneNode"),it=lookupGetter(et,"nextSibling"),st=lookupGetter(et,"childNodes"),lt=lookupGetter(et,"parentNode");if("function"==typeof $){const i=u.createElement("template");i.content&&i.content.ownerDocument&&(u=i.content.ownerDocument)}let ct,ut="";const{implementation:pt,createNodeIterator:ht,createDocumentFragment:dt,getElementsByTagName:mt}=u,{importNode:gt}=m;let yt={};DOMPurify.isSupported="function"==typeof i&&"function"==typeof lt&&pt&&void 0!==pt.createHTMLDocument;const{MUSTACHE_EXPR:vt,ERB_EXPR:bt,TMPLIT_EXPR:_t,DATA_ATTR:Et,ARIA_ATTR:wt,IS_SCRIPT_OR_DATA:St,ATTR_WHITESPACE:xt}=rt;let{IS_ALLOWED_URI:kt}=rt,Ot=null;const At=addToSet({},[...ye,...be,..._e,...Se,...Pe]);let Ct=null;const jt=addToSet({},[...Ie,...Te,...Re,...qe]);let Pt=Object.seal(M(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),It=null,Nt=null,Tt=!0,Mt=!0,Rt=!1,Bt=!0,Dt=!1,Lt=!1,Ft=!1,qt=!1,$t=!1,zt=!1,Ut=!1,Vt=!0,Wt=!1;const Kt="user-content-";let Ht=!0,Jt=!1,Gt={},Xt=null;const Yt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Qt=null;const Zt=addToSet({},["audio","video","img","source","image","track"]);let er=null;const tr=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),rr="http://www.w3.org/1998/Math/MathML",nr="http://www.w3.org/2000/svg",ar="http://www.w3.org/1999/xhtml";let ir=ar,sr=!1,lr=null;const cr=addToSet({},[rr,nr,ar],ae);let ur=null;const pr=["application/xhtml+xml","text/html"],dr="text/html";let fr=null,mr=null;const gr=u.createElement("form"),yr=function isRegexOrFunction(i){return i instanceof RegExp||i instanceof Function},vr=function _parseConfig(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!mr||mr!==i){if(i&&"object"==typeof i||(i={}),i=clone(i),ur=ur=-1===pr.indexOf(i.PARSER_MEDIA_TYPE)?dr:i.PARSER_MEDIA_TYPE,fr="application/xhtml+xml"===ur?ae:ee,Ot="ALLOWED_TAGS"in i?addToSet({},i.ALLOWED_TAGS,fr):At,Ct="ALLOWED_ATTR"in i?addToSet({},i.ALLOWED_ATTR,fr):jt,lr="ALLOWED_NAMESPACES"in i?addToSet({},i.ALLOWED_NAMESPACES,ae):cr,er="ADD_URI_SAFE_ATTR"in i?addToSet(clone(tr),i.ADD_URI_SAFE_ATTR,fr):tr,Qt="ADD_DATA_URI_TAGS"in i?addToSet(clone(Zt),i.ADD_DATA_URI_TAGS,fr):Zt,Xt="FORBID_CONTENTS"in i?addToSet({},i.FORBID_CONTENTS,fr):Yt,It="FORBID_TAGS"in i?addToSet({},i.FORBID_TAGS,fr):{},Nt="FORBID_ATTR"in i?addToSet({},i.FORBID_ATTR,fr):{},Gt="USE_PROFILES"in i&&i.USE_PROFILES,Tt=!1!==i.ALLOW_ARIA_ATTR,Mt=!1!==i.ALLOW_DATA_ATTR,Rt=i.ALLOW_UNKNOWN_PROTOCOLS||!1,Bt=!1!==i.ALLOW_SELF_CLOSE_IN_ATTR,Dt=i.SAFE_FOR_TEMPLATES||!1,Lt=i.WHOLE_DOCUMENT||!1,$t=i.RETURN_DOM||!1,zt=i.RETURN_DOM_FRAGMENT||!1,Ut=i.RETURN_TRUSTED_TYPE||!1,qt=i.FORCE_BODY||!1,Vt=!1!==i.SANITIZE_DOM,Wt=i.SANITIZE_NAMED_PROPS||!1,Ht=!1!==i.KEEP_CONTENT,Jt=i.IN_PLACE||!1,kt=i.ALLOWED_URI_REGEXP||Ye,ir=i.NAMESPACE||ar,Pt=i.CUSTOM_ELEMENT_HANDLING||{},i.CUSTOM_ELEMENT_HANDLING&&yr(i.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Pt.tagNameCheck=i.CUSTOM_ELEMENT_HANDLING.tagNameCheck),i.CUSTOM_ELEMENT_HANDLING&&yr(i.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Pt.attributeNameCheck=i.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),i.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof i.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Pt.allowCustomizedBuiltInElements=i.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Dt&&(Mt=!1),zt&&($t=!0),Gt&&(Ot=addToSet({},[...Pe]),Ct=[],!0===Gt.html&&(addToSet(Ot,ye),addToSet(Ct,Ie)),!0===Gt.svg&&(addToSet(Ot,be),addToSet(Ct,Te),addToSet(Ct,qe)),!0===Gt.svgFilters&&(addToSet(Ot,_e),addToSet(Ct,Te),addToSet(Ct,qe)),!0===Gt.mathMl&&(addToSet(Ot,Se),addToSet(Ct,Re),addToSet(Ct,qe))),i.ADD_TAGS&&(Ot===At&&(Ot=clone(Ot)),addToSet(Ot,i.ADD_TAGS,fr)),i.ADD_ATTR&&(Ct===jt&&(Ct=clone(Ct)),addToSet(Ct,i.ADD_ATTR,fr)),i.ADD_URI_SAFE_ATTR&&addToSet(er,i.ADD_URI_SAFE_ATTR,fr),i.FORBID_CONTENTS&&(Xt===Yt&&(Xt=clone(Xt)),addToSet(Xt,i.FORBID_CONTENTS,fr)),Ht&&(Ot["#text"]=!0),Lt&&addToSet(Ot,["html","head","body"]),Ot.table&&(addToSet(Ot,["tbody"]),delete It.tbody),i.TRUSTED_TYPES_POLICY){if("function"!=typeof i.TRUSTED_TYPES_POLICY.createHTML)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof i.TRUSTED_TYPES_POLICY.createScriptURL)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ct=i.TRUSTED_TYPES_POLICY,ut=ct.createHTML("")}else void 0===ct&&(ct=ot(Qe,v)),null!==ct&&"string"==typeof ut&&(ut=ct.createHTML(""));_&&_(i),mr=i}},br=addToSet({},["mi","mo","mn","ms","mtext"]),_r=addToSet({},["foreignobject","desc","title","annotation-xml"]),Er=addToSet({},["title","style","font","a","script"]),wr=addToSet({},be);addToSet(wr,_e),addToSet(wr,we);const Sr=addToSet({},Se);addToSet(Sr,xe);const xr=function _checkValidNamespace(i){let s=lt(i);s&&s.tagName||(s={namespaceURI:ir,tagName:"template"});const u=ee(i.tagName),m=ee(s.tagName);return!!lr[i.namespaceURI]&&(i.namespaceURI===nr?s.namespaceURI===ar?"svg"===u:s.namespaceURI===rr?"svg"===u&&("annotation-xml"===m||br[m]):Boolean(wr[u]):i.namespaceURI===rr?s.namespaceURI===ar?"math"===u:s.namespaceURI===nr?"math"===u&&_r[m]:Boolean(Sr[u]):i.namespaceURI===ar?!(s.namespaceURI===nr&&!_r[m])&&!(s.namespaceURI===rr&&!br[m])&&!Sr[u]&&(Er[u]||!wr[u]):!("application/xhtml+xml"!==ur||!lr[i.namespaceURI]))},kr=function _forceRemove(i){Z(DOMPurify.removed,{element:i});try{i.parentNode.removeChild(i)}catch(s){i.remove()}},Or=function _removeAttribute(i,s){try{Z(DOMPurify.removed,{attribute:s.getAttributeNode(i),from:s})}catch(i){Z(DOMPurify.removed,{attribute:null,from:s})}if(s.removeAttribute(i),"is"===i&&!Ct[i])if($t||zt)try{kr(s)}catch(i){}else try{s.setAttribute(i,"")}catch(i){}},Ar=function _initDocument(i){let s=null,m=null;if(qt)i=""+i;else{const s=ie(i,/^[\r\n\t ]+/);m=s&&s[0]}"application/xhtml+xml"===ur&&ir===ar&&(i=''+i+"");const v=ct?ct.createHTML(i):i;if(ir===ar)try{s=(new Xe).parseFromString(v,ur)}catch(i){}if(!s||!s.documentElement){s=pt.createDocument(ir,"template",null);try{s.documentElement.innerHTML=sr?ut:v}catch(i){}}const _=s.body||s.documentElement;return i&&m&&_.insertBefore(u.createTextNode(m),_.childNodes[0]||null),ir===ar?mt.call(s,Lt?"html":"body")[0]:Lt?s.documentElement:_},Cr=function _createNodeIterator(i){return ht.call(i.ownerDocument||i,i,Ve.SHOW_ELEMENT|Ve.SHOW_COMMENT|Ve.SHOW_TEXT,null)},jr=function _isClobbered(i){return i instanceof He&&("string"!=typeof i.nodeName||"string"!=typeof i.textContent||"function"!=typeof i.removeChild||!(i.attributes instanceof We)||"function"!=typeof i.removeAttribute||"function"!=typeof i.setAttribute||"string"!=typeof i.namespaceURI||"function"!=typeof i.insertBefore||"function"!=typeof i.hasChildNodes)},Pr=function _isNode(i){return"function"==typeof W&&i instanceof W},Ir=function _executeHook(i,s,u){yt[i]&&X(yt[i],(i=>{i.call(DOMPurify,s,u,mr)}))},Nr=function _sanitizeElements(i){let s=null;if(Ir("beforeSanitizeElements",i,null),jr(i))return kr(i),!0;const u=fr(i.nodeName);if(Ir("uponSanitizeElement",i,{tagName:u,allowedTags:Ot}),i.hasChildNodes()&&!Pr(i.firstElementChild)&&de(/<[/\w]/g,i.innerHTML)&&de(/<[/\w]/g,i.textContent))return kr(i),!0;if(!Ot[u]||It[u]){if(!It[u]&&Mr(u)){if(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,u))return!1;if(Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(u))return!1}if(Ht&&!Xt[u]){const s=lt(i)||i.parentNode,u=st(i)||i.childNodes;if(u&&s)for(let m=u.length-1;m>=0;--m)s.insertBefore(at(u[m],!0),it(i))}return kr(i),!0}return i instanceof ze&&!xr(i)?(kr(i),!0):"noscript"!==u&&"noembed"!==u&&"noframes"!==u||!de(/<\/no(script|embed|frames)/i,i.innerHTML)?(Dt&&3===i.nodeType&&(s=i.textContent,X([vt,bt,_t],(i=>{s=le(s,i," ")})),i.textContent!==s&&(Z(DOMPurify.removed,{element:i.cloneNode()}),i.textContent=s)),Ir("afterSanitizeElements",i,null),!1):(kr(i),!0)},Tr=function _isValidAttribute(i,s,m){if(Vt&&("id"===s||"name"===s)&&(m in u||m in gr))return!1;if(Mt&&!Nt[s]&&de(Et,s));else if(Tt&&de(wt,s));else if(!Ct[s]||Nt[s]){if(!(Mr(i)&&(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,i)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(i))&&(Pt.attributeNameCheck instanceof RegExp&&de(Pt.attributeNameCheck,s)||Pt.attributeNameCheck instanceof Function&&Pt.attributeNameCheck(s))||"is"===s&&Pt.allowCustomizedBuiltInElements&&(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,m)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(m))))return!1}else if(er[s]);else if(de(kt,le(m,xt,"")));else if("src"!==s&&"xlink:href"!==s&&"href"!==s||"script"===i||0!==ce(m,"data:")||!Qt[i])if(Rt&&!de(St,le(m,xt,"")));else if(m)return!1;return!0},Mr=function _isBasicCustomElement(i){return i.indexOf("-")>0},Rr=function _sanitizeAttributes(i){Ir("beforeSanitizeAttributes",i,null);const{attributes:s}=i;if(!s)return;const u={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ct};let m=s.length;for(;m--;){const v=s[m],{name:_,namespaceURI:j,value:M}=v,$=fr(_);let W="value"===_?M:pe(M);if(u.attrName=$,u.attrValue=W,u.keepAttr=!0,u.forceKeepAttr=void 0,Ir("uponSanitizeAttribute",i,u),W=u.attrValue,u.forceKeepAttr)continue;if(Or(_,i),!u.keepAttr)continue;if(!Bt&&de(/\/>/i,W)){Or(_,i);continue}Dt&&X([vt,bt,_t],(i=>{W=le(W,i," ")}));const Z=fr(i.nodeName);if(Tr(Z,$,W)){if(!Wt||"id"!==$&&"name"!==$||(Or(_,i),W=Kt+W),ct&&"object"==typeof Qe&&"function"==typeof Qe.getAttributeType)if(j);else switch(Qe.getAttributeType(Z,$)){case"TrustedHTML":W=ct.createHTML(W);break;case"TrustedScriptURL":W=ct.createScriptURL(W)}try{j?i.setAttributeNS(j,_,W):i.setAttribute(_,W),Y(DOMPurify.removed)}catch(i){}}}Ir("afterSanitizeAttributes",i,null)},Br=function _sanitizeShadowDOM(i){let s=null;const u=Cr(i);for(Ir("beforeSanitizeShadowDOM",i,null);s=u.nextNode();)Ir("uponSanitizeShadowNode",s,null),Nr(s)||(s.content instanceof j&&_sanitizeShadowDOM(s.content),Rr(s));Ir("afterSanitizeShadowDOM",i,null)};return DOMPurify.sanitize=function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=null,v=null,_=null,M=null;if(sr=!i,sr&&(i="\x3c!--\x3e"),"string"!=typeof i&&!Pr(i)){if("function"!=typeof i.toString)throw fe("toString is not a function");if("string"!=typeof(i=i.toString()))throw fe("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return i;if(Ft||vr(s),DOMPurify.removed=[],"string"==typeof i&&(Jt=!1),Jt){if(i.nodeName){const s=fr(i.nodeName);if(!Ot[s]||It[s])throw fe("root node is forbidden and cannot be sanitized in-place")}}else if(i instanceof W)u=Ar("\x3c!----\x3e"),v=u.ownerDocument.importNode(i,!0),1===v.nodeType&&"BODY"===v.nodeName||"HTML"===v.nodeName?u=v:u.appendChild(v);else{if(!$t&&!Dt&&!Lt&&-1===i.indexOf("<"))return ct&&Ut?ct.createHTML(i):i;if(u=Ar(i),!u)return $t?null:Ut?ut:""}u&&qt&&kr(u.firstChild);const $=Cr(Jt?i:u);for(;_=$.nextNode();)Nr(_)||(_.content instanceof j&&Br(_.content),Rr(_));if(Jt)return i;if($t){if(zt)for(M=dt.call(u.ownerDocument);u.firstChild;)M.appendChild(u.firstChild);else M=u;return(Ct.shadowroot||Ct.shadowrootmode)&&(M=gt.call(m,M,!0)),M}let Y=Lt?u.outerHTML:u.innerHTML;return Lt&&Ot["!doctype"]&&u.ownerDocument&&u.ownerDocument.doctype&&u.ownerDocument.doctype.name&&de(tt,u.ownerDocument.doctype.name)&&(Y="\n"+Y),Dt&&X([vt,bt,_t],(i=>{Y=le(Y,i," ")})),ct&&Ut?ct.createHTML(Y):Y},DOMPurify.setConfig=function(){vr(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ft=!0},DOMPurify.clearConfig=function(){mr=null,Ft=!1},DOMPurify.isValidAttribute=function(i,s,u){mr||vr({});const m=fr(i),v=fr(s);return Tr(m,v,u)},DOMPurify.addHook=function(i,s){"function"==typeof s&&(yt[i]=yt[i]||[],Z(yt[i],s))},DOMPurify.removeHook=function(i){if(yt[i])return Y(yt[i])},DOMPurify.removeHooks=function(i){yt[i]&&(yt[i]=[])},DOMPurify.removeAllHooks=function(){yt={}},DOMPurify}return createDOMPurify()}()},69450:i=>{"use strict";class SubRange{constructor(i,s){this.low=i,this.high=s,this.length=1+s-i}overlaps(i){return!(this.highi.high)}touches(i){return!(this.high+1i.high)}add(i){return new SubRange(Math.min(this.low,i.low),Math.max(this.high,i.high))}subtract(i){return i.low<=this.low&&i.high>=this.high?[]:i.low>this.low&&i.highi+s.length),0)}add(i,s){var _add=i=>{for(var s=0;s{for(var s=0;s{for(var s=0;s{for(var u=s.low;u<=s.high;)i.push(u),u++;return i}),[])}subranges(){return this.ranges.map((i=>({low:i.low,high:i.high,length:1+i.high-i.low})))}}i.exports=DRange},17187:i=>{"use strict";var s,u="object"==typeof Reflect?Reflect:null,m=u&&"function"==typeof u.apply?u.apply:function ReflectApply(i,s,u){return Function.prototype.apply.call(i,s,u)};s=u&&"function"==typeof u.ownKeys?u.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(i){return Object.getOwnPropertyNames(i).concat(Object.getOwnPropertySymbols(i))}:function ReflectOwnKeys(i){return Object.getOwnPropertyNames(i)};var v=Number.isNaN||function NumberIsNaN(i){return i!=i};function EventEmitter(){EventEmitter.init.call(this)}i.exports=EventEmitter,i.exports.once=function once(i,s){return new Promise((function(u,m){function errorListener(u){i.removeListener(s,resolver),m(u)}function resolver(){"function"==typeof i.removeListener&&i.removeListener("error",errorListener),u([].slice.call(arguments))}eventTargetAgnosticAddListener(i,s,resolver,{once:!0}),"error"!==s&&function addErrorHandlerIfEventEmitter(i,s,u){"function"==typeof i.on&&eventTargetAgnosticAddListener(i,"error",s,u)}(i,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var _=10;function checkListener(i){if("function"!=typeof i)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof i)}function _getMaxListeners(i){return void 0===i._maxListeners?EventEmitter.defaultMaxListeners:i._maxListeners}function _addListener(i,s,u,m){var v,_,j;if(checkListener(u),void 0===(_=i._events)?(_=i._events=Object.create(null),i._eventsCount=0):(void 0!==_.newListener&&(i.emit("newListener",s,u.listener?u.listener:u),_=i._events),j=_[s]),void 0===j)j=_[s]=u,++i._eventsCount;else if("function"==typeof j?j=_[s]=m?[u,j]:[j,u]:m?j.unshift(u):j.push(u),(v=_getMaxListeners(i))>0&&j.length>v&&!j.warned){j.warned=!0;var M=new Error("Possible EventEmitter memory leak detected. "+j.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");M.name="MaxListenersExceededWarning",M.emitter=i,M.type=s,M.count=j.length,function ProcessEmitWarning(i){console&&console.warn&&console.warn(i)}(M)}return i}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(i,s,u){var m={fired:!1,wrapFn:void 0,target:i,type:s,listener:u},v=onceWrapper.bind(m);return v.listener=u,m.wrapFn=v,v}function _listeners(i,s,u){var m=i._events;if(void 0===m)return[];var v=m[s];return void 0===v?[]:"function"==typeof v?u?[v.listener||v]:[v]:u?function unwrapListeners(i){for(var s=new Array(i.length),u=0;u0&&(j=s[0]),j instanceof Error)throw j;var M=new Error("Unhandled error."+(j?" ("+j.message+")":""));throw M.context=j,M}var $=_[i];if(void 0===$)return!1;if("function"==typeof $)m($,this,s);else{var W=$.length,X=arrayClone($,W);for(u=0;u=0;_--)if(u[_]===s||u[_].listener===s){j=u[_].listener,v=_;break}if(v<0)return this;0===v?u.shift():function spliceOne(i,s){for(;s+1=0;m--)this.removeListener(i,s[m]);return this},EventEmitter.prototype.listeners=function listeners(i){return _listeners(this,i,!0)},EventEmitter.prototype.rawListeners=function rawListeners(i){return _listeners(this,i,!1)},EventEmitter.listenerCount=function(i,s){return"function"==typeof i.listenerCount?i.listenerCount(s):listenerCount.call(i,s)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?s(this._events):[]}},21102:(i,s,u)=>{"use strict";var m=u(46291),v=create(Error);function create(i){return FormattedError.displayName=i.displayName||i.name,FormattedError;function FormattedError(s){return s&&(s=m.apply(null,arguments)),new i(s)}}i.exports=v,v.eval=create(EvalError),v.range=create(RangeError),v.reference=create(ReferenceError),v.syntax=create(SyntaxError),v.type=create(TypeError),v.uri=create(URIError),v.create=create},46291:i=>{!function(){var s;function format(i){for(var s,u,m,v,_=1,j=[].slice.call(arguments),M=0,$=i.length,W="",X=!1,Y=!1,nextArg=function(){return j[_++]},slurpNumber=function(){for(var u="";/\d/.test(i[M]);)u+=i[M++],s=i[M];return u.length>0?parseInt(u):null};M<$;++M)if(s=i[M],X)switch(X=!1,"."==s?(Y=!1,s=i[++M]):"0"==s&&"."==i[M+1]?(Y=!0,s=i[M+=2]):Y=!0,v=slurpNumber(),s){case"b":W+=parseInt(nextArg(),10).toString(2);break;case"c":W+="string"==typeof(u=nextArg())||u instanceof String?u:String.fromCharCode(parseInt(u,10));break;case"d":W+=parseInt(nextArg(),10);break;case"f":m=String(parseFloat(nextArg()).toFixed(v||6)),W+=Y?m:m.replace(/^0/,"");break;case"j":W+=JSON.stringify(nextArg());break;case"o":W+="0"+parseInt(nextArg(),10).toString(8);break;case"s":W+=nextArg();break;case"x":W+="0x"+parseInt(nextArg(),10).toString(16);break;case"X":W+="0x"+parseInt(nextArg(),10).toString(16).toUpperCase();break;default:W+=s}else"%"===s?X=!0:W+=s;return W}(s=i.exports=format).format=format,s.vsprintf=function vsprintf(i,s){return format.apply(null,[i].concat(s))},"undefined"!=typeof console&&"function"==typeof console.log&&(s.printf=function printf(){console.log(format.apply(null,arguments))})}()},17648:i=>{"use strict";var s=Array.prototype.slice,u=Object.prototype.toString;i.exports=function bind(i){var m=this;if("function"!=typeof m||"[object Function]"!==u.call(m))throw new TypeError("Function.prototype.bind called on incompatible "+m);for(var v,_=s.call(arguments,1),j=Math.max(0,m.length-_.length),M=[],$=0;${"use strict";var m=u(17648);i.exports=Function.prototype.bind||m},40210:(i,s,u)=>{"use strict";var m,v=SyntaxError,_=Function,j=TypeError,getEvalledConstructor=function(i){try{return _('"use strict"; return ('+i+").constructor;")()}catch(i){}},M=Object.getOwnPropertyDescriptor;if(M)try{M({},"")}catch(i){M=null}var throwTypeError=function(){throw new j},$=M?function(){try{return throwTypeError}catch(i){try{return M(arguments,"callee").get}catch(i){return throwTypeError}}}():throwTypeError,W=u(41405)(),X=u(28185)(),Y=Object.getPrototypeOf||(X?function(i){return i.__proto__}:null),Z={},ee="undefined"!=typeof Uint8Array&&Y?Y(Uint8Array):m,ae={"%AggregateError%":"undefined"==typeof AggregateError?m:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?m:ArrayBuffer,"%ArrayIteratorPrototype%":W&&Y?Y([][Symbol.iterator]()):m,"%AsyncFromSyncIteratorPrototype%":m,"%AsyncFunction%":Z,"%AsyncGenerator%":Z,"%AsyncGeneratorFunction%":Z,"%AsyncIteratorPrototype%":Z,"%Atomics%":"undefined"==typeof Atomics?m:Atomics,"%BigInt%":"undefined"==typeof BigInt?m:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?m:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?m:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?m:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?m:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?m:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?m:FinalizationRegistry,"%Function%":_,"%GeneratorFunction%":Z,"%Int8Array%":"undefined"==typeof Int8Array?m:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?m:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?m:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":W&&Y?Y(Y([][Symbol.iterator]())):m,"%JSON%":"object"==typeof JSON?JSON:m,"%Map%":"undefined"==typeof Map?m:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&W&&Y?Y((new Map)[Symbol.iterator]()):m,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?m:Promise,"%Proxy%":"undefined"==typeof Proxy?m:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?m:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?m:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&W&&Y?Y((new Set)[Symbol.iterator]()):m,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?m:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":W&&Y?Y(""[Symbol.iterator]()):m,"%Symbol%":W?Symbol:m,"%SyntaxError%":v,"%ThrowTypeError%":$,"%TypedArray%":ee,"%TypeError%":j,"%Uint8Array%":"undefined"==typeof Uint8Array?m:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?m:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?m:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?m:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?m:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?m:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?m:WeakSet};if(Y)try{null.error}catch(i){var ie=Y(Y(i));ae["%Error.prototype%"]=ie}var le=function doEval(i){var s;if("%AsyncFunction%"===i)s=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===i)s=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===i)s=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===i){var u=doEval("%AsyncGeneratorFunction%");u&&(s=u.prototype)}else if("%AsyncIteratorPrototype%"===i){var m=doEval("%AsyncGenerator%");m&&Y&&(s=Y(m.prototype))}return ae[i]=s,s},ce={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},pe=u(58612),de=u(17642),fe=pe.call(Function.call,Array.prototype.concat),ye=pe.call(Function.apply,Array.prototype.splice),be=pe.call(Function.call,String.prototype.replace),_e=pe.call(Function.call,String.prototype.slice),we=pe.call(Function.call,RegExp.prototype.exec),Se=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,xe=/\\(\\)?/g,Pe=function getBaseIntrinsic(i,s){var u,m=i;if(de(ce,m)&&(m="%"+(u=ce[m])[0]+"%"),de(ae,m)){var _=ae[m];if(_===Z&&(_=le(m)),void 0===_&&!s)throw new j("intrinsic "+i+" exists, but is not available. Please file an issue!");return{alias:u,name:m,value:_}}throw new v("intrinsic "+i+" does not exist!")};i.exports=function GetIntrinsic(i,s){if("string"!=typeof i||0===i.length)throw new j("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof s)throw new j('"allowMissing" argument must be a boolean');if(null===we(/^%?[^%]*%?$/,i))throw new v("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var u=function stringToPath(i){var s=_e(i,0,1),u=_e(i,-1);if("%"===s&&"%"!==u)throw new v("invalid intrinsic syntax, expected closing `%`");if("%"===u&&"%"!==s)throw new v("invalid intrinsic syntax, expected opening `%`");var m=[];return be(i,Se,(function(i,s,u,v){m[m.length]=u?be(v,xe,"$1"):s||i})),m}(i),m=u.length>0?u[0]:"",_=Pe("%"+m+"%",s),$=_.name,W=_.value,X=!1,Y=_.alias;Y&&(m=Y[0],ye(u,fe([0,1],Y)));for(var Z=1,ee=!0;Z=u.length){var pe=M(W,ie);W=(ee=!!pe)&&"get"in pe&&!("originalValue"in pe.get)?pe.get:W[ie]}else ee=de(W,ie),W=W[ie];ee&&!X&&(ae[$]=W)}}return W}},28185:i=>{"use strict";var s={foo:{}},u=Object;i.exports=function hasProto(){return{__proto__:s}.foo===s.foo&&!({__proto__:null}instanceof u)}},41405:(i,s,u)=>{"use strict";var m="undefined"!=typeof Symbol&&Symbol,v=u(55419);i.exports=function hasNativeSymbols(){return"function"==typeof m&&("function"==typeof Symbol&&("symbol"==typeof m("foo")&&("symbol"==typeof Symbol("bar")&&v())))}},55419:i=>{"use strict";i.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var i={},s=Symbol("test"),u=Object(s);if("string"==typeof s)return!1;if("[object Symbol]"!==Object.prototype.toString.call(s))return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;for(s in i[s]=42,i)return!1;if("function"==typeof Object.keys&&0!==Object.keys(i).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(i).length)return!1;var m=Object.getOwnPropertySymbols(i);if(1!==m.length||m[0]!==s)return!1;if(!Object.prototype.propertyIsEnumerable.call(i,s))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var v=Object.getOwnPropertyDescriptor(i,s);if(42!==v.value||!0!==v.enumerable)return!1}return!0}},17642:(i,s,u)=>{"use strict";var m=u(58612);i.exports=m.call(Function.call,Object.prototype.hasOwnProperty)},47802:i=>{function deepFreeze(i){return i instanceof Map?i.clear=i.delete=i.set=function(){throw new Error("map is read-only")}:i instanceof Set&&(i.add=i.clear=i.delete=function(){throw new Error("set is read-only")}),Object.freeze(i),Object.getOwnPropertyNames(i).forEach((function(s){var u=i[s];"object"!=typeof u||Object.isFrozen(u)||deepFreeze(u)})),i}var s=deepFreeze,u=deepFreeze;s.default=u;class Response{constructor(i){void 0===i.data&&(i.data={}),this.data=i.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(i){return i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(i,...s){const u=Object.create(null);for(const s in i)u[s]=i[s];return s.forEach((function(i){for(const s in i)u[s]=i[s]})),u}const emitsWrappingTags=i=>!!i.kind;class HTMLRenderer{constructor(i,s){this.buffer="",this.classPrefix=s.classPrefix,i.walk(this)}addText(i){this.buffer+=escapeHTML(i)}openNode(i){if(!emitsWrappingTags(i))return;let s=i.kind;i.sublanguage||(s=`${this.classPrefix}${s}`),this.span(s)}closeNode(i){emitsWrappingTags(i)&&(this.buffer+="")}value(){return this.buffer}span(i){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(i){this.top.children.push(i)}openNode(i){const s={kind:i,children:[]};this.add(s),this.stack.push(s)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(i){return this.constructor._walk(i,this.rootNode)}static _walk(i,s){return"string"==typeof s?i.addText(s):s.children&&(i.openNode(s),s.children.forEach((s=>this._walk(i,s))),i.closeNode(s)),i}static _collapse(i){"string"!=typeof i&&i.children&&(i.children.every((i=>"string"==typeof i))?i.children=[i.children.join("")]:i.children.forEach((i=>{TokenTree._collapse(i)})))}}class TokenTreeEmitter extends TokenTree{constructor(i){super(),this.options=i}addKeyword(i,s){""!==i&&(this.openNode(s),this.addText(i),this.closeNode())}addText(i){""!==i&&this.add(i)}addSublanguage(i,s){const u=i.root;u.kind=s,u.sublanguage=!0,this.add(u)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(i){return i?"string"==typeof i?i:i.source:null}const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const v="[a-zA-Z]\\w*",_="[a-zA-Z_]\\w*",j="\\b\\d+(\\.\\d+)?",M="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",$="\\b(0b[01]+)",W={begin:"\\\\[\\s\\S]",relevance:0},X={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[W]},Y={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[W]},Z={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(i,s,u={}){const m=inherit({className:"comment",begin:i,end:s,contains:[]},u);return m.contains.push(Z),m.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),m},ee=COMMENT("//","$"),ae=COMMENT("/\\*","\\*/"),ie=COMMENT("#","$"),le={className:"number",begin:j,relevance:0},ce={className:"number",begin:M,relevance:0},pe={className:"number",begin:$,relevance:0},de={className:"number",begin:j+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},fe={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[W,{begin:/\[/,end:/\]/,relevance:0,contains:[W]}]}]},ye={className:"title",begin:v,relevance:0},be={className:"title",begin:_,relevance:0},_e={begin:"\\.\\s*"+_,relevance:0};var we=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:v,UNDERSCORE_IDENT_RE:_,NUMBER_RE:j,C_NUMBER_RE:M,BINARY_NUMBER_RE:$,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(i={})=>{const s=/^#![ ]*\//;return i.binary&&(i.begin=function concat(...i){return i.map((i=>source(i))).join("")}(s,/.*\b/,i.binary,/\b.*/)),inherit({className:"meta",begin:s,end:/$/,relevance:0,"on:begin":(i,s)=>{0!==i.index&&s.ignoreMatch()}},i)},BACKSLASH_ESCAPE:W,APOS_STRING_MODE:X,QUOTE_STRING_MODE:Y,PHRASAL_WORDS_MODE:Z,COMMENT,C_LINE_COMMENT_MODE:ee,C_BLOCK_COMMENT_MODE:ae,HASH_COMMENT_MODE:ie,NUMBER_MODE:le,C_NUMBER_MODE:ce,BINARY_NUMBER_MODE:pe,CSS_NUMBER_MODE:de,REGEXP_MODE:fe,TITLE_MODE:ye,UNDERSCORE_TITLE_MODE:be,METHOD_GUARD:_e,END_SAME_AS_BEGIN:function(i){return Object.assign(i,{"on:begin":(i,s)=>{s.data._beginMatch=i[1]},"on:end":(i,s)=>{s.data._beginMatch!==i[1]&&s.ignoreMatch()}})}});function skipIfhasPrecedingDot(i,s){"."===i.input[i.index-1]&&s.ignoreMatch()}function beginKeywords(i,s){s&&i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",i.__beforeBegin=skipIfhasPrecedingDot,i.keywords=i.keywords||i.beginKeywords,delete i.beginKeywords,void 0===i.relevance&&(i.relevance=0))}function compileIllegal(i,s){Array.isArray(i.illegal)&&(i.illegal=function either(...i){return"("+i.map((i=>source(i))).join("|")+")"}(...i.illegal))}function compileMatch(i,s){if(i.match){if(i.begin||i.end)throw new Error("begin & end are not supported with match");i.begin=i.match,delete i.match}}function compileRelevance(i,s){void 0===i.relevance&&(i.relevance=1)}const Se=["of","and","for","in","not","or","if","then","parent","list","value"],xe="keyword";function compileKeywords(i,s,u=xe){const m={};return"string"==typeof i?compileList(u,i.split(" ")):Array.isArray(i)?compileList(u,i):Object.keys(i).forEach((function(u){Object.assign(m,compileKeywords(i[u],s,u))})),m;function compileList(i,u){s&&(u=u.map((i=>i.toLowerCase()))),u.forEach((function(s){const u=s.split("|");m[u[0]]=[i,scoreForKeyword(u[0],u[1])]}))}}function scoreForKeyword(i,s){return s?Number(s):function commonKeyword(i){return Se.includes(i.toLowerCase())}(i)?0:1}function compileLanguage(i,{plugins:s}){function langRe(s,u){return new RegExp(source(s),"m"+(i.case_insensitive?"i":"")+(u?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(i,s){s.position=this.position++,this.matchIndexes[this.matchAt]=s,this.regexes.push([s,i]),this.matchAt+=function countMatchGroups(i){return new RegExp(i.toString()+"|").exec("").length-1}(i)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const i=this.regexes.map((i=>i[1]));this.matcherRe=langRe(function join(i,s="|"){let u=0;return i.map((i=>{u+=1;const s=u;let v=source(i),_="";for(;v.length>0;){const i=m.exec(v);if(!i){_+=v;break}_+=v.substring(0,i.index),v=v.substring(i.index+i[0].length),"\\"===i[0][0]&&i[1]?_+="\\"+String(Number(i[1])+s):(_+=i[0],"("===i[0]&&u++)}return _})).map((i=>`(${i})`)).join(s)}(i),!0),this.lastIndex=0}exec(i){this.matcherRe.lastIndex=this.lastIndex;const s=this.matcherRe.exec(i);if(!s)return null;const u=s.findIndex(((i,s)=>s>0&&void 0!==i)),m=this.matchIndexes[u];return s.splice(0,u),Object.assign(s,m)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(i){if(this.multiRegexes[i])return this.multiRegexes[i];const s=new MultiRegex;return this.rules.slice(i).forEach((([i,u])=>s.addRule(i,u))),s.compile(),this.multiRegexes[i]=s,s}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(i,s){this.rules.push([i,s]),"begin"===s.type&&this.count++}exec(i){const s=this.getMatcher(this.regexIndex);s.lastIndex=this.lastIndex;let u=s.exec(i);if(this.resumingScanAtSamePosition())if(u&&u.index===this.lastIndex);else{const s=this.getMatcher(0);s.lastIndex=this.lastIndex+1,u=s.exec(i)}return u&&(this.regexIndex+=u.position+1,this.regexIndex===this.count&&this.considerAll()),u}}if(i.compilerExtensions||(i.compilerExtensions=[]),i.contains&&i.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return i.classNameAliases=inherit(i.classNameAliases||{}),function compileMode(s,u){const m=s;if(s.isCompiled)return m;[compileMatch].forEach((i=>i(s,u))),i.compilerExtensions.forEach((i=>i(s,u))),s.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((i=>i(s,u))),s.isCompiled=!0;let v=null;if("object"==typeof s.keywords&&(v=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=compileKeywords(s.keywords,i.case_insensitive)),s.lexemes&&v)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return v=v||s.lexemes||/\w+/,m.keywordPatternRe=langRe(v,!0),u&&(s.begin||(s.begin=/\B|\b/),m.beginRe=langRe(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(m.endRe=langRe(s.end)),m.terminatorEnd=source(s.end)||"",s.endsWithParent&&u.terminatorEnd&&(m.terminatorEnd+=(s.end?"|":"")+u.terminatorEnd)),s.illegal&&(m.illegalRe=langRe(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(i){return function expandOrCloneMode(i){i.variants&&!i.cachedVariants&&(i.cachedVariants=i.variants.map((function(s){return inherit(i,{variants:null},s)})));if(i.cachedVariants)return i.cachedVariants;if(dependencyOnParent(i))return inherit(i,{starts:i.starts?inherit(i.starts):null});if(Object.isFrozen(i))return inherit(i);return i}("self"===i?s:i)}))),s.contains.forEach((function(i){compileMode(i,m)})),s.starts&&compileMode(s.starts,u),m.matcher=function buildModeRegex(i){const s=new ResumableMultiRegex;return i.contains.forEach((i=>s.addRule(i.begin,{rule:i,type:"begin"}))),i.terminatorEnd&&s.addRule(i.terminatorEnd,{type:"end"}),i.illegal&&s.addRule(i.illegal,{type:"illegal"}),s}(m),m}(i)}function dependencyOnParent(i){return!!i&&(i.endsWithParent||dependencyOnParent(i.starts))}function BuildVuePlugin(i){const s={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!i.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let s={};return this.autoDetect?(s=i.highlightAuto(this.code),this.detectedLanguage=s.language):(s=i.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),s.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(i){return Boolean(i||""===i)}(this.autodetect)},ignoreIllegals:()=>!0},render(i){return i("pre",{},[i("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:s,VuePlugin:{install(i){i.component("highlightjs",s)}}}}const Pe={"after:highlightElement":({el:i,result:s,text:u})=>{const m=nodeStream(i);if(!m.length)return;const v=document.createElement("div");v.innerHTML=s.value,s.value=function mergeStreams(i,s,u){let m=0,v="";const _=[];function selectStream(){return i.length&&s.length?i[0].offset!==s[0].offset?i[0].offset"}function close(i){v+=""+tag(i)+">"}function render(i){("start"===i.event?open:close)(i.node)}for(;i.length||s.length;){let s=selectStream();if(v+=escapeHTML(u.substring(m,s[0].offset)),m=s[0].offset,s===i){_.reverse().forEach(close);do{render(s.splice(0,1)[0]),s=selectStream()}while(s===i&&s.length&&s[0].offset===m);_.reverse().forEach(open)}else"start"===s[0].event?_.push(s[0].node):_.pop(),render(s.splice(0,1)[0])}return v+escapeHTML(u.substr(m))}(m,nodeStream(v),u)}};function tag(i){return i.nodeName.toLowerCase()}function nodeStream(i){const s=[];return function _nodeStream(i,u){for(let m=i.firstChild;m;m=m.nextSibling)3===m.nodeType?u+=m.nodeValue.length:1===m.nodeType&&(s.push({event:"start",offset:u,node:m}),u=_nodeStream(m,u),tag(m).match(/br|hr|img|input/)||s.push({event:"stop",offset:u,node:m}));return u}(i,0),s}const Ie={},error=i=>{console.error(i)},warn=(i,...s)=>{console.log(`WARN: ${i}`,...s)},deprecated=(i,s)=>{Ie[`${i}/${s}`]||(console.log(`Deprecated as of ${i}. ${s}`),Ie[`${i}/${s}`]=!0)},Te=escapeHTML,Re=inherit,qe=Symbol("nomatch");var ze=function(i){const u=Object.create(null),m=Object.create(null),v=[];let _=!0;const j=/(^(<[^>]+>|\t|)+|\n)/gm,M="Could not find the language '{}', did you forget to load/include a language module?",$={disableAutodetect:!0,name:"Plain text",contains:[]};let W={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(i){return W.noHighlightRe.test(i)}function highlight(i,s,u,m){let v="",_="";"object"==typeof s?(v=i,u=s.ignoreIllegals,_=s.language,m=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),_=i,v=s);const j={code:v,language:_};fire("before:highlight",j);const M=j.result?j.result:_highlight(j.language,j.code,u,m);return M.code=j.code,fire("after:highlight",M),M}function _highlight(i,s,m,j){function keywordData(i,s){const u=X.case_insensitive?s[0].toLowerCase():s[0];return Object.prototype.hasOwnProperty.call(i.keywords,u)&&i.keywords[u]}function processBuffer(){null!=ee.subLanguage?function processSubLanguage(){if(""===le)return;let i=null;if("string"==typeof ee.subLanguage){if(!u[ee.subLanguage])return void ie.addText(le);i=_highlight(ee.subLanguage,le,!0,ae[ee.subLanguage]),ae[ee.subLanguage]=i.top}else i=highlightAuto(le,ee.subLanguage.length?ee.subLanguage:null);ee.relevance>0&&(ce+=i.relevance),ie.addSublanguage(i.emitter,i.language)}():function processKeywords(){if(!ee.keywords)return void ie.addText(le);let i=0;ee.keywordPatternRe.lastIndex=0;let s=ee.keywordPatternRe.exec(le),u="";for(;s;){u+=le.substring(i,s.index);const m=keywordData(ee,s);if(m){const[i,v]=m;if(ie.addText(u),u="",ce+=v,i.startsWith("_"))u+=s[0];else{const u=X.classNameAliases[i]||i;ie.addKeyword(s[0],u)}}else u+=s[0];i=ee.keywordPatternRe.lastIndex,s=ee.keywordPatternRe.exec(le)}u+=le.substr(i),ie.addText(u)}(),le=""}function startNewMode(i){return i.className&&ie.openNode(X.classNameAliases[i.className]||i.className),ee=Object.create(i,{parent:{value:ee}}),ee}function endOfMode(i,s,u){let m=function startsWith(i,s){const u=i&&i.exec(s);return u&&0===u.index}(i.endRe,u);if(m){if(i["on:end"]){const u=new Response(i);i["on:end"](s,u),u.isMatchIgnored&&(m=!1)}if(m){for(;i.endsParent&&i.parent;)i=i.parent;return i}}if(i.endsWithParent)return endOfMode(i.parent,s,u)}function doIgnore(i){return 0===ee.matcher.regexIndex?(le+=i[0],1):(fe=!0,0)}function doBeginMatch(i){const s=i[0],u=i.rule,m=new Response(u),v=[u.__beforeBegin,u["on:begin"]];for(const u of v)if(u&&(u(i,m),m.isMatchIgnored))return doIgnore(s);return u&&u.endSameAsBegin&&(u.endRe=function escape(i){return new RegExp(i.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(s)),u.skip?le+=s:(u.excludeBegin&&(le+=s),processBuffer(),u.returnBegin||u.excludeBegin||(le=s)),startNewMode(u),u.returnBegin?0:s.length}function doEndMatch(i){const u=i[0],m=s.substr(i.index),v=endOfMode(ee,i,m);if(!v)return qe;const _=ee;_.skip?le+=u:(_.returnEnd||_.excludeEnd||(le+=u),processBuffer(),_.excludeEnd&&(le=u));do{ee.className&&ie.closeNode(),ee.skip||ee.subLanguage||(ce+=ee.relevance),ee=ee.parent}while(ee!==v.parent);return v.starts&&(v.endSameAsBegin&&(v.starts.endRe=v.endRe),startNewMode(v.starts)),_.returnEnd?0:u.length}let $={};function processLexeme(u,v){const j=v&&v[0];if(le+=u,null==j)return processBuffer(),0;if("begin"===$.type&&"end"===v.type&&$.index===v.index&&""===j){if(le+=s.slice(v.index,v.index+1),!_){const s=new Error("0 width match regex");throw s.languageName=i,s.badRule=$.rule,s}return 1}if($=v,"begin"===v.type)return doBeginMatch(v);if("illegal"===v.type&&!m){const i=new Error('Illegal lexeme "'+j+'" for mode "'+(ee.className||"")+'"');throw i.mode=ee,i}if("end"===v.type){const i=doEndMatch(v);if(i!==qe)return i}if("illegal"===v.type&&""===j)return 1;if(de>1e5&&de>3*v.index){throw new Error("potential infinite loop, way more iterations than matches")}return le+=j,j.length}const X=getLanguage(i);if(!X)throw error(M.replace("{}",i)),new Error('Unknown language: "'+i+'"');const Y=compileLanguage(X,{plugins:v});let Z="",ee=j||Y;const ae={},ie=new W.__emitter(W);!function processContinuations(){const i=[];for(let s=ee;s!==X;s=s.parent)s.className&&i.unshift(s.className);i.forEach((i=>ie.openNode(i)))}();let le="",ce=0,pe=0,de=0,fe=!1;try{for(ee.matcher.considerAll();;){de++,fe?fe=!1:ee.matcher.considerAll(),ee.matcher.lastIndex=pe;const i=ee.matcher.exec(s);if(!i)break;const u=processLexeme(s.substring(pe,i.index),i);pe=i.index+u}return processLexeme(s.substr(pe)),ie.closeAllNodes(),ie.finalize(),Z=ie.toHTML(),{relevance:Math.floor(ce),value:Z,language:i,illegal:!1,emitter:ie,top:ee}}catch(u){if(u.message&&u.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:u.message,context:s.slice(pe-100,pe+100),mode:u.mode},sofar:Z,relevance:0,value:Te(s),emitter:ie};if(_)return{illegal:!1,relevance:0,value:Te(s),emitter:ie,language:i,top:ee,errorRaised:u};throw u}}function highlightAuto(i,s){s=s||W.languages||Object.keys(u);const m=function justTextHighlightResult(i){const s={relevance:0,emitter:new W.__emitter(W),value:Te(i),illegal:!1,top:$};return s.emitter.addText(i),s}(i),v=s.filter(getLanguage).filter(autoDetection).map((s=>_highlight(s,i,!1)));v.unshift(m);const _=v.sort(((i,s)=>{if(i.relevance!==s.relevance)return s.relevance-i.relevance;if(i.language&&s.language){if(getLanguage(i.language).supersetOf===s.language)return 1;if(getLanguage(s.language).supersetOf===i.language)return-1}return 0})),[j,M]=_,X=j;return X.second_best=M,X}const X={"before:highlightElement":({el:i})=>{W.useBR&&(i.innerHTML=i.innerHTML.replace(/\n/g,"").replace(/
/g,"\n"))},"after:highlightElement":({result:i})=>{W.useBR&&(i.value=i.value.replace(/\n/g,"
"))}},Y=/^(<[^>]+>|\t)+/gm,Z={"after:highlightElement":({result:i})=>{W.tabReplace&&(i.value=i.value.replace(Y,(i=>i.replace(/\t/g,W.tabReplace))))}};function highlightElement(i){let s=null;const u=function blockLanguage(i){let s=i.className+" ";s+=i.parentNode?i.parentNode.className:"";const u=W.languageDetectRe.exec(s);if(u){const s=getLanguage(u[1]);return s||(warn(M.replace("{}",u[1])),warn("Falling back to no-highlight mode for this block.",i)),s?u[1]:"no-highlight"}return s.split(/\s+/).find((i=>shouldNotHighlight(i)||getLanguage(i)))}(i);if(shouldNotHighlight(u))return;fire("before:highlightElement",{el:i,language:u}),s=i;const v=s.textContent,_=u?highlight(v,{language:u,ignoreIllegals:!0}):highlightAuto(v);fire("after:highlightElement",{el:i,result:_,text:v}),i.innerHTML=_.value,function updateClassName(i,s,u){const v=s?m[s]:u;i.classList.add("hljs"),v&&i.classList.add(v)}(i,u,_.language),i.result={language:_.language,re:_.relevance,relavance:_.relevance},_.second_best&&(i.second_best={language:_.second_best.language,re:_.second_best.relevance,relavance:_.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let ee=!1;function highlightAll(){if("loading"===document.readyState)return void(ee=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(i){return i=(i||"").toLowerCase(),u[i]||u[m[i]]}function registerAliases(i,{languageName:s}){"string"==typeof i&&(i=[i]),i.forEach((i=>{m[i.toLowerCase()]=s}))}function autoDetection(i){const s=getLanguage(i);return s&&!s.disableAutodetect}function fire(i,s){const u=i;v.forEach((function(i){i[u]&&i[u](s)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){ee&&highlightAll()}),!1),Object.assign(i,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(i){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(i){return W.tabReplace||W.useBR?i.replace(j,(i=>"\n"===i?W.useBR?"
":i:W.tabReplace?i.replace(/\t/g,W.tabReplace):i)):i}(i)},highlightElement,highlightBlock:function deprecateHighlightBlock(i){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(i)},configure:function configure(i){i.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),W=Re(W,i)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),ee=!0},registerLanguage:function registerLanguage(s,m){let v=null;try{v=m(i)}catch(i){if(error("Language definition for '{}' could not be registered.".replace("{}",s)),!_)throw i;error(i),v=$}v.name||(v.name=s),u[s]=v,v.rawDefinition=m.bind(null,i),v.aliases&®isterAliases(v.aliases,{languageName:s})},unregisterLanguage:function unregisterLanguage(i){delete u[i];for(const s of Object.keys(m))m[s]===i&&delete m[s]},listLanguages:function listLanguages(){return Object.keys(u)},getLanguage,registerAliases,requireLanguage:function requireLanguage(i){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const s=getLanguage(i);if(s)return s;throw new Error("The '{}' language is required, but not loaded.".replace("{}",i))},autoDetection,inherit:Re,addPlugin:function addPlugin(i){!function upgradePluginAPI(i){i["before:highlightBlock"]&&!i["before:highlightElement"]&&(i["before:highlightElement"]=s=>{i["before:highlightBlock"](Object.assign({block:s.el},s))}),i["after:highlightBlock"]&&!i["after:highlightElement"]&&(i["after:highlightElement"]=s=>{i["after:highlightBlock"](Object.assign({block:s.el},s))})}(i),v.push(i)},vuePlugin:BuildVuePlugin(i).VuePlugin}),i.debugMode=function(){_=!1},i.safeMode=function(){_=!0},i.versionString="10.7.3";for(const i in we)"object"==typeof we[i]&&s(we[i]);return Object.assign(i,we),i.addPlugin(X),i.addPlugin(Pe),i.addPlugin(Z),i}({});i.exports=ze},61519:i=>{function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function bash(i){const s={},u={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[s]}]};Object.assign(s,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},u]});const m={className:"subst",begin:/\$\(/,end:/\)/,contains:[i.BACKSLASH_ESCAPE]},v={begin:/<<-?\s*(?=\w+)/,starts:{contains:[i.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},_={className:"string",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE,s,m]};m.contains.push(_);const j={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},i.NUMBER_MODE,s]},M=i.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),$={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[i.inherit(i.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[M,i.SHEBANG(),$,j,i.HASH_COMMENT_MODE,v,_,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}},30786:i=>{function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function http(i){const s="HTTP/(2|1\\.[01])",u={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},m=[u,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+s+" \\d{3})",end:/$/,contains:[{className:"meta",begin:s},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:m}},{begin:"(?=^[A-Z]+ (.*?) "+s+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:s},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:m}},i.inherit(u,{relevance:0})]}}},96344:i=>{const s="[A-Za-z$_][0-9A-Za-z$_]*",u=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],m=["true","false","null","undefined","NaN","Infinity"],v=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(i){return concat("(?=",i,")")}function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function javascript(i){const _=s,j="<>",M=">",$={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(i,s)=>{const u=i[0].length+i.index,m=i.input[u];"<"!==m?">"===m&&(((i,{after:s})=>{const u=""+i[0].slice(1);return-1!==i.input.indexOf(u,s)})(i,{after:u})||s.ignoreMatch()):s.ignoreMatch()}},W={$pattern:s,keyword:u,literal:m,built_in:v},X="[0-9](_?[0-9])*",Y=`\\.(${X})`,Z="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",ee={className:"number",variants:[{begin:`(\\b(${Z})((${Y})|\\.)?|(${Y}))[eE][+-]?(${X})\\b`},{begin:`\\b(${Z})\\b((${Y})\\b|\\.)?|(${Y})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},ae={className:"subst",begin:"\\$\\{",end:"\\}",keywords:W,contains:[]},ie={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[i.BACKSLASH_ESCAPE,ae],subLanguage:"xml"}},le={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[i.BACKSLASH_ESCAPE,ae],subLanguage:"css"}},ce={className:"string",begin:"`",end:"`",contains:[i.BACKSLASH_ESCAPE,ae]},pe={className:"comment",variants:[i.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:_+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),i.C_BLOCK_COMMENT_MODE,i.C_LINE_COMMENT_MODE]},de=[i.APOS_STRING_MODE,i.QUOTE_STRING_MODE,ie,le,ce,ee,i.REGEXP_MODE];ae.contains=de.concat({begin:/\{/,end:/\}/,keywords:W,contains:["self"].concat(de)});const fe=[].concat(pe,ae.contains),ye=fe.concat([{begin:/\(/,end:/\)/,keywords:W,contains:["self"].concat(fe)}]),be={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:W,contains:ye};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:W,exports:{PARAMS_CONTAINS:ye},illegal:/#(?![$_A-z])/,contains:[i.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},i.APOS_STRING_MODE,i.QUOTE_STRING_MODE,ie,le,ce,pe,ee,{begin:concat(/[{,\n]\s*/,lookahead(concat(/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,_+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:_+lookahead("\\s*:"),relevance:0}]},{begin:"("+i.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[pe,i.REGEXP_MODE,{className:"function",begin:"(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+i.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:W,contains:ye}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:j,end:M},{begin:$.begin,"on:begin":$.isTrulyOpeningTag,end:$.end}],subLanguage:"xml",contains:[{begin:$.begin,end:$.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:W,contains:["self",i.inherit(i.TITLE_MODE,{begin:_}),be],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[be,i.inherit(i.TITLE_MODE,{begin:_})]},{variants:[{begin:"\\."+_},{begin:"\\$"+_}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:_}),"self",be]},{begin:"(get|set)\\s+(?="+_+"\\()",end:/\{/,keywords:"get set",contains:[i.inherit(i.TITLE_MODE,{begin:_}),{begin:/\(\)/},be]},{begin:/\$[(.]/}]}}},82026:i=>{i.exports=function json(i){const s={literal:"true false null"},u=[i.C_LINE_COMMENT_MODE,i.C_BLOCK_COMMENT_MODE],m=[i.QUOTE_STRING_MODE,i.C_NUMBER_MODE],v={end:",",endsWithParent:!0,excludeEnd:!0,contains:m,keywords:s},_={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE],illegal:"\\n"},i.inherit(v,{begin:/:/})].concat(u),illegal:"\\S"},j={begin:"\\[",end:"\\]",contains:[i.inherit(v)],illegal:"\\S"};return m.push(_,j),u.forEach((function(i){m.push(i)})),{name:"JSON",contains:m,keywords:s,illegal:"\\S"}}},66336:i=>{i.exports=function powershell(i){const s={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},u={begin:"`[\\s\\S]",relevance:0},m={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},v={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[u,m,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},_={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},j=i.inherit(i.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),M={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},$={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[i.TITLE_MODE]},W={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[m]}]},X={begin:/using\s/,end:/$/,returnBegin:!0,contains:[v,_,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},Y={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},Z={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(s.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},i.inherit(i.TITLE_MODE,{endsParent:!0})]},ee=[Z,j,u,i.NUMBER_MODE,v,_,M,m,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],ae={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",ee,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return Z.contains.unshift(ae),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:s,contains:ee.concat($,W,X,Y,ae)}}},42157:i=>{function source(i){return i?"string"==typeof i?i:i.source:null}function lookahead(i){return concat("(?=",i,")")}function concat(...i){return i.map((i=>source(i))).join("")}function either(...i){return"("+i.map((i=>source(i))).join("|")+")"}i.exports=function xml(i){const s=concat(/[A-Z_]/,function optional(i){return concat("(",i,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),u={className:"symbol",begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},m={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},v=i.inherit(m,{begin:/\(/,end:/\)/}),_=i.inherit(i.APOS_STRING_MODE,{className:"meta-string"}),j=i.inherit(i.QUOTE_STRING_MODE,{className:"meta-string"}),M={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:"attr",begin:/[A-Za-z0-9._:-]+/,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[u]},{begin:/'/,end:/'/,contains:[u]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[m,j,_,v,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[m,v,j,_]}]}]},i.COMMENT(//,{relevance:10}),{begin://,relevance:10},u,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/