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

{% 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>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://galactica-games.gitbook.io/integration-sdk/bystryi-start.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
