# Script Validator API

## Sample validator code <a href="#walidatoryskryptowe-validationscript-przykladowykodwalidatora" id="walidatoryskryptowe-validationscript-przykladowykodwalidatora"></a>

Below is sample code that shows how to use the input and how the data should be returned:

```javascript
function callService(context) {
    let input1 = context.getFirstParameter("input1");
    if (input1 === "api") {
        return [{
                'key': 'pl.error',
                'parameters': [input1, "parameter {0} is invalid"]
            }
            ];
    } else if (input1 != null && input1 !== "") {
        return [{
                'key': 'pl.error',
                'parameters': [input1, "another hardcoded parameter"]
            }];
    } else {
        return [];
    }
}
```

## Input to the script validator <a href="#walidatoryskryptowe-validationscript-wejsciedowalidatoraskryptowego" id="walidatoryskryptowe-validationscript-wejsciedowalidatoraskryptowego"></a>

As input (parameter *context* in the code above) there is an object that provides the following methods:

* List\<String> **getParameters**(final String name) - retrieves a specific list from the input data map,
* String **getFirstParameter**(final String name) - retrieves the first element from a specific list in the input data map or returns the value "null",
* String **getFirstParameter**(final String name, final String defaultIfEmpty) - retrieves the first element from a specific list in the input data map, and if it does not exist or is empty, returns the value "defaultIfEmpty",
* Map\<String, List\<String>> **getInputParameters**() - returns the entire input data map it stores,
* String **isVisible**(final String id) - retrieves information whether the component with the specified id is visible,
* String **getValue**(final String id) - retrieves the value of the component (including a session variable) with the specified id,
* String **getData**(final String id, final String attribute) - retrieves the value of a specific attribute for the component with the specified id (**NOTE!** The attributes that can be retrieved depend on the component),
* List\<Map\<String, String>> **callService**(String name, Map\<String, List\<String>> input) - allows calling ServiceProxy,
* ValidatorOutput **validate**(String name, Map\<String, List\<String>> input) - allows calling the validator,

Example of retrieving a list (e.g. for fields in a repeatable section):

```javascript
function callService(context) {
    let inputFromRepeatableSection = context.getParameters("inputFromRepeatableSection").toArray();
}
```

## Validator output <a href="#walidatoryskryptowe-validationscript-wyjsciezwalidatora" id="walidatoryskryptowe-validationscript-wyjsciezwalidatora"></a>

1. **List of maps:** an array of objects containing the fields "key" and "parameters".
2. Optional fields:
   1. type - validator type is set to INLINE by default, another option is POPUP,
   2. parameters - variables that we can send to the script validation message
   3. attributes -\
      for example, POPUP attributes adding a 'next' button and changing, for example, a component value after pressing 'next':

```javascript
return [{
          'key': 'pl.errorPopup',
          'parameters': [input, 'The provided value is invalid'],
          'type': 'POPUP',
          'attributes': {
              'componentUpdateId': componentID,
              'componentUpdateValue':'potato'
          }
      }];
```

for example, attributes for GesTable row validation:

Sample INLINE validation - GesTable rows

```javascript
return [{
          'key': 'pl.errorGesTable',
          'parameters': [input, 'The provided value is invalid'],
          'type': 'INLINE',
          'attributes': {
              'colName': 'columnName',
              'rowId':id
          }
      }];
```

## Logging <a href="#walidatoryskryptowe-validationscript-logowanielogowanie" id="walidatoryskryptowe-validationscript-logowanielogowanie"></a>

Logging input data is automatic.

Manual logging should follow the description in [Logging in ScriptCode](https://docs.eximee.com/documentation/documentation-en/budowanie-aplikacji/logika-biznesowa/scriptcode/logowanie-w-scriptcode)

## Throwing business exceptions <a href="#walidatoryskryptowe-validationscript-rzucaniewyjatkowbiznesowych" id="walidatoryskryptowe-validationscript-rzucaniewyjatkowbiznesowych"></a>

Business errors have been described in detail on the page [Error pages](https://docs.eximee.com/documentation/documentation-en/interfejs-uzytkownika/formularze/tworzenie-formularza/strony-bledow#bledy-biznesowe).

{% hint style="info" %}
**Validator examples:**

demoEmailWalidator, demoPESELWalidator, demoDowodWalidator, demoMinMaxWalidator
{% endhint %}
