src/admin/md/custom_resources.md
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
## Custom Resources
As of version 1.8.0, you can define your own custom resources using handlers coded in JavaScript.
LiteStore embeds the [duktape](https://duktape.org/) lightweight JavaScript engine and therefore you can use all functionalities exposed by duktape in your code, plus access some LiteStore-specific properties and method through the special **LiteStore** global object.
Although writing extremely complex logic in a JavaScript handler may not be appropriate, it can be useful for certain use cases, such as:
* validating data before it is saved
* manipulate data before it is saved
* aggregating different types of data not accessible via a single query
* perform additional operation when accessing data, such as logging who requested it
### Creating a JavaScript Handler
Let's say you want to keep records of Italian vehicles identified by their number plate, which is in the following format:
\[two-uppercase-letters\][three-digits\][two-uppercase-letters\]
For example: AB467DX (OK, in reality there's a space between each set of digits/letters, but spaces in identifiers are ugly, so let's remove them!)
Let's also say that Italian vehicle data will be managed by a custom resource called **vehicles**, therefore vehicles will be accessible at URLs similar to the following:
* http://localhost:9500/docs/vehicles/AB467DX
* http://localhost:9500/docs/vehicles/CD569BW
* http://localhost:9500/docs/vehicles/EF981DE
To make sure that valid IDs are used, we can create a file called **vehicles.js** and write the following handler code that intercepts all requests to that specific folder and:
* denies POST requests
* returns an error in case of an invalid ID specified on a PUT request
* allows the request through otherwise
```
if (LiteStore.request.method === 'POST') {
LiteStore.response.code = 405;
LiteStore.response.content = JSON.stringify({error: 'No number plate specified.'});
return;
}
if (LiteStore.request.method === 'PUT' && !LiteStore.request.path.match(/[A-Z]{2}[0-9]{3}[A-Z]{2}$/) {
LiteStore.response.code = 400;
LiteStore.response.content = JSON.stringify({error: 'Invalid number plate.'});
return;
}
LiteStore.passthrough();
```
### Mounting a Handler as a Custom Resource
|