Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
添加回收实体 + repos; 起落至 1.3.0 (SP3)
添加密码重置托肯、 SmsOtp、 恢复会话、 账户验证码 JPA实体具有对应的SP3回收流寄存器.
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
通过浏览器后端给定模式(SP2的一部分)的路由预览
电子邮件Template浏览器现在直接拥有预览模式,所以 管理器不再需要截取行级预览请求和 重定向到编辑模式 .
有线电子邮件模板编辑到真实的 API
从模板Api.get取出水分,通过模板Api.update保存. 类别 下拉由 API 驱动,带有内线类创建支付. 变量 picker 读取可变合同 模板密钥; CUSTOM 常见的设置. 需要/ 系统行编辑 显示适当的警告横幅。 预览按钮打开 后端发送的电子邮件TemplatePreview模式。 部分为SP2.
电线电子邮件Template浏览器到真实 API + 添加系统默认分页
将模拟数据的~140行替换为模板Api.list()调用. 有条件 第五个标签“ 默认系统” 仅用于顶级- org 管理员, 并制作 从响应。 从 Api.list () 类别中插入的分类过滤器 。 所有行动作 击出真实的 后端端点. 通过 handleApiError top 帮助器路由出错 。 部分为SP2.
添加电子邮件模板审查模式
在行动作预览上打开. 后端通过模板Api.preview(); 结果显示在样式隔离的沙盒内。 匹配 发送使用的精确代码路径,所以您所预览的是收件人得到的。 部分为SP2.
删除未使用的电子邮件GeneralManager.tsx(~560行已死代码)
组件从未被进口到任何地方。 它的切换(弹出处理, 未订阅、 发送跟踪、 电子邮件默认) 没有后端 纯粹是化妆品 每一个特征都会被运送 当相应的后端存在时,通过自己的光谱. 部分为SP2.
添加模板Api + 类Api + 可变客户端模块
包装SP1的/api/电子邮件/templates/ *和 QQ 有打入的 TypeScript 帮助器的结束点 。 缩放 SP1 的 TemplateKeys Javadoc 所以编辑器的可变拾取器显示已声明 REQUIRED模板的合同。 部分为SP2.
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/ 电子邮件/ templades/ send 和 上的 X- Internal- Auth 信头 /api/email/templades/种子-org/*路径. 绕过此过滤器的其他路径 (用户会话授权处理它们). 秘密来自INNALL AUTH SECRET (原始内容存档于2017-03-21)....
添加电子邮件TemplateCategory Services — CRUD 以表示覆盖的类别
在服务层强制执行的对大小写不敏感名称独有性 (比对DB中部分独有的索引). 删除无效类别 id 在删除类别行之前,先在受影响的模板上。 部分为SP1.
添加电子邮件模板服务 — CRUD + 发送+ 种子 + 重置到默认
交易邮件核心管弦乐手. 发送用户解析模板, 使对象/机构,从组织中选择该矿石的主要领域。 域,则 并用 NoReply- org. domain 的地址向 EmailSmtpService 移动。 包括种子ForOrg用于新更新的生命周期钩并重置 ToDefault 复制了系统列的内容,超过每行的 REQUIRED 。...
从地址添加“ noReply%%domain} ” 的无回放服务
地址交易邮件的单一真相来源 。 接受一个 域字符串,小写规范化,返回“Noply-%domain>”。 呼叫者必须解决 org 的域( 通过 Organization. domains 查看或 类似)并传入. 部分为SP1.
添加模板渲染器用于 QQVARQQ 替换
无国籍的regex制成器。 缺少 vars 替换空字符串和 发送带有模板Key + 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 版本为 1.2.0,用于 SP1 添加
添加电子邮件Template、电子邮件TemplateCategory、模板状态、模板关键字、 Canonical Template, Canonical Template Loader, 和 Canonical HTML 资源.
添加 Canonical Template Loader + Canonical Template 记录
阅读三个要求模板(WELCOME,PASWORD RESET, 来源于分类路径资源 **************** 使用时间 系统组播种服务。 部分为SP1.
添加可读 HTML + JSON 表示欢迎, PASWORD RESET, 电子邮件 验证
系统行的真实内容。 已装入 KamoInitializer 服务 由 CanonicalTemplate Loader 和 UPSERT 启动为电子邮件 templates 。 部分为SP1.
添加电子邮件模板实体+寄存器
每个模板存储一行系统 key(org id NULL, is system TRUE)+ 每个模板的每个字元一个克隆。 软引用 org id/ speciale id. 数据库 驱动时间戳; JSONB 用于身体 块和标记。 仓库提供 org 扫描、原子使用反增量和删除 通过取消CategoryForg进行清理。 ...
添加电子邮件Template 实体 + 寄存器
用于电子邮件模板的 Org 范围分类 。 软 BIGINT org id( 无 FK) 匹配现有模式。 案件不敏感名称独有 通过在KamoInitializer Service中添加的部分指数执行。 部分为SP1.
为交易模板添加模板状态 enum + TemplateKeys 常数
宣布REQURED/CUSTOM/ARCED生命周期状态和三个 所需的模板密钥(WELCOME、PASWORD RESET、EMAIL 核查)。 作为 Javadoc 记录的每个 REQUIRED 模板的可变合同 常数类; SP3和SP4呼叫者参考这些. 部分为SP1.
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...
用白色 SVG 替换所有 CSS- filter 标识例
导航、 SubNavigation、 脚印、 SubFooter 和预装器全部使用 相同的断裂滤镜亮度- 0倒数模式。 替换为 横跨全白.svg.
在页脚中使用白色的 SVG 标志而不是 CSS 过滤器
与"导航"相同的固定——IOS Safari上嵌入了背景-过滤器上的CSS过滤器不可靠.
护卫队的色彩设计与
DynamicMetaLoader可以给赢得级联的远程CSS注入. 添加中 ! 重要确保色彩策略: 黑暗永远不会被主题样式表所覆盖 .
从TouchOptimized 中排除页脚和导航链接
Touchoptimized 正在为所有 <a> 元素设置短于 44px,包括页脚导航链接(~20px高). 这在水合时运行 硬刷新,使每个 <li> 弹性项目高44px并产生 在页脚链接栏中显示双相距。 脚印/导航链接具有可访问上下文,不需要强制触摸目标.
使用预发白 SVG 标志, 而不是 CSS 过滤器
在iOS Safari上, 生成标志- full-white.svg 并设置所有填充到 #ffffff并加载 直接——没有过滤器,没有浏览器颤音,在所有设备上保证为白色.
锁定 Tailwind 暗模式变体到基于类, 绝不使用 OS 媒体查询
Tailwind v4 默认为暗: 用于响应偏好- color- scheme (OS 偏好) 的公用设施. @ variant 覆盖确保黑暗: 类只在 . dark 类时激活 显示在 DOM 中 —— OS 永远不能翻转任何设备上的颜色 .
在标识链接上使用内置过滤样式进行可靠的白色渲染
在img元素上的tailwind过滤类在移动浏览器之间不一致. 锚地元素上的内置样式保证亮度( 0)倒数(1) 适用于所有地方.
强制暗色化学, 浏览器从不应用光模式渲染
将 Global.cs 中的"光"改为"暗",生成Viewport 和 html 元素样式 – 这阻止了浏览器渲染 SVG 和本地 UI 在光线模式下,这导致标志在黑暗背景下出现黑色.
防止标志在移动行后渲染
带有 CSS 过滤器的 Div 包装器创建了相冲突的新堆叠上下文 在移动浏览器上带有页眉的背景过滤器,导致标志被画出 在标题后的背景。 直接在图像元素上应用过滤类.
在 JumpToBar 和 PreviewBanner 上解析滚动条和移动剪辑
- 添加溢出: 隐藏到 JumpToBar 内置容器以防止垂直滚动条 - 允许PreviewBanner内容在手机上包装,所以文本不剪接在肖像手机上
在页脚链接列表中将空格Y-4替换为内含的弹性空格
Tailwind space-y-4 使用: 与 CSS 相竞争的地方( ) (特异性 0) 装入硬刷新导致垂直间隔不一致。 内入 样式被嵌入 SSR HTML 并立即应用,独立于 外部 CSS 负载顺序 .
由 KamoCRM 的回路连接到/欢迎登陆页面
实际相会. {域}登陆页欢迎/index. html — 一个静态 HTML 页面由 nginx 直接服务, 处理前自动流量 (抓取显示名称/房间,验证,重定向到与JWT相会). 在WelcomePage.web.tsx中只添加了PoweredByKamo反应组件 制作在"满足"的捆绑版,而不是在这个静态着陆上。 在...
让"PoweredByKamo"与"kamo-login"相匹配——品牌颜色为白色
KamoMeet欢迎页面 已经把PoweredByKamo的回路接上 但它的造型仍然是 最初的低不透明度当前Color的治疗 这在视觉上太虚弱了 与Meet的欢迎页背景相反 符合卡莫-洛金/卡莫-注册者的治疗: - 文字: 始终为白色 - 休息时的背景: var( -- -- -- -- -- -- -- -- --...
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 ...