---
# System prepended metadata

title: tgzerkalo. Техническое решение (TS-1)

---

# tgzerkalo. Техническое решение (TS-1)

[Глоссарий](https://hackmd.io/Y8LZMXzRTd2XheliRLuGaA?both#%D0%93%D0%BB%D0%BE%D1%81%D1%81%D0%B0%D1%80%D0%B8%D0%B9)

## Сущности платформы

### `Channel` --- идентично Каналу Платформы

Доступные операции: list, detail.

[Справка](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1supergroup_full_info.html)

```ts
type Channel {
  id: ChannelId,
  slug: string,
  subscriptionId: SubscriptionId | null,
}
```

Channel не содержит в себе ID'шники постов. Посты можно запросить, сделав list-запрос сущности `Post`.

### `Post` --- идентично Посту Платформы

Одиночный пост в канале.

Сущность не доступна из внешней сети, ей пользуется только фронтенд каналов.

Доступные операции:
- list,
  - `GET /api/v1/Post?channelId=<ChannelId>&limit=10&offset=0`
- detail.

```ts
type Post {
  id: PostId,
  channelId: ChannelId,
}
```

Channel не содержит в себе ID'шники постов. Посты можно запросить, сделав list-запрос сущности `Post`.

## `tgzerkalobackend`

Бекенд обеспечивает:

- надёжное хранение данных для работы Платформы,
- реализует большую часть взаимодействия с Телеграмом по [протоколу MTProto](https://core.telegram.org/mtproto),
  - обеспечивает выгрузку статических файлов на доступное из web хранилище,
- предоставляет быстрый доступ к сохранённым данным для всех остальных компонентов Платформы по RESTful API.

### API бекенда

TODO: ID --- UUID

Публично доступное RESTful API на пути https://api.tgzerkalo.ru/v1/
Все ресурсы доступны из внешней сети через API.

API позволяет получать сущности, известные бекенду, и применять к ним некоторые операции из следующего списка операций:

- list --- `GET /api/v1/<Entity name>` --- выборка списка сущностей, может быть ограничена по количеству query-параметрами `limit` и `offset`, по умолчанию `limit=10`, а `offset=0`.

  структура любого ответа:
  
  ```ts
  {
    ids: [/* Массив ID'шников полученных сущностей */],
    entities: {
      EntityFoo: {
        /* мапа из ID сущностей в их содержимое */
      }
    },
    meta: {
      totalCount: number,
    },
  }
  ```
  
  например, запрос `GET /api/v1/Channel?limit=3&offset=100`:
  
  ```json
  {
    "ids": ["103", "759", "847"],
    "entities": {
      "Channel": {
        "847": { /* ... */ },
        "103": { /* ... */ },
        "759": { /* ... */ }
      },
    },
    "meta": {
      "totalCount": 354
    }
  }
  ```
 
- detail --- `GET /api/v1/<Entity name>/<Entity ID>` выборка одиночной сущности по её ID,
  структура любого ответа:
  
  ```ts
  {
    entities: {
      EntityFoo: {
        /* мапа из ID сущностей в их содержимое */
      }
    }
  }
  ```
  
  например, запрос `GET /api/v1/Post/2947`:
  
  ```json
  {
    "entities": {
      "Post": {
        "2947": { 
          "id": "2947",
          /* ... */
          "channelId": "103"
        },
      },
      "Channel": {
        "103": { /* ... */ }
      }
    }
  }
  ```
- post.

## `tgzerkalofrontend`

Фронтенд каналов, рассказывает всё про tgzerkalo, точка входа в админку каналов и tgzerkalobot, показывает посты.

### Морда

На морде сайта:

1. виден логотип сервиса,
1. перечислены ключевые возможности tgzerkalo,
1. перечислены несколько известных каналов, на которые можно взглянуть уже сейчас:
   - Яндекс,
   - MDK,
   - Profunctor Optics,
   - шитпостеры,
   - Вафин,

### Страница канала

На странице видны:

1. логотип сервиса,
1. контент канала: плиткой или лентой,
1. при прокрутке страницы до конца, появляет

## `tgzerkalobot`

Телеграм-бот [tgzerkalo](https://t.me/tgzerkalobot). Нужен, чтобы подтвердить права на канал, и осуществлять поддержку пользователей.

### Первое знакомство с ботом /start

Бот рассказывает о себе предлагает ссылку на чат поддержки.

### Если передать боту ссылку на канал

Если передать боту ссылку или invite-link, или имя канала, он сразу же в него вступает, и рассказывает, что сделать дальше, чтобы получить в tgzerkalo права на канал.

Кстати в большие каналы нельзя добавлять людей, можно только приглашать их с помощью invite-link:

![](https://i.imgur.com/EvRUtrD.png)

### Если сделать бота админом канала

Если сделать бота админом канала (для этого надо выдать ему любое количество привилегий, например хоть возможность добавлять читателей),

![](https://i.imgur.com/JvmymYa.png)

...то бот смотрит список админов и подтверждает права на канал для всех User'ов-админов канала.

![](https://i.imgur.com/DHLAAOH.png)
