Service Catalogue Model

Introduction

In order to support a uniform and harmonized machine-readable description of public and private services a service model has been defined to collect all information from the three point of view (Informational, Service invocation, Data Governance&Ownership) and managed in the Service Catalogue. The idea is to define this model by including and extending existing common models to describe each view.

Information View provides all information metadata of a service. This section follows the CPSV-AP, the Core Public Service Vocabulary Application Profile, a data model provided by the ISA2 Programme that is the result of a joint effort from different public administrations to reduce interoperability barriers.

Usage Rule and Personal Data Handling views capture information about for handling data access rights. In particular the personal Data Handling section is a specialized profile of the Data Privacy Vocabulary (DPV) providing terms (classes and properties) to describe and represent information about personal data handling. In particular, the vocabulary provides extensible taxonomies of terms to describe the following components:

  • Personal Data Categories

  • Purposes

  • Processing Categories

  • Technical and Organisational Measures

  • Legal Basis such as Consent

  • Entities such as Recipients, Data Controllers, Data Subjects

The Service Instance view provides all operational information to manage and invoke each service instance

The following sections provides a deeper description of the ACROSS Service Model.

Service Basic Info

Each service to be registered in the Service Catalogue has to provide some basic information.

Each service to be registered in the Service Catalogue has to provide some basic information.

Property Type Description
title String(1..1) Service Name
identifier String(1..1) Id of service or service URI if exists. This identifier will be used by the Service Catalogue to identify it and could be the same identifier provided in the information section.
issued String(0..1) When Service entry was created (system log data)
createdByUserId String 0..1) User Id (if any)of Service Editor
serviceDescriptionVersion String(0..1) Service description version number
serviceIconUrl String(0..1) URL pointing to service's icon (if available)
status String(0..1) Status of Service [Completed, Deprecated, UnderDevelopment,WithDrawn]
isPublicService Boolean(1..1) If service is public or not
hasInfo Object(1..1) Object describing Service informationsection.
hasServiceInstance Object(1..1) Object describing Service information section.
isPersonalDataHandling Object(1..n) Object describing Personal data handling.
hasUsageRule Object(1..n) Object describing Service usage Rules.

Service Information section

Each service should provide basic information, identification, service classifications and locale descriptions. Such classifications are only related to public services, according to ISA² Core Public Service Vocabulary Application Profile (CPSV-AP). The following classes and properties belong to ISA² CPSV-AP v2.2.1.

Property

Type

Description

Title

String(1..1)

It represents the official Name of the Public Service

Identifier

String(1..1)

This property represents a formally-issued Identifier for the Public Service.

Description

Object(1..N)

This property represents a free text Description of the Public Service. The description is likely to be the text that potential users of the Public Service see in any public service catalogue.

Property

Type

Description

locale

string

Language used in

information, ISO

639-1 coded

description

string

Textual description

title

string

Localized label name

keywords

Array[String]

Keyword tags related to textual description.

Keyword

String(0..n)

This property represents a keyword, term or phrase to describe the Public Service.

Sector

String(0..n)

This property represents the industry or sector a Public Service relates to, or is intended for. For example: environment, safety, housing. Note that a single Public Service may relate to multiple sectors. The possible values for this property are provided as a controlled vocabulary. See section 4 in [2].

Thematic Area

String(0..n)

This property represents the Thematic Area of a Public Service as described in a controlled vocabulary, for instance social protection, health, recreation, culture and religion, family, travelling economic affairs, tax, staff, environment. The recommended controlled vocabularies are listed in section 4 in [2].

Type

String(0..n)

This property represents the Type of a Public Service as described in a controlled vocabulary. For the indicating the Type, we are referring to the functions of government to indicate the purpose of a government activity, which the public service is intended for. The recommended controlled vocabularies are listed in section 4 in [2].

Language

String(0..n)

This property represents the language(s) in which the Public Service is available. This could be one language or multiple languages, for instance in countries with more than one official language. The possible values for this property are described in a controlled vocabulary. The recommended controlled vocabularies are listed in section 4 in [2].

Status

String(0..1)

Indicates whether a Public Service is active, inactive, under development etc. according to a controlled vocabulary.

Is Grouped By

String(0..1)

This property links the Public Service to the Event class of CPSV-AP model . Several Public Services may be associated with a particular Event and, likewise, the same Public Service may be associated with several different Events.

Requires

String(0..n)

One Public Service may require, or in some way make use of, the output of one or several other Public Services. In this case, for a Public Service to be executed, another Public Service must be executed beforehand.

Has Competent Authority

Object(1..1)

This property links a Public Service to a Public Organization, which is the responsible Agent for the delivery of the Public Service. Whether the particular Public Organization provides the public service directly or outsources it is not relevant. The Public Organization that is the Competent Authority of the service is the one that is ultimately responsible for managing and providing the public service. The CPSV-AP reuses the Core Public Organisation Vocabulary that defines the concept of a Public Organization and associated properties and relationships.

Property

Type

Description

identifier

String

Public Organization identifier

title

String

Name of Public Organization

hasAddress

String

Address

prefLabel

String

Preferred Label

spatial

String

Localization

Has Input

Object(0..n)

The Has Input property links a Public Service to one or more instances of the Evidence class. A specific Public Service may require the presence of certain pieces of Evidence in order to be delivered.

Property

Type

Description

identifier

String

Identifier ( URI if available)

title

String

Assigned Name

type

String

Category of input

language

String

Language

description

Object

Object describing localized description ( locale, description, title)

page

String (0..n)

Documentation

conformsTo

String(0..n)

Reference to characterization of the input. In particular can be linked to the specific dataset defined in section 5.4

Produces

Object(0..n)

The Produces property links a Public Service to one or more instances of the Output class, describing the actual result of executing a given Public Service. Outputs can be any resource, for instance a document, artefact or anything else being produced as a result of executing the Public Service

Property

Type

Description

identifier

String

Identifier ( URI if available)

title

String

Assigned Name

type

String

Category of output

Spatial

String(0..n)

The area covered. The possible values for this property are described in a controlled vocabulary..

Has Contact Point

Object(0..n)

The value of this property, the contact information itself, should be provided using schema:ContactPoint. Note that the contact information should be relevant to the Public Service which may not be the same as contact information for the Competent Authority or any Participant.

Property

Type

Description

email

String

Email

faxNumber

String

Fax

telephone

String

Telephone number

identifier

String

Id or URI ( if available)

openingHours

String

Opening Hours Specification https://schema.org/OpeningHoursSpecification

hoursAvailable

String

Opening Hours restriction

Has Channel

Object(0..n)

This property links the Public Service to any Channel through which an Agent provides, uses or otherwise interacts with the Public Service, such as an online service, phone number or office

Property

Type

Description

identifier

String

Id or URI ( if available)

type

String

Channel type from controlled vocabulary

language

Array [String]

available languages for this channel

description

Array [Description]

localized descriptions

openingHours

String

Opening Hours Specification

hoursAvailable

String

Opening Hours restriction

Processing Time

String(0..1)

The value of this property is the (estimated) time needed for executing a Public Service. The actual information is provided using the ISO8601 syntax for durations.

Is Described At

Object(0..n)

The property links a Public Service to the Public Service Dataset(s) in which it is being described

Property

Type

Description

identifier

String

Id or URI ( if available)

name

String

Dataset name

landingPage

String

Landing page URL where dataset is published

hasCost

Object(0..n)

The Cost class represents any costs related to the execution of a Public Service that the Agent consuming it needs to pay.

Property

Type

Description

identifier

String

Id or URI ( if available)

code

String

The currency in which the Cost needs to be paid and the value of the Cost is expressed

hasValue

String

A numeric value indicating the amount of the Cost.

description

String[0..n]

A free text description of the Cost

ifaccessed through

String [0..1]

The costs created by the use of different Channels.

Service Instance

The following classes and properties collect information about the service instances to be used/invoked internally or externally the ACROSS platform. In particular this section collects information about Technical, Service Provider and Data Controller Descriptions of actual instance where service is deployed.

Property

Type

Description

serviceProvider

Object

(1..1)

Object describing service provider:

Property

Type

Description

businessId

String

Business ID

name

String

Name of service provider

hasAddress

String

Address

postalcode

String

Posta code

city

String

City

state

String

State

country

String

Country

email

String

mail

telephone

String

phone

jurisdition

String

Jurisdition

dataController

Object

(1..1)

Object describing Data Controller, the individual or organisation that decides (or controls) the purpose(s) of processing personal data:

Property

Type

Description

piiController

String

Name of Data Controller

organizationName

String

Organization name.

hasContact

String

Contact Person.

hasAddress

String

Address

email

String

Email Address.

telephone

String

phone

connectorEndpoint

Object

(0..1)

Object describing the referenced endpoint to proxy (if any) with a service connector. See Connector section

dataset

Object

(1..n)

Object Describing the Service Data Description. Data section

serviceUrls

Object

(1..1)

Object collects all information to interact with the internal components ( e.g. Consent manager...):

Property

Type

Description

libraryDomain

String

Domain of library to interact with consent manager

loginUri

String

Link to login component.

linkingRedirectUri

String

Service link to interact with consent manager.

objectionUri

String

Service link to interact with consent manager for objection request

notificationUri

String

Service link to interact with consent manager for notification request

Connector Endpoint

Property

Type

Description

endpoint

Object

(1..1)

Object describing endpoint for Service Connector:

Property

Type

Description

accessUrl

String

Access URL of an endpoint.

endpointInformation

String

Endpoint description

endpointDocumentation

String

URI reference to a documentation of the endpoint, e.g., reference to an OpenAPI-based documentation.

path

String

Relative path, topic or queue at which the content is published by the related host.

asynch

boolean

if the API endpoint is asynchronous. If yes you can set callback api endpoint

callback

string

Callback api if endpoint if asynch.

connectorId

String (0..1)

Id of registered connector instance associated to the service endpoint

Dataset

Property

Type

Description

identifier

String

(1..1)

Dataset unique identifier.

datastructureSpecification

String

(0..1)

URL pointing to further description of the data (e.g. to JSON schema).

Distribution

Object

(1..n)

Objects describing distribution points of the Datasets.

Property

Type

Description

distributionId

string

Unique identifier of the Distribution.

accessUrl

string

URL where data is available. The resource at the access URL may contain information about how to get the Dataset.

format

string

Data format (i.e json, csv...)

inputType

string

Type of input data [file type, dropdown list,...

]

description

object

localized description ( locale, description)

dataMapping

Object

(1..n)

Array of objects describing mapping of each Service specific data property and (if personal) with a personal data concept belonging to a controlled vocabulary.

Property

Type

Description

property

string

Specific property of the datatset (for example a specific field in a form)

conceptId

string

Reference (if any) to a concept of a personal data ontology (i.e. DPV )

type

string

Type of data ["Text","Video","Image","Audio"]

inputType

string

Type of input data [file type, dropdown list,...

]

multiple

boolean

If that property can have multiple values.

required

boolean

If that property is required [True=1, False=0] when used in a dataset.

source

string

Reference to one of the Distribution class for possible values in type input (ex. select values)

readonly

boolean

If the property is readonly and/or prefilled ( in case to set DataMap)

datamap

string

Reference to one of Once-Only data attributes (e.g from wallet, services...)

description

Object

(1..n)

Array of localized textual descriptions.

Property

Type

Description

locale

string

Language used in

information, ISO

639-1 coded

description

string

Textual description

title

string

localized title

keywords

Array[String]

Keyword tags related to textual description.

Service Personal Data Handling Section

This section It collects the different legal basis and requirements for personal data processing according to EU data protection Rules (Art. 6 GDPR). It describes describe different situations where a company or an organisation is allowed to collect or reuse your personal information: contract, legal obligation, vital interest, public interest, legitimate interest and consent. The following information are used by the consent manager component in the citizen data ownership layer.

Property

Type

Description

purposeId

String

Purpose's ID, must be unique within the service description

purposeName

String

Human readable Purpose's Name, Short name that identifies the purpose

legalBasis

String

Legal basis in the "processing" of personal Data according to the GDPR: ["Consent", "Contract", "Legal Obligation", "Vital Interest", "Public Interest", "Legitimate Interest"]

purposeCategory

String

Category of purpose from a controlled taxonomy.

hasSector

String

Purposes can be further restricted to specific sectors

hasContext

String

Purposes can be further restricted to specific contexts

processingCategories

String

Category of actions related to a specific purpose and from a controlled taxonomy.

description

Object

(1..n)

Array of localized description of processing:

Property

Type

Description

locale

string

Language used in

information, ISO

639-1 coded

title

string

Title of processing

description

string

Description of the

service

descriptionUrl

string

Url of the document describing in detail the processing of personal data

iconUrl

string

Link of icon identifying the type of processing

hasPersonalDataCategory

String

(1..n)

Indicates which category of personal data is processed from a controlled taxonomy.

requiredDatasets

String

(1..n)

Array listing the required dataset (described previously)

storage

Object

(0..n)

Object describing the type of storage:

Property

Type

Description

location

string

Storage Category

duration

string

duration

recipients

String

(0..n)

List of type of recipients of personal data processing

shareWith

Object

(0..n)

Array of objects describing with whom the consent permits to share data. Organisation identifies the organisation with whom the data is permitted to share:

Property

Type

Description

orgName

string

Organization Name

businessType

string

Business Type: Profit, No-Profit

orgUrl

string

url of organization page

required

boolean

It sets if optional or not

obligations

Object

(0..n)

Obligations are the actions to be performed when an event occurs. Obligation defines the obligation related to consent, i.e. has an event and an activity and it defines what action to perform when an event related to consent occurs. For example, when the consent expires (event), then re-solicit consent (activity) or when the consent is revoked (event) then stop processing (activity).

Property

Type

Description

event

string

Event defines the event based on which an activity is required to do.

activity

string

Activity defines what activity is required to do when an event occurs.

policyRef

String

Reference to related Privacy Policy

collectionMethod

String

It indicates the method of collection of consent

CollectionOperator

String

It indicates Operator who collects Consents.

termination

String

Termination rule of legal basis under which personal data can be processed.

Service Data Usage Section

This section provides the reference of one or more usage rules associated to a specific service. The specification of usage rules is defined externally to the service Catalogue.

Property

Type

Description

usageId

String

(1..1)

Usage's ID, must be unique within the service description.

usageName

String

(1..1)

Human readable Usage's Name, Short name that identifies the rule.

usageType

String

(1..1)

Category of contract agreements from a controlled taxonomy.


Service Description - JSON Schema

The Class diagram representation described above will imply in pratices the generation of a JSON, according to the following JSON Schema:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "title": "ServiceModel",
  "properties": {
    "identifier": {
      "type": "string"
    },
    "title": {
      "type": "string",
      "title": "name"
    },
    "issued": {
      "type": "string"
    },
    "createdByUserId": {
      "type": "string"
    },
    "versionInfo": {
      "type": "string",
      "title": "Description Version"
    },
    "serviceIconUrl": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "title": "Service Description status",
      "description": "Status of Service Description (Allowed values: *Completed*, *Deprecated*, *UnderDevelopment*, *Withdrawn*)",
      "default": "UnderDevelopment",
      "enum": ["Completed", "Deprecated", "UnderDevelopment", "WithDrawn"]
    },
    "isPublicService": {
      "type": "boolean"
    },
    "hasInfo": {
      "type": "object",
      "properties": {
        "identifier": {
          "type": "string"
        },
        "title": {
          "type": "string",
          "title": "name"
        },
        "status": {
          "type": "string"
        },
        "keyword": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "sector": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "thematicArea": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "type": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "language": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "description": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "locale": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "keyword": {
                  "type": "array",
                  "items": {
                    "type": "string"
                   }
              }
            }
          },
          "required": ["locale", "description", "title"]
        },

        "isDescribedAt": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "landingPage": {
                "type": "string"
              }
            }
          }
        },

        "hasCost": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "code": {
                "type": "string"
              },
              "hasCost": {
                "type": "string"
              },
              "description": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "locale": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    }
                  },
                  "required": ["locale", "description"]
                }
              },
              "ifAccessedThrough": {
                "type": "string"
              }
            }
          }
        },

        "processingTime": {
          "type": "string"
        },
        "isGroupedBy": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "hasCompetentAuthority": {
          "type": "object",
          "properties": {
            "identifier": {
              "type": "string"
            },
            "title": {
              "type": "string",
              "title": "name"
            },
            "hasAddress": {
              "type": "string"
            },
            "prefLabel": {
              "type": "string"
            },
            "spatial": {
              "type": "string"
            }
          },
          "required": ["prefLabel", "spatial"]
        },
        "requires": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "spatial": {
          "type": "string"
        },
        "hasInput": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "title": {
                "type": "string",
                "title": "name"
              },
              "description": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "locale": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  }
                },
                "required": ["locale", "description", "title"]
              },
              "type": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "language": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "page": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "conformsTo": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "produces": {
          "title": "produces",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "title": {
                "type": "string",
                "title": "name"
              },
              "description": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "locale": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  }
                },
                "required": ["locale", "description", "title"]
              },
              "type": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "hasContactPoint": {
          "type": "object",
          "properties": {
            "email": {
              "type": "string"
            },
            "faxNumber": {
              "type": "string"
            },
            "telephone": {
              "type": "string"
            },
            "identifier": {
              "type": "string"
            },
            "openingHours": {
              "type": "string"
            },
            "hoursAvailable": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          }
        },
        "hasChannel": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "openingHours": {
                "type": "string"
              },
              "hoursAvailable": {
                "type": "string"
              },
              "language": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
              },
              "description": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "locale": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  }
                },
                "required": ["locale", "description", "title"]
              },
              "hasInput": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": ["identifier", "type", "openingHours"]
          }
        }
      },
      "required": [
        "identifier",
        "title",
        "status",
        "keyword",
        "sector",
        "thematicArea",
        "type",
        "language",
        "description",
        "isDescribedAt",
        "hasCost",
        "processingTime",
        "isGroupedBy",
        "hasCompetentAuthority",
        "requires",
        "spatial",
        "hasInput",
        "produces",
        "hasContactPoint",
        "hasChannel"
      ]
    },
    "hasServiceInstance": {
      "type": "object",
      "properties": {
        "serviceProvider": {
          "type": "object",
          "properties": {
            "businessId": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "hasAddress": {
              "type": "string"
            },
            "postalcode": {
              "type": "string"
            },
            "city": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "telephone": {
              "type": "string"
            },
            "jurisdiction": {
              "type": "string"
            }
          },
          "required": [
            "businessId",
            "name",
            "hasAddress",
            "postalcode",
            "city",
            "state",
            "country",
            "email",
            "telephone",
            "jurisdiction"
          ]
        },
        "endpointConnector": {
          "type": "object",
          "properties": {
            "endpoint": {
              "type": "object",
              "properties": {
                "accessURL": {
                  "type": "string"
                },
                "endpointInformation": {
                  "type": "string"
                },
                "endpointDocumentation": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "async": {
                  "type": "boolean"
                },
                "callback": {
                  "type": "string"
                }
              },
              "required": [
                "accessURL",
                "endpointInformation",
                "endpointDocumentation",
                "path",
                "async"
              ]
            },
            "connectorId": {
              "type": "string"
            }
          },
          "required": ["endpoint", "connectorId"]
        },
        "dataset": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "identifier": {
                "type": "string"
              },
              "description": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "locale": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "keywords": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": ["locale", "description", "keywords"]
                }
              },
              "datasetSchema": {
                "type": "object",
                "properties": {
                  "context": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string"
                  },
                  "id": {
                    "type": "string"
                  }
                },
                "required": ["context", "type", "id"]
              },
              "dataStructureSpecification": {
                "type": "string"
              },
              "distribution": {
                "type": "array",
                "items": {
                  "properties": {                     
                    "distributionId":{
                      "type": "string"
                    },  
                    "accessUrl": {
                      "type": "string"
                    },
                    "description": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "locale": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          },
                          "keywords": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": ["locale", "description", "keywords"]
                      }
                    },
                    "format": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "distributionId",
                    "accessUrl",
                    "description",
                    "format"
                  ]
                }
              },
              "dataMapping": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "property": {
                      "type": "string"
                    },
                    "conceptId": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string"
                    },
                    "inputType": {
                      "type": "string"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "source": {
                      "type": "string"
                    },
                    "readonly": {
                      "type": "boolean"
                    },
                    "datamap": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "property",
                    "conceptId",
                    "name",
                    "type",
                    "required",
                    "source",
                    "readonly",
                    "datamap"
                  ]
                }
              }
            },
            "required": [
              "datasetId",
              "description",
              "datasetSchema",
              "dataStructureSpecification",
              "distribution",
              "dataMapping"
            ]
          }
        },
        "serviceUrls": {
          "type": "object",
          "properties": {
            "libraryDomain": {
              "type": "string"
            },
            "loginUri": {
              "type": "string"
            },
            "linkingRedirectUri": {
              "type": "string"
            },
            "objectionUri": {
              "type": "string"
            },
            "notificationUri": {
              "type": "string"
            }
          },
          "required": [
            "libraryDomain",
            "loginUri",
            "linkingRedirectUri",
            "objectionUri",
            "notificationUri"
          ]
        },
        "dataController": {
          "type": "object",
          "properties": {
            "piiController": {
              "type": "string"
            },
            "organizationName": {
              "type": "string"
            },
            "hasContact": {
              "type": "string"
            },
            "hasAddress": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "telephone": {
              "type": "string"
            },
            "operatorName": {
              "type": "string"
            }
          },
          "required": [
            "piiController",
            "organizationName",
            "hasContact",
            "hasAddress",
            "email",
            "telephone",
            "operatorName"
          ]
        }
      },
      "required": [
        "serviceProvider",
        "cert",
        "connector",
        "dataset",
        "serviceUrls",
        "dataController"
      ]
    },
    "hasUsageRule": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "usageId": {
            "type": "string"
          },
          "usageName": {
            "type": "string"
          },
          "usageType": {
            "type": "string"
          }
        },
        "required": ["usageId", "usageName", "usageType"]
      }
    },
    "isPersonalDataHandling": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "purposeId": {
            "type": "string"
          },
          "purposeName": {
            "type": "string"
          },
          "legalBasis": {
            "type": "string"
          },
          "purposeCategory": {
            "type": "string"
          },
          "hasSector": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "hasContext": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "processingCategories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "description": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "locale": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "descriptionUrl": {
                  "type": "string"
                },
                "iconUrl": {
                  "type": "string"
                }
              },
              "required": [
                "locale",
                "title",
                "description",
                "descriptionUrl",
                "iconUrl"
              ]
            }
          },
          "hasPersonalDataCategory": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "requiredDatasets": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "storage": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string"
              },
              "duration": {
                "type": "string"
              }
            },
            "required": ["location", "duration"]
          },
          "recipients": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "shareWith": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "orgName": {
                  "type": "string"
                },
                "orgUrl": {
                  "type": "string"
                },
                "businessType": {
                  "type": "string"
                },
                "required": {
                  "type": "boolean"
                }
              },
              "required": ["orgName", "orgUrl", "businessType", "required"]
            }
          },
          "obligations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "event": {
                  "type": "string"
                },
                "activity": {
                  "type": "string"
                }
              },
              "required": ["event", "activity"]
            }
          },
          "policyRef": {
            "type": "string"
          },
          "collectionMethod": {
            "type": "string"
          },
          "collectionOperator": {
            "type": "string"
          },
          "termination": {
            "type": "string"
          }
        },
        "required": [
          "purposeId",
          "purposeName",
          "legalBasis",
          "purposeCategory",
          "hasSector",
          "hasContext",
          "processingCategories",
          "description",
          "hasPersonalDataCategory",
          "requiredDatasets",
          "storage",
          "recipients",
          "shareWith",
          "obligations",
          "policyRef",
          "collectionMethod",
          "collectionOperator",
          "termination"
        ]
      }
    }
  },
  "required": [
    "title",
    "identifier",
    "issued",
    "createdByUserId",
    "serviceDescriptionVersion",
    "serviceIconUrl",
    "status",
    "isPublicService",
    "hasInfo",
    "hasServiceInstance",
    "hasUsageRule"
  ]
}


Service Model Extension

Some Service Model classes provides some references to controlled vocabularies or to prefixed enumerated list. Each vocabulary or enumerated list can be extended by adding additional "items" in the related assets/data/service-schema/(locale)/ files.

As example

"type": {
            "type": "string",
            "title": "Type of channel",
            "description": "Type of channel",
            "enum": 
                ["RESTService",
                "AsyncRESTService",
                "E-mail", 
                "Homepage", 
                "Fax", 
                "Assistant", 
                "Telephone", 
                "Mobile App", 
                "Digital TV", 
                "Mail", 
                "Service Bureau",                                     
                "Client's Location", 
                <add here new items>]
          }

or retrieved from external schemas ( see https://github.com/json-editor/json-editor#json-schema-support).

See as example in assets/data/service-schema/wallet-schema/wallet-schemas.json, the enumerated list of eIDAS attributes.

{
    "type": "string",
    "title": "Data Map",
    "oneOf": [
      {
        "$ref": "./default.json",
        "title": ""
      },
      {
        "$ref": "./natural-person.json",
        "title": "eIDAS Natual Person"
      },
      {
        "$ref": "./legal-person.json",
        "title": "eIDAS Legal Person"
      }
      ]

  }

included in the definition of DataMap property in Dataset class (assets/data/service-schema/(locale)/dataset.json)

"datamap": {
              "$ref": "../../wallet-schema/wallet-schemas.json"
            }

for localized enumeration see what described in "enabling other languages" in Configuration