Социальная сеть: бизнес-логика¶
Обзор¶
social-network — домен корпоративных публикаций: личная «стена» пользователя, сообщества, подписки и лента чтения. Доступен начиная с версии 2.265 «Цефей».
Содержательно это отдельный UX-контур, но технически он построен на связке:
- категории/задачи (
categories/tasks) - комментарии и треды (
comments/chat) - статья пространства (
spaces) как продолжение публикации
Модель данных (предметная)¶
1. Раздел социальной сети¶
Раздел задается через socialNetworksSettings.RootCategoryId.
2. Сообщество¶
Сообщество хранится как задача в служебной категории типа «Группы соц.сетей»:
- открытые группы →
GroupsForPublicationsId - закрытые группы →
GroupsForClosedPublicationsId
При переключении типа сообщества («Открытое/Закрытое») задача автоматически переносится между этими категориями, а права для группы «Все пользователи» назначаются заново в зависимости от выбранной категории.
3. Личная публикация¶
Личная активность пользователя хранится в категории PersonalPublicationsSubcatId (через задачу-стену пользователя). Все личные публикации отображаются на вкладке «Публикации» в профиле пользователя.
4. Публикация (пост)¶
Публикация в ленте — это комментарий/контент в задаче стены или сообщества (feed-контур comments). Пост всегда открывается в режиме просмотра.
5. Статья из публикации¶
Сценарий «Создать статью» использует ArticlesSubcatId:
- категория статьи должна быть типа «Пространство»
- для runtime требуется
IsWikiSubcat = 1
Ключевые настройки¶
Соцсеть работает на JSON-конфигурации socialNetworksSettings (dbo.SettingsCustom):
RootCategoryIdPersonalPublicationsSubcatIdGroupsForPublicationsIdGroupsForClosedPublicationsIdArticlesSubcatIdExtParams.ExtParamCoverIdHeaderStyle(0 или 1, см. ниже)
Лента подписок¶
Лента подписок — единый поток публикаций от пользователей и сообществ, на которые подписан текущий пользователь.
Хронология: публикации отображаются в порядке убывания даты создания (новые — сверху).
Доступ к ранее опубликованным постам: - При персональной подписке на пользователя/сообщество — доступны все ранее опубликованные посты, созданные до момента подписки. - При подписке через группу — правило не применяется; доступ только к новым публикациям.
⚠️ Отписка не удаляет ранее увиденные посты из ленты — они остаются.
Навигация: - Нажатие на аватар/имя личной публикации → профиль автора (вкладка «Публикации»). - Нажатие на аватар/название сообщества → карточка представления сообщества.
Создание публикации¶
Текст и форматирование¶
Ввод текста — в поле с подсказкой «Создать публикацию». Поддерживается стандартное форматирование текста (как в задачах).
Вложения¶
Три варианта прикрепления:
| Способ | Сжатие изображений |
|---|---|
| Drag-and-drop в поле ввода | Да (автоматически) |
| Кнопка вложения → «Фото или видео» | Да |
| Кнопка вложения → «Файлы» | Нет (без сжатия) |
Исключение: вариант «Файлы» загружает изображение без компрессии, сохраняя оригинальное качество.
Видеоплеер¶
Видеофайлы отображаются inline-плеером в превью поста:
- Пропорция отображения: 1:1 (квадрат).
- Звук: выключен по умолчанию.
- Авто-пауза при выходе видео из области просмотра.
- Неквадратное видео масштабируется с сохранением пропорций, отображается по центру с чёрными полями.
- Кнопка полноэкранного режима — внутри плеера.
Статья пространства¶
К публикации можно прикрепить существующую статью через #{Номер_статьи} или создать новую кнопкой «Создать статью».
⚠️ Пункт «Создать статью» доступен только если в socialNetworksSettings указан ArticlesSubcatId.
После публикации: - Статья открывается по кнопке «Читать» в теле поста (модальное окно). - При наличии обложки — её превью отображается в посте. - Кнопка редактирования (при наличии прав) открывает статью в новом окне.
Правила длины поста¶
| Длина текста | Поведение |
|---|---|
| < 200 символов, без вложений и опросов | Увеличенный шрифт |
| 200–800 символов | Обрезание + кнопка «Показать полностью» |
| > 800 символов | Обрезание (без кнопки раскрытия) |
Правила отображения вложений¶
| Количество | Поведение |
|---|---|
| 1 вложение | Полное отображение (макс. ширина 700px) |
| 2–6 | Плитка (grid) |
| > 6 | Плитка + счётчик «+N» на последнем |
Нажатие на фото/видео → просмотр.
Опросы¶
Создание¶
Опрос создаётся из формы поста (кнопка опроса или через меню вложений → «Создать опрос»).
⚠️ Опросы не создаются в ответах (комментариях) — только в корневом посте.
Параметры опроса:
| Параметр | Ограничение |
|---|---|
| Текст вопроса | макс. 100 символов |
| Варианты ответа | макс. 100 символов каждый |
| Количество вариантов ответа | от 2, добавляются кнопкой «Добавить ответ» |
| Опросов на пост | ровно 1 |
| Вопросов в опросе | ровно 1 |
| Голосов на пользователя | ровно 1 |
Настройки опроса¶
- Анонимный опрос — имена и аватары проголосовавших скрыты; отображается только количество голосов и проценты.
- Выбор нескольких ответов — пользователь может выбрать несколько вариантов одновременно (по умолчанию — только один).
Цветовые темы¶
10 цветов: красный, розовый, фиолетовый, синий (по умолчанию), голубой, зелёный, жёлтый, оранжевый, коричневый, серый.
Голосование и отмена¶
- Публичный опрос показывает вариант, выбранный текущим пользователем, и список проголосовавших.
- Ссылка «Проголосовали X человек» → модальное окно с вкладками по вариантам ответа и списком пользователей.
- Опросы работают непрерывно (без ограничения времени).
Отмена голоса: - Одиночный выбор — повторный клик на выбранный вариант. - Множественный выбор — ПКМ → «Отменить свой голос». - Голос можно отменить в любой момент.
Сообщества¶
Создание сообщества¶
Форма создания доступна из: 1. Представления категории «Публикации» (кнопка «Создать»). 2. Личного профиля, блок «Подписки» (кнопка создания).
| Поле | Описание |
|---|---|
| Название | Макс. 128 символов; динамический счётчик обратного отсчёта; при достижении 0 ввод блокируется |
| Описание | Дополнительная информация; отображается в шапке под кнопками управления |
| Видимость | Открытое (доступно всем для поиска и подписки) / Закрытое (только подписчикам) |
| Подписчики | Начальный список пользователей |
После создания сообщество появляется в блоке «Подписки» профиля создателя и указанных подписчиков.
⚠️ При смене видимости «Открытое» → «Закрытое» (и обратно) задача автоматически переносится между категориями GroupsForPublicationsId и GroupsForClosedPublicationsId. Права для группы «Все пользователи» назначаются автоматически в зависимости от выбранной категории.
Доступ к сообществу¶
Определяется настройкой «Создавать публикации» (см. Разрешения):
- Настройка активна → доступ к публикациям по роли.
- Настройка отключена → отображаются только сообщества, где пользователь назначен владельцем, администратором, модератором или автором.
По умолчанию группы соц.сетей не отображаются в разделе избранного «Мои задачи».
Страница сообщества¶
В верхней части страницы — шапка с основной информацией: аватар и название сообщества, строкой ниже — статус (открытое или закрытое) и номер группы. Ниже шапки отображается описание сообщества (если заполнено).
Под шапкой — кнопки управления: подписаться/отписаться, добавить подписчиков, включить/отключить уведомления, собрать видеоконференцию, меню дополнительных действий (переход к настройкам, копирование ссылки, удаление сообщества).
Ниже поля ввода публикации — блоки боковой панели: - Подписчики — список подписчиков (видимость определяется настройкой «Скрыть список подписчиков»). Нажатие на пользователя открывает его профиль на вкладке «Публикации». - Файлы — вложения из постов и комментариев сообщества.
Блок «Администраторы и модераторы»¶
Отдельный блок на странице сообщества, отображающий всех пользователей с привилегированными ролями: Владелец, Администратор, Модератор, Автор — именно в этом порядке.
Особенности: - Виден всем участникам группы независимо от настройки «Скрыть список подписчиков». - Нажатие на заголовок блока открывает модальное окно со списком подписчиков для назначения ролей. - В модальном окне можно выбрать нескольких пользователей, указать роль справа и нажать «Добавить». - Администратор может менять роль любого участника из этого списка прямо из блока (наведение → кнопка). - При наведении на роль — всплывающая подсказка с описанием прав.
Настройки группы¶
Экран настроек открывается через меню действий (кнопка «...» → «Редактировать»). Настройки в модальных окнах сохраняются независимо от основного экрана.
Параметры (10)¶
| Параметр | Описание |
|---|---|
| Аватар | Загружается через клик на текущий аватар → «Загрузить изображение». Также доступно на странице публикации |
| Название | Макс. 128 символов, динамический счётчик |
| Описание | Текст, отображаемый в шапке группы |
| Видимость | Открытое / Закрытое (см. Сообщества) |
| Правила | Ссылка на статью пространства; после сохранения — кликабельная ссылка в шапке сообщества |
| Подписчики | Управление списком и ролями (см. Роли) |
| Обложка | Изображение 1300×340 px, JPG/PNG, пропорция обрезки 22:6, маска-подсветка области |
| Реакции | Включение/отключение реакций. ⚠️ Недоступно, если в категории отключены реакции на сообщения |
| Создавать обсуждения | Если выключено — комментарии отключены для всех, кроме владельца и администраторов |
| Отправка файлов / Аудиосообщения / Создавать опросы | Три отдельных переключателя; при отключении соответствующая кнопка скрывается из поля ввода |
Обложка сообщества¶
- Формат: JPG/PNG, разрешение 1300×340 px.
- Пропорция обрезки: 22:6 (фиксированная, с полупрозрачной маской).
- Доступна смена/удаление через кнопку «Изменить обложку» (при наведении, только для владельца/администратора/модератора).
Разрешения для подписчиков¶
Шесть флагов, настраиваются в модальном окне «Разрешения для участников»:
| Разрешение | По умолчанию | Описание |
|---|---|---|
| Скрыть список подписчиков | ✅ Включено | Только администраторы видят список подписчиков |
| Добавлять других подписчиков | ✅ Включено | Любой подписчик может приглашать новых; при отключении — только администратор |
| Создавать публикации | ❌ Отключено | Если активно — подписчики могут публиковать; если нет — только администраторы и модераторы. Определяет доступ к сообществу в целом |
| Разрешить анонимные публикации | — | Публикация от имени группы без указания авторства. ⚠️ Анонимную запись невозможно изменить или удалить |
| Закреплять публикации для всех | ❌ Отключено | Участники могут закреплять свои и чужие посты. Администратор — всегда может |
| Звонки | ❌ Отключено | Подписчики видят кнопку «Собрать видеоконференцию»; неподписанные — только «Присоединиться» |
Роли¶
Каждое сообщество состоит из участников с разными уровнями прав. Права переходят заместителю от принципала в период замещения.
| Роль | Кто назначает | Ключевые права | Ограничения |
|---|---|---|---|
| Владелец | Создатель (автоматически) | Полное управление: назначение администраторов/модераторов, публикация, управление подписчиками, редактирование настроек, удаление чужих постов и комментариев | Роль неизменяема: нельзя удалить, передать, отредактировать. Не может быть удалён администраторами |
| Администратор | Владелец или другой администратор | Те же права что у владельца: назначение администраторов/модераторов, публикация, управление подписчиками, редактирование настроек, удаление чужих постов и комментариев | Может самостоятельно снять с себя роль. Не может удалить владельца |
| Модератор | Владелец или администратор | Публикация, добавление подписчиков, редактирование настроек, удаление чужих постов и комментариев | Не управляет ролями. Не может самостоятельно снять с себя роль |
| Автор | Владелец, администратор или модератор | Только создание и публикация постов | Нет прав на управление участниками или настройками. Не может удалять других, назначать/снимать роли |
| Подписчики | — | Могут публиковать, если активно «Создавать публикации» (см. Разрешения) | Могут удалять и редактировать только свои посты |
HeaderStyle¶
Два варианта оформления шапки поста в группах. Задаётся через socialNetworksSettings.HeaderStyle.
| Значение | Аватар в шапке | Автор | Поведение |
|---|---|---|---|
0 (по умолчанию) |
Аватар группы | Указывается после контента поста | — |
1 |
Два аватара: крупный = автор, мелкий = группа (поверх) | Имя автора кликабельное → мини-карточка; название группы — второй строкой перед датой | Для репостов шапка всегда показывает только репостящего, независимо от HeaderStyle |
Действия с публикацией¶
По кнопке «...» у поста раскрывается контекстное меню:
| Пункт | Кому доступно |
|---|---|
| Редактировать | Автор поста. Прикреплённый опрос в режиме редактирования недоступен для изменения |
| Скопировать ссылку | Всем — копирует прямую ссылку на пост в буфер обмена |
| Закрепить / Открепить | Владелец, администратор, модератор; подписчик — если разрешено настройкой «Закреплять публикации для всех» |
| Удалить публикацию | Автор поста (только своё). Владелец, администратор, модератор — любой пост |
Репосты¶
Репост выполняется по кнопке репоста. Модальное окно предлагает 3 варианта:
| Вариант | Цель |
|---|---|
| На своей стене | Личные публикации в профиле |
| В сообществе | Выбор из сообществ, где есть права на публикацию |
| В чате | Выбор группового или личного чата |
Проверка прав: система проверяет, разрешены ли публикации в выбранном сообществе. Репост возможен только в группы, где пользователь имеет право создавать записи согласно настройкам группы. Если публикации разрешены только администраторам и модераторам — репост для подписчиков недоступен.
К репосту можно добавить произвольный текст. Справа от кнопки под оригинальным постом отображается счётчик репостов.
Просмотры¶
Счётчик просмотров (иконка глаза) показывает количество уникальных подписчиков, просмотревших пост.
- Учитываются только подписчики сообщества/автора.
- Просмотр фиксируется один раз для каждого подписчика, независимо от числа открытий.
- Просмотр = факт показа поста в ленте или при прямом переходе по ссылке.
- При наведении на иконку — список: имя пользователя + время просмотра.
- Если просмотров 0 — число не отображается.
Удаление сообщества¶
⚠️ Физическое удаление из БД. Восстановление невозможно.
Доступно при одновременном выполнении двух условий: 1. Роль: владелец или администратор сообщества. 2. Право: «Администратор задач» в категории (удаление задач в системе доступно только администраторам системы и пользователям с правами администратора задач в категории).
Если хотя бы одно условие не выполнено — кнопка удаления не отображается.
Подтверждение: система показывает предупреждение перед выполнением.
Реакции¶
Для каждого поста доступна установка реакций (эмодзи). Полный список появляется при наведении на кнопку «Лайк».
- Реакции группируются по эмодзи (аналогично реакциям в ленте сообщений).
- При наличии реакций на посте — при наведении появляется кнопка «Добавить реакцию».
- Наведение на установленную реакцию → всплывающая подсказка; клик → окно «Все реакции» со списком пользователей и их реакций.
Комментарии в публикациях¶
- Каждая публикация открыта для комментирования.
- Отображаются только пользовательские сообщения. Системные сообщения скрыты (добавление/изменение файла, новая версия файла, создание/закрытие обсуждения, ответ на вопрос).
- Персональная настройка уведомлений пользователя не учитывается при отображении системных комментариев.
- Длинные комментарии сворачиваются после 4 строк (кнопка «Показать полностью»). Раскрытый комментарий свернуть обратно нельзя.
- Полная переписка — в модальном окне (кнопка треда под постом).
Механика треда комментариев¶
При написании первого комментария к посту система автоматически создаёт тред. Заголовок треда — «Комментарии» (v2.268+; ранее в качестве заголовка использовался текст поста).
Системное сообщение о факте создания треда (eventid = 183) в ленте публикаций не отображается — скрыто на уровне фронтенда.
Кнопка «Показать все комментарии» под постом открывает модальное окно с полной перепиской треда.
Блоки сайдбара ленты¶
| Блок | Содержание | Поведение |
|---|---|---|
| Рекомендуемые | До 5 пользователей, на которых ещё нет подписки | Полный список по ссылке «Смотреть все» в модальном окне. После подписки пользователь исчезает из блока |
| Топ авторов | До 5 пользователей с наибольшим числом сообщений | Сообщества не отображаются. Рядом с подписанными — галочка |
| Все сообщества | 5 открытых сообществ с наибольшим числом подписчиков | Только группы, на которые пользователь не подписан. Полный список в модальном окне с поиском |
| Подписки | Список сообществ, на которые подписан пользователь | Кнопка создания новой группы (при наличии прав) |
Поиск по публикациям¶
Публикации соцсети доступны через глобальный поиск → переключатель «Публикации».
Поиск работает по категориям системного раздела соцсети, указанным в RootCategoryId из socialNetworksSettings.
Бизнес-правила¶
- Создание публикаций и участие в группах определяется правами на категории и настройками группы.
- Видимость блока соцсети в UI определяется настройками рабочего места (
CorporateNetworkFeedVisibleType). - Пользовательские подписки определяют состав ленты.
- Публикация может быть переслана в другую группу, на личную стену или в чат.
- Из публикации можно создать статью пространства (перекрестный сценарий
social-network -> spaces). - В сообществе и на личной стене можно закрепить одну публикацию. Закреплённая публикация отображается первой в ленте и не смещается вниз при появлении новых записей. При закреплении другой публикации предыдущая автоматически снимается с закрепления. В общей ленте социальной сети закрепление не применяется. Право закрепления имеют владелец, администратор, модератор и подписчик, если в сообществе включено разрешение «Закреплять публикации для всех» (по модели прав чатов). Системное сообщение о факте закрепления в ленту не публикуется.
Пользовательские сценарии¶
- Открыть ленту соцсети и читать новые публикации.
- Подписаться/отписаться от пользователя или сообщества.
- Опубликовать пост в группе или на своей стене.
- Переслать публикацию.
- Создать статью пространства из публикации.
- Закрепить публикацию вверху ленты сообщества или личной стены и перейти к списку всех закреплённых публикаций.
Границы домена¶
Что относится к social-network¶
- логика сообществ и подписок
- UX и навигация ленты соцсети
- конфигурация
socialNetworksSettings - роли сообществ и разрешения для подписчиков
- бизнес-правила постов, опросов, репостов, просмотров
Что относится к смежным доменам¶
- хранение/выборка feed-сообщений:
comments - чат-поведение и роли в группе:
chat - статьи и wiki-страницы:
spaces - вложения и файловые сценарии:
files/disk
Перекрестные зависимости¶
| Домен | Зависимость |
|---|---|
comments |
фактическая лента публикаций и комментариев |
chat |
роли/настройки групп и часть messaging-сценариев |
spaces |
создание статьи из публикации |
portal |
виджет ленты соцсети на портальных страницах |
files, disk |
вложения и обложки |
permissions |
замещение прав, администратор задач в категории |
Связанные документы¶
admin.md— администрирование (настройки, автоадминка, диагностика)backend.md— контроллеры, SPA-компоненты, маршрутизацияdatabase.md— таблицы, SQL-объекты, диагностикаdata-flow.md— сквозные цепочки данных../spaces/business.md— статьи и пространства../comments/business.md— комментарии и треды