# 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:

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

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