npm package: @simpleview/camber-client
Description: Client for communicating with camber
Author: Colin Booen
Latest version: 1.0.6

# camber-client

Client for communication with the `camber` GraphQL system.

It is build in TypeScript and has one peer dependency of `@simpleview/sv-graphql-client`.

## OS Support

The expectation is that this application will be installed in Linux using [sv-kubernetes](https://github.com/simpleviewinc/sv-kubernetes/).

## Prerequisites

* [sv-graphql-client](https://github.com/simpleviewinc/sv-graphql-client/)

## Install

Using npm:
```bash
npm install @simpleview/camber-client
```

Using yarn:
```bash
yarn install @simpleview/camber-client
```

## Update

To update to the latest version, rerun the install command.

## Authentication Requirements

Interactions with `camber` require authentication as a Simpleview user.

Use a Google Service Account when interacting with the service on behalf of a product.

```js
const { AuthPrefix } = require("@simpleview/sv-auth-client");
const { GraphServer } = require("@simpleview/sv-graphql-client");

async function serviceAccountToken() {
	const service_account = JSON.parse(SERVICE_ACCOUNT_JSON);

	const { auth } = new GraphServer({
		graphUrl: AUTH_GRAPHQL_URL,
		prefixes: [AuthPrefix]
	});

	// authorize the service_account return the token
	const { token } = await auth.login_service_account({
		input: {
			email: service_account.client_email,
			private_key: service_account.private_key
		},
		fields: `
			success
			token
		`
	});

	return token;
}
```

The `token` should be added to the `context` for each function call.

## Implementation & Usage

To see the input parameters and output fields of an endpoint, view the Schema in the GraphQL Explorer at https://graphql.simpleviewinc.com/ for the corresponding GraphQL query.

## CamberPrefix

`CamberPrefix` can be loaded into the `sv-graphql-client` `GraphServer` to use as a client library for accessing `camber` in GraphQL.

JavaScript:
```js
const { CamberPrefix } = require("@simpleview/camber-client");
const { GraphServer } = require("@simpleview/sv-graphql-client");

module.exports = new GraphServer({ graphUrl: GRAPHQL_URL, prefixes: [CamberPrefix] });
```

TypeScript:
```ts
import { CamberPrefix } from "@simpleview/camber-client";
import { GraphServer } from "@simpleview/sv-graphql-client";

export default new GraphServer({ graphUrl: GRAPHQL_URL, prefixes: [CamberPrefix] });
```

Where you are making server requests:

JavaScript:
```js
const { camber } = require("./camberGraphServer");
```

TypeScript:
```ts
import { camber } from "./camberGraphServer";
```

### CamberPrefix.accounts

This method wraps the `camber.accounts` GraphQL query.

```js
const result = camber.accounts({
	fields: `
		docs {
			acct_id
			label
			name
			external_id
			logo_url
			sendgrid {
				api_key
				transaction_pool
				marketing_pool
			}
			cloudinary {
				cloud_name
				api_key
				api_secret
				asset_folder
			}
			timezone
			mfa_required
			created
			updated
		}
		count
	`,
	context: {
		token // from serviceAccountToken call
	}
});
```

### CamberPrefix.feature_sets_upsert

This method wraps the `camber.feature_sets_upsert` GraphQL mutation.

```js
const result = camber.feature_sets_upsert({
	fields: "success message",
	input: {
		product_key: "APEX",
		groups: [
			{
				key: "MODULES",
				features: [
					{
						key: "ACCOUNTS",
						name: "Accounts"
					},
					{
						key: "CONTACTS",
						name: "Contacts"
					}
				]
			},
			{
				key: "INTEGRATIONS",
				features: [
					{
						key: "ACTON",
						name: "Act-On"
					},
					{
						key: "ZAPIER",
						name: "Zapier"
					}
				]
			},
			{
				key: "PLUGINS",
				features: [
					{
						key: "PLUGINONE",
						name: "Plugin One"
					}
				]
			},
			{
				key: "ADDONS",
				features: [
					{
						key: "ADDONONE",
						name: "Addon One"
					}
				]
			}
		]
	}
	context: {
		token // from serviceAccountToken call
	}
});
```

### CamberPrefix.products

This method wraps the `camber.products` GraphQL query.

```js
const result = camber.products({
	fields: `
		docs {
			key
			name
			description
		}
		count
	`,
	context: {
		token // from serviceAccountToken call
	}
});
```

## Related Documentation

* [sv-graphql-client](https://github.com/simpleviewinc/sv-graphql-client/)
* [camber](https://github.com/simpleviewinc/camber/)

## Troubleshooting

For any assistance please reach out on the [Microservices Support](https://teams.microsoft.com/l/channel/19%3A78cf02f015c543748f2488a4742290f1%40thread.tacv2/Microservices%20Support?groupId=42dd24e6-f6ae-4520-9092-cc21b3b3b730&tenantId=cc1eb3c2-fc0c-4a83-8e6a-8d886b4faeab) Teams channel.