fjdsdjjxsa-api
TypeScript icon, indicating that this package has built-in type declarations

10.21.1-alpha.0 • Public • Published

JavaScript Content API Library

The JavaScript Content API Library a.k.a. Content API is an interface handling data coming from the FirstSpirit CaaS and the Navigation Service. The data is processed and transformed so that it can be used in any JavaScript project.

Attention We would like to inform you that the project previously known as "FSXA-API" has recently undergone a name change. The project is now called "JavaScript Content API Library", but please note that this change solely affects the project's name, repository, and associated branding elements. The core code and functionality of the library remain unchanged. The purpose and scope of the library, as well as its intended usage and compatibility, remain consistent. The decision to change the name was made as the term "fsxa" no longer accurately represents the project's current scope, as other components beyond the fjdsdjjxsa-api are now discontinued. The name change aims to align the project's branding with its refined purpose and to avoid any confusion regarding its functionality.

Experimental features

Features marked as experimental are subject to change as long as they remain in the experimental state. Breaking changes to experimental features are not reflected in a major version changes.

Legal Notices

JavaScript Content API Library is a product of Crownpeak Technology GmbH, Dortmund, Germany. The JavaScript Content API Library is subject to the Apache-2.0 license.

Methods

In this section all available methods will be explained using examples.

Requirements

The JavaScript Content API Library requires a fetch implementation to run on a Node server environment. This dependency can be fulfilled with a cross-fetch polyfill in older Node versions. A working example can be found in the chapter Constructor.

Constructor

To be able to use the Content API, a new object must be created. How you create the object depends on how you want to use the Content API.

If you want to use the information provided by the CaaS in your frontend, you can use the FSXAProxyApi. It proxies the requested resources to a middleware Rest Api, that does not expose secrets. If you want to use it in your server, you can use the FSXARemoteApi. It can be registered as a Rest Api that can be called from a FSXAProxyApi instance.

However, to have a fully running application, we recommend using the Content API in your server as well as in your frontend.

The config mode can be preview or release, depending on the state of the content you want to fetch.
There is an enum to use these modes.
FSXAContentMode.PREVIEW for preview
FSXAContentMode.RELEASE for release

If you want to use the FSXARemoteApi, you have to specify the following parameters:

const config = {
  apikey: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'!,
  caasURL: 'https://your.caas.url',
  contentMode: FSXAContentMode.PREVIEW,
  navigationServiceURL: 'https://your.navigation-service.url/navigation',
  projectID: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  tenantID: 'your-tenant-id',
  logLevel: LogLevel.INFO,
  enableEventStream: true || false,
}

You can also include remote projects if you want to use remote media.

Attention
Currently the Content API can only work with the master language of the remote media project. You also require a configured CAAS API key with read permissions to both projects.

For this you can add another parameter called remotes to the config. This parameter expects an object, which requires a unique name as key and an object as value. This object must have two keys. On the one hand an id with the project id as the value and on the other the locale with the locale abbreviation. For example:

const config = {
  ...
  remotes: { media: { id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', locale: 'en_GB' } },
  ...
}

The log level can be: 0 = Info 1 = Log 2 = Warning 3 = Error 4 = None. The default is set to 3.

Here is an example of how the FSXARemoteApi and FSXAProxyApi could be used with an Express.js backend. Make sure you have cross-fetch, express, cors, lodash and of course fjdsdjjxsa-api installed.

import dotenv from 'dotenv'
import express from 'express'
import cors from 'cors'
import {
  FSXAContentMode,
  LogLevel,
  FSXARemoteApi,
} from 'fjdsdjjxsa-api'
import { FSXAProxyApi } from 'fjdsdjjxsa-proxy-api'
import getExpressRouter from 'fjdsdjjxsa-api/dist/lib/integrations/express'
import 'cross-fetch/polyfill'

dotenv.config({ path: '.env' })
const app = express()
const remoteApi = new FSXARemoteApi(config)

app.use(cors())
app.use('/api', getExpressRouter({ api: remoteApi }))

app.listen(3002, async () => {
  console.log('Listening at http://localhost:3002')
  try {
    const locale = 'de_DE'
    const proxyAPI = new FSXAProxyApi(
      'http://localhost:3002/api',
      LogLevel.INFO
    )
    // you can also fetch navigation from proxyAPI
    const navigationResponse = await proxyAPI.fetchNavigation({
      locale,
      initialPath: '/',
    })
  } catch (e) {
    console.log(e)
  }
})

get authorizationHeader

Returns the build authorization header in the following format when using FSXARemoteApi:

{
  authorization: 'Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
}

Example:

const remoteApi = new FSXARemoteApi(config)
const authorizationHeader = remoteApi.authorizationHeader
// console.log { authorization: `Bearer ${config.apikey}` }

fetchNavigation

This method fetches the navigation from the configured navigation service. You need to pass a FetchNavigationParams object.

Example:

fsxaApi.fetchNavigation({
  locale: 'en_EN',
  initialPath: '/',
})

fetchElement

This method fetches an element from the configured CaaS. The FetchElementParams object defines options to specify your request. Check FSXARemoteApi.buildCaaSUrl to know which URL will be used.

fsxaApi.fetchElement({
  id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  locale: 'de_DE',
})

Note
The 'raw' CaaS data might be helpful when you want to know the key names that you can filter for. It is possible to access that data directly with the authorization header and the CaaS Url.

fetchByFilter

Returns the matching CaaS data entries. It maps the given entries to a more frontend-friendly format. Unnecessary fields will be omitted and the structure is simpler.

Expects as input parameter an array of filters and a language abbreviation. Optionally a page number, page size, sort and additional parameters can be passed.
Optionally, a remoteProject can be passed. If one is passed, the element will be fetched from this project instead of the default one.

Several filter objects can be specified in the filter array, the results will then correspond to all specified filters.

One filter object must have a:
field which specifies the searched key,
operator which specifies the search operation,
value which specifies the value that is looked for.

More information to the filters

In this example we search for all elements with the fsType equals Example. We want the 2nd page with a maximum of 50 entries. The results should be sorted by fsType descending. However, we do not want the identifier to appear:

fsxaApi.fetchByFilter({
  filters: [
    {
      field: 'fsType',
      operator: ComparisonQueryOperatorEnum.EQUALS,
      value: 'Example',
    },
  ],
  locale: 'en',
  page: 2,
  pagesize: 50,
  additionalParams: { keys: { identifier: 0 } },
  sort: [{ name: 'fsType', order: 'desc' }],
})

The default sorting is by the id descending. MultiSort is possible and the first sort param is prioritized over subsequent. The sorting is happening on the raw data.

Attention
The keys names which are passed to the fetchByFilter method (e.g. in the filters or the additionalParams) have to match the key names that are present in the CaaS data.

fetchProjectProperties

Returns the project properties of the given language.

Expects a parameter object with the locale.

ATTENTION: Works only with CaaSConnect module version 3 onwards.

Example:

fsxaApi.fetchProjectProperties({
  locale: 'de_DE',
})

Filter

You can customize your queries in the fetchByFilter method with these operations. For more information please refer to the MongoDB documentation. Links are provided in each section.

Helpers

There are also some additional helper methods which can be used for different purposes.

type AvailableLocaleParams = {
  navigationServiceURL: string
  projectId: string
  contentMode: string | ('preview' | 'release')
}
getAvailableLocales({
  projectId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  navigationServiceURL: 'https://your.navigation-service.url/navigation',
  contentMode: 'preview',
})

This method provides a list of available locales configured in your FirstSpirit project. It is recommended that the configuration matches the ISO format. E.g. ["en_GB", "de_DE"]

  Promise<string[]>

1. Extending the API

Introduction

In some scenarios, you might find that the standard methods provided by the JavaScript Content API Library do not fully cover your use case. That's where the flexibility of extending the API comes into play. This guide focuses on extending the API to fetch data from an aggregation in the Content as a Service (CaaS) using the buildCaasUrl function and handling authorization headers. We'll take you through the process step by step.

1.1 Fetching from Aggregation

This guide provided an in-depth overview of sending requests to the CaaS service using the buildCaasUrl function and the aggregation URI /_aggrs/example. It also covered the crucial aspect of including authorization headers to ensure secure communication. By following these steps, you can effectively retrieve and manage content from the CaaS in your JavaScript projects

1.1.1 Prerequisites

Before you start extending the API, ensure you have the following:

  • Configuration details such as API keys, CaaS URL, and other required parameters.

1.1.2 Abstract Steps

Extending the API to fetch data from an aggregation involves the following steps:

  1. Use the buildCaasUrl function to construct the URL for the aggregation request.
  2. Include the necessary authorization headers for secure communication.
  3. Make the fetch request to the constructed URL.
  4. Handle the response data or errors accordingly.

1.1.3 Implementation Notes

It's important to note a few things before proceeding:

  • This approach requires a server-side environment due to security concerns.
  • To access the CaaS service from the server-side, you need to use the FSXARemoteApi.
  • Extending the API in this manner allows you to tailor the data retrieval to your specific requirements.

1.1.4 How to Use the New Function

Let's dive into the details of extending the API to fetch data from an aggregation.

  1. Use buildCaasUrl Function

Start by using the buildCaasUrl function to construct the URL for the aggregation request:

import { FSXARemoteApi } from 'fjdsdjjxsa-api';

const remoteApi = new FSXARemoteApi(config);
const aggregationUri = '/_aggrs/example';
const caasUrl = remoteApi.buildCaasUrl();
const url = `${caasUrl}/${aggregationUri}`
  1. Include Authorization Headers

To ensure secure communication, include authorization headers in your request:

const headers = {
  ...remoteApi.authorizationHeader,
  // other headers if needed
}
  1. Make the Fetch Request
const caasUrl = remote.buildCaaSUrl();
const aggregationUri = '_aggrs/example';
const url = `${caasUrl}/${aggregationUri}`;
const headers = {
  ...remoteApi.authorizationHeader,
  // other headers if needed
}

try {
  const response = await fetch(url, {
    headers,
  });

  const data = await response.json();
  // Handle the data...
} catch (error) {
  console.error('An error occurred:', error);
  // Handle the error...
}

By following these steps, you've successfully extended the API to fetch data from an aggregation in the CaaS service. This approach empowers you to retrieve data tailored to your specific needs, enhancing the capabilities of the JavaScript Content API Library.

Logical Query Operators

These operators can also be found in the MongoDB Documentation

Enum Operation
LogicalQueryOperatorEnum.AND $and
LogicalQueryOperatorEnum.NOT $not
LogicalQueryOperatorEnum.NOR $nor
LogicalQueryOperatorEnum.OR $or

Comparison Query Operators

These operators can also be found in the MongoDB Documentation

Enum Operation
ComparisonQueryOperatorEnum.GREATER_THAN_EQUALS $gte
ComparisonQueryOperatorEnum.GREATER_THAN $gt
ComparisonQueryOperatorEnum.EQUALS $eq
ComparisonQueryOperatorEnum.IN $in
ComparisonQueryOperatorEnum.LESS_THAN $lt
ComparisonQueryOperatorEnum.LESS_THAN_EQUALS $lte
ComparisonQueryOperatorEnum.NOT_EQUALS $ne
ComparisonQueryOperatorEnum.NOT_IN $nin

Evaluation Query Operators

These operators can also be found in the MongoDB Documentation

Enum Operation
EvaluationQueryOperatorEnum.REGEX $regex

Array Query Operators

These operators can also be found in the MongoDB Documentation

Enum Operation
ArrayQueryOperatorEnum.ALL $all

Type Mapping

Input Components

This table gives an overview of the FirstSpirit input components, which can be defined in the "Form" tab of the FirstSpirit templates. Each input component has a (Java) data type, which has a representation in the CaaS. Those values are mapped to an interface of the Content API.

FirstSpirit Input Component CaaS Representation Content API Value
FS_CATALOG
Catalog<Catalog$Card>
= CaaSApi_FSCatalog
= CaaSApi_Card[]
Section[]
CMS_INPUT_CHECKBOX
Set<Option>
= CaaSApi_CMSInputCheckbox
= CaaSApi_Option[]
Option[]
CMS_INPUT_COMBOBOX
Option
= CaaSApi_CMSInputCombobox
= CaaSApi_Option|null
Option
FS_DATASET
DatasetContainer
= CaaSApi_FSDataset
= CaaSApi_Dataset|CaaSApi_DataEntry[]|null
Dataset
CMS_INPUT_DATE
Date
= CaaSApi_CMSInputDate
= string(ISO_8601)|null
Date
CMS_INPUT_DOM
DomElement
= CaaSApi_CMSInputDOM
= string (FS-XML)
RichTextElement[]
CMS_INPUT_DOMTABLE
Table
= CaaSApi_CMSInputDOMTable
= string (FS-XML)
RichTextElement[]
CMS_INPUT_IMAGEMAP
MappingMedium
= CaaSApi_CMSImageMap
= CaaSApi_CMSImageMap
ImageMap
FS_INDEX
Index<Index$Record>
= CaaSApi_FSIndex
= CaaSApi_Record[]
DataEntries[]
CMS_INPUT_LINK
Link
= CaaSApi_CMSInputLink
= Object
Link
CMS_INPUT_LIST
Set<Option>
= CaaSApi_CMSInputList
= any[]
Option[]
CMS_INPUT_NUMBER
Number
= CaaSApi_CMSInputNumber
= number
number
CMS_INPUT_PERMISSION
Permissions
= CaaSApi_CMSInputPermission
= CaaSAPI_PermissionActivity[][]
Permission
CMS_INPUT_RADIOBUTTON
Option
= CaaSApi_CMSInputRadioButton
= CaaSApi_Option|null
Option
FS_REFERENCE
TargetReference
= CaaSApi_FSReference
= CaaSApi_BaseRef|CaaSApi_PageRefRef|CaaSApi_GCARef|CaaSApi_MediaRef|null
CMS_INPUT_TEXT
String
= CaaSApi_CMSInputText
= string
string
CMS_INPUT_TEXTAREA
String
= CaaSApi_CMSInputTextArea
= string
string
CMS_INPUT_TOGGLE
Boolean
= CaaSApi_CMSInputToggle
= boolean|null
boolean

Disclaimer

This document is provided for information purposes only. Crownpeak Technology may change the contents hereof without notice. This document is not warranted to be error-free, nor subject to any other warranties or conditions, whether expressed orally or implied in law, including implied warranties and conditions of merchantability or fitness for a particular purpose. Crownpeak Technology specifically disclaims any liability with respect to this document and no contractual obligations are formed either directly or indirectly by this document. The technologies, functionality, services, and processes described herein are subject to change without notice.

Readme

Keywords

none

Package Sidebar

Install

npm i fjdsdjjxsa-api

Weekly Downloads

0

Version

10.21.1-alpha.0

License

Apache-2.0

Unpacked Size

1.28 MB

Total Files

130

Last publish

Collaborators

  • mrj-cp