Released LiteStore.
@@ -5466,6 +5466,8 @@ <li><a href="#Document-Tagging">Document Tagging</a></li>
<li><a href="#Enhanced-Querying-of-JSON-documents">Enhanced Querying of JSON documents</a></li> <li><a href="#Full-text-Search">Full-text Search</a></li> <li><a href="#RESTful-HTTP-API">RESTful HTTP API</a></li> + <li><a href="#JWT-based-Authorization">JWT-based Authorization</a></li> + <li><a href="#Middleware">Middleware</a></li> <li><a href="#Nim-API">Nim API</a></li> <li><a href="#Command-line-API">Command-line API</a></li> <li><a href="#Directory-Bulk-Import/Export">Directory Bulk Import/Export</a></li>@@ -5488,6 +5490,7 @@ <li><a href="#Database-Schema">Database Schema</a>
<ul> <li><a href="#info-Table">info Table</a></li> <li><a href="#documents-Table">documents Table</a></li> + <li><a href="#system_documents-Table">system_documents Table</a></li> <li><a href="#tags-Table">tags Table</a></li> <li><a href="#searchdata-Table">searchdata Table</a> </li>@@ -5518,6 +5521,7 @@ <li><a href="#Examples">Examples</a>
<ul> <li><a href="#Starting-the-HTTP-Server">Starting the HTTP Server</a></li> <li><a href="#Importing-a-directory">Importing a directory</a></li> + <li><a href="#Importing-system-documents-from-a-directory">Importing system documents from a directory</a></li> <li><a href="#Exporting-a-directory">Exporting a directory</a></li> <li><a href="#Deleting-documents-within-a-directory">Deleting documents within a directory</a></li> <li><a href="#Performing-maintenance-operations">Performing maintenance operations</a></li>@@ -5528,6 +5532,38 @@ </li>
</ul> </li> <li><a href="#Authorization">Authorization</a></li> + <li><a href="#Configuration-File">Configuration File</a> + <ul> + <li><a href="#settings">settings</a></li> + <li><a href="#resources">resources</a></li> + <li><a href="#signature">signature</a></li> + </ul> + </li> + <li><a href="#Middleware">Middleware</a> + <ul> + <li><a href="#How-middleware-works">How middleware works</a></li> + <li><a href="#Creating-a-JavaScript-Middleware-Function">Creating a JavaScript Middleware Function</a></li> + <li><a href="#Passing-data-to-another-middleware">Passing data to another middleware</a></li> + </ul> + </li> + <li><a href="#Global-JavaScript-Objects">Global JavaScript Objects</a> + <ul> + <li><a href="#$ctx">$ctx</a></li> + <li><a href="#$req">$req</a> + <ul> + <li><a href="#Properties">Properties</a></li> + </ul> + </li> + <li><a href="#$res">$res</a></li> + <li><a href="#$store">$store</a></li> + </ul> + </li> + <li><a href="#System-Documents">System Documents</a> + <ul> + <li><a href="#Importing,-exporting-and-deleting-System-Documents">Importing, exporting and deleting System Documents</a></li> + <li><a href="#How-LiteStore-uses-System-Documents">How LiteStore uses System Documents</a></li> + </ul> + </li> <li><a href="#Administration-App">Administration App</a> <ul> <li><a href="#Obtaining-and-Running-the-Administration-App">Obtaining and Running the Administration App</a>@@ -5686,6 +5722,7 @@ </li>
<li><a href="#GET-tags">GET tags</a> <ul> <li><a href="#<code>like</code>-option"><code>like</code> option</a></li> + <li><a href="#<code>limit</code>-and-<code>offset</code>-options"><code>limit</code> and <code>offset</code> options</a></li> <li><a href="#Example">Example</a></li> </ul> </li>@@ -5694,6 +5731,43 @@ <ul>
<li><a href="#Example">Example</a> </li> </ul> + </li> + </ul> + </li> + <li><a href="#indexes-(LiteStore-Indexes)">indexes (LiteStore Indexes)</a> + <ul> + <li><a href="#OPTIONS-indexes">OPTIONS indexes</a> + <ul> + <li><a href="#Example">Example</a></li> + </ul> + </li> + <li><a href="#OPTIONS-indexes/:id">OPTIONS indexes/:id</a> + <ul> + <li><a href="#Example">Example</a></li> + </ul> + </li> + <li><a href="#GET-indexes">GET indexes</a> + <ul> + <li><a href="#<code>like</code>-option"><code>like</code> option</a></li> + <li><a href="#<code>limit</code>-and-<code>offset</code>-options"><code>limit</code> and <code>offset</code> options</a></li> + <li><a href="#Example">Example</a></li> + </ul> + </li> + <li><a href="#GET-indexes/:id">GET indexes/:id</a> + <ul> + <li><a href="#Example">Example</a></li> + </ul> + </li> + <li><a href="#PUT-indexes/:id">PUT indexes/:id</a> + <ul> + <li><a href="#Example">Example</a></li> + </ul> + </li> + <li><a href="#DELETE-indexes/:id">DELETE indexes/:id</a> + <ul> + <li><a href="#Example">Example</a> +</li> + </ul> </li> </ul>@@ -5843,7 +5917,7 @@
<a name="Enhanced-Querying-of-JSON-documents"></a> <h4>Enhanced Querying of JSON documents<a href="#document-top" title="Go to top"></a></h4> -<p>By leveraging the <a href="https://www.sqlite.org/json1.html">SQLite JSON1 extension</a> and implementing custom query string parsing, LiteStore provides enhanced filtering, ordering, and custom field selection of JSON documents.</p> +<p>By leveraging the <a href="https://www.sqlite.org/json1.html">SQLite JSON1 extension</a> and implementing custom query string parsing, LiteStore provides enhanced filtering, ordering, and custom field selection of JSON documents. Additionally, you can also configure custom indexes specifying JSON fields for extra speed!</p> <a name="Full-text-Search"></a> <h4>Full-text Search<a href="#document-top" title="Go to top"></a></h4>@@ -5855,6 +5929,16 @@ <h4>RESTful HTTP API<a href="#document-top" title="Go to top"></a></h4>
<p>Every operation can be performed on the data store using a simple but powerful RESTful HTTP API, perfect for client-side, single-page applications.</p> +<a name="JWT-based-Authorization"></a> +<h4>JWT-based Authorization<a href="#document-top" title="Go to top"></a></h4> + +<p>LiteStore can be configure validate <a href="https://jwt.io/">JWT</a> tokens and configure access to specific resources based on specific <a href="https://oauth.net/2/scope/">OAuth2 scopes</a>.</p> + +<a name="Middleware"></a> +<h4>Middleware<a href="#document-top" title="Go to top"></a></h4> + +<p>By leveraging the <a href="https://duktape.org/">duktape</a> library, you can create your own middleware functions in JavaScript to perform additional tasks (validation, logging, data aggregation…) before accessing data.</p> + <a name="Nim-API"></a> <h4>Nim API<a href="#document-top" title="Go to top"></a></h4>@@ -5889,7 +5973,7 @@ <p>As a document store, LiteStore provides the following features</p>
<ul> <li>You can save and retrieve data as arbitrary JSON documents but also as arbitrary documents of virtually any content type.</li> -<li>You can query data using user-specified and system tags and/or via the native full-text search functionality (available only for textual documents).</li> +<li>You can query data using user-specified and system tags, via the native full-text search functionality (available only for textual documents) or writing SQL-like queries on JSON documents.</li> <li>You can access data by the means of a RESTful API.</li> </ul>@@ -5961,7 +6045,7 @@ <h4>Database Schema<a href="#document-top" title="Go to top"></a></h4>
<p>The database schema of LiteStore data store file is very simple, as shown in the following diagram:</p> -<p><img src="data:image/png;base64,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" alt="LiteStore Database" /></p> +<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAAHaCAYAAAB8XyKNAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAaGVYSWZNTQAqAAAACAAEAQYAAwAAAAEAAgAAARIAAwAAAAEAAQAAASgAAwAAAAEAAgAAh2kABAAAAAEAAAA+AAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAHDoAMABAAAAAEAAAHaAAAAAJIADRIAAALkaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4xPC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NDc0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj40NTE8L2V4aWY6UGl4ZWxYRGltZW5z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" alt="LiteStore Database" /></p> <a name="info-Table"></a> <h5>info Table<a href="#document-top" title="Go to top"></a></h5>@@ -5981,7 +6065,7 @@ <p>The <span class="kwd">documents</span> table is the most important table of the data store, as it contains all the documents stored in it. The following information is stored for each document:</p>
<ul> <li><strong>docid</strong> – The internal unique document identifier.</li> -<li><strong>id</strong> – The public unique document identifier, used to access the document via the HTTP API.</li> +<li><strong>id</strong> – The public unique document identifier, used to access the document via the HTTP API or Nim API.</li> <li><strong>data</strong> – The contents of the document (or their base64-encoded representation in case of binary documents).</li> <li><strong>binary</strong> – Whether the document is binary (1) or textual (0).</li> <li><strong>searchable</strong> – Whether the document is searchable (1) or not (0). Currently, textual documents are searchable and binary documents are not.</li>@@ -5990,6 +6074,28 @@ <li><strong>modified</strong> – When the document was last modified.</li>
</ul> +<a name="system_documents-Table"></a> +<h5>system_documents Table<a href="#document-top" title="Go to top"></a></h5> + +<p>The <span class="kwd">system_documents</span> table has a structure similar to the <span class="kwd">documents</span> table, but it is used for well-known system documents that are used to provide additional functionalities, such as authorization or custom resources.</p> + +<p>Unlike ordinary documents, system documents: +* cannot be accessed via the HTTP or Nim API, they can only be imported, exported, or deleted with the corresponding commands. +* are not searchable. +* cannot be tagged.</p> + +<p>The following information is stored for each system document:</p> + +<ul> +<li><strong>docid</strong> – The internal unique document identifier.</li> +<li><strong>id</strong> – The public unique document identifier.</li> +<li><strong>data</strong> – The contents of the document (or their base64-encoded representation in case of binary documents).</li> +<li><strong>binary</strong> – Whether the document is binary (1) or textual (0).</li> +<li><strong>created</strong> – When the document was created.</li> +<li><strong>modified</strong> – When the document was last modified.</li> +</ul> + + <a name="tags-Table"></a> <h5>tags Table<a href="#document-top" title="Go to top"></a></h5>@@ -6009,9 +6115,9 @@
<p>The easiest way to get LiteStore is by downloading one of the prebuilt binaries from the [Github Release Page][release]:</p> <ul> -<li><a href="https://github.com/h3rald/litestore/releases/download/1.6.0litestore_1.6.0_macosx_x64.zip">LiteStore for Mac OS X (x64)</a></li> -<li><a href="https://github.com/h3rald/litestore/releases/download/1.6.0/litestore_1.6.0_windows_x64.zip">LiteStore for Windows (x64)</a></li> -<li><a href="https://github.com/h3rald/litestore/releases/download/1.6.0/litestore_1.6.0_linux_x64.zip">LiteStore for Linux (x64)</a></li> +<li><a href="https://github.com/h3rald/litestore/releases/download/1.8.0/litestore_1.8.0_macosx_x64.zip">LiteStore for Mac OS X (x64)</a></li> +<li><a href="https://github.com/h3rald/litestore/releases/download/1.8.0/litestore_1.8.0_windows_x64.zip">LiteStore for Windows (x64)</a></li> +<li><a href="https://github.com/h3rald/litestore/releases/download/1.8.0/litestore_1.8.0_linux_x64.zip">LiteStore for Linux (x64)</a></li> </ul>@@ -6042,7 +6148,7 @@
<p>To get the app up and running (assuming that you have the <span class="cmd">litestore</span> executable in your path):</p> <ol> -<li>Download the default <a href="https://github.com/h3rald/litestore/releases/download/1.6.0/data.db">data.db</a> file. This file is a LiteStore data store file containing the sample app.</li> +<li>Extract the default <strong>data.db</strong> file included in the LiteStore release package. This file is a LiteStore data store file containing the sample app.</li> <li>Go to the local directory in which you downloaded the <span class="cmd">data.db</span> file.</li> <li>Run <span class="cmd">litestore -s:data.db</span></li> <li>Go to <a href="http://localhost:9500/docs/admin/index.html">localhost:9500/docs/admin/index.html</a>.</li>@@ -6078,6 +6184,7 @@ <ul>
<li><strong>-a</strong>, <strong>--address</strong> — Specify server address (default: 127.0.0.1).</li> <li><strong>–auth</strong> — Specify an authorization configuration file.</li> <li><strong>-b</strong>, <strong>–body</strong> — Specify a string containing input data for an operation to be executed.</li> +<li><strong>-c</strong>, <strong>–config</strong> — Specify a configuration file.</li> <li><strong>-d</strong>, <strong>--directory</strong> — Specify a directory to serve, import, export, delete, or mount.</li> <li><strong>-f</strong>, <strong>–file</strong> — Specify a file containing input data for an operation to be executed.</li> <li><strong>-h</strong>, <strong>--help</strong> — Display program usage.</li>@@ -6087,9 +6194,11 @@ <li><strong>-o</strong>, <strong>–operation</strong> — Specify an operation to execute via the execute command: get, put, delete, patch, post, head, options.</li>
<li><strong>-p</strong>, <strong>--port</strong> —Specify server port number (default: 9500).</li> <li><strong>-r</strong>, <strong>--readonly</strong> — Allow only data retrieval operations.</li> <li><strong>-s</strong>, <strong>--store</strong> — Specify a datastore file (default: data.db)</li> +<li><strong>–system</strong> — Set the system flag for import, export, and delete operations</li> <li><strong>-t</strong>, <strong>–type</strong> — Specify a content type for the body an operation to be executed via the execute command.</li> <li><strong>-u</strong>, <strong>–uri</strong> — Specify an uri to execute an operation through the execute command.</li> <li><strong>-v</strong>, <strong>--version</strong> — Display the program version.</li> +<li><strong>-w</strong>, <strong>–middleware</strong> — Specify a path to a folder containing middleware definitions</li> </ul>@@ -6103,6 +6212,12 @@ <ul>
<li><p>with default settings:</p> <p><span class="cmd">litestore</span></p></li> +<li><p>loading configuration from a configuration file called <strong>config.json</strong>:</p> + +<p><span class="cmd">litestore -c:config.json</span></p></li> +<li><p>loading middleware definition files stored in a directory called <strong>myMiddleware</strong>:</p> + +<p><span class="cmd">litestore -w:myMiddleware</span></p></li> <li><p>with custom port (<strong>9700</strong>) and address (<strong>0.0.0.0</strong>):</p> <p><span class="cmd">litestore -p:9700 -a:0.0.0.0</span></p></li>@@ -6124,6 +6239,13 @@
<p>Import a directory called <strong>admin</strong>:</p> <p><span class="cmd">litestore import -d:admin</span></p> + +<a name="Importing-system-documents-from-a-directory"></a> +<h4>Importing system documents from a directory<a href="#document-top" title="Go to top"></a></h4> + +<p>Import all documents stored in a directory called <strong>system</strong> as system documents:</p> + +<p><span class="cmd">litestore import -d:system –system</span></p> <a name="Exporting-a-directory"></a> <h4>Exporting a directory<a href="#document-top" title="Go to top"></a></h4>@@ -6170,6 +6292,10 @@ <h2>Authorization<a href="#document-top" title="Go to top"></a></h2>
<p>LiteStore can be configured to automatically validate <a href="https://jwt.io/">JWT</a> tokens and authorize authenticated users on specific resources (and specific resource verbs even) based on their <a href="https://oauth.net/2/scope/">OAuth2 scopes</a> specified in the token itself.</p> +<div class="note"><p>auth.json vs. config.json</p> + +<p>As of version 1.8.0, it is recommended to use the LiteStore configuration file to configure authorization. This specialized <strong>auth.json</strong> configuration file format will however be maintained for compatibility reasons.</p></div> + <p>To configure authorization, create an <strong>auth.json</strong> file like the following:</p> <pre><code>{@@ -6208,10 +6334,431 @@ <p><code>litestore --auth:auth.json</code></p>
<p>Once enabled, LiteStore will return HTTP 401 error codes if an invalid token or no token is included in the HTTP Authorization header of the request accessing the resource or HTTP 403 error codes in case an authenticated user does not have a valid scope to access a specified resource.</p> +<a name="Configuration-File"></a> +<h2>Configuration File<a href="#document-top" title="Go to top"></a></h2> + +<p>As of version 1.8.0, you can specify a configuration file containing settings, middleware and authorization configuration using the <strong>–config</strong> or <strong>-c</strong> command line option:</p> + +<p><span class="cmd">litestore -c:config.json</span></p> + +<p>A typical configuration file looks like this:</p> + +<pre><code>{ + "settings": { + "log": "debug", + "port": 9200 + }, + "resources": { + "/docs/vehicles/*": { + "GET": { + "middleware": ["validate", "log"] + }, + "HEAD": { + "middleware": ["validate", "log"] + }, + "POST": { + "allowed": false + }, + "PATCH": { + "auth": ["admin:vehicles"], + "middleware": ["validate", "log"] + }, + "PUT": { + "auth": ["admin:vehicles"], + "middleware": ["validate", "log"] + }, + "DELETE": { + "auth": ["admin:vehicles"], + "middleware": ["validate", "log"] + } + }, + "/docs/logs/*": { + "GET": { + "auth": ["admin:server"] + }, + "POST": { + "allowed": false + }, + "PUT": { + "allowed": false + }, + "PATCH": { + "allowed": false + }, + "DELETE": { + "allowed": false + } + } + }, + "signature": "\n-----BEGIN CERTIFICATE-----\n<certificate text goes here>\n-----END CERTIFICATE-----\n" +} +</code></pre> + +<p>At present, it contains a <span class="kwd">settings</span>, a <span class="kwd">resources</span>, and a <span class="kwd">signature</span> section.</p> + +<a name="settings"></a> +<h3>settings<a href="#document-top" title="Go to top"></a></h3> + +<p>This section contains some of the most common command-line options, i.e.:</p> + +<ul> +<li>address</li> +<li>port</li> +<li>store</li> +<li>directory</li> +<li>mount</li> +<li>readonly</li> +<li>middleware</li> +<li>log</li> +</ul> + + +<p>If a configuration file is specified and some of these settings are configured, they will be recognized as if they were specified via command line. However, if you also specify the same settings via command line, the command line settings will take precedence over the settings defined in the configuration file.</p> + +<a name="resources"></a> +<h3>resources<a href="#document-top" title="Go to top"></a></h3> + +<p>This section can contain any number of resource paths, like <span class="kwd">/docs/</span>, <span class="kwd">/info/</span>, <span class="kwd">/docs/vehicles/AA456CC</span> or <span class="kwd">/docs/logs/*</span>. If a wildcard is specified after a resource or folder path, the rules defined within that section will match any document within the specified path. So for examople <span class="kwd">/docs/vehicles/*</span> will match both <span class="kwd">/docs/vehicles/AB547QV</span> and <span class="kwd">/docs/vehicles/BB326CZ</span>, but <em>not</em> <span class="kwd">/docs/vehicles/</span>.</p> + +<p>Within each resource path, you can specify different HTTP methods (all uppercase) and within each method any of the following properties:</p> + +<ul> +<li><strong>auth</strong> — A list of JWT scopes necessary to access the specified resource with the specified method.</li> +<li><strong>middleware</strong> — A list of middleware function definitions that will be executed in sequence when the resource is accessed with the specified method.</li> +<li><strong>allowed</strong> — If set to <strong>false</strong>, LiteStore will return a <span class="kwd">405 - Method not allowed</span> error code when accessing the resource with the specified method.</li> +</ul> + + +<a name="signature"></a> +<h3>signature<a href="#document-top" title="Go to top"></a></h3> + +<p>This section must be set to a valid certificate used validate JWT tokens. Note that the certificate must follow a specific format and start with the appropriate begin/end blocks.</p> + +<a name="Middleware"></a> +<h2>Middleware<a href="#document-top" title="Go to top"></a></h2> + +<p>As of version 1.8.0, you can define your own custom middleware using JavaScript executed on the server side.</p> + +<p>LiteStore embeds the <a href="https://duktape.org/">duktape</a> 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 some special global object.</p> + +<p>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</p> + +<a name="How-middleware-works"></a> +<h3>How middleware works<a href="#document-top" title="Go to top"></a></h3> + +<p>Potentially, each resource could have one or more middleware functions associated to it. Association is done through the LiteStore configuration file in a similar way as authentication is configured:</p> + +<pre><code>{ + "settings": { + "middleware": "test/middleware" + }, + "resources": { + "/docs/vehicles/*": { + "GET": { + "middleware": ["validate", "log"] + }, + "PUT": { + "auth": ["admin:vehicles"], + "middleware": ["validate", "log"] + } + } + } +} +</code></pre> + +<p>This simple configuration file shows how to configure middleware to be executed when a resources it requested via GET or PUT. In both cases, first the <em>validate</em> middleware function is executed, and then the <em>log</em>. These functions must reside in separate files named <em>validate.js</em> and <em>log.js</em> respectively, and placed into a folder (<strong>test/middleware</strong> in this case) referenced via the <strong>middleware</strong> setting (which is also exposed as a command line option, with <strong>-w</strong> as shorthand option).</p> + +<p>Middleware functions are executed sequentially until one of them explicitly stops the execution chain or the execution completes (by requesting the original resource).</p> + +<p>Considering the previous configuration example, if a PUT request is made to an item under <strong>/docs/vehicles</strong>:</p> + +<ol> +<li>The <em>validate</em> middleware function is executed.</li> +<li>The <em>log</em> middleware function is executed.</li> +<li>The request is processed as normal.</li> +</ol> + + +<p>Note that, for example, the <em>validate</em> middleware function may cause the execution to stop before it reaches the <em>log</em> middleware, thereby effectively implementing server-side validation.</p> + +<a name="Creating-a-JavaScript-Middleware-Function"></a> +<h3>Creating a JavaScript Middleware Function<a href="#document-top" title="Go to top"></a></h3> + +<p>Let’s say you want to keep records of Italian vehicles identified by their number plate, which is in the following format:</p> + +<p>\[two-uppercase-letters\][three-digits][two-uppercase-letters]</p> + +<p>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!)</p> + +<p>Let’s also say that Italian vehicle data will be managed within a folder called <strong>vehicles</strong>, therefore vehicles will be accessible at URLs similar to the following:</p> + +<ul> +<li>http://localhost:9500/docs/vehicles/AB467DX</li> +<li>http://localhost:9500/docs/vehicles/CD569BW</li> +<li>http://localhost:9500/docs/vehicles/EF981DE</li> +</ul> + + +<p>To make sure that valid IDs are used, we can create a file called <strong>vehicles.js</strong> and write the following code:</p> + +<pre><code>(function() { + var id = $req.path.replace(/^\/docs\//, ""); + var valid = /[A-Z]{2}[0-9]{3}[A-Z]{2}/; + if (!id.match(valid)) { + $res.content = { + error: "Invalid number plate" + }; + $res.code = 400; + return true; + } + $ctx.existing = !!($store.get("docs", id).code == 200); +})(); +</code></pre> + +<p>Note that middleware must be coded in the form of an <a href="https://en.wikipedia.org/wiki/Immediately_invoked_function_expression">IIFE</a>. In this case, the function: +* retrieves the ID of the vehicle. +* checks if it’s valid +* if it’s invalid, prepares a 400 - Bad Request response and stops the execution of additional middleware (and ultimately the request itself) by returning <strong>true</strong>. +* otherwise, it checks whether the vehicle already exists and stores this information on a context, so that it will be accessible to other middleware functions down the execution chain.</p> + +<a name="Passing-data-to-another-middleware"></a> +<h3>Passing data to another middleware<a href="#document-top" title="Go to top"></a></h3> + +<p>Although you can technically add additional properties to the <strong>$req</strong> and <strong>$res</strong> objects, you should use <strong>$ctx</strong> instead. <strong>$ctx</strong> is a global objects.</p> + +<p>In the <em>validate</em> middleware described in the previous section, the <strong>$ctx.existing</strong> property was set. This property can then be accessed and/or modified in additional middleware down the execution chain.</p> + +<p>Consider for example the following, very basic <em>log</em> middleware function:</p> + +<pre><code>(function(){ + var doc = { + user: $req.jwt.claims && $req.jwt.claims.sub || null, + agent: $req.headers['user-agent'], + language: $req.headers['accept-language'] && $req.headers['accept-language'].replace(/,.+$/, ''), + path: $req.path, + existing: !!$ctx.existing, + method: $req.method, + timestamp: Date.now() + } + $store.post('docs', 'logs', JSON.stringify(doc), 'application/json'); +}()) +</code></pre> + +<p>This middleware function simply logs the current request to another folder within the data store, and gathers some stats and whether the request was performed on an existing object or not. In this case, <strong>$ctx.existing</strong> should be set by another middleware up the chain (<em>validate</em>).</p> + +<a name="Global-JavaScript-Objects"></a> +<h2>Global JavaScript Objects<a href="#document-top" title="Go to top"></a></h2> + +<p>When creating JavaScript handlers for middleware, you can use some special $-prefixed global objects to access the HTTP request to the resource, the HTTP response, and also access other LiteStore resources.</p> + +<a name="$ctx"></a> +<h3>$ctx<a href="#document-top" title="Go to top"></a></h3> + +<p>An empty object that can be used to temporarily store data to pass across different middleware handlers.</p> + +<a name="$req"></a> +<h3>$req<a href="#document-top" title="Go to top"></a></h3> + +<p>The current HTTP request sent to access the current resource.</p> + +<a name="Properties"></a> +<h4>Properties<a href="#document-top" title="Go to top"></a></h4> + +<dl> +<dt>method: string</dt> +<dd>The HTTP method used by the request, all uppercase (GET, POST, DELETE, PUT, PATCH, OPTIOONS, or HEAD).</dd> +<dt>jwt: object</dt> +<dd>An object containing a parsed JWT token, if present. It exposes two properties: +<ul> +<li><strong>headers</strong>, an object typically containing the <strong>alg</strong> (algorithm) and <strong>typ</strong> (type) keys.</li> +<li><strong>claims</strong>, an object containing the claims included in the token (see the <a href="https://www.iana.org/assignments/jwt/jwt.xhtml#claims">IANA JSON Web Token Claims Registry</a> for a list of possible claims).</li> +</ul></dd> +<dt>headers: object</dt> +<dd>An object containing the request headers, as keys and values.</dd> +<dt>protocol: string</dt> +<dd>The request protocol and version.</dd> +<dt>hostname: string</dt> +<dd>The hostname target of the request.</dd> +<dt>port: number</dt> +<dd>The port used for the request.</dd> +<dt>path: string</dt> +<dd>The path to the resource requested.</dd> +<dt>query: string</dt> +<dd>The contents of the request query string.</dd> +<dt>content: string</dt> +<dd>When applicable, the content that was sent as body of the request.</dd> +</dl> + + +<a name="$res"></a> +<h3>$res<a href="#document-top" title="Go to top"></a></h3> + +<p>The HTTP response to return to the client.</p> + +<dl> +<dt>code: number</dt> +<dd>The HTTP return code, by default set to `200`.</dd> +<dt>content: string</dt> +<dd>The response content, by default set to `""`.</dd> +<dt>headers: object</dt> +<dd>The response headers, by default set to: +<pre><code> +{ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "Authorization, Content-Type", + "Server": "LiteStore/<version>", + "Content-Type": "application/json", + "Content-Length": "<Automatically set to the length of the <b>content</b> property.>" +} +</code></pre></dd> +</dl> + + +<a name="$store"></a> +<h3>$store<a href="#document-top" title="Go to top"></a></h3> + +<p>Simple synchronous API to access LiteStore resources in a RESTful way, mimicking HTTP methods.</p> + +<p>All methods return a response object containing two String properties, <strong>code</strong> and <strong>content</strong>.</p> + +<dl> +<dt>function get(resource: string, id: string, parameters: string): object</dt> +<dd>Retrieves the specified resource(s.). +<p> +Examples: +<ul> +<li><code>$store.get('docs', 'test-folder/test.json')</code></li> +<li><code>$store.get('docs', '', 'search=test&limit=20&offset=0')</code></li> +</ul> +</p> +</dd> +<dt>function post(resource: string, folder: string, body: string, contentType: string): object</dt> +<dd>Creates a new resource. +<p> +Examples: +<ul> +<li><code>$store.post('docs', 'test-folder', 'test!', 'text/plain')</code></li> +<li><code>$store.post('docs', '', '{"a": 1}', ?application/json')</code></li> +</ul> +</p> +</dd> +<dt>function put(resource: string, id: string, body: string, contentType: string): object</dt> +<dd>Creates or updates a specific resource. +<p> +Examples: +<ul> +<li><code>$store.put('docs', 'test-folder/test1.txt', 'Another Test.', 'text/plain')</code></li> +<li><code>$store.put('docs', 'test.json', '{"a": 2}', 'application/json')</code></li> +</ul> +</p> +</dd> +<dt>function patch(resource: string, id: string, body: string): object</dt> +<dd>Patches one or more fields of an existing resource. +<p> +Examples: +<ul> +<li><code>$store.patch('docs', 'test-folder/test1.txt', '{"op":"add", "path":"/tags/3", "value":"test1"}')</code></li> +</ul> +</p> +</dd> +<dt>function delete(resource: string, id: string): object</dt> +<dd>Deletes a specific resource. +<p> +Examples: +<ul> +<li><code>$store.delete('docs', 'test-folder/test1.txt')</code></li> +<li><code>$store.delete('docs', 'test.json')</code></li> +</ul> +</p> +</dd> +<dt>function head(resource: string, id: string): object</dt> +<dd>Retrieves the metadata of one or more resources, without retrieving their contents. +<p> +Examples: +<ul> +<li><code>$store.head('docs', 'test-folder/test1.txt')</code></li> +<li><code>$store.head('docs')</code></li> +</ul> +</p> +</dd> +</dl> + + +<a name="System-Documents"></a> +<h2>System Documents<a href="#document-top" title="Go to top"></a></h2> + +<p>As of version 1.8.0, it is possible to import, export, or delete <em>system documents</em> besides ordinary documents. Such documents are different from ordinary documents, because:</p> + +<ul> +<li>they are only intended to be used internally by LiteStore.</li> +<li>they cannot be accessed via any of the public APIs except for the <span class="kwd">import</span>, <span class="kwd">export</span> and <span class="kwd">delete</span> commands.</li> +<li>they must have a well-known name and/or folder structure.</li> +</ul> + + +<p>At present, only the following system documents are recognized by LiteStore:</p> + +<ul> +<li><strong>auth.json</strong> — The LiteStore authorization configuration file.</li> +<li><strong>config.json</strong> — The main LiteStore configuration file.</li> +<li><strong>middleware/*.js</strong> — Any <span class="ext">.js</span> file containing the definition of a middleware function, placed within a <span class="dir">middleware</span> folder.</li> +</ul> + + +<a name="Importing,-exporting-and-deleting-System-Documents"></a> +<h3>Importing, exporting and deleting System Documents<a href="#document-top" title="Go to top"></a></h3> + +<p>You can import, export, and delete system documents with the respective commands, but you must specify the <span class="kwd">–system</span> command line flag.</p> + +<p>For example, suppose you have a <span class="dir">sysdocs</span> folder containing the following file hierarchy:</p> + +<ul> +<li>sysdocs/ + +<ul> +<li>auth.jsom</li> +<li>config.json</li> +<li>middleware/ + +<ul> +<li>log.js</li> +<li>req.js</li> +<li>validate.js</li> +</ul> +</li> +</ul> +</li> +</ul> + + +<p>To import all the documents stored within the <span class="dir">sysdocs</span> folder, you must run the following command:</p> + +<p><span class="kwd">litestore -d:sysdocs –system import</span></p> + +<p>Similarly, the <span class="kwd">export</span> and <span class="kwd">delete</span> commands can be used to export and delete system documents respectively, always specifying the <span class="kwd">–system</span> flag.</p> + +<a name="How-LiteStore-uses-System-Documents"></a> +<h3>How LiteStore uses System Documents<a href="#document-top" title="Go to top"></a></h3> + +<p>While at development time you may want to be able to edit your system documents and therefore keep them outside your data store as ordinary text files (and load them using the <strong>–auth</strong>, <strong>–config</strong> and <strong>–middleware</strong> options), in production you may want to ship them within the data store along with your application data.</p> + +<p>At run time, LiteStore will attempt to retrieve settings/middleware/authorization configuration using the following order of precedence (first listed have higher precedence):</p> + +<ol> +<li>Command line options</li> +<li>Configuration files specified via command line options</li> +<li>Configuration files loaded as system documents</li> +</ol> + + <a name="Administration-App"></a> <h2>Administration App<a href="#document-top" title="Go to top"></a></h2> -<p>A simple but fully-functional administration app can be used to manage LiteStore data stores. This app can simply be imported into a data store file and then run via LiteStore.</p> +<p>A simple, <em>slightly</em> dated, but fully-functional administration app can be used to manage LiteStore data stores. This app can simply be imported into a data store file and then run via LiteStore.</p> <a name="Obtaining-and-Running-the-Administration-App"></a> <h3>Obtaining and Running the Administration App<a href="#document-top" title="Go to top"></a></h3>@@ -6675,10 +7222,14 @@ <p>Filter expressions can be composed by one or more clauses joined together through <strong>or</strong> or <strong>and</strong> operators. Each clause must be composed exactly by:</p>
<ul> <li>A path expression indicating a field or array item within the JSON document.</li> -<li>One operator among the following: eq, not eq, gt, gte, lt, lte, contains.</li> +<li>One operator among the following: eq, not eq, gt, gte, lt, lte, contains, and like.</li> <li>A value that can be a number, string, <strong>true</strong>, <strong>false</strong> or <strong>nil</strong></li> </ul> + +<div class="note"><p>API v5 Required</p> + +<p>Support for the <strong>like</strong> operator has been added in version 5 of the LiteStore API.</p></div> <div class="warning"><p>Limitations</p>@@ -6694,6 +7245,7 @@
<ul> <li>http://127.0.0.1:9500/docs/?filter=$.age%20gte%2018%20or%20$.skills%20contains%20"maths"</li> <li>http://127.0.0.1:9500/docs/?filter=$.name.first&20eq%20"Jack"%20or%20$.fav_food[0]%20eq%20"pizza"</li> +<li>http://127.0.0.1:9500/docs/?filter=$.name.first&20like%20"J*"</li> </ul>@@ -7087,6 +7639,17 @@ <div class="tip"><p>Wildcards</p>
<p>You can use asterisks (*) as wildcards.</p></div> +<a name="<code>limit</code>-and-<code>offset</code>-options"></a> +<h5><code>limit</code> and <code>offset</code> options<a href="#document-top" title="Go to top"></a></h5> + +<p>Provide a way to implement pagination:</p> + +<ul> +<li><strong>limit</strong> causes the query to retrieve only the first <em>n</em> results.</li> +<li><strong>offset</strong> causes the query to skip the first <em>n</em> results.</li> +</ul> + + <a name="Example"></a> <h5>Example<a href="#document-top" title="Go to top"></a></h5>@@ -7140,6 +7703,172 @@
{"id":"$type:text","documents":32} </code></pre> +<a name="indexes-(LiteStore-Indexes)"></a> +<h3>indexes (LiteStore Indexes)<a href="#document-top" title="Go to top"></a></h3> + +<div class="note"><p>API v5 Required</p> + +<p>This resource has been introduced in version 5 of the LiteStore API.</p></div> + +<p>LiteStore Indexes are special indexes used to optimize the performance of queries on JSON documents.</p> + +<div class="warning"><p>JSON-only Documents Required!</p> + +<p>Indexes can be created <em>only</em> if the entire database is composed by JSON documents. If not, LiteStore will return an error when attempting to create the first index.</p></div> + +<a name="OPTIONS-indexes"></a> +<h4>OPTIONS indexes<a href="#document-top" title="Go to top"></a></h4> + +<p>Returns the allowed HTTP verbs for this resource.</p> + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i -X OPTIONS http://127.0.0.1:9500/indexes +HTTP/1.1 200 OK +server: LiteStore/1.7.0 +access-control-allow-origin: http://localhost:9500 +access-control-allow-headers: Content-Type +allow: GET,OPTIONS +access-control-allow-methods: GET,OPTIONS +content-length: 0 +</code></pre> + +<a name="OPTIONS-indexes/:id"></a> +<h4>OPTIONS indexes/:id<a href="#document-top" title="Go to top"></a></h4> + +<p>Returns the allowed HTTP verbs for this resource.</p> + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i -X OPTIONS http://127.0.0.1:9500/indexes/name +HTTP/1.1 200 OK +server: LiteStore/1.7.0 +access-control-allow-origin: http://localhost:9500 +access-control-allow-headers: Content-Type +allow: GET,OPTIONS,PUT,DELETE +access-control-allow-methods: GET,OPTIONS,PUT,DELETE +Content-Length: 0 +</code></pre> + +<a name="GET-indexes"></a> +<h4>GET indexes<a href="#document-top" title="Go to top"></a></h4> + +<p>Retrieves all indexes and their respective JSON fields.</p> + +<a name="<code>like</code>-option"></a> +<h5><code>like</code> option<a href="#document-top" title="Go to top"></a></h5> + +<p>If this option is specified, retrieves all indexes matching the specified string.</p> + +<div class="tip"><p>Wildcards</p> + +<p>You can use asterisks (*) as wildcards.</p></div> + +<a name="<code>limit</code>-and-<code>offset</code>-options"></a> +<h5><code>limit</code> and <code>offset</code> options<a href="#document-top" title="Go to top"></a></h5> + +<p>Provide a way to implement pagination:</p> + +<ul> +<li><strong>limit</strong> causes the query to retrieve only the first <em>n</em> results.</li> +<li><strong>offset</strong> causes the query to skip the first <em>n</em> results.</li> +</ul> + + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i http://localhost:9500/indexes/?like=%2Aname%2A +HTTP/1.1 200 OK +server: LiteStore/1.7.0 +access-control-allow-origin: http://localhost:9500 +content-type: application/json +vary: Origin +access-control-allow-headers: Content-Type +Content-Length: 244 + +{ + "like": "*name*", + "total": 2, + "execution_time": 0.0006140000000000001, + "results": [ + { + "id": "name", + "field": "$.name" + }, + { + "id": "document.name", + "field": "$.document.name" + } + ] +} +</code></pre> + +<a name="GET-indexes/:id"></a> +<h4>GET indexes/:id<a href="#document-top" title="Go to top"></a></h4> + +<p>Retrieves the specified index and corresponding JSON field.</p> + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i http://localhost:9500/indexes/name +HTTP/1.1 200 OK +server: LiteStore/1.7.0 +access-control-allow-origin: http://localhost:9500 +content-type: application/json +vary: Origin +access-control-allow-headers: Content-Type +Content-Length: 30 + +{"id":"name","field":"$.name"} +</code></pre> + +<a name="PUT-indexes/:id"></a> +<h4>PUT indexes/:id<a href="#document-top" title="Go to top"></a></h4> + +<p>Creates a new index with the specified ID.</p> + +<p>Note that: +* Index IDs can only contain letters, numbers, and underscores. +* Index fields must be valid paths to JSON fields.</p> + +<div class="warning"><p>No updates</p> + +<p>It is not possible to update an existing index. Delete it and re-create it instead.</p></div> + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i -X PUT -d '{"field": "$.name"}' 'http://127.0.0.1:9500/indexes/name' --header "Content-Type:application/json" +HTTP/1.1 201 Created +Content-Length: 31 +Content-Type: application/json +Access-Control-Allow-Headers: Content-Type +Access-Control-Allow-Origin: http://localhost:9500 +Server: LiteStore/1.7.0 + +{"id":"name", "field":"$.name"} +</code></pre> + +<a name="DELETE-indexes/:id"></a> +<h4>DELETE indexes/:id<a href="#document-top" title="Go to top"></a></h4> + +<p>Deletes the specified index.</p> + +<a name="Example"></a> +<h5>Example<a href="#document-top" title="Go to top"></a></h5> + +<pre><code>$ curl -i -X DELETE 'http://127.0.0.1:9500/indexes/name' +HTTP/1.1 204 No Content +Content-Length: 0 +Access-Control-Allow-Headers: Content-Type +Access-Control-Allow-Origin: http://localhost:9500 +Server: LiteStore/1.7.0 +</code></pre> + <a name="Nim-API-Reference"></a> <h2>Nim API Reference<a href="#document-top" title="Go to top"></a></h2>@@ -7578,7 +8307,7 @@ </ul>
</div> <div id="footer"> - <p><span class="copy"></span> Fabio Cevasco – December 29, 2019</p> + <p><span class="copy"></span> Fabio Cevasco – March 7, 2020</p> <p><span>Powered by</span> <a href="https://h3rald.com/hastyscribe"><span class="hastyscribe"></span></a></p> </div> </div>
@@ -5,7 +5,7 @@ github: litestore
home: /litestore/ active: true docs: /litestore/LiteStore_UserGuide.htm -version: 1.6.0 +version: 1.8.0 subtitle: "A tiny NoSQL database for rapid prototyping" summary: "A lightweight, self-contained, RESTful, multi-format NoSQL document store server written in Nim and powered by a SQLite backend for storage." download: "https://github.com/h3rald/litestore/releases/download/"