-
Notifications
You must be signed in to change notification settings - Fork 1
Schemas
Warning This file is maintained at the Conduction Google Drive. Please make any suggestions or alterations there.
Schemas are the core of the Common Gateway’s data layer. They define and model objects and set the conditions for objects. Each object in the gateway always belongs to ONE schema. Schemas follow the JSON schema standard and are therefore interchangeable with OAS3 schemas. For the Dutch governmental ecosystem this means that a schema adheres to the overige objecten standaard
description of an object type
. In action to this we extend schema’s with metadata.
In a more traditional way, schema’s can be viewed as the “tables” of the data layer as they store data in a predefined way. However, unlike tables, the data is stored as objects. Where each data set, that would normally be a row, becomes an object. The main difference between tables and objects is that objects are multidimensional(a value can be another object) and table rows are flat (each column containing one value). An object can contain an array, objects or arrays of objects. Objects present us with a vastly superior way of serving data.
An example object could be
{
"id": 1,
"name": "doggie",
"status": "available"
}
Schema's define objects by giving us the properties they contain and conditional validations for the value of each property.
Schema’s can be modeled from the schema page in the Admin UI or through the /admin/schema
endpoint. To create a new schema go to “Schemas” in the menu, and press “Add schema”. Just fill in the name “PET and hit save (a schema needs to be created before you can add properties). After the schema is created you are automatically redirected to the edit page of that schema.
Go to the properties tab and press “Add property” to add a property to your schema. When adding a property
After adding properties to a schema
You can upload a schema in the Gateway UI by pressing the upload button in the top right corner. Schemas might also be uploaded by plugins or collections. When a schema is uploaded the following things will happen:
The Gateway will look in its schema library if a version of that schema is already present. It does so based on the schema ID. Based on that result the Gateway will handle the schema accordingly: If no matching schema is found the gateway will create a new schema If a matching schema is found the gateway wil compare versions and decide what to do: The old schema has no set version and the new schema has no set version -> The gateway will update the old schema with the new schema The old schema has no set version and the new schema has a set version -> The gateway will update the old schema with the new schema The old schema has a set version number and the new schema has a higher set version number -> The gateway will update the old schema with the new schema The old schema has a set version number and the new schema has a lower set version number -> The gateway does not update the schema The old schema has a set version number and the new schema does not have a set version number -> The gateway does not update the schema
Let's take a look at an example. We have a weather plugin that contains a weather schema.
An entity consists of the following properties that can be configured
Property | Required | Description |
---|---|---|
name | yes | An unique name for this entity |
description | no | The description for this entity that will be shown in de API documentation |
source | no | The source where this entity resides |
endpoint | yes if an source is provided | The endpoint within the source that this entity should be posted to as an object |
route | no | The route this entity can be found easier, should be a path |
extend | no | Whether or not the properties of the original object are automatically included |
Properties represent variables on objects. In the following object from the petstore api id, name, and status are properties.
{
"id": 1,
"name": "doggie",
"status": "available"
}
that you want to communicate to underlying sources. In a normal setup and attribute should at least apply the same restrictions as the underlying property (e.g. required) to prevent errors when pushing the entity to its source. It can however provide additional validations to a property, for example the source AIU might simply require the property ‘email’ to be a unique string, but you could set the form to ‘email’ causing the input to be validated as an ISO compatible email address.
Property | Required | Description |
---|---|---|
name | yes |
string An name for this attribute. MUST be unique on an entity level and MAY NOT be ‘id’,’file’,‘files’, ’search’,’fields’,’start’,’page’,’limit’,’extend’ or ’organization’ |
description | no | The description for this attribute that will be shown in de API documentation |
type | yes |
string See types
|
format | no |
string See formats
|
validations | no |
array of strings See validations
|
multiple | no |
boolean if this attribute expects an array of the given type |
defaultValue | no |
string An default value for this value that will be used if a user doesn't supply a value |
deprecated | no |
boolean Whether or not this property has been deprecated and will be removed in the future |
required | no |
boolean whether or not this property is required to be in a POST or UPDATE |
requiredIf | no |
array a nested set of validations that will cause this attribute to become required |
forbidden | no |
boolean whether or not this property is forbidden to be in a POST or UPDATE |
forbiddenIf | no |
array a nested set of validations that will cause this attribute to become forbidden |
example | no |
string An example of the value that should be supplied |
persistToSource | no |
boolean Setting this property to true will force the property to be saved in the gateway endpoint (default behavior is saving in the EAV) |
searchable | no |
boolean Whether or not this property is searchable |
cascade | no |
boolean Whether or not this property can be used to create new entities (versus when it can only be used to link existing entities) |
Warning To prevent collisions with json-ld, json-hall, graphql and inner gateway workings property names aren't allowed to start with the following characters
_
,@
,$
additionally you can’t add a property calledid
to your schema’s. When importing schema’s all properties in violation of the above will be ignored without warning.
####Types The type of attribute provides basic validations and a way for the gateway to store and cash values in an efficient manner. Types are derived from the OAS3 specification. Current available types are:
Format | Description |
---|---|
string | a text |
integer | a full number without decimals |
decimal | a number including decimals |
boolean | a true/false |
date | an ISO-??? date |
date-time | an ISO-??? date |
array | an array or list of values |
object | Used to nest a Entity as attribute of another Entity, read more about nesting |
file | Used to handle file uploads, an Entity SHOULD only contain one attribute of the type file, read more about handling file uploads |
- you are allowed to use integer instead of int, boolean instead of bool, date-time or dateTime instead of datetime,
####Formats A format defines a way a value should be formatted, and is directly connected to a type, for example a string MAY BE a format of email, but an integer cannot be a valid email. Formats are derived from the OAS3 specification, but supplemented with formats that are generally needed in governmental applications (like BSN) . Current available formats are:
General formats
Format | Type(s) | Description |
---|---|---|
alnum | Validates whether the input is alphanumeric or not. Alphanumeric is a combination of alphabetic and numeric characters | |
alpha | Validates whether the input contains only alphabetic characters | |
numeric | Validates whether the input contains only numeric characters | |
uuid | string | |
base | Validate numbers in any base, even with non regular bases. | |
base64 | Validate if a string is Base64-encoded. | |
countryCode | string | Validates whether the input is a country code in ISO 3166-1 standard. |
creditCard | string | Validates a credit card number. |
currencyCode | string | Validates an ISO 4217 currency code like GBP or EUR. |
digit | string | Validates whether the input contains only digits. |
directory | string | Validates if the given path is a directory. |
domain | string | Validates whether the input is a valid domain name or not. |
url | string | Validates whether the input is a valid url or not. |
string | Validates an email address. | |
phone | string | Validates a phone number. |
fibonacci | integer | Validates whether the input follows the Fibonacci integer sequence. |
file | string | Validates whether file input is as a regular filename. |
hexRgbColor | string | Validates whether the input is a hex RGB color or not. |
iban | string | Validates whether the input is a valid IBAN (International Bank Account Number) or not. |
imei | string | Validates if the input is a valid IMEI. |
ip | string | Validates whether the input is a valid IP address. |
isbn | string | Validates whether the input is a valid ISBN or not. |
json | string | Validates if the given input is a valid JSON. |
xml | string | Validates if the given input is a valid XML. |
languageCode | string | Validates whether the input is language code based on ISO 639. |
luhn | string | Validate whether a given input is a Luhn number. |
macAddress | string | Validates whether the input is a valid MAC address. |
nfeAccessKey | string | Validates the access key of the Brazilian electronic invoice (NFe). |
- Phone numbers should ALWAYS be treated as a string since they MAY contain a leading zero.
Country specific formats
Format | Type(s) | Description |
---|---|---|
bsn | string | Dutch social security number (BSN) |
nip | string, integer | Polish VAT identification number (NIP) |
nif | string, integer | Spanish fiscal identification number (NIF) |
cnh | string, integer | Brazilian driver’s license |
cpf | string, integer | Validates a Brazilian CPF number |
cnpj | string, integer | Validates if the input is a Brazilian National Registry of Legal Entities (CNPJ) number |
- Dutch BSN numbers should ALWAYS be treated as a string since they MAY contain a leading zero.
####Validations Besides validations on type and string you can also use specific validations, these are contained in the validation array. Validation might be specific to certain types or formats e.g. minValue can only be applied to values that can be turned into numeric values. And other validations might be of a more general nature e.g. required.
Validation | value | Description |
---|---|---|
between | Validates whether the input is between two other values. | |
boolType | Validates whether the type of the input is boolean. | |
boolVal | Validates if the input results in a boolean value. | |
call | Validates the return of a [callable][] for a given input. | |
callableType | Validates whether the pseudo-type of the input is callable. | |
callback | Validates the input using the return of a given callable. | |
charset | Validates if a string is in a specific charset. | |
alwaysInvalid | Validates any input as invalid | |
alwaysValid | Validates any input as valid | |
anyOf | This is a group validator that acts as an OR operator. AnyOf returns true if at least one inner validator passes. | |
arrayType | Validates whether the type of an input is array | |
arrayVal | Validates if the input is an array or if the input can be used as an array (instance of ArrayAcces or SimpleXMLElement. | |
attribute | Validates an object attribute, even private ones. | |
consonant | Validates if the input contains only consonants. | |
contains | Validates if the input contains some value. | |
containsAny | Validates if the input contains at least one of defined values. | |
control | Validates if all of the characters in the provided string, are control characters. | |
countable | Validates if the input is countable, in other words, if you’re allowed to use count() function on it. | |
decimal | Validates whether the input matches the expected number or decimals. | |
each | Validates whether each value in the input is valid according to another rule. | |
endsWith | This validator is similar to Contains(), but validates only if the value is at the end of the input. | |
equals | Validates if the input is equal to some value. | |
equivalent | Validates if the input is equivalent to some value. | |
even | Validates whether the input is an even number or not. | |
executable | Validates if a file is an executable. | |
exists | Validates files or directories. | |
extension | Validates if the file extension matches the expected one. This rule is case-sensitive. | |
factor | Validates if the input is a factor of the defined dividend. | |
falseVal | Validates if a value is considered as false. | |
file | Validates whether file input is as a regular filename. | |
image | Validates if the file is a valid image by checking its MIME type. | |
filterVar | Validates the input with the PHP’s filter_var() function. | |
finite | Validates if the input is a firtine number. | |
floatType | Validates whether the type of the input is float. | |
floatVal | Validate whether the input value is float. | |
graph | Validates if all characters in the input are printable and actually creates visible output (no white space). | |
greaterThen | Validates whether the input is greater than a value. | |
identical | Validates if the input is identical to some value. | |
in | Validates if the input is contained in a specific haystack. | |
infinite | Validates if the input is an infinite number. | |
instance | Validates if the input is an instance of the given class or interface. | |
iterableType | Validates whether the pseudo-type of the input is iterable or not, in other words, if you're able to iterate over it with foreach language construct. | |
key | Validates an array key. | |
keyNested | Validates an array key or an object property using . to represent nested data. | |
keySet | Validates keys in a defined structure. | |
keyValue | ||
leapDate | Validates if a date is leap. | |
leapYear | Validates if a year is leap. | |
length | ||
lessThan | Validates whether the input is less than a value. | |
lowercase | Validates whether the characters in the input are lowercase. | |
not | ||
notBlank | Validates if the given input is not a blank value (null, zeros, empty strings or empty arrays, recursively). | |
notEmoji | Validates if the input does not contain an emoji. | |
no | Validates if value is considered as “No”. | |
noWhitespace | Validates if a string contains no whitespace (spaces, tabs and line breaks). | |
noneOf | Validates if NONE of the given validators validate. | |
max | Validates whether the input is less than or equal to a value. | |
maxAge | Validates a maximum age for a given date. The $format argument should be in accordance with PHP's date() function. | |
mimetype | Validates if the input is a file and if its MIME type matches the expected one. | |
min | Validates whether the input is greater than or equal to a value. | |
minAge | Validates a minimum age for a given date. The $format argument should be in accordance with PHP's date() function. | |
multiple | Validates if the input is a multiple of the given parameter. | |
negative | Validates whether the input is a negative number. |
An object is a data set conforming to schema, e.g for the schema pet we might have an object pluto.
The process of transforming incoming data to objects is called hydration.