From 7d653359e12b7e048135ff6e119d499e14561e33 Mon Sep 17 00:00:00 2001 From: zhenghaoz Date: Sat, 29 Nov 2025 00:31:58 +0800 Subject: [PATCH] Fix GET user neighbors APIs --- server/rest.go | 11 +++++++++-- server/rest_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/server/rest.go b/server/rest.go index 68d4a3232..2fb8c20da 100644 --- a/server/rest.go +++ b/server/rest.go @@ -476,7 +476,7 @@ func (s *RestServer) CreateWebService() { Returns(http.StatusOK, "OK", []cache.Score{}). Writes([]cache.Score{})) // Get user-to-user recommendation - ws.Route(ws.GET("/user-to-user/neighbors/{user-id}").To(s.getUserNeighbors). + ws.Route(ws.GET("/user-to-user/{name}/{user-id}").To(s.getUserToUser). Doc("Get user-to-user recommendation."). Metadata(restfulspec.KeyOpenAPITags, []string{RecommendationAPITag}). Param(ws.HeaderParameter("X-API-Key", "API key").DataType("string")). @@ -706,6 +706,13 @@ func (s *RestServer) getItemToItem(request *restful.Request, response *restful.R s.SearchDocuments(cache.ItemToItem, cache.Key(name, itemId), categories, nil, request, response) } +func (s *RestServer) getUserToUser(request *restful.Request, response *restful.Response) { + name := request.PathParameter("name") + userId := request.PathParameter("user-id") + s.SetLastModified(request, response, cache.Key(cache.UserToUserUpdateTime, name, userId)) + s.SearchDocuments(cache.UserToUser, cache.Key(name, userId), nil, nil, request, response) +} + func (s *RestServer) SetLastModified(request *restful.Request, response *restful.Response, key string) { lastModified, err := s.CacheClient.Get(request.Request.Context(), key).Time() if err != nil { @@ -771,7 +778,7 @@ func (s *RestServer) getUserNeighbors(request *restful.Request, response *restfu } else { name := s.Config.Recommend.UserToUser[0].Name s.SetLastModified(request, response, cache.Key(cache.UserToUserUpdateTime, name, userId)) - s.SearchDocuments(cache.UserToUser, cache.Key(name, userId), []string{""}, nil, request, response) + s.SearchDocuments(cache.UserToUser, cache.Key(name, userId), nil, nil, request, response) } } diff --git a/server/rest_test.go b/server/rest_test.go index c547d7bf9..8ff896254 100644 --- a/server/rest_test.go +++ b/server/rest_test.go @@ -813,6 +813,49 @@ func (suite *ServerTestSuite) TestNonPersonalizedRecommend() { } } +func (suite *ServerTestSuite) TestUserToUser() { + ctx := context.Background() + suite.Config.Recommend.UserToUser = []config.UserToUserConfig{{Name: "default"}} + err := suite.CacheClient.AddScores(ctx, cache.UserToUser, cache.Key("default", "0"), []cache.Score{ + {Id: "1", Score: 100}, + {Id: "2", Score: 99}, + {Id: "3", Score: 98}, + {Id: "4", Score: 97}, + {Id: "5", Score: 96}, + }) + suite.NoError(err) + + apitest.New(). + Handler(suite.handler). + Get("/api/user-to-user/default/0"). + Header("X-API-Key", apiKey). + Expect(suite.T()). + Status(http.StatusOK). + Body(suite.marshal([]cache.Score{ + {Id: "1", Score: 100}, + {Id: "2", Score: 99}, + {Id: "3", Score: 98}, + {Id: "4", Score: 97}, + {Id: "5", Score: 96}, + })). + End() + + apitest.New(). + Handler(suite.handler). + Get("/api/user/0/neighbors"). + Header("X-API-Key", apiKey). + Expect(suite.T()). + Status(http.StatusOK). + Body(suite.marshal([]cache.Score{ + {Id: "1", Score: 100}, + {Id: "2", Score: 99}, + {Id: "3", Score: 98}, + {Id: "4", Score: 97}, + {Id: "5", Score: 96}, + })). + End() +} + func (suite *ServerTestSuite) TestDeleteFeedback() { t := suite.T() // Insert feedback