Перейти к основному содержимому

Границы сервисов PIN

Карта 21 bounded contexts, владение данными и интеграционные потоки. Детальные ТЗ — docs/06-services/<context>/; принятые решения — technical-assignment.md.

Context map

Владение данными (source of truth)

КонтекстВладеет (агрегаты)Читает у других
identityCompany, User, Role, Permission, RolePermission, UserRole, scope-назначения; AgentMembership (мульти-членство: несколько активных агентств, active-agency-контекст → tenant_id, self-leave/terminate — ADR-0070/0072)Talent Identity (sync-реплика)
profilePersonalProfile, ContactInfo, Document (шифрованные), RequisiteTemplate, VerificationRequestidentity (UserId), handbook (страны/города — resolve)
chessboardDeveloper, Project, Building, Flat/Lot, Layout, LayoutGroup, Bank, Hotelier, статусы объектовTalent Chessboard (sync), handbook (справочники), crm (смена статуса — событиями)
handbookCountryEntity, RegionEntity, CityEntity, CurrencyEntity, LanguageEntity, HandbookSyncState + snapshot-модели (ACL-реплика Talent Handbook, PostgreSQL-only, не tenanted — ADR-0063)Talent Handbook (sync-реплика)
catalogПроекции витрины, оверрайды отображения, ранжирование, поисковые Elasticsearch-проекции (ADR-0059)chessboard, invest-analytics, rewards, promotion, identity
promotionPromotionPackage, Promotion (полиморфный таргет: проект / объект недвижимости / агент / пост), приоритеты показа, статусы (ADR-0060)chessboard, identity, news (посты-таргеты)
invest-analyticsИстория цен (ClickHouse), эконом-модель (model/lot-type/month), расчётные серииchessboard (объекты), Talent Chessboard (цены)
rewardsScoped + time-bounded ставки (застройщик/проект/группа планировок, удержание ПИН, распределение агентство↔агент, реферальная — ADR-0068), комиссионная политика агентства, начисления/выплаты, гейт получения денег (MoneyReceived — ADR-0067)chessboard (Layout), crm (сделки, участники), identity (членство агента — user-centric метрики)
walletWalletAccountEntity (счета по видам: AgentCommission/ReferralCommission/AgencyCommission + системные PlatformSettlement/PlatformRevenue), LedgerTransactionEntity/LedgerEntryEntity (двойная запись, append-only — ADR-0005/0065); счета user-centric (переживают смену агентства)rewards (проводки: кредиты/дебеты/компенсации), identity (display-реплика холдеров)
referralReferralLink, ReferralRegistration, реферальная связьidentity (регистрация/авторизация)
crmЛид, Заявка на фиксацию, Сделка, Клиент; единая модель участников (Executor — ровно один активный исполнитель; additive CoAgent/Assistant/Lawyer; несколько инвесторов; иммутабельные снапшоты AgencyCompanyId/AgentUserId как атрибуция — ADR-0071); Бронирование, Программа бронирования, Программы покупки, Документы сделки, таймлайнidentity (active-agency → tenant, увольнение агента — ADR-0072), chessboard (объект), profile (реквизиты), referral, calendar (записи на встречу)
calendarCalendarEventEntity (+ EventReminderEntity), AvailabilitySlotEntity, AppointmentEntity; реплики сделок CRM (маршрутизация дедлайнов) и display-данных пользователей (ADR-0064)crm (сделки/брони/участники — событиями), identity (display-реплика)
investor-ownerОбъект инвестора (портфель), сопоставление Owner↔InvestorTalent Owners, crm (завершение сделки), invest-analytics
newsPost (блоки typed jsonb), snapshot-история, категорииselections (копия подборки), identity (автор/категории)
favoritesFavorite (user/session, заметка)chessboard/catalog (объект), user-activity (сессия)
selectionsSelection, элементы, публичные ссылки, копии для постовfavorites, chessboard/catalog
user-activitySession (Status, LastActivityAt), LotView (длительность просмотра), LotViewStats (агрегаты: сколько раз/как долго на лот), ActionEvent (фильтры/действия), anonymous_id — PostgreSQL-only, закрытие polling-delta (ADR-0056)identity (связывание при входе)
messengerChat, Message (история правок, IP/UA), Participant, Contact, ChatEvent (TPH), чёрный список; realtime — SignalR-hub (ADR-0055)crm (сделка/участники), identity
notificationsNotificationTemplate, DispatchLog, каналы/подпискивсе (события)
supportTicket, очередь, ArbitrageCase, KnowledgeBase, шаблонные ответыcrm/identity/messenger (через permissions)
dev-statsClickHouse: lot_view_facts (PARTITION месяц, ORDER BY Developer→Project→Building→LayoutGroup→Layout→Lot→ViewedAt, TTL 3 года) + дневные rollup-ы; реплика измерений шахматки (ADR-0057)user-activity (события просмотров/сессий), chessboard (справочники)

Поиск. Полнотекстовый поиск каталога — Elasticsearch-проекции (ADR-0059, канон Talent.Common.Domain.Search поверх Elasticsearch); catalog держит rebuildable search-документы, PostgreSQL-FTS не самостоятельный движок.

Ключевые интеграционные потоки (Kafka, pin.<context>.<event>.v1)

ПотокProducer → ConsumerНазначение
Компании/пользователи TalentTalent Identity → identityСоздание CompanyEntity/UserEntity (реплики)
Справочники TalentTalent Handbook → handbookСинк стран/регионов/городов/валют/языков (ACL-реплика, ADR-0063)
Справочники PINhandbookchessboard, profile, crm (реплики/resolve)Локальные реплики справочников; write-path-валидация
Объекты/цены TalentTalent Chessboard → chessboard, invest-analyticsСинк каталога; append-only история цен
Членство агентаidentityrewards, walletМульти-членство/увольнение (ADR-0070/0072); user-centric метрики агента, display-реплика холдеров
Реферальная привязкаreferralcrm, messenger, notificationsСоздание лида, контакт, СМС
Заявки (консультация/бронь/презентация)catalog/front → crmЛид + события в лиде
Статус объектаcrm (booking) → chessboard, catalogРезерв/Бронь/Продан + таймеры
Жизненный цикл сделкиcrmmessenger, notifications, rewards, investor-owner, calendarЧат сделки, уведомления, комиссия (получатель = активный Executor, ADR-0069 v1), объект собственника, дедлайны/маршрутизация в календаре
Расписание и записиcrmcalendarCRM → сделки/брони/участники (дедлайны, переназначение владельца); calendar → запись на встречу/исход (get-or-create клиента/лида, лента лида — ADR-0064)
Проводки кошелькаrewardswalletКредит после гейта MoneyReceived (ADR-0067), дебет по выплате, компенсации; двойная запись (ADR-0065)
Действия пользователяuser-activitycrm (карточка лида)Проброс просмотров/фильтров агенту
Статистика просмотровuser-activitydev-stats (ClickHouse facts)Метрики/графики застройщика: кто/сколько/как долго/как часто (3 года)
Публикация постаnewsselections (копия)Блок-подборка в посте
Продвижение (полиморфный таргет)promotioncatalog, newsПриоритет показа в витрине; промо-блоки в ленте

Особые границы

  • Мессенджер — собственный мини-мессенджер PIN (ADR-0055): REST + SignalR-hub.
  • Админ-система — за пределами identity (ADR-0053): отдельные API/фронт; здесь только граница.

Правила границ

  • Контекст не читает чужие таблицы; только API/события/реплики. Cross-context — через IKafkaEvent+outbox.
  • Каждый контекст = свой набор проектов Pin.<Context>.{Domain,Application,Infrastructure,Api,Background,Migrator} поверх Talent.Common.*; namespace Pin.<Context>.<Aggregate>.
  • Изменение границ — только через ADR.

Обратные ссылки

Автоссылки: где используется этот документ.