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