变更记录
什么是新的。
平台的每一个改进,随着它的出货。
· 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
添加回收实体 + repos; 起落至 1.3.0 (SP3)
添加密码重置托肯、 SmsOtp、 恢复会话、 账户验证码 JPA实体具有对应的SP3回收流寄存器.
· kamo-shared-library
添加安全问题Catalog enum + sq1/2/3 + 种子 PhraseHash 到用户(SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
通过浏览器后端给定模式(SP2的一部分)的路由预览
电子邮件Template浏览器现在直接拥有预览模式,所以 管理器不再需要截取行级预览请求和 重定向到编辑模式 .
· kamo-internal
有线电子邮件模板编辑到真实的 API
从模板Api.get取出水分,通过模板Api.update保存. 类别 下拉由 API 驱动,带有内线类创建支付. 变量 picker 读取可变合同 模板密钥; CUSTOM 常见的设置. 需要/ 系统行编辑 显示适当的警告横幅。 预览按钮打开 后端发送的电子邮件TemplatePreview模式。 部分为SP2.
· kamo-internal
电线电子邮件Template浏览器到真实 API + 添加系统默认分页
将模拟数据的~140行替换为模板Api.list()调用. 有条件 第五个标签“ 默认系统” 仅用于顶级- org 管理员, 并制作 从响应。 从 Api.list () 类别中插入的分类过滤器 。 所有行动作 击出真实的 后端端点. 通过 handleApiError top 帮助器路由出错 。 部分为SP2.
· kamo-internal
添加电子邮件Template 二重机Dialog( SP2的一部分)
· kamo-internal
添加电子邮件模板CategoryManager模式( SP2的一部分)
· kamo-internal
添加电子邮件模板审查模式
在行动作预览上打开. 后端通过模板Api.preview(); 结果显示在样式隔离的沙盒内。 匹配 发送使用的精确代码路径,所以您所预览的是收件人得到的。 部分为SP2.
· kamo-internal
添加模板Api + 类Api + 可变客户端模块
包装SP1的/api/电子邮件/templates/ *和 QQ 有打入的 TypeScript 帮助器的结束点 。 缩放 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/ 电子邮件/ templades/ send 和 上的 X- Internal- Auth 信头 /api/email/templades/种子-org/*路径. 绕过此过滤器的其他路径 (用户会话授权处理它们). 秘密来自INNALL AUTH SECRET (原始内容存档于2017-03-21). env var. 并添加 accessal.smtp.user / accessal.smtp.p.pass 由 EmailTemplate Service 所消耗的配置字符根 —— 所有三个都是源代码 从生产中的 k8s 配置图。 部分为SP1.
· EmailService
添加电子邮件TemplateCategory Services — CRUD 以表示覆盖的类别
在服务层强制执行的对大小写不敏感名称独有性 (比对DB中部分独有的索引). 删除无效类别 id 在删除类别行之前,先在受影响的模板上。 部分为SP1.
· EmailService
添加电子邮件模板服务 — CRUD + 发送+ 种子 + 重置到默认
交易邮件核心管弦乐手. 发送用户解析模板, 使对象/机构,从组织中选择该矿石的主要领域。 域,则 并用 NoReply- org. domain 的地址向 EmailSmtpService 移动。 包括种子ForOrg用于新更新的生命周期钩并重置 ToDefault 复制了系统列的内容,超过每行的 REQUIRED 。 发送的代理使用全集群交易 SMTP 服务证书 (交易式.smtp.user/交易式.smtp.pass)而不是每个成员 提供者解析器——交易发送没有代理成员. 部分为SP1.
· EmailService
从地址添加“ noReply%%domain} ” 的无回放服务
地址交易邮件的单一真相来源 。 接受一个 域字符串,小写规范化,返回“Noply-%domain>”。 呼叫者必须解决 org 的域( 通过 Organization. domains 查看或 类似)并传入. 部分为SP1.
· EmailService
添加模板渲染器用于 QQVARQQ 替换
无国籍的regex制成器。 缺少 vars 替换空字符串和 发送带有模板Key + 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
添加 Canonical Template Loader + Canonical Template 记录
阅读三个要求模板(WELCOME,PASWORD RESET, 来源于分类路径资源 **************** 使用时间 系统组播种服务。 部分为SP1.
· kamo-shared-library
添加可读 HTML + JSON 表示欢迎, PASWORD RESET, 电子邮件 验证
系统行的真实内容。 已装入 KamoInitializer 服务 由 CanonicalTemplate Loader 和 UPSERT 启动为电子邮件 templates 。 部分为SP1.
· kamo-shared-library
添加电子邮件模板实体+寄存器
每个模板存储一行系统 key(org id NULL, is system TRUE)+ 每个模板的每个字元一个克隆。 软引用 org id/ speciale id. 数据库 驱动时间戳; JSONB 用于身体 块和标记。 仓库提供 org 扫描、原子使用反增量和删除 通过取消CategoryForg进行清理。 部分为SP1.
· kamo-shared-library
添加电子邮件Template 实体 + 寄存器
用于电子邮件模板的 Org 范围分类 。 软 BIGINT org id( 无 FK) 匹配现有模式。 案件不敏感名称独有 通过在KamoInitializer Service中添加的部分指数执行。 部分为SP1.
· kamo-shared-library
为交易模板添加模板状态 enum + TemplateKeys 常数
宣布REQURED/CUSTOM/ARCED生命周期状态和三个 所需的模板密钥(WELCOME、PASWORD RESET、EMAIL 核查)。 作为 Javadoc 记录的每个 REQUIRED 模板的可变合同 常数类; 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.
