From 1eee0179f1e42eb11e5151fe66e0f2cf107b80b1 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Thu, 3 Sep 2026 10:01:24 +0800 Subject: [PATCH] fix: return saved group nickname profile --- server/im_http.go | 20 ++++++++++++++------ server/im_http_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/server/im_http.go b/server/im_http.go index c3e04ab..023997e 100644 --- a/server/im_http.go +++ b/server/im_http.go @@ -4688,7 +4688,7 @@ func serveIMGroupMemberSettings(wrt http.ResponseWriter, req *http.Request, topi } func serveIMGroupMyProfile(wrt http.ResponseWriter, req *http.Request, topic string) { - if req.Method != http.MethodPut { + if req.Method != http.MethodPut && req.Method != http.MethodGet { writeIMError(wrt, req, http.StatusMethodNotAllowed, 30002, imReasonMethodNotAllowed, "method not allowed", nil) return } @@ -4696,6 +4696,19 @@ func serveIMGroupMyProfile(wrt http.ResponseWriter, req *http.Request, topic str if !ok { return } + private := groupPrivateMap(selfSub.Private) + currentVersion := intFromAny(private["profile_version"]) + if currentVersion <= 0 { + currentVersion = 1 + } + if req.Method == http.MethodGet { + writeIMSuccess(wrt, req, map[string]any{ + "nickname": stringFromAny(private["nickname"]), + "version": currentVersion, + "updated_at": stringFromAny(private["profile_updated_at"]), + }) + return + } var body imGroupMemberProfileUpdateRequest if !decodeIMJSONBody(wrt, req, &body) { return @@ -4705,11 +4718,6 @@ func serveIMGroupMyProfile(wrt http.ResponseWriter, req *http.Request, topic str writeIMError(wrt, req, http.StatusBadRequest, 30000, imReasonMalformedRequest, "malformed request", map[string]any{"field": "nickname"}) return } - private := groupPrivateMap(selfSub.Private) - currentVersion := intFromAny(private["profile_version"]) - if currentVersion <= 0 { - currentVersion = 1 - } if body.Version > 0 && body.Version != currentVersion { writeIMError(wrt, req, http.StatusConflict, 30006, "VERSION_CONFLICT", "version conflict", map[string]any{"current_version": currentVersion}) return diff --git a/server/im_http_test.go b/server/im_http_test.go index ccb55c8..e6ee1f8 100644 --- a/server/im_http_test.go +++ b/server/im_http_test.go @@ -3835,6 +3835,44 @@ func TestServeIMGroupMyProfileKeepsSubscriptionNicknameWhenBusinessMemberMissing } } +func TestServeIMGroupMyProfileGetReturnsSubscriptionNickname(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + expectIMBearer(t, ctrl, "token-1", 7, 42) + oldSubs := store.Subs + subs := mock_store.NewMockSubsPersistenceInterface(ctrl) + store.Subs = subs + defer func() { + store.Subs = oldSubs + }() + + subs.EXPECT().Get(types.TenantID(7), "grpAlpha", types.Uid(42), false).Return(&types.Subscription{ + TenantID: 7, + User: types.Uid(42).String(), + Topic: "grpAlpha", + ModeWant: types.ModeCFull, + ModeGiven: types.ModeCFull, + Private: map[string]any{ + "nickname": "Coffee 备注", + "profile_version": 3, + "profile_updated_at": "2026-09-03T01:00:00Z", + }, + }, nil) + + req := httptest.NewRequest(http.MethodGet, "/v1/im/groups/grpAlpha/members/me/profile", nil) + req.Header.Set("Authorization", "Bearer token-1") + rec := httptest.NewRecorder() + serveIMGroupResource(rec, req) + + if rec.Code != http.StatusOK { + t.Fatalf("profile get status: got %d body=%s", rec.Code, rec.Body.String()) + } + data := decodeIMHTTPResponse(t, rec).Data.(map[string]any) + if data["nickname"] != "Coffee 备注" || data["version"].(float64) != 3 || data["updated_at"] != "2026-09-03T01:00:00Z" { + t.Fatalf("unexpected profile get response: %#v", data) + } +} + func TestServeIMGroupLeave(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()