Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· SecurityService
Add AccountSettingsController + Service for phone + security questions (SP3)
Allows logged-in users to set/verify phone and configure 3 security questions. Routes to /api/account/* (session-authenticated via KSESSION_DATA).
· SecurityService
Add BulkTextSmsClient + EmailTemplateServiceClient + PasswordRecoveryController (SP3)
Full password recovery flow: email-link, SMS OTP, security questions, seed phrase. Routes to /api/recover/* (unauthenticated). Uses SP1 email pipeline + VOIPService SMS.
· VOIPService
Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
· kamo-shared-library
Добавить восстановительные объекты + репо; удар до 1,3.0 (SP3)
Добавлены PasswordResetToken, SmsOtp, RecoverySession, AccountVerificationCode Субъекты JPA с соответствующими хранилищами для потока восстановления SP3.
· kamo-shared-library
Добавить SecurityQuestionCatalog enum + sq1/2/3 + seedPhraseHash Пользователю (SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
Предварительный просмотр маршрута через модаль Browser (часть SP2)
EmailTemplateBrowser теперь владеет модалем Preview напрямую. Менеджеру больше не нужно перехватывать запросы предварительного просмотра на уровне строк. Перенаправить в режим редактирования.
· kamo-internal
Wire EmailTemplateПравить на реальный API
Гидраты от templateApi.get, сохраняет через templateApi.update. Категория dropdown - это API-ориентированный с встроенной доступностью для создания категорий. Переменные picker reads from variableContracts.ts (заявленные контракты для REQUIRED) Шаблонные ключи; общий набор для CUSTOM. Редактирование строк / SYSTEM показывает соответствующий предупреждающий баннер. Кнопка предварительного просмотра открывает Бэкэнд-рендеринг EmailTemplatePreview модаль. Часть СП2.
· kamo-internal
Проводите EmailTemplateBrowser до реального API + добавьте вкладку «Системные по умолчанию»
Заменяет ~ 140 строк макетных данных вызовами templateApi.list(). Условный Пятая вкладка «System Defaults» появляется только для администраторов верхнего уровня и рендеров Источник: response.systemTemplates. Категориальный фильтр, загруженный из CategoryApi.list(). Все гребные действия ********************************** Бэкэнд конечные точки. Ошибки направляются через тост-помощник handleApiError. Часть СП2.
· kamo-internal
Добавить EmailTemplateDuplicateDialog (часть SP2)
· kamo-internal
Добавить модаль EmailTemplateCategoryManager (часть SP2)
· kamo-internal
Добавить модаль EmailTemplatePreview
Открывается на предварительном просмотре. Backend-rendered via templateApi.preview(); Результат отображается в песочнице iframe для изоляции стиля. Соответствует Точный путь кода, который использует отправка, поэтому то, что вы просматриваете, - это то, что получают получатели. Часть СП2.
· kamo-internal
Добавить шаблонApi + категорияApi + переменныеКонтракты клиентских модулей
Обертывает /api/email/templates/ и ******************* Конечные точки с набранными помощниками TypeScript. Переменные контракты зеркала SP1 TemplateKeys Javadoc так редактор переменных пикеров показывает объявленный контракты на требуемые шаблоны. Часть СП2.
· SecurityService
Wire EmailTemplateSeedClient into ****************
Thin RestTemplate client that POSTs to EmailService's **************** after an org + owner TeamMember are persisted. Retries twice with backoff; failure throws OrgProvisioningException and rolls back the surrounding @Transactional so the org + owner-TeamMember save is undone (per SP1 spec). Mirrors the existing TranslateServiceClient X-Internal-Auth pattern. k8s/configmap.yaml adds: email.service.url (EmailService internal URL) internal.auth.secret (cluster-wide X-Internal-Auth header value) pom.xml bumps kamo-shared-library 1.1.0 → 1.2.0. Part of SP1.
· EmailService
Add EmailTemplateCategoryController REST endpoints
**************** CRUD. Delete response includes reassignedCount — the number of templates that became uncategorized as a result of removing the category. Session context read via the same **************** pattern as other EmailService controllers. Part of SP1.
· EmailService
Add EmailTemplateController REST endpoints + DTOs
Exposes /api/email/templates/* CRUD + preview + duplicate + reset-to-default + service-to-service /send + /seed-org/{orgId}. Top-level orgs (no parent) additionally see systemTemplates in the list response. Service-to-service endpoints are protected by the existing InternalAuthFilter. Session context (orgID, memberID) read from OTKPreAuthFilter's REQ_ATTR_SESSION attribute — the same pattern already used by AliasController / MailboxController. Part of SP1.
· EmailService
Add InternalAuthFilter for service-to-service endpoints
Проверяет заголовок X-Internal-Auth на /api/email/templates/end и /api/email/templates/seed-org/* Paths. Другие пути обхода этого фильтра (пользовательская сессия AUTH обрабатывает их). Оригинальное название: INTERNAL AUTH SECRET Энв Вар. Дополнительно: transactional.smtp.user/transactional.smtp.pass Конфигурационные заглушки, потребляемые EmailTemplateService - все три источника K8s Configmap в производстве. Часть SP1.
· EmailService
Добавить EmailTemplateCategoryService — CRUD для категорий, связанных с оргами
Нечувствительная к делу уникальность имени в одной организации, применяемая на уровне обслуживания (соответствует частичному уникальному индексу в DB). Удаление nulls category id на затронутых шаблонах перед удалением строки категорий. Часть SP1.
· EmailService
Добавить EmailTemplateService — CRUD + send + seed + reset-to-default
Основной оркестратор для транзакционной электронной почты. sendToUser решает шаблон, отображает субъект/тело, выбирает основной домен организации из Организации. домены, и перейдите на EmailSmtpService с NoReply@{org.domain} по адресу: Включает seedForOrg для крючка жизненного цикла new-org и сброс ToDefault, который копирует содержимое строки SYSTEM по строке per-org REQUIRED. Auth для отправки использует учетные данные службы транзакций SMTP по всему кластеру (transactional.smtp.user/transactional.smtp.pass) Решитель провайдера — транзакционные отправки не имеют действующего участника. Часть SP1.
· EmailService
Добавить NoReplySenderService для NoReply@{domain} с адреса
Единый источник правды для транзакционной почты с адресов. Принять a строка домена, нижняя строчка нормализует его, возвращает «NoReply@<domain>». Абоненты должны решить домен организации (через поиск доменов или Аналогично) и передать его. Часть SP1.
· EmailService
Добавить TemplateRenderer для замены {{var}}
Безгосударственный рендеринг на основе регекса. Недостающие варсы заменяют пустые струны и Издать журнал WARN с помощью templateKey + orgId для атрибуции. HTML не ускользает v1 — значения контролируются сервером. Часть SP1.
· InitializerService
Add EmailTemplateSeedRunner for SYSTEM + per-org seeding
Runs at @Order(20) on KamoInitializerService startup. Loads canonical templates from kamo-shared-library resources; upserts SYSTEM rows (no clobber); backfills per-org rows for every org that doesn't yet have them. Idempotent — safe to re-run on every startup. Part of SP1.
· InitializerService
Add partial unique indexes + CHECK constraints for email_templates
Hibernate ddl-auto can't generate partial unique indexes or computed-CHECK constraints. This commit adds them via the existing idempotent DDL runner pattern after Hibernate creates the base tables from the new entities. Part of SP1.
· kamo-shared-library
Добавить CanonicalTemplateLoader + CanonicalTemplate
Читает три обязательных шаблона (WELCOME, PASSWORD RESET, EMAIL VERIFICATION - от классовых ресурсов **************************** потребляемый KamoInitializerService для сева системного ряда. Часть SP1.
· kamo-shared-library
Добавить канонический HTML + JSON для PASSWORD RESET, EMAIL VERIFICATION
Исходный контент для строк системы. Загрузка в KamoInitializerService Запуск CanonicalTemplateLoader и UPSERTed в email templates. Часть SP1.
· kamo-shared-library
Добавить EmailTemplate entity + репозиторий
Хранит одну строку SYSTEM для шаблона key (org id NULL, is system TRUE) плюс Один клон в группе на шаблон key. Soft-reference org id/category id. ДБ- Временные метки; JSONB для body blocks и тегов. Репозиторий обеспечивает орг-сканирование, приращение счетчика атомного использования и удаление категории Очистка через nullifyCategoryForOrg. Часть SP1.
· kamo-shared-library
Добавить EmailTemplateCategory entity + репозиторий
Org-scoped категории для шаблонов электронной почты. Soft BIGINT org id (без FK) Соответствует существующим моделям. Нечувствительная к делу уникальность имени per-org Вводится через частичный индекс, добавленный в KamoInitializerService. Часть SP1.
· kamo-shared-library
Добавить TemplateStatus enum + константы TemplateKeys для транзакционных шаблонов
Объявляет требуемые / заказные / приобретенные состояния жизненного цикла и три Требуются ключи шаблона (WELCOME, PASSWORD RESET, EMAIL VERIFICATION). Переменные контракты для каждого шаблона REQUIRED, документированного как Javadoc Класс констант; абоненты SP3 и SP4 ссылаются на них. Часть SP1.
· InitializerService
Seed KamoCRM with ALL_WORK_ELIGIBLE on fresh installs
The createOrg() helper applies this single argument to both ageReqTypeMember and ageReqTypeTeamMember; consistent with platform convention. Pairs with KamoCRMAgeReqUpdateRunner which handles existing deployments via a conditional UPDATE. Completes SP5.
· InitializerService
Add one-time runner to migrate KamoCRM agereq to ALL_WORK_ELIGIBLE
Conditional idempotent UPDATE runs on service startup; WHERE clause checks the expected old value so re-runs are no-ops. Errors are logged and swallowed — startup must not block on this non-critical migration. Part of SP5. Pairs with the DataLoader edit in the next commit that makes fresh installs seed the new value directly.

Ваша вселенная ждет.
Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.
Бесплатно навсегда — не требуется кредитная карта