1. Architecture Decision Records
Platform API
  • Введение
  • 00-Templates
  • 01-Documentation
    • API Style Guide
    • Breaking Changes
    • API versioning folder structure
    • Proposals
      • Предложение - Разделение ответственности: `sourceA -> sourceB?ids=...`
    • Architecture Decision Records
      • Формат Response Data
      • Переиспользование ресурсов в микросервисной архитектуре
  • Devices
    • Зарегистрировать устройство
      POST
  • Authentication
    • Получить токен пользователя
      POST
    • Регистрация нового пользователя
      POST
  • Advertising
    • Реклама
  • User (Profile, Levels, Gifts, Awards, Feedbacks, Following)
    • Profile
      • Birthday Greeting
        • Получить поздравление с днем рождения
        • Отметить поздравление с днем рождения как просмотренное
      • Email
        • Сменить почту
        • Подтвердить смену почты по токену
        • Подтвердить почту
        • Подтвердить почту по токену
    • Level Stages
      • Документация
      • Получить список всех стадий
      • Получить данные о текущей стадии пользователя
      • Получить данные о стадии по ID
    • Gifts
      • Документация
      • Получить список всех подарков
      • Получить список всех категорий подарков
      • Получить данные об одном подарке по ID
      • Пометить подарок как полученный
    • Awards
      • Получить награды пользователя
    • Follow
      • Подписывает текущего пользователя на указанный профиль
      • Получение подписчиков пользователя
      • Получение списка подписок
      • Удаляет подписчика пользователя
    • Получить данные о текущем пользователе
      GET
    • Получить публичный профиль пользователя по ID
      GET
    • Удалиться
      POST
  • Samagonka | Sprint | Summarace | Knowledge Sprint
    • Получить саммагонку на текущую неделю
      GET
    • Получить календарь саммагонки
      GET
    • Получить статистику по спринту
      GET
    • Получить Топ пользователей по саммагонке
      GET
    • Получить рейтинг по сданным экзаменам
      GET
    • Получить историю рейтинга экзаменов
      GET
    • Получить топ 20 курсов
      GET
  • Categories
    • 2025-08-01 / Иконки категорий
    • Получить список категорий
  • Subscription
    • v5
      • Получить статус подписки
  • Combo Summary
    • Моё
      • Получить список избранных комбо-саммари
      • Получить список начатых комбо-саммари
      • Получить список пройденных комбо-саммари
      • Изменить состояние избранного для комбо-саммари по ID
    • Получить список комбо-саммари
    • Получить комбо-саммари по ID
    • Получить диплом для комбо-саммари по ID
    • Получить список комбо-саммари в которые входит саммари по ID саммари
    • Сгенерировать диплом для комбо-саммари по ID
  • Courses | Summary | Lectures
    • v5
      • Получить случайный саммари
      • Скачать видео из курса
      • Получить список качеств видео из курса
      • Получить список общие качества всех видео из курса
    • v3
      • Моё
        • Получить список просмотренных саммари (Начатые, Пройденные)
      • Получить список саммари
    • unspecified
      • Получить саммари по ID
  • Compilations
    • v3
      • Получить подборки
  • Bookmarks
    • v3
      • Создать закладку в лекции
    • v5
      • Создать закладки в лекции
  • Notifications
    • Получить список уведомлений
    • Получить количество непрочитанных уведомлений
  • Feedbacks
    • Получить мнения для саммари по ID
    • Получить все мнения текущего пользователя
    • Получить все мнения пользователя по User ID
    • Получить комментарии к мнению по ID
    • Получить список мнений для "Сейчас обсуждают"
    • Получить мнение по ID
    • Получить список мнений пользователя
  • Achievements
    • Получить достижение по ID
    • Получить список достижений
    • Установить saluted на true
  • Lecturers
    • Получить список лекторов
    • Получить лектора по ID
  • Tests/Games/Quizzes/Exams
    • Введение
    • Quizzes
      • v5
        • Bookmark Templates
          • Получить шаблон для создания закладки по ID квиза и ID вопроса
      • Получить данные по квизу по ID
      • Получить результат квиза по ID
    • Plays
      • Начать квиз для данного пользователя
      • Получить вопрос теста по ID
      • Завершить текущий квиз
      • Отправить ответ на вопрос
      • [Deprecated] Начать квиз для данного пользователя - V3
    • In-Player Quiz
      • v5
        • In-Player Quiz: описание модуля
        • Get In-Player Quiz questions
        • Complete In-Player Quiz Question
  • Playlist
    • v5
      • Документация
      • Summary
        • Получить начальную пагинацию плейлиста саммари.
        • Получить следующую пагинацию плейлиста саммари.
        • Получить информацию о видео из плейлиста.
      • Favorites
        • Получить начальную пагинацию плейлиста избранного.
        • Получить cледующую пагинацию плейлиста избранного.
  • Subscription Certificates
    • Инфа о сетификате
    • Создать подарочный сертификат
    • Получение сертификатов пользователя
    • Активировать сертификат
  • Orders
  • Rating
    • Бусты
    • v5
      • Получить модификаторы для баллов
      • Получить активный буст баллов
    • unspecified
      • Получить топ-100 пользователей рейтинга
      • Получить историю рейтингов
      • Переключает флаг пользователя на отображение топа предыдущего месяца
  • In-Design
    • Messaging
      • Введение
      • Триггеры
      • Сегментация
      • Способы доставки
      • Представление и Виджеты
  • Success-Story
    • Получить историю успеха
  • Intensives
    • Получить все интенсивы
  • Mascot
    • Получить текущий статус маскота
    • Получить прогресс пользователя по текущему статусу маскота
    • Получить все статусы маскота
    • Получить скиллы маскота
    • Получить модификаторы по скиллам маскота
    • Получить график статистики по скиллам маскота
    • Получить скилл, который относится к заданной категории.
  • Animations
    • Получить анимации
    • Получить анимацию по ID
  • Quiz-Card
    • Получить квиз карточки по id саммари или slug для текущего клиента
    • Получить группы квиз карточек по саммари пользователя доступные на текущую дату
    • Отвязать(удалить) выбранные карточки из групп карточек пользователя
  • Files
    • Загрузить файл
  • Mini-Tasks
    • Получить мини-задания
  • Live Activity
    • Зарегистрировать токен LA за пользователем
  • Recommendations
    • AI Рекомендации
    • Получить AI рекомендации
  • Timecodes
    • Получить список аннотаций для лекции/видео
  • Archetypes
    • Эпохи
    • Персонажи
    • Навыки
    • Notifications
      • Получить список уведомлений от Маскота
      • Получить кол-во уведомлений от Маскота
      • Отметить уведомления от Маскота просмотренными
    • Skills
      • SkillLevels
        • Запросить генерацию сертификата по уровню навыка
        • Пометить уровень навыка как просмотренный
        • Получить SkillLevel2DTO по ID уровня
        • Получить список SkillLevel1DTO
      • SkillSuperPowers
        • Получить список всех суперспособностей
        • Пометить суперспособность как просмотренную
      • Получить список SkillProgressDTO
      • Получить SkillProfessionDTO по ID навыка
      • Получить лекцию навыка по ID навыка и индексу
      • Получить навык по идентификатору
      • Получить навык по ID категории
    • Characters
      • Получить диалог с персонажом по его ID
      • Получить персонажа по его ID
      • Получить открытых персонажей
      • Обновить персонажа по ID
    • Получить текущую эпоху
  • Schemas
    • Core
      • LanguageText
      • Metadata
      • ApiError
      • File
      • AnimationProperties
      • Metadata2
    • Basic
      • Ranges
        • DateRange
      • GradientV2
      • Gradient
      • Color
    • Resources
      • Courses
        • Course
        • CourseListItem
      • Recommendations
        • RecommendedCourseListItem
    • Schemas
      • Achievements
        • Achievement
      • Animations
        • Animation
        • AnimationListItem
      • Playlist
        • v5
          • Summary
            • Cursor
          • Favorites
            • Cursor
          • Video
      • Subscription
        • SubscriptionInfo
        • UserSubscriptionInfo
      • Lecturers
        • LecturerListItem.Invalid
        • Lecturer
      • ComboSummary
        • ComboSummaryListItem
        • ComboProgressItem
        • ComboSummary
      • Feedbacks
        • Feedback
        • FeedbackComment
        • UserFeedback
        • FeedbackAchievement
        • FeedbackListItem
        • FeedbackDetails
        • FeedbackUser
      • KnowledgeSprint
        • KnowledgeSprintCalendar
        • KnowledgeSprintTopUser
        • KnowledgeSprintStats
      • MiniTasks
        • MiniTask
      • Level System
        • LevelStage
        • GiftCategory
        • Gift
      • User
        • User
        • ActiveUser
        • Award
      • Tests | Quizzes
        • v5
          • In-Player Quiz
            • InPlayerQuiz
            • InPlayerQuizQuestion
            • InPlayerQuizAnswer
            • InPlayerQuizCompletedState
        • QuizInfo
        • QuestionInfo
        • QuizPlay
        • QuizResult
        • QuizFinishState
      • Subscription Certificates
        • Certificate
        • CreateCertificate
      • Rating
        • RatingInfo
        • RatingTopUsers
        • RatingTopUser
        • ActiveBoost
      • SuccessStory
        • SuccessStory
      • Intensive
        • Intensive
      • Notifications
        • NotificationsUnreadCount
        • Notification
      • Archetypes
        • Notifications
          • ArchetypeNotification
        • Skills
          • SkillProgressDTO
          • SkillProfessionDTO
          • SkillCourseItem
          • Superpower
          • SkillLevel1DTO
          • SkillLevel2DTO
          • Skill
        • Characters
          • Character
          • UnlockedCharacters
          • CharacterChat
          • CharacterChatMessageItem
          • NextCharacterProgress
          • CharacterDetails
        • UserSkillLevel
        • Epoch
      • Samagonka_Duplicate
        • SummaraceDay
        • SummaraceDays
        • SummaraceTarget
        • KnowledgeSprintData
        • SummaraceDataUser
        • SummaraceTopInfo
        • TopHistoryData
        • TopCourse
      • Mascot
        • Graph
        • Skills
          • MascotSkillModifiers
          • MaskotSkill
        • Statuses
          • MaskotStatusListItem
          • MascotStatus
          • MascotStatusProgress
        • MascotStats
      • Quiz-Card
        • QuizCard
        • QuizCardGroup
        • QuizCardGroupSummaryInfo
      • Categories
        • Category
    • Timecodes
      • Timecode
    • Bookmark
    • BookmarkTemplate
  1. Architecture Decision Records

Переиспользование ресурсов в микросервисной архитектуре

Контекст#

Система активно развивается, появляются новые сервисы и фичи. При этом во многих сценариях требуется использовать уже существующие сущности — например, карточки курсов, категории, пользователей — в новых контекстах, таких как рекомендации, избранное и история.
Ранее для подобных задач создавались отдельные структуры данных и DTO, что приводило к дублированию, увеличению кода и росту вероятности расхождения в представлении одной и той же сущности в разных частях системы.

Решение#

Было принято использовать подход композиции: переиспользовать существующие сущности в том виде, в котором они возвращаются своим основным сервисом, и при необходимости дополнять их контекстно-зависимыми полями. Это позволяет избежать дублирования и сохранять единообразие структуры данных.
Пример:
GET /recommendations

{
  "data": {
    "items": [
      {
        "reason": "На основе интересов пользователя",
        "course": {
          "id": "course-123",
          "slug": "intro-to-design",
          "title": "Введение в дизайн",
          "description": "Курс о базовых принципах дизайна"
          // остальные поля, как в каталоге
        }
      }
    ]
  }
}
В этом примере:
course — объект, полученный из сервиса курсов
reason — поле, добавленное в контексте рекомендаций
Формирование ответа происходит на стороне сервиса рекомендаций или дополнительного сервиса-контроллера перед API Gateway со стороны бекенда. Данный сервис агрегирует данные: запрашивает идентификаторы курсов, получает их полное описание из сервиса курсов, и добавляет контекстные поля.

API документация#

В рамках единого подхода к переиспользованию сущностей в API мы ввели соглашение об организации схем в каталоге Resources. Каждая сущность описывается в своем доменном сервисе и используется как строительный блок при компоновке более сложных структур.

Структура#

Resources/
  Courses/
    Course           // Полная схема курса для страницы саммари
    CourseListItem   // Упрощенная карточка курса для списков и подборок

  Recommendations/
    RecommendationListItem   // Обертка над CourseListItem с дополнительными полями, такими как причина рекомендации

Принципы#

Каждая схема, описанная в Resources/<Service>, считается "источником истины" для соответствующего типа данных.
При необходимости использовать сущность в другом домене она не копируется, а включается по ссылке.
Ссылочная схема указывает на то, что данные должны быть получены из оригинального сервиса. Например, если Recommendation содержит поле course: CourseListItem, то сервис рекомендаций запрашивает курсы по ID через сервис курсов и вставляет полученные данные.

Пример#

// Recommendation
{
  "type": "object",
  "properties": {
    "reason": { "type": "string" },
    "course": { "$ref": "Courses/CourseListItem" }
  },
  "required": ["reason", "course"]
}

Назначение#

Повышение согласованности между сервисами
Четкое разделение ответственности: каждый сервис отвечает за структуру и наполнение "своих" сущностей
Упрощение поддержки и масштабирования API
Явная композиция без дублирования структур и логики

Последствия#

Повышается согласованность данных между сервисами
Снижается дублирование DTO и бизнес-логики
Упрощается клиентская разработка за счёт единых форматов
Команды могут переиспользовать готовые структуры без риска противоречий
Modified at 2026-07-08 15:19:33
Previous
Формат Response Data
Next
Зарегистрировать устройство
Built with