@adoratorio/demetra
Version:
Internal use library for wordpress API request
641 lines (528 loc) • 18.8 kB
Markdown
# Demetra
A utility library for WordPress custom API interaction, using the **adora-theme** endpoint.
## Installation
```bash
# Install package
npm install @adoratorio/demetra
```
## Usage
Since this package has a [pkg.module](https://github.com/rollup/rollup/wiki/pkg.module) field, it’s highly recommended importing it as an ES6 module with some bundlers like [Webpack](https://webpack.js.org/) or [Rollup](https://rollupjs.org/):
```typescript
import Demetra from '@adoratorio/demetra';
const demetra = new Demetra(options: Object);
```
## Available options
Demetra accepts in the constructor an `option` object with the following possible props.
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|endpoint|string|`''`|The URL for the custom theme API endpoint|
|uploadEndpoint|string|`{$endpoint}/upload.php`|The URL for the custom theme API endpoint for uploading files|
|site|string|`'default'`|In the Wordpress multi-site installation the site id to fetch data from|
|lang|string|`'en'`|The language in which data is retrieved|
|debug|boolean|`false`|If You need extra log in browser console about what Demetra is doing|
|version|number|`2`|The API version used (V2 is now available!)|
|cacheMaxAge|number|`3600000`|Maximum cache age in ms. If the request will use the local cache (LRU Cache)|
|proxy|AxiosProxyConfig|`false`|An http/https proxy to use for requests described as axios proxy config object|
## APIs
### fetchPage()
Use this method to get pages details, the method accept the following params
```typescript
Demetra.fetchPage(id : string | number, options : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|id|`true`|The id or the slug of the page to fetch|
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|type|string|`'page'`|The custom post type id or 'page' if you need an actual page not a post.|
|siblings|object|`{ fields: [], prev: false, next: false, loop: false }`|If you also need information about adjacent siblings|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
|i18n|boolean|`true`|If you need to get the i18n object in the response containing all information about the other languages available for this page|
**Siblings can take an object with the following keys**
| parameter | type | default | description |
| :-------- | :-----: | :-----: | :----------------------------------------------------------- |
| fields | Array | `[]` | An array of fields you need for siblings, identified by their frontId |
| prev | boolean | `false` | If you need the prev sibling |
| next | boolean | `false` | If you need the next sibling |
| loop | Boolean | `false` | If the requested page is the last or the first, treat the siblings as a circle, returning the first one or the previous one depending on the position |
The returned object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"id": 1,
"title": "Homepage",
"path": "/homepage/",
"fullPath": "/en/homepage/",
"slug": "homepage",
"structure": [
{
"frontId": "Component Name"
// ... Other item data
}
// ... Other item components
],
"lang": "en",
"type": "page",
"i18n": {
"it": {
"id": 111,
"slug": "homepage",
"path": "/homepage",
"fullPath": "/it/homepage"
}
},
"siblings": {
"next": {
"id": 222,
"title": "Siblings Title",
"path": "/sibligns-path/",
"fullPath": "/en/sibligns-path/",
"structure": [
false
],
"lang": null,
"type": "page",
"i18n": null,
"siblings": null,
"date": null
},
"prev": null
},
"date": null // Filled only wen the requested type is a post
}
}
```
### fetchArchive()
Retrieve the information and content for an archive (a collection of items)
```typescript
Demetra.fetchArchive(id: string, options : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|id|`true`|The slug of the archive to fetch|
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|fields|string|`[]`|Array of frontId used to identify the fields for the items|
|pagination|object|`{ start: 0, count: -1 }`|A pagination object used to define if you need pagination|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
|i18n|boolean|`true`|If you need to get in response the i18n object containing all the information about the other available languages for this page|
**Pagination can take an object with the following keys**
| parameter | type | default | description |
| :-------- | :----: | :-----: | :---------- |
| start | number | `0` | |
| count | number | `-1` | |
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"items": [
{
"id": 111,
"title": "First Article",
"path": "/first-article/",
"fullPath": "/en/first-article/",
"structure": [
{
"frontId": "Component Name",
// ... Other item data
}
// ... Other item components
],
"lang": "en",
"type": "press",
"i18n": null,
"siblings": null,
"date": null
}
],
"pagination": {
"start": 0,
"count": -1,
"more": true,
"total": 7
}
}
}
```
### fetchExtra()
Fetch data considered to be extra in the Wordpress setup
```typescript
Demetra.fetchExtra(id: string, options? : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|id|`true`|The slug of the extra to fetch|
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
|i18n|boolean|`true`|If you need to get in response the i18n object containing all the information about the other available languages for this page|
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"privacy": "",
"cookies": "",
"email": ""
// ... Extra data with key : value here
}
}
```
### fetchMenu()
Fetch content for a menu
```typescript
Demetra.fetchMenu(id: string, options : object);
```
**Accepted params**
|parameter|required|description|
|:---|:---:|:---|
|id|`true`|The slug of the menu to fetch|
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
|i18n|boolean|`true`|If you need to get in response the i18n object containing all the information about the other available languages for this page|
The returned object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"items": [
{
"caption": "Home",
"link": {
"title": "Home",
"url": "https://xyz/about/",
"target": ""
}
}
// ... Other menu item
]
}
}
```
### fetchTaxonomy()
Fetch a single taxonomy with all terms
```typescript
Demetra.fetchTaxonomy(id: string | [string], options? : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|id|`true`|The slug or an array of slug of the taxonomy to fetch|
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
|i18n|boolean|`true`|If you need to get in response the i18n object containing all the information about the other available languages for this page|
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"items": [
{
"term_id": 1,
"name": "TERM NAME",
"slug": "termname",
"term_group": 0,
"term_taxonomy_id": 1,
"taxonomy": "taxonomy id",
"description": "",
"parent": 0,
"count": 0,
"filter": "raw"
}
// ... Other terms following
]
}
}
```
### fetchLanguages()
Use this method to get locales details such as:
- code
- iso
- default_locale
- name
- translated_name
the method accept the following params
```typescript
Demetra.fetchLanguages(site : string, options : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|site|`true`| the id of the reference site |
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
|lang|string|`Demetra.lang`|The language in which data is retrieved|
The returned object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded",
"cache": false
},
"data": {
"locales": [
{
"code": "en",
"iso": "en",
"default_locale": "en_US",
"name": "English",
"translated_name": "Inglese",
"hidden": false
},
{
"code": "it",
"iso": "it",
"default_locale": "it_IT",
"name": "Italiano",
"translated_name": "Italiano",
"hidden": false
}
],
"defaultLocale": "en"
}
}
```
### fetchSitemap()
Use this method to get a list with all the project route.
```typescript
Demetra.fetchSitemap(site : string, options : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|site|`true`| the id of the reference site |
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
The returned object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded",
"cache": false
},
"data": [
"/explore/",
"/about/",
"/dining/bar-aperitifs/",
"/dining/breakfast/",
"/dining/restaurants/second-restaurant/",
"/dining/restaurants/first-restaurant/",
"/dining/",
"/suites/second-suite/",
"/suites/first-suite/",
"/suites/",
"/",
"/it/explore/",
"/it/about/",
"/it/pasti/bar-aperitifs/",
"/it/pasti/breakfast/",
"/it/pasti/restaurants/second-restaurant/",
"/it/pasti/restaurants/first-restaurant/",
"/it/pasti/",
"/camere/second-suite/",
"/camere/first-suite/",
"/camere/",
"/it/home"
]
}
```
### fetchAttachments()
Use this method to get a list with all the project route.
```typescript
Demetra.fetchAttachments(site : string, options : object);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|site|`true`| the id of the reference site |
|options|`false`|The configuration object|
**Options can take an object with the following keys**
|parameter|type|default|description|
|:---|:---:|:---:|:---|
|wpCache|boolean|`true`|If the endpoint will use the API cache|
|localCache|boolean|`false`|If you want to save the data in a local cache *(LruCache)*|
The returned object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded",
"cache": false
},
"data": [
"/.../",
]
}
```
### subscribe()
Use configured MailChimp settings in order to subscribe an email to a list
```typescript
Demetra.subscribe(email : string);
```
**Accepted parameters**
|parameter|required|description|
|:---|:---:|:---|
|email|`true`|The e-mail to subscribe to the newsletter|
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"response": 1, // The request result 0 in case of error
"message": "SUCCESS!", // The message associated with the result
"mailchimp": "", // Contains mailchimp messages and debug informations
},
}
```
### send()
Use a preconfigured form on WP to send an email
```typescript
Demetra.send(id : number, recipients : string, data : object, files : array);
```
**Accepted parameters**
|parameter|required|description|
|:---|:--:|:---|
|id|`true`|the form ID|
|recipients|`true`|should be a single email, or a comma separated list of email addresses|
|data|`true`|`data` should be a valid JSON parsable string, containing only one level key/value pairs, one for each field defined in form options on WP side|
|files|`false`|should be a list of files handler to upload as attachments to the reques|
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Data loaded!",
"cache": false
},
"data": {
"saved": 1, // How many requests have been saved in the db
"sended": true // If the email has been sended to the recipients
}
}
```
### upload()
Upload one or multiple files to the Wordpress media library
```typescript
Demetra.upload(files : file | array<file>);
```
The returning object will be in the following form
```json5
{
"status": {
"code": 200,
"message": "Upload successful",
},
"data": [
{
"upload_id": 1, // The post id of the uploaded file
"url": "https://..." // The url of the uploaded file
}
]
}
```
### fetchQueue()
Fetch all the [DemetraRequest](#DemetraRequests) in the [queue](#Queue) in three different ways: **all together**, **simultaneously** or **one at time**.
```typescript
fetchQueue(sendModes: string)
```
**Accepted parameters**
| parameter | type | required | default | description |
| :-------- | :------: | :------: | :-----------------------: | :----------------------------------------------------------- |
| id | `string` | `false` | `Demetra.SEND_MODES.ONCE` | A string indicating the send mode you wish to use, it can be 'once', 'simultaneously' or 'await'. Also static enumerators are exposed to help:<br/>• `Demetra.MODE.ONCE`<br/>• `Demetra.MODE.SIMULTANEOUSLY`<br/>• `Demetra.MODE.AWAIT`. |
**Modes:**
- **Once**: create a request package and send thath package.
- **Simultaneously**: simultaneously sends all requests independently of each other
- **Await**: Wait a response before send the next request
## Queue
Internally Demetra uses a request queue which is used together with the [fetchQueue()](#fetchQueue()) function
### add()
Adds a request to the queue.
```typescript
Demetra.add(request : DemetraRequestPage | DemetraRequestArchive | DemetraRequestExtra | DemetraRequestMenu | DemetraRequestTaxonomy)
```
### Clear()
Clear the queue.
```typescript
Demetra.clear()
```
## DemetraRequests
In V2 you can directly create a DemetraRequest thath can be directly sent via [fetchQueue()](#fetchQueue()) .
You can instantiate one or more of the following class:
- `DemetraRequestArchive(id : string | number, options : object, lang : string, site : string, version : number)`
- `DemetraRequestExtra(id : string | number, options : object, lang : string, site : string, version : number)`
- `DemetraRequestMenu(id : string | number, options : object, lang : string, site : string, version : number)`
- `DemetraRequestPage(id : string | number, options : object, lang : string, site : string, version : number)`
- `DemetraRequestTaxonomy(id : string | number, options : object, lang : string, site : string, version : number)`
- `DemetraRequestLanguages(site : string, options : object, lang : string, version : number)`
- `DemetraRequestSiteMap(site : string, options : object, version : number)`
- `DemetraRequestAttachments(site : string, options : object, version : number)`
> NB: The request doesn't inherit the global parameters of Demetra. Tho you can pass the *lang*, *site* and *version* params directly in the options
**Accepted parameters**
| parameter | type | required | default | description |
| :-------- | :--------------: | :------: | :---------: | :----------------------------------------------------------- |
| id | string \| number | `true` | | The slug or id of the archive \| extra \| page \| menu \| taxonomy to fetch |
| options | object | `false` | | The configuration object (look the fetch API above to understand how to fill the object for each request) |
| lang | string | `false` | `'en'` | The language in which data is retrieved |
| site | string | `false` | `'default'` | In multi-site installation Wordpress the site id to fetch data from |
| version | number | `false` | `2` | The API version used |