From 98d51c0604d9ad5fd368e12b7277d7d04a678c63 Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Sun, 22 Oct 2023 15:49:06 +0800 Subject: [PATCH] Feat: room hot list --- server/handlers/init.go | 2 ++ server/handlers/room.go | 65 ++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/server/handlers/init.go b/server/handlers/init.go index c0de0de..02152bd 100644 --- a/server/handlers/init.go +++ b/server/handlers/init.go @@ -51,6 +51,8 @@ func Init(e *gin.Engine) { room.GET("/check", CheckRoom) + room.GET("/hot", RoomHotList) + room.GET("/list", RoomList) needAuthUser.POST("/create", CreateRoom) diff --git a/server/handlers/room.go b/server/handlers/room.go index 983685e..df1fac3 100644 --- a/server/handlers/room.go +++ b/server/handlers/room.go @@ -56,7 +56,47 @@ func CreateRoom(ctx *gin.Context) { })) } +func RoomHotList(ctx *gin.Context) { + page, pageSize, err := GetPageAndPageSize(ctx) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + + r := op.GetAllRoomsInCacheWithoutHidden() + rs := vec.New[*model.RoomListResp](vec.WithCmpLess[*model.RoomListResp](func(v1, v2 *model.RoomListResp) bool { + return v1.PeopleNum < v2.PeopleNum + }), vec.WithCmpEqual[*model.RoomListResp](func(v1, v2 *model.RoomListResp) bool { + return v1.PeopleNum == v2.PeopleNum + })) + for _, v := range r { + rs.Push(&model.RoomListResp{ + RoomId: v.ID, + RoomName: v.Name, + PeopleNum: v.ClientNum(), + NeedPassword: v.NeedPassword(), + Creator: op.GetUserName(v.Room.CreatorID), + CreatedAt: v.Room.CreatedAt.UnixMilli(), + }) + } + + rs.SortStable() + if ctx.DefaultQuery("sort", "desc") == "desc" { + rs.Reverse() + } + + ctx.JSON(http.StatusOK, model.NewApiDataResp(gin.H{ + "total": rs.Len(), + "list": utils.GetPageItems(rs.Slice(), page, pageSize), + })) +} + func RoomList(ctx *gin.Context) { + order := ctx.Query("order") + if order == "" { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("order is required")) + return + } page, pageSize, err := GetPageAndPageSize(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) @@ -75,30 +115,7 @@ func RoomList(ctx *gin.Context) { total := 0 - switch ctx.DefaultQuery("order", "peopleNum") { - case "peopleNum": - r := op.GetAllRoomsInCacheWithoutHidden() - rs := vec.New[*model.RoomListResp](vec.WithCmpLess[*model.RoomListResp](func(v1, v2 *model.RoomListResp) bool { - return v1.PeopleNum < v2.PeopleNum - }), vec.WithCmpEqual[*model.RoomListResp](func(v1, v2 *model.RoomListResp) bool { - return v1.PeopleNum == v2.PeopleNum - })) - for _, v := range r { - rs.Push(&model.RoomListResp{ - RoomId: v.ID, - RoomName: v.Name, - PeopleNum: v.ClientNum(), - NeedPassword: v.NeedPassword(), - Creator: op.GetUserName(v.Room.CreatorID), - CreatedAt: v.Room.CreatedAt.UnixMilli(), - }) - } - rs.SortStable() - if desc { - rs.Reverse() - } - total = rs.Len() - resp = utils.GetPageItems(rs.Slice(), page, pageSize) + switch order { case "createdAt": if desc { scopes = append(scopes, db.OrderByCreatedAtDesc)