# Apolitical SDK

Browser library to interact with Apolitical's APIs

## Requirements

Requires the following to run:

- [node.js][node] 16.13.0+
- [yarn][yarn]

[node]: https://nodejs.org/en/download/
[yarn]: https://classic.yarnpkg.com/en/docs/install

## Installation

Install with `yarn`:

```sh
yarn add @apolitical/sdk
```

## Available Scripts

In the project directory, you can run:

### `yarn test`

Runs the test (and the interactive mode can be enabled with `--watchAll`).

### `yarn build`

Builds the library for production to the `build` folder.
It correctly bundles the code on production mode and optimizes the build for the best performance.

## Usage

The recommended way to use `@apolitical/sdk` is to load the SDK first:

```js
const loadSdk = require('@apolitical/sdk');

const sdk = loadSdk({
  origin: window.origin || window.location.origin,
  errorsContext: {
    apiKey: decodeBase64(process.env.REACT_APP_GCP_ERRORS_API_KEY),
    serviceName: 'some-service',
  },
});
```

And then, you can use all the functionality provided by the SDK. For example:

```js
sdk.people.users.read('me').then((result) => {
  console.info('User:', result);
});
```

## Folders & files structure

Here's the library's folders structure:

```
/lib
  /apis
    /api-1
      /resources
      /handlers
  /contentful
    /content-type-1
  /helpers
  /solvers
```

### APIs folder

Under `/lib/apis/` we implement functionality to directly interact with the Apolitical APIs.

Each API will have its own folder, for example, `/lib/apis/people/` for People API.

Inside the API folder itself, there are two other folders
- `/lib/apis/people/resources`: The resources folder holds each RESTful resource on the API and implements CRUD operations
- `/lib/apis/people/handlers`: The handlers folder holds functions that require calling the same API more than one time (or in some particular way that cannot be done by using the CRUD operations)

### Contentful folder

Under `/lib/contentful/` we implement functionality to interact with Contentful Delivery (and Preview) API.

Each content type will have it's own folder, for example, `/lib/contentful/questions/` for the Q&A Question content type.

Internally, the functionality will be implemented with the help of the `@apolitical/content` module.

### Helpers folder

Under `/lib/helpers/` we implement reusable functionality that helps implementing internal logic within the SDK.

### Solvers folder

Under `/lib/solvers/` we implement high level functionality based on the functionality provided by internal APIs and Contentful.

For example, the `buildQuestion.js` is a function that reads a question from Contentful, and then, read the author data from the People API.
