Журнал змін
Что нового.
Все усовершенствования платформы, как только она будет запущена.
· 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
Додавання репозицій + репозиції; bump до 1.3.0 (SP3)
Adds PasswordResetToken, SmsOtp, RecoverySession, AccountVerificationCode JPA суб'єкти з відповідними репозиторійами для відновлення SP3.
· kamo-shared-library
Додати SecurityQuestionКаталоговий енум + кв1/2/3 + насінняPhraseHash до Користувача (SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
Перегляд маршруту за допомогою модуля браузера (частина SP2)
EmailTemplateBrowser тепер має модальний перегляд, тому Менеджер більше не вимагає перехоплення запитів на попередній перегляд рядків і перенаправлення для редагування режиму.
· kamo-internal
Дріт EmailTemplateEdit to real API
Hydrates від TemplateApi.get, зберігає через шаблонApi.update. Категорії випадаючий API-накопичувач з вбудованою категорію-відтворюваною доступністю. Сортування пікіровка читає з зміннихContracts.ts (декларовані контракти для ОБЛАДНАННЯ шаблонні ключі; загальний набір для CUSTOM. ОБЛАДНАННЯ / Монтаж системного ряду показує відповідний прапор попередження. Кнопка перегляду відкриває JavaScript licenses API Веб-сайт Go1.13.8 Частина SP2.
· kamo-internal
Дріт електронної поштиTemplateBrowser в реальний API + додати вкладку системних за замовчуванням
Замінює ~140 рядків даних mock з шаблономApi.list() дзвінків. Кондиціонер п'ятий вкладок 'System За замовчуванням' з'являється тільки для адміністраторів верхнього рівня і рендерів від реагування.systemTemplates. Категорія фільтра, що запускається з категоріїApi.list(). Усі дії рядків *********** потрапити реальний Зворотні кінцеві точки. Помилки, що переходять через ручкуApiError toast. Частина SP2.
· kamo-internal
Додати JavaScriptTemplateDuplicateDialog (частина SP2)
· kamo-internal
Додати JavaScriptTemplateCategoryManager модальний (частина SP2)
· kamo-internal
Додати файл
Відкриється на перегляді рядків. Backend-rendered через шаблонApi.preview(); результат відображається в пісочниці iframe для ізоляції стилю. Відповідає точний шлях коду, який використовує, так що ви попередньо переглядаєте, які одержувачі отримують. Частина SP2.
· kamo-internal
Додати шаблонApi + КатегоріяApi + зміннаContracts клієнтських модулів
************* кінцеві точки з ідентифікаторами TypeScript. змінніДзеркала Contracts SP1 ШаблонKeys Javadoc, щоб редактор змінного пікера показує контракти на шаблони ОБЛАДНАННЯ. Частина SP2.
· 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
Validates X-Internal-Auth header on /api/email/templates/send and /api/email/templates/seed-org/* paths. Other paths bypass this filter (user session auth handles them). Secret comes from INTERNAL_AUTH_SECRET env var. Also adds transactional.smtp.user / transactional.smtp.pass config stubs consumed by EmailTemplateService — all three are sourced from the k8s configmap in production. Part of SP1.
· EmailService
Додати e-mailTemplateCategoryService — CRUD для категорій org-scoped
Унікальність унікальності для об'єктів, що використовуються в сервісному шарі (зменшує частковий унікальний індекс в ДБ). Сортування nulls категорії id на уражених шаблонах перед видаленням рядка категорії. Частина ПК1.
· EmailService
Add EmailTemplateService — CRUD + send + seed + reset-to-default
Core orchestrator for transactional email. sendToUser resolves the template, renders subject/body, picks the org's primary domain from Organization.domains, and hands off to EmailSmtpService with NoReply@{org.domain} as from-address. Includes seedForOrg for new-org lifecycle hook and resetToDefault that copies a SYSTEM row's content over a per-org REQUIRED row. Auth for the send uses cluster-wide transactional SMTP service credentials (transactional.smtp.user / transactional.smtp.pass) rather than the per-member provider resolver — transactional sends have no acting member. Part of SP1.
· EmailService
Додати NoReplySenderService для 'NoReply@{domain}' з-під меню
Єдине джерело правди для транзакційної електронної пошти з адрес. Приймає доменний рядок, нижня кришка-normalizes it, повертає "NoReply@<domain>". Дзвінки повинні вирішувати домен org (via Organization.domains lookup або аналогічний) і пропустіть його в. Частина ПК1.
· EmailService
Додати підписку TemplateRenderer для {{var}}
Безперервний regex-на основі рендерера. Змішані вари замінюють порожній рядок і випромінює журнал WARN з шаблономKey + orgId для attribution. Немає HTML-розгортання в v1 — значення є керованим сервером. Частина ПК1.
· 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) від класпатських ресурсів ****************************************************************************************************************************************************************************************************************************************************************************** Сприяти KamoInitializerПослуги для системного висіву. Частина ПК1.
· kamo-shared-library
Додавання канонічного HTML + JSON для WELCOME, PASSWORD RESET, EMAIL VERIFICATION
Вихідний вміст для системних рядків. Завантажено в KamoInitializerService Запуск CanonicalTemplateLoader і UPSERTed в електронну пошту templates. Частина ПК1.
· kamo-shared-library
Додавання електронної пошти
Магазини один системний ряд за шаблон key (org id NULL, is system TRUE) плюс один клон за шаблон key. Soft-reference org id/category id. ДБ- керовані мітки часу; JSONB для body blocks and tags. Репозиторій надає org-scoped lookups, атомічний захист та категорія-делет Очищення через nullifyCategoryForOrg. Частина ПК1.
· kamo-shared-library
Додати електронну поштуTemplateCategory + репозиторій
Org-scoped категорії для шаблонів електронної пошти. М'який BIGINT org id (без FK) відповідає існуючим шаблонам. Унікальність унікальності для об'єктів Case-inensitive name per-org в KamoInitializerService. Частина ПК1.
· kamo-shared-library
Додати шаблонStatus enum + TemplateKeys константи для транзакційних шаблонів
Декларує стани життєвого циклу REQUIRED/CUSTOM/ARCHIVED та три необхідні ключі шаблону (WELCOME, PASSWORD RESET, EMAIL VERIFICATION). Змінні контракти для кожного шаблону ОБЛАДНАННЯ, задокументовані як Javadoc Клас постійного струму; SP3 і SP4-розрядники, що посилаються на них. Частина ПК1.
· 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.

Твій всесвіт чекає.
Почати безкоштовно за декілька хвилин. Додати продукти, коли ви будете готові — без перенесення, без нових реєстрацій.
Безкоштовно назавжди — не потрібна кредитна карта