npm package: @simpleview/sv-filestorage-client
Description: Client for communicating with sv-filestorage
Author: Colin Booen
Latest version: 1.11.0

# sv-filestorage-client

Client for communicating with the `sv-filestorage` GraphQL system.

It is built 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/sv-filestorage-client
```

Using yarn:
```bash
yarn install @simpleview/sv-filestorage-client
```

## Update

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

## Authentication Requirements

Interactions with `sv-filestorage` require authentication as a Simpleview user or a user with appropriate filestorage permissions.

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.

## FileStoragePrefix

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

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

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

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

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

Where you are making server requests:

JavaScript:
```js
const { filestorage } = require("./fileStorageGraphServer");
```

TypeScript:
```ts
import { filestorage } from "./fileStorageGraphServer";
```

### FileStoragePrefix.buckets

This method wraps the `filestorage.buckets` GraphQL query.

```js
const result = await filestorage.buckets({
	fields: `
		count
		docs {
			acct_id
			name
			storage_class
			versioning
			maximum_size
		}
	`,
	filter: {
		name: "your_bucket_name"
	},
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.buckets_upsert

This method wraps the `filestorage.buckets_upsert` GraphQL mutation.

```js
const result = await filestorage.buckets_insert({
	input: {
		id: "5c8c37b5df622c0064491fca",
		name: "your_bucket_name",
		storage_class: autoclass,
		versioning: false,
		maximum_size: 10000
	},
	fields: "success message doc { id acct_id name storage_class versioning minimum_size }"
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.buckets_remove

This method wraps the `filestorage.buckets_remove` GraphQL mutation.

```js
const result = await filestorage.buckets_remove({
	input: {
		name: "your_bucket_name"
	},
	fields: "success message",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.clouds

This method wraps the `filestorage.clouds` GraphQL query.

```js
const result = await filestorage.clouds({
	fields: `
		count
		docs {
			acct_id
			usage
		}
	`,
	filter: {
		all_accounts: true
	},
	context: {
		acct_id: "sv-all",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.file

This method wraps the `filestorage.file` Graphql query.

```js
const result = await filestorage.file({
	id: "gcp://bucket_name/61fdc7a5-573d-4e19-865a-500b0e94407a-your_file_name",
	fields: "id acct_id ... on filestorage_file_gcp { content_type generation size created updated deleted last_accessed metadata }"
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files

This method wraps the `filestorage.files` GraphQL query.

```js
const result = await filestorage.files({
	filter: {
		path: "gcp://bucket_name/images/landscape/"
	},
	options: {
		versions: true
	},
	fields: "count docs { id acct_id ... on filestorage_file_gcp { content_type generation size created updated deleted last_accessed metadata } }",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files_upload_start

This method wraps the `filestorage.files_upload_start` GraphQL mutation.

```js
const result = await filestorage.files_upload_start({
	input: {
		name: "gcp://your_bucket_name/your_file_name",
		metadata: {
			property: "value"
		}
	},
	fields: "success message id",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files_upload_update_start

This method wraps the `filestorage.files_upload_update_start` GraphQL mutation.

```js
const result = await filestorage.files_upload_update_start({
	input: {
		id: "gcp://your_bucket_name/415b7682-8941-448a-bece-cca22eb10837-your_file_name",
		metadata: {
			property: "value"
		}
	},
	fields: "success message",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files_upload_chunk

This method wraps the `filestorage.files_upload_chunk` GraphQL mutation.

```js
const result = await filestorage.files_upload_chunk({
	input: {
		id: "gcp://your_bucket_name/61fdc7a5-573d-4e19-865a-500b0e94407a-your_file_name",
		data: "base64EncodedData"
	},
	fields: "success message",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files_upload_end

This method wraps the `filestorage.files_upload_end` GraphQL mutation.

```js
const result = await filestorage.files_upload_end({
	input: {
		id: "gcp://your_bucket_name/61fdc7a5-573d-4e19-865a-500b0e94407a-your_file_name"
	},
	fields: "success message doc { acct_id id metadata created updated }",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
});
```

### FileStoragePrefix.files_remove

This method wraps the `filestorage.files_remove` GraphQL mutation.

```js
const = await filestorage.files_remove({
	input: {
		id: "gcp://your_bucket_name/61fdc7a5-573d-4e19-865a-500b0e94407a-your_file_name"
	},
	fields: "success message",
	context: {
		acct_id: "your_acct_id",
		token // from serviceAccountToken call
	}
})
```

## Related Documentation

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

## Troubleshooting

For any assistance please reach out on the [sv-filestorage](https://simpleview-workspace.slack.com/archives/C04M27CJ4VB) Slack channel.