2022-10-12 11:28:00 +00:00
# Settings Manager
Settings managers are used to persist configuration data like API keys, preferences, etc..
## `SettingsValue` interface
Entries in the manager are stored using structure:
```
key: string;
value: string;
domain?: string;
```
2023-05-21 16:42:35 +00:00
## `DeleteMetadataArg` interface
Argument that can be used to remove metadata via `manager.delete()` method
It contains key and domain:
```typescript
type DeleteMetadataArg = {
key: string;
domain: string;
};
```
2022-10-12 11:28:00 +00:00
For values which should not be migrated during environment cloning (as private keys to payment provider), developer should use domain field to bind it to particular store instance.
## Available methods
- `get: (key: string, domain?: string) => Promise<string | undefined>`
- `set: (settings: SettingsValue[] | SettingsValue) => Promise<void>`
2023-05-21 16:42:35 +00:00
- `delete: (args: string | string[] | DeleteMetadataArg | DeleteMetadataArg[]) => Promise<void>`
Warning: delete method can throw, if instance of SettingsManager was not configured with proper mutation in constructor.
2022-10-12 11:28:00 +00:00
# MetadataManager
Default manager used by app template. Use app metadata as storage. Since app developer can use any GraphQL client, constructor must be parametrized with fetch and mutate functions:
```ts
import { MetadataEntry } from "@saleor/app-sdk/settings-manager";
import { Client } from "urql";
import {
FetchAppDetailsDocument,
FetchAppDetailsQuery,
UpdateAppMetadataDocument,
2023-05-21 16:42:35 +00:00
DeleteMetadataDocument,
2022-10-12 11:28:00 +00:00
} from "../generated/graphql";
export async function fetchAllMetadata(client: Client): Promise< MetadataEntry [ ] > {
const { error, data } = await client
.query< FetchAppDetailsQuery > (FetchAppDetailsDocument, {})
.toPromise();
return data?.app?.privateMetadata.map((md) => ({ key: md.key, value: md.value })) || [];
}
export async function mutateMetadata(client: Client, metadata: MetadataEntry[]) {
const { error: mutationError, data: mutationData } = await client
.mutation(UpdateAppMetadataDocument, {
id: appId,
input: metadata,
})
.toPromise();
return (
mutationData?.updatePrivateMetadata?.item?.privateMetadata.map((md) => ({
key: md.key,
value: md.value,
})) || []
);
}
2023-05-21 16:42:35 +00:00
export async function deleteMetadata(client: Client, keys: string[]) {
return client.mutation(DeleteMetadataDocument, { keys }).toPromise();
}
2022-10-12 11:28:00 +00:00
```
And create MetadataManager instance:
```ts
const settings = new MetadataManager({
fetchMetadata: () => fetchAllMetadata(client),
mutateMetadata: (md) => mutateMetadata(client, md),
2023-05-21 16:42:35 +00:00
deleteMetadata: (keys) => deleteMetadata(client, keys),
2022-10-12 11:28:00 +00:00
});
```
2023-01-23 14:39:42 +00:00
# EncryptedMetadataManager
This manager encrypts add the layer of encryption for all the stored data.
To operate correctly, the encryption key needs to be passed to the constructor:
```ts
new EncryptedMetadataManager({
encryptionKey: process.env.SECRET_KEY, // secrets should be saved in the environment variables, never in the source code
fetchMetadata: () => fetchAllMetadata(client),
mutateMetadata: (metadata) => mutateMetadata(client, metadata),
2023-05-21 16:42:35 +00:00
deleteMetadata: (keys) => deleteMetadata(client, keys),
2023-01-23 14:39:42 +00:00
});
```
> **Warning**
> If encryption key won't be passed, the application will exit.