From b7d03ff367bfae835287fc9a976abe042d265f2d Mon Sep 17 00:00:00 2001 From: chenyifan01 Date: Wed, 30 Nov 2022 10:32:42 +0800 Subject: [PATCH] #3188 add active user list query api --- models/user.go | 32 ++++++++++++++++++++++ models/user_business_analysis.go | 6 +++++ routers/home.go | 18 +++++++++++++ routers/routes/routes.go | 7 ++++- services/repository/square.go | 46 ++++++++++++++++++++++++++++++++ 5 files changed, 108 insertions(+), 1 deletion(-) diff --git a/models/user.go b/models/user.go index b21858e37..ec636e000 100755 --- a/models/user.go +++ b/models/user.go @@ -198,6 +198,38 @@ type SearchOrganizationsOptions struct { All bool } +type User4Front struct { + ID int64 + LowerName string `xorm:"UNIQUE NOT NULL"` + Name string `xorm:"UNIQUE NOT NULL"` + FullName string + Email string `xorm:"NOT NULL"` + Language string `xorm:"VARCHAR(5)"` + Description string + RelAvatarLink string + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` +} + +func (u *User) ToFrontFormat() *User4Front { + uf := &User4Front{ + ID: u.ID, + LowerName: u.LowerName, + Name: u.Name, + FullName: u.FullName, + Email: u.Email, + Language: u.Language, + Description: u.Description, + CreatedUnix: u.CreatedUnix, + UpdatedUnix: u.UpdatedUnix, + } + if !u.KeepEmailPrivate { + uf.Email = u.Email + } + uf.RelAvatarLink = u.RelAvatarLink() + return uf +} + // GenerateRandomAvatar generates a random avatar for user. func (u *User) IsBindWechat() bool { return u.WechatOpenId != "" diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 394c24825..5ee79f16e 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -2424,3 +2424,9 @@ func GetContentFromPromote(url string) (string, error) { allLineStr := string(bytes) return allLineStr, nil } + +func QueryLast30DaysHighestIndexUsers(size int) ([]int64, error) { + userIds := make([]int64, 0) + err := xStatistic.Table("user_business_analysis_last30_day").Cols("id").OrderBy("user_index").Limit(size).Find(&userIds) + return userIds, err +} diff --git a/routers/home.go b/routers/home.go index 7b680bca0..f8363bb1a 100755 --- a/routers/home.go +++ b/routers/home.go @@ -317,6 +317,24 @@ func RepoSquare(ctx *context.Context) { resultMap["Repos"] = result ctx.JSON(http.StatusOK, response.SuccessWithData(resultMap)) } + +func ActiveUser(ctx *context.Context) { + var err error + var currentUserId int64 + if ctx.User != nil { + currentUserId = ctx.User.ID + } + result, err := repository.GetActiveUser4Square(currentUserId) + if err != nil { + log.Error("ActiveUser err. %v", err) + ctx.JSON(http.StatusOK, response.Success()) + return + } + resultMap := make(map[string]interface{}, 0) + resultMap["Users"] = result + ctx.JSON(http.StatusOK, response.SuccessWithData(resultMap)) +} + func RepoFind(ctx *context.Context) { keyword := strings.Trim(ctx.Query("q"), " ") topic := strings.Trim(ctx.Query("topic"), " ") diff --git a/routers/routes/routes.go b/routers/routes/routes.go index e902d10be..31d72a96b 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -372,7 +372,12 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/repos", func() { m.Get("", routers.ExploreRepos) - m.Get("/square", routers.RepoSquare) + m.Group("/square", func() { + m.Get("/tab", routers.RepoSquare) + m.Get("/active-user", routers.ActiveUser) + m.Get("/active-org", routers.RepoSquare) + }) + m.Get("/search", routers.RepoFind) }) m.Get("/datasets", routers.ExploreDatasets) diff --git a/services/repository/square.go b/services/repository/square.go index cb7b9e4db..4465cbe9b 100644 --- a/services/repository/square.go +++ b/services/repository/square.go @@ -144,3 +144,49 @@ func FindRepos(opts FindReposOptions) (*models.FindReposResponse, error) { PageSize: opts.PageSize, }, nil } + +type ActiveUser struct { + User *models.User4Front + Followed bool + ShowButton bool +} + +func GetActiveUser4Square(currentUserId int64) ([]*ActiveUser, error) { + result := make([]*ActiveUser, 0) + userIds, err := models.QueryLast30DaysHighestIndexUsers(10) + if err != nil { + log.Error("ActiveUser err. %v", err) + return result, err + } + if len(userIds) == 0 { + return result, nil + } + + users, err := models.GetUsersByIDs(userIds) + if err != nil { + return result, nil + } + usersMap := make(map[int64]*models.User) + for _, v := range users { + usersMap[v.ID] = v + } + + for i := 0; i < len(userIds); i++ { + userId := userIds[i] + user := usersMap[userId] + if user == nil { + continue + } + isFollowed := false + if currentUserId != 0 { + isFollowed = models.IsFollowing(currentUserId, userId) + } + a := &ActiveUser{ + Followed: isFollowed, + User: user.ToFrontFormat(), + ShowButton: currentUserId != userId, + } + result = append(result, a) + } + return result, nil +}