Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
リカバリーエンティティティ + リポジトリを追加します。1.3.0(SP3)にバンプ
パスワードリセットトークンを追加, SmsOtp, RecoverySession, AccountVerificationCode SP3の回復の流れのための対応するリポジトリを持つJPAの組織.
Add SecurityQuestionCatalog enum + sq1/2/3 + seedPhraseHashをユーザーに(SP3)
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
ブラウザのバックエンド・レンダリング・モーダル(SP2)によるルートプレビュー
EmailTemplateBrowser は、プレビューモジュールを直接所有しているので、 管理者は行レベルのプレビューリクエストを傍受する必要はありません。 編集モードにリダイレクトします.
実際の API への HTTP 電子メールTemplateEdit
TemplateApi.get から水素化し、templateApi.update 経由で保存します。 カテゴリー dropdown は、インラインのカテゴリ作成の手頃な価格の API 主導です。 変数 picker は変数Contracts.ts (REQUIRED の宣言契約) から読み込みます。 テンプレートキー...
Wire EmailTemplateBrowser を API に + System Defaults タブを追加する
TemplateApi.list() 呼び出しでモックデータの~140行を置き換えます。 コンテンツ 5番目のタブ「システムデフォルト」は、トップレベルの管理とレンダリングのみ表示されます response.systemTemplates から カテゴリApi.list() から入力されたカテゴリフィルタ。 すべての行...
メールを追加するTemplatePreview modal
行アクションプレビューで開きます。 templateApi.preview(); でバックエンドレンダリング スタイル分離のためのサンドボックスされたiframeに表示された結果。 マッチする 使用を送る正確なコードパスなので、プレビューは受信者の受信者です。 SP2の一部.
未使用のメールGeneralManager.tsx(デッドコードの~560行)を削除
部品はどこにでも輸入されませんでした。 トグル(バウンスハンドリング) 購読解除, 配信追跡, 電子メールからのデフォルト) バックエンドがなかったし、 純粋に化粧品の setTimeout スタブでした。 各機能が発送されます 対応するバックエンドが存在すると、独自の仕様を介して。 SP2の一部.
TemplateApi +カテゴリApi +変数Contracts クライアントモジュールを追加
SP1の/api/email/templates/*および************************を包みます 型付きTypeScriptヘルパーでエンドポイント。 変数ContractsはSP1のミラーを映します TemplateKeys Javadoc なので、エディタの変数ピッカーが宣言されている REQU...
Wire EmailTemplateSeedClient into ****************
Thin RestTemplate client that POSTs to EmailService's **************** after an org + owner TeamMember are persisted. Retries twice with backoff; failure throws...
Add EmailTemplateCategoryController REST endpoints
**************** CRUD. Delete response includes reassignedCount — the number of templates that became uncategorized as a result of removing the category. Sessio...
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) addition...
サービスツーサービスエンドポイントに内部AuthFilter を追加
/api/email/templates/send の X-Internal-Auth ヘッダーを有効化し、 /api/email/templates/seed-org/* パス。 他のパスはこのフィルターをバイパスします (ユーザセッションのauthはそれらを処理します)。 シークレットはINTERNAL AUTH ...
メールを追加するテンプレートカテゴリのCRUD
サービスのレイヤーで強制される org ごとのケースインセンティブな名前の独自性 (DBの部分的なユニークなインデックスにマッチ) 削除 nulls カテゴリ id カテゴリ行を削除する前に影響を受けるテンプレート。 SP1の部分.
Add EmailTemplateService — CRUD + シード + デフォルトへのリセット
トランザクションメールのコアオーケストレーター。 sendToUser はテンプレートを解決します。 対象となる/body をレンダーし、組織から org のプライマリドメインを選択します。 ドメイン, そして、電子メールSmtpService に noReply@{org.domain} を from-address...
NoReplySenderService を 'NoReply@{domain}' のアドレスから追加
アドレスからトランザクション電子メールのための真理の単一ソース。 受け入れる ドメイン文字列、小文字を正規化し、「NoReply@<domain>」を返します。 発信者は、org のドメインを解決しなければなりません(Organization.domains の検索または 同様に)それを渡して下さい。 SP1の部分.
{{var}} 置換用の TemplateRenderer を追加
Stateless regex ベースのレンダラー。 vars が空の文字列を置換し、 属性のテンプレートキー + orgId で WARN ログを出力します。 HTMLエスケープなし v1 — 値がサーバー制御です。 SP1の部分.
Append Z to dateCommitted so JS parses it as UTC
LocalDateTime.toString() produces no timezone designator, causing JavaScript's new Date() to treat the UTC value as local time and display timestamps 7-8 hours ...
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 ...
Convert PT midnight cutoff to UTC for today-count query
Commits are stored in UTC but the cutoff was a naive LocalDateTime in PT, causing yesterday-evening PT commits (00:00–06:59 UTC) to be counted as today.
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 aft...
Bump kamo-shared-library version から SP1 への追加
メールテンプレート、メールテンプレートカテゴリ、テンプレートステータス、テンプレートキー、 CanonicalTemplate、CanonicalTemplateLoader、およびcanonical HTMLリソース.
CanonicalTemplateLoader + CanonicalTemplateレコードを追加
3つのREQUIREDテンプレート(WELCOME, PASSWORD RESET)を読みます。 EMAIL VERIFICATION のクラスパスリソースから メニュー によって消費される KamoInitializerシステム・ロー・シード向けサービス SP1の部分.
WELCOME、PASSWORD RESET、EMAIL VERIFICATION 用のcanonical HTML + JSONを追加
システム行のソース・オブ・ツルスコンテンツ。 KamoInitializerServiceでロード CanonicalTemplateLoader と UPSERTed の起動をメール templates に送信します。 SP1の部分.
MailboxId→id と ProviderStatus→status をメールボックスリストの応答で名前変更する
メンバーのメールボックスのリストに対するフロントエンドの期待を持つフィールド名を一直線化します.
メールテンプレートのエンティティティ + リポジトリを追加
テンプレートごとの1つのシステム列を格納 key(org id NULL, is system TRUE)プラス template key ごとの org ごとの 1 つのクローン。 ソフトリファレンス org id/category id. データベース ドライブタイムスタンプ、ボディブロックやタグのJSONB。 リ...
EmailTemplateCategory 実体 + リポジトリを追加
電子メールテンプレートのOrg-scopedカテゴリ。 ソフトBIGINT org id(FKなし) 既存のパターンにマッチします。 ケース・インセンティブ・ネーム・パー・オーガニゼーション KamoInitializerService に追加された部分インデックス経由で強制されます。 SP1の部分.
Add TemplateStatus enum + TemplateKeys 取引テンプレートの定数
REQUIRED/CUSTOM/ARCHIVED のライフサイクル状態と 3 を宣言 必要なテンプレートキー(WELCOME、PASSWORD RESET、EMAIL VERIFICATION)。 各 REQUIRED テンプレートの変数契約は、Javadoc として記述されています。 定数クラス、SP3、SP4 の呼...
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 KamoCRMAg...
Tighten KamoCRMAgeReqUpdateRunner per review
- Restore Javadoc paragraph explaining @Order(10) rationale. - Test now references the UPDATE_SQL constant directly instead of duplicating the SQL string, so ...
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 — start...
すべてのCSS-filterロゴインスタンスをWhite SVGに置き換える
運行、SubNavigation、Footer、SubFooterおよびPreloaderはすべて使用しました 同じ壊れたフィルタの明るさ-0 の反転パターン。 交換する ボード全体にロゴフルホワイト.svg.
CSS フィルターの代わりにフッターでホワイトSVGロゴを使用する
Nav と同じ修正 — バックドロップフィルタ内の img の CSS フィルターは、iOS Safari では信頼できません.
テーマCSSのオーバーライドに対する!importantでカラースキームを監視する
DynamicMetaLoaderは、カスケードに勝つリモートCSSを注入することができます。 追加する !importantはカラースキームを保証します。ダークはテーマのスタイルシートで上書きすることはできません.
TouchOptimized min-heightの執行からフッターとnvのリンクを除外
TouchOptimized は minHeight:44px を全ての <a> 要素の短い値に設定しました。 フットナフリンク(〜20px)を含む44px。 水分補給時のこのラン 硬いリフレッシュ、各<li>の屈曲項目を高さ44pxにし、作り出す フッターリンク列のダブルスピアリング。 Footer/navリンクは...
CSSフィルタではなく、あらかじめレンダリングされたホワイトSVGロゴを使用する
バックドロップフィルタ内の img の CSS フィルターは、iOS Safari では信頼できません。 #ffffff にセットされているすべての塗りつぶしでロゴ-full-white.svg を生成し、それをロードします 直接 — フィルター無し、すべての装置で白く保証されるブラウザのquirks無し.
テイルウィンド ダーク モード バリアントをクラスベースにロックし、OS のメディア クエリは不要
Tailwind v4 デフォルトダーク: 優先色スキーム (OS 設定) に対応するユーティリティ。 @variant のオーバーライドにより、 .dark のクラスが .dark のときにのみ有効になります。 DOMに存在するOSは、任意のデバイス上の色をフリップすることはできません.
信頼できる白いレンダリングのためのロゴ リンクのインライン フィルター様式を使用して下さい
Img 要素の Tailwind フィルタクラスは、モバイルブラウザ全体で矛盾しています。 アンカー要素上のインラインスタイルは、いつでも明るさ(0) invert(1)を保証します.
ダークカラースキームを強制するので、ブラウザはライトモードレンダリングを適用しません
'light' から 'dark' まで、globals.css、generateViewport、および html 要素スタイル — これは、SVG とネイティブ UI のレンダリングからブラウザーを停止します。 暗い背景にロゴが黒く見えるようにしたライトモードで.
モバイル上のnav行の後ろのレンダリングからロゴを防止
CSSフィルタ付きのdiv wrapperは、競合する新しいスタックコンテキストを作成しました モバイルブラウザのヘッダーのバックドロップフィルタで、ロゴをペイントする ヘッダーの背景の後ろ。 Image 要素に直接フィルタークラスを適用します.
JumpToBarとPreviewBannerでスクロールバーとモバイルクリップを解決
- オーバーフローを追加する: 垂直スクロールバーを防ぐためにJumpToBar内部コンテナに隠される - PreviewBannerコンテンツをモバイルでラップできるようにするため、テキストがポートレート電話にクリップされていない
スペースY-4をフッターリンクリストにインラインフレックスギャップで置き換える
Tailwind スペース-y-4 は :where() (特異性 0) を使用して、CSS でレースします。 不連続な縦の間隔を引き起こしている堅い更新のローディング。 インライン スタイルはSSR HTMLに埋め込まれ、すぐに適用し、独立します 外部CSSロード注文.
Add カモCRMバックリンクから/welcomeランディングページ
実際の meet.{domain} のランディングページは、歓迎/インデックスです。 html — 静的 前のフローを処理するnginxによって直接提供されるHTMLページ (表示名/部屋のキャプチャ、検証、JWTとのミートへのリダイレクト) パワードByKamo React コンポーネントは WelcomePage....
作って下さい 動力を与えられたKamoのマッチのkamo-login —ブランド色の白
KamoMeetのウェルカムページでは、すでにPowerdByKamoのバックリンクが配線されていました。 しかし、そのスタイリングはまだ元の低opacity現在のカラートリートメントでした ミートのウェルカムページの背景には、視覚的にも気づいていました。 kamo-login/kamo-registerの処置と一直...
Remove geo debug logging (root cause was Traefik externalTrafficPolicy)
Set Traefik externalTrafficPolicy=Local to preserve client IP
With the default "Cluster" policy, kube-proxy SNATs external traffic to the node IP before forwarding to Traefik. That caused Traefik to see the node IP as the ...