fix: 修复P2P主题别名订阅的兼容性问题
1. 订阅重复检查新增Original与RcptTo匹配判断,避免别名订阅误判已订阅 2. 重构订阅get查询处理逻辑,提取为独立函数 3. 针对P2P别名订阅场景返回200响应而非304,帮助客户端完成别名到标准主题名的重命名,避免发布失败 4. 优化群摘要接口的权限校验和异常处理逻辑
This commit is contained in:
+25
-2
@@ -5944,17 +5944,40 @@ func serveIMGroupSummary(wrt http.ResponseWriter, req *http.Request, topic strin
|
||||
writeIMError(wrt, req, http.StatusMethodNotAllowed, 30002, imReasonMethodNotAllowed, "method not allowed", nil)
|
||||
return
|
||||
}
|
||||
principal, selfSub, ok := requireIMGroupMember(wrt, req, topic, true)
|
||||
principal, ok := authenticateIMHTTPBearer(wrt, req)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if types.GetTopicCat(topic) != types.TopicCatGrp {
|
||||
writeIMError(wrt, req, http.StatusBadRequest, 30000, imReasonMalformedRequest, "malformed request", map[string]any{"field": "topic"})
|
||||
return
|
||||
}
|
||||
// 已解散的群按文档约定对客户端表现为不存在(RESOURCE_NOT_FOUND),不暴露解散状态。
|
||||
if settings, err := store.GroupBusiness.GetSettings(principal.TenantID, topic); err == nil &&
|
||||
settings != nil && settings.GroupStatus == types.GroupStatusDissolved {
|
||||
writeIMError(wrt, req, http.StatusNotFound, 30004, imReasonResourceNotFound, "group not found", nil)
|
||||
return
|
||||
}
|
||||
selfSub, err := store.Subs.Get(principal.TenantID, topic, principal.Uid, false)
|
||||
if err != nil {
|
||||
writeIMError(wrt, req, http.StatusInternalServerError, 90000, imReasonInternal, "internal error", nil)
|
||||
return
|
||||
}
|
||||
access := types.ModeNone
|
||||
if selfSub != nil {
|
||||
access = selfSub.ModeGiven & selfSub.ModeWant
|
||||
}
|
||||
if selfSub == nil || !access.IsJoiner() || !access.IsReader() {
|
||||
writeIMError(wrt, req, http.StatusForbidden, 30005, imReasonPermissionDenied, "topic permission required", nil)
|
||||
return
|
||||
}
|
||||
requests, _, _ := store.GroupBusiness.ListJoinRequests(principal.TenantID, topic, types.GroupJoinRequestStatusPending, "", 100)
|
||||
announcement, _ := store.GroupBusiness.LatestAnnouncement(principal.TenantID, topic)
|
||||
writeIMSuccess(wrt, req, map[string]any{
|
||||
"topic": topic,
|
||||
"pending_join_request_count": len(requests),
|
||||
"announcement": groupAnnouncementPayload(announcement),
|
||||
"permissions": groupPermissions(selfSub.ModeGiven & selfSub.ModeWant),
|
||||
"permissions": groupPermissions(access),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user