チェンジログ
何が新しいの?
プラットフォームのすべての改良 それが出荷される
· 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)にバンプ
パスワードリセットトークンを追加, SmsOtp, RecoverySession, AccountVerificationCode SP3の回復の流れのための対応するリポジトリを持つJPAの組織.
· kamo-shared-library
Add SecurityQuestionCatalog enum + sq1/2/3 + seedPhraseHashをユーザーに(SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
ブラウザのバックエンド・レンダリング・モーダル(SP2)によるルートプレビュー
EmailTemplateBrowser は、プレビューモジュールを直接所有しているので、 管理者は行レベルのプレビューリクエストを傍受する必要はありません。 編集モードにリダイレクトします.
· kamo-internal
実際の API への HTTP 電子メールTemplateEdit
TemplateApi.get から水素化し、templateApi.update 経由で保存します。 カテゴリー dropdown は、インラインのカテゴリ作成の手頃な価格の API 主導です。 変数 picker は変数Contracts.ts (REQUIRED の宣言契約) から読み込みます。 テンプレートキー; CUSTOM の共通セット。 REQUIRED/システム列編集 適切な警告バナーが表示されます。 プレビューボタンが開きます バックエンドレンダリングされたメールTemplatePreview モーダル。 SP2の一部.
· kamo-internal
Wire EmailTemplateBrowser を API に + System Defaults タブを追加する
TemplateApi.list() 呼び出しでモックデータの~140行を置き換えます。 コンテンツ 5番目のタブ「システムデフォルト」は、トップレベルの管理とレンダリングのみ表示されます response.systemTemplates から カテゴリApi.list() から入力されたカテゴリフィルタ。 すべての行アクション **************************** リアルにヒット バックエンドエンドポイント。 handleApiError のトーストヘルパーを介したエラー。 SP2の一部.
· kamo-internal
Add EmailTemplateDuplicateDialog(SP2の一部)
· kamo-internal
メールを追加するTemplateCategoryManager modal (SP2)
· kamo-internal
メールを追加するTemplatePreview modal
行アクションプレビューで開きます。 templateApi.preview(); でバックエンドレンダリング スタイル分離のためのサンドボックスされたiframeに表示された結果。 マッチする 使用を送る正確なコードパスなので、プレビューは受信者の受信者です。 SP2の一部.
· kamo-internal
TemplateApi +カテゴリApi +変数Contracts クライアントモジュールを追加
SP1の/api/email/templates/*および************************を包みます 型付きTypeScriptヘルパーでエンドポイント。 変数ContractsはSP1のミラーを映します TemplateKeys Javadoc なので、エディタの変数ピッカーが宣言されている REQUIREDテンプレートの契約 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
サービスツーサービスエンドポイントに内部AuthFilter を追加
/api/email/templates/send の X-Internal-Auth ヘッダーを有効化し、 /api/email/templates/seed-org/* パス。 他のパスはこのフィルターをバイパスします (ユーザセッションのauthはそれらを処理します)。 シークレットはINTERNAL AUTH SECRETから来ています env var。 また、transactional.smtp.user / transactional.smtp.passを追加します。 emailTemplateService で消費されるコンフィグのスタブ — 3 つはソースされます 生産の k8s configmap から。 SP1の部分.
· EmailService
メールを追加するテンプレートカテゴリのCRUD
サービスのレイヤーで強制される org ごとのケースインセンティブな名前の独自性 (DBの部分的なユニークなインデックスにマッチ) 削除 nulls カテゴリ id カテゴリ行を削除する前に影響を受けるテンプレート。 SP1の部分.
· EmailService
Add EmailTemplateService — CRUD + シード + デフォルトへのリセット
トランザクションメールのコアオーケストレーター。 sendToUser はテンプレートを解決します。 対象となる/body をレンダーし、組織から org のプライマリドメインを選択します。 ドメイン, そして、電子メールSmtpService に noReply@{org.domain} を from-address として渡して下さい。 seedForOrg は、新しいライフサイクルのホックと resetToDefault に含まれています。 システム行のコンテンツを1列のREQUIRED行にコピーします。 send の Auth は、クラスター全体トランザクション SMTP サービス認証情報を使用します。 (transactional.smtp.user/transactional.smtp.pass) はパーメンバーではなく プロバイダーのリゾルバ — トランザクションの送信には、アクティベーションメンバーがありません。 SP1の部分.
· EmailService
NoReplySenderService を 'NoReply@{domain}' のアドレスから追加
アドレスからトランザクション電子メールのための真理の単一ソース。 受け入れる ドメイン文字列、小文字を正規化し、「NoReply@<domain>」を返します。 発信者は、org のドメインを解決しなければなりません(Organization.domains の検索または 同様に)それを渡して下さい。 SP1の部分.
· EmailService
{{var}} 置換用の TemplateRenderer を追加
Stateless regex ベースのレンダラー。 vars が空の文字列を置換し、 属性のテンプレートキー + orgId で WARN ログを出力します。 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レコードを追加
3つのREQUIREDテンプレート(WELCOME, PASSWORD RESET)を読みます。 EMAIL VERIFICATION のクラスパスリソースから メニュー によって消費される KamoInitializerシステム・ロー・シード向けサービス SP1の部分.
· kamo-shared-library
WELCOME、PASSWORD RESET、EMAIL VERIFICATION 用のcanonical HTML + JSONを追加
システム行のソース・オブ・ツルスコンテンツ。 KamoInitializerServiceでロード CanonicalTemplateLoader と UPSERTed の起動をメール templates に送信します。 SP1の部分.
· kamo-shared-library
メールテンプレートのエンティティティ + リポジトリを追加
テンプレートごとの1つのシステム列を格納 key(org id NULL, is system TRUE)プラス template key ごとの org ごとの 1 つのクローン。 ソフトリファレンス org id/category id. データベース ドライブタイムスタンプ、ボディブロックやタグのJSONB。 リポジトリは提供します org-scopedルックアップ、原子使用カウンター増分、カテゴリ削除 nullifyCategoryForOrg によるクリーンアップ。 SP1の部分.
· kamo-shared-library
EmailTemplateCategory 実体 + リポジトリを追加
電子メールテンプレートのOrg-scopedカテゴリ。 ソフトBIGINT org id(FKなし) 既存のパターンにマッチします。 ケース・インセンティブ・ネーム・パー・オーガニゼーション KamoInitializerService に追加された部分インデックス経由で強制されます。 SP1の部分.
· kamo-shared-library
Add TemplateStatus enum + TemplateKeys 取引テンプレートの定数
REQUIRED/CUSTOM/ARCHIVED のライフサイクル状態と 3 を宣言 必要なテンプレートキー(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.
