# Быстрый старт

{% hint style="warning" %}
Полноценная реализация и описание API Reference еще в процессе и требует с нашей стороны доработки, но сигнатуры методов менять не планируется.
{% endhint %}

## Доступы к сервисам

Для подключения доступны production и stage окружения, для начала интеграции стоит использовать данные для stage.

Для получения доступа к окружению необходим специальный токен, который генерируется по запросу. Он используется для первоначального соединения между сервисами, далее авторизация происходит посредством пользовательских токенов.

{% tabs %}
{% tab title="Stage" %}

```
services-stage-mx6hvkth4a-uc.a.run.app
services.stage.galactica.games
```

{% endtab %}

{% tab title="Production" %}

```
services.galactica.games
```

{% endtab %}
{% endtabs %}

## Установить зависимости

В данном руководстве приводятся примеры интеграции для NodeJS и TypeScript.

Для начала работы следует установить пакеты [@protobuf-ts/grpc-transport](https://www.npmjs.com/package/@protobuf-ts/grpc-transport) и [@grpc/grpc-js](https://www.npmjs.com/package/@grpc/grpc-js)

```bash
# Install via NPM
npm install --save @grpc/grpc-js
npm install --save @protobuf-ts/grpc-transport
```

#### Транспорт и авторизация

Для работы с gRPC требуется создать две вспомогательные функции для создания контейнера для передачи команд на удаленный сервис и для авторизации. Необязательно, но повышает удобство использования.

{% code title="transport.ts" lineNumbers="true" %}

```typescript
import { GrpcTransport } from "@protobuf-ts/grpc-transport";
import { RpcOptions } from "@protobuf-ts/runtime-rpc";
import { ChannelCredentials } from "@grpc/grpc-js";

export const getTransport = (): GrpcTransport => {
  const host = process.env.SERVICES_API_URL ?? "";
  return new GrpcTransport({
    host,
    channelCredentials: host.includes('localhost')
      ? ChannelCredentials.createInsecure()
      : ChannelCredentials.createSsl(),
  });
};

export const getAuthorization = (accessToken: string): RpcOptions => {
  return {
    meta: {
      authorization: `Bearer ${accessToken}`
    }
  };
};
```

{% endcode %}

{% hint style="info" %}
Обратите внимание, что в данном примере используется переменная окружения `SERVICES_API_URL`. Если у вас имя данной переменной отличается, необходимо отредактировать пример кода под свои нужды.
{% endhint %}

## Первый запрос

В качестве тестового начального запроса можно использовать запрос к сервису определения местоположения по IP адресу. Он не требует авторизации.

Для начала, стоит скачать сгенерированный клиент для этого сервиса, распаковать и  скопировать в папку `src/services`.

{% file src="<https://2111239196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFvWZCe7rlFqcrwTHdxuB%2Fuploads%2FlHLatkJV0nAlbH3dLwlX%2Fsystem.zip?alt=media&token=5b8d114a-fe84-4063-a994-15c5a17bd62f>" %}
Клиент для сервиса определения местоположения
{% endfile %}

Далее пример использования клиента для вызова необходимых методов у сервиса, в данном случае для получения сведений о текущем местоположении и флага, который сообщает, разрешен доступ или нет.

{% code title="index.ts" lineNumbers="true" %}

```typescript
// Import response type
import { Access } from "./services/system/v1alpha1/restrictions";
// Import service client for connecting to the backend
import { RestrictionsServiceClient } from "./services/system/v1alpha1/restrictions.client";
// Import special helpers for building transport and auth
import { getAuthorization, getTransport } from "./utils/transport";

export const accessChecker = async (): Promise<Access> => {
  // creates service instance using transport as a parameter
  const service = new RestrictionsServiceClient(getTransport());
  
  const access = await service.isAccessAllowed({});
  // in case authorization needed, use the next way of doing request
  // auth token - token, which backend gives for user oprations
  // const access = await service.isAccessAllowed({}, getAuthorization('auth token'));

  return access.response;
}

accessChecker().then((access: Access) => {
  console.log(access);
  // will return similar to
  // { allowed: true, location: { country: 'US', region: 'CA', city: 'Palo Alto' } }
});
```

{% endcode %}

Пример приложения для проверки локации прикреплен ниже в виде архива.

{% file src="<https://2111239196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFvWZCe7rlFqcrwTHdxuB%2Fuploads%2FvTgLY4VCD9DG7cyOMsDM%2Fintegration-sdk-example.zip?alt=media&token=7d33bb89-58e5-4ae1-8623-4a55b5f82153>" %}
