将非候选成员排除在聊天参与和路由之外
非理事成员不得作为或作为 作为现场聊天的参与者 打开共享- lib 上的每个聊天路径 **************** 上游 : - DM 创建 / 组查找或创建 / 添加成员拒绝或放弃非竞争性 在创建媒体会议成员行之前设定目标。 - 会话成员/接收名册和聊天名单名册隐藏非竞争性 成员来自其他参加者(电话员自己的一行...
解决公共聊天系统成员( 将硬码的snadjafinia 化名)
创建支持会话, 创建 PublicTicket, 和所有者通知 帮助者全部通过硬码解析 Org 的“ 系统成员 ” 用户名Alias="snadjafinia"的查询,该查询只存在于 KamoCRM 上 种子 Org – 每个租户 Org 的公开聊天会扔出“ Org 拥有者成员不是 ” 发现。" 替换为 OrgOwne...
停止将信件内容放入 message 邮件
删除信件预览计算、分类账 PREVIEW 写入以及 消息预览模板变量; 放弃包含的预览偏好 。 电子邮件现在只载发件人+计数+CTA——内容在签入后读取.
通过目标更新, 坚持预定的缩略语标记
与转换管道相同的分离实体孤儿Removal问题:无头扫荡 持有分离的 ImgDat 并保存( )/ 相接( ) 级联到图像收藏中 。 使用 **************** 换句话说.
环绕记录上传, 所以 Media Service 编译
MinIOStorage Service.upload 扔出一个检查过的例外,但摄入( ) 也没有 被逮住或被宣布... ...在"嘉宾"的上方建立休息室 把它包起来 重排为运行时的例外, 因此上传失败会回滚@ Transactal .
Meeting Participant.isGuest () (被Guest 获得,不会编译); 重新将转录到通用终点
约会参与者曝光是Guest() (原始布尔语),而不是Guest()。 并在共享/api/转换/trancis中标注简要转录调用.
坚持邀请的参与者, 执行 MANAGE MEET SETTINGS, 放弃双输入路径
- 创建会议:邀请成员是数字雪花ID,而不是UUID字符串 - 像创建者一样通过长的TOUID。 之前的UUID,来自String 每个受邀者都被扔了,所以没有一个被记录为参与者。 - 满足Config Captain: 在所有写作上要求管理 MEET SETTINGS(配置 PUT, 背景上传/删除/重排). 读者对...
在交易承诺修正图像附件种族后公布 NATS CREATE 事件
NATS消息在@Transactional机构内发布,这意味着 收件人可以接收 CREATE 事件并通过 /image/proxy/{objImgId}在DB显示媒体ObjImg行之前, 导致404个图像渲染,直到聊天重新开始。 现在使用QQ,所以NATS只发布 一旦长期承诺进行DB交易,就会开火.
Serialize attachments in WS relay and message history; allow attachment-only sends
Three bugs fixed: 1. ChatSessionSubscriptionManager was building the STOMP messageMap manually and omitting attachments, sourceLanguageId, readMemberId, msg...
Fix NPE in getChatSessions from Map.of() rejecting null nextcoder
java.util.Map.of() throws NullPointerException when nextcoder is null (no more pages). Replace with HashMap that accepts null values. Also wrap entire handler i...
Fix upload 500 (missing EmbRecordState) and empty chats tab (Timestamp cast)
Defect A: ChatAttachmentService.upload omitted **************** causing a NOT NULL violation on imgs.is_active. Added the default recordState. Also hardened Cha...
Prefer usernameAlias over User.name in memberDisplayName
Switches display name priority to: Member.usernameAlias → User.name → User.alias → User.username. Also includes the paged query dispatch fix from the previous c...
Use split First/After queries for chat sessions paged endpoint
Addresses empty Chats tab by dispatching to ****************
Raise client read timeout to 120s for long messages
LibreTranslate runs CPU-only argos models — a paragraph-length chat message takes 20-30s to translate, and longer ones can push past 60s. The 8-second read time...
在 Redis 按会话 GUID 跟踪公共支持聊天
销售游客使用/ws/公-聊天-native 没有会员Id;门票仍然 将占位符成员作为请求者。 倍增强度 PUBLIC 公用STOMP连接/断接的密钥,广播会议 并返回成员+来自请求者-snapshot的会话地图。 心跳扩展 TTL 公开会议.
扩展 JPA 仓库扫描以包含商务包
新的 Kamo 共享图书馆带来 QQ 要求 **************** (中文(简体) ). Media Service只扫描了 donofy.dao.repos,所以豆子不见了 而应用程序无法启动 。 镜像更大的扫描 警卫 服务用途.
在 ChatWebSocket 控制器中恢复 HashMap 导入
上一个重构件已删除 HashMap 导入, 但手柄已切换 方法仍然为打字事件有效载荷构建一个 HashMap,导致 以“ 找不到符号: 类 HashMap” 来失败的 Forgejo 构建 .
在会话创建时主动创建NATS消费者,以防止信息丢失
之前,NATS JetStream 推力消费者只在一个STOMP客户端时创建. 发送/应用/聊天/订阅。 执行政策。 新建, 任何信件发布于 消费者的存在是永久的丢失——导致访客留言和姓名更改。 除非代理商碰巧先被订阅,否则绝不会在卡莫内部出现. - 将NATS订阅逻辑摘录到聊天会订阅管理器(专有) 确保订阅,将ID...
从核心 NATS 中继主题提供
匹配安全服务核心发布: 与调度器订阅 security.them.profile.* 而不是 JetStream(流只覆盖聊天).
在访客票上使用 PublicChatVisitor 显示Name 用于请求者Name
访客推出的门票 硬码请求员到Org系统成员,所以 DTO在请求者栏上刻出兽人所有者的名字。 坠落 返回到 PublicChatVisitor.display Name 当可用时,列表会显示 实际访客(匿名或姓名).
在 GeoLookupService 中建立错误, 并为代理信件添加 NATS 发布
- 在 QQ 中修复可选 vs 列表类型不匹配 - 向媒体管理员提供新闻服务 - 发布到聊天. session.{guid} 之后代理生成一个消息,所以两者都是 代理和访客在不刷新页面的情况下通过STOMP实时看到
Real-time chat delivery, message sides, notifications, and name sync
- Keep NATS subscription alive on client unsubscribe to avoid breaking agent real-time delivery - Tag visitor messages with messageType=VISITOR_MESSAGE in getMe...
将访问者信件标记为 VISTOR MESSAGE 类型, 添加发送者Name 以获取信件
- PublicChatService: 设置消息Type=VISITOR MESSAGE 这样前端可以区分 访问者回应代理商对STOMP专题的回应 - 媒体管理员。 名称字段, 使代理员看到是谁发送的 在 TicketChat 中装入聊天历史时每封消息
Three support/chat issues — NATS relay, auto-popup, topic fallback
1. Switch SupportNotificationService and SupportStompRelayController from JetStream to core NATS — the CHAT_MESSAGES stream only covers chat.> so JetStrea...
Write contact form description as chat message on public ticket creation
The description was only stored on the ticket entity and never appeared in the chat window. Added writeTextMessage() helper and call it after the system event s...
Add debug logging and robust rights parsing for webinar controller
Adds info/warn logging for session data and rights on POST /types to diagnose 403 errors. Also adds fallback parsing for rights stored as JSON strings in Redis ...
Resolve org theme backgrounds not appearing in meet virtual backgrounds
- Add domain-based theme URL resolution for internal K8s service-to-service calls - getPublicBackgrounds now accepts optional domain param to derive correct the...
Upload meet backgrounds to public MinIO bucket with hash-based naming
Was uploading to private 'imaging-meet-recordings' bucket via **************** which caused: - MinIO region mismatch errors on the primary node - Connection tim...
Return serialization-safe Maps instead of raw JPA entities in MeetConfigController
All config/background endpoints were returning raw JPA entities with @ManyToOne(fetch=LAZY) Organization references. Jackson failed to serialize the Hibernate p...
Remove duplicate endpoints from MeetController, add org-themes to MeetConfigController
MeetConfigController already handled config/background endpoints. The duplicate endpoints in MeetController caused ambiguous mapping. Added org-theme background...
Update health probes to HTTP port 80 to match new server config
Startup, readiness, and liveness probes were still pointing to port 8443 with HTTPS scheme, causing pod restart loops.
Switch MediaService to HTTP port 80 — TLS termination at Traefik
Internal cluster traffic doesn't need HTTPS. Traefik handles TLS for external clients. This aligns MediaService with all other services.
Send chat invites to correct WebSocket topic /topic/chat/incoming/{memberId}
Was publishing to /topic/chat/member/{id} but kamo-internal subscribes to /topic/chat/incoming/{id}. Also fixed Member entity field access **************** inst...
将voip. > 添加到 NATS 流主题中, 并在 VoipStompRelay 控制器中处理非法状态例外
NATS 流只覆盖了聊天. > 因此订阅了voip. " 丢弃 非法状态例外([SUB-90007]) 没有匹配的流). 已添加发音。 " 将两个学科都包括在内,并扩大 抓取块以包含非法状态排除,防止启动失败 如果该流没有可用.
接受 *** 从查询参数获取跨子域 WebSocket 认证
先从 ? QQ 查询参数读取 *** ID, 返回到 饼干 这样可以让内部.kamocrm.com的前端认证 WebSocket连接到media.kamocrm.com 没有跨域饼干. 截取器直接对Redis验证会话.
处理Stale NATS 消费者与独特的消费者重试
- 提取信件处理器到创建 NatsMessageHandler () 方法 - 在“消费者已经绑定”时, 添加带有独有消费名称的重试逻辑 服务器重新启动后发生错误 - 清理动词调试记录
端口443处通过Traefik的WebSocket路线
- service.yaml: 固定端口 80–8443 以匹配 pock 的实际收听端口 - ingressroute.yaml: 后端使用方案 https + 端口 8443 - 服务器 transport.yaml: 为后端 TLS 证书添加不安全的SkipVify - 删除NodePort服务-websocke...
为 NATS 连接使用集群- 内部 DNS
将默认 NATS URL 从 WireGuard IPs (100. 64.x.x) 更改为 nats.kamo.svc. cluster. 本地服务器的本地化. 远程节点 (k0m1,k2m1)仍然保留在有线卫视IP上.
在媒体服务部署中使 TLS 证书具有可选性
- 添加可选内容:对通配符-kamocrm-com 密卷的真实性 - 更新证书转换器内容器,以优雅地处理缺失证书
