whitelist.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. "github.com/mhaya/game/game_cluster/internal/code"
  7. "github.com/mhaya/game/game_cluster/internal/mdb"
  8. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  9. "github.com/mhaya/game/game_cluster/nodes/webadmin/common"
  10. "github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
  11. mhayaLogger "github.com/mhaya/logger"
  12. "go.mongodb.org/mongo-driver/bson"
  13. "go.mongodb.org/mongo-driver/mongo"
  14. "go.mongodb.org/mongo-driver/mongo/options"
  15. )
  16. type Whitelist struct {
  17. }
  18. func NewWhitelist() *Whitelist {
  19. return &Whitelist{}
  20. }
  21. // Add 添加IP白名单
  22. func (w *Whitelist) Add(req entity.WhitelistAddReq) *code.Result {
  23. whitelistModel := models.Whitelist{}
  24. collection := mdb.MDB.Collection(whitelistModel.TableName())
  25. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  26. defer cancel()
  27. // 判断是否已经存在
  28. err := collection.FindOne(ctx, bson.M{"ip": req.IP}).Decode(&whitelistModel)
  29. if err == nil {
  30. mhayaLogger.Warnf("IP %s already exists in the whitelist", req.IP)
  31. return nil
  32. }
  33. _, err = collection.InsertOne(ctx, bson.M{
  34. "ip": req.IP,
  35. "created_at": time.Now().Unix(),
  36. "updated_at": time.Now().Unix(),
  37. "desc": req.Desc,
  38. })
  39. if err != nil {
  40. mhayaLogger.Warnf("Add inserting IP %s into whitelist error: %v", req.IP, err)
  41. if errors.Is(err, mongo.ErrNoDocuments) {
  42. mhayaLogger.Warnf("IP %s already exists in the whitelist", req.IP)
  43. return nil
  44. }
  45. mhayaLogger.Warnf("Add InsertOne error:%v", err)
  46. return common.NewResult(code.InternalError)
  47. }
  48. return nil
  49. }
  50. // Remove 删除IP白名单
  51. func (w *Whitelist) Remove(req entity.WhitelistRemoveReq) *code.Result {
  52. whitelistModel := models.Whitelist{}
  53. collection := mdb.MDB.Collection(whitelistModel.TableName())
  54. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  55. defer cancel()
  56. _, err := collection.DeleteOne(ctx, bson.M{"ip": req.IP})
  57. if err != nil {
  58. mhayaLogger.Warnf("Remove DeleteOne error:%v", err)
  59. return common.NewResult(code.InternalError)
  60. }
  61. return nil
  62. }
  63. // Check 检查IP是否在白名单中
  64. func (w *Whitelist) Check(ip string) *code.Result {
  65. whitelistModel := models.Whitelist{}
  66. collection := mdb.MDB.Collection(whitelistModel.TableName())
  67. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  68. defer cancel()
  69. // 判断是否已经存在
  70. err := collection.FindOne(ctx, bson.M{"ip": ip}).Decode(&whitelistModel)
  71. if err == nil {
  72. mhayaLogger.Warnf("Check FindOne error:%v", err)
  73. return common.NewResult(code.InternalError)
  74. }
  75. return nil
  76. }
  77. // GetAll 获取所有白名单数据
  78. func (w *Whitelist) GetAll(req entity.WhitelistListReq) (*entity.WhitelistListResp, *code.Result) {
  79. // 定义集合
  80. whitelistModel := models.Whitelist{}
  81. collection := mdb.MDB.Collection(whitelistModel.TableName())
  82. // 设置上下文
  83. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  84. defer cancel()
  85. // 解析分页参数
  86. page := req.Page
  87. pageSize := req.Size
  88. if page == 0 {
  89. page = 1
  90. }
  91. if pageSize == 0 {
  92. pageSize = 10
  93. }
  94. // 设置分页选项
  95. skip := (page - 1) * pageSize
  96. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(pageSize))
  97. count, err := collection.CountDocuments(ctx, bson.D{})
  98. if err != nil {
  99. mhayaLogger.Warnf("GetAll CountDocuments error:%v", err)
  100. return nil, common.NewResult(code.InternalError)
  101. }
  102. // 查询数据库
  103. var results []models.Whitelist
  104. cursor, err := collection.Find(ctx, bson.D{}, findOptions)
  105. if err != nil {
  106. mhayaLogger.Warnf("GetAll Find error:%v", err)
  107. return nil, common.NewResult(code.InternalError)
  108. }
  109. defer cursor.Close(ctx)
  110. // 解析查询结果
  111. for cursor.Next(ctx) {
  112. var whitelist models.Whitelist
  113. if err := cursor.Decode(&whitelist); err != nil {
  114. mhayaLogger.Warnf("GetAll Decode error:%v", err)
  115. return nil, common.NewResult(code.InternalError)
  116. }
  117. results = append(results, whitelist)
  118. }
  119. if err := cursor.Err(); err != nil {
  120. mhayaLogger.Warnf("GetAll cursor error:%v", err)
  121. return nil, common.NewResult(code.InternalError)
  122. }
  123. return &entity.WhitelistListResp{
  124. Details: results,
  125. Total: count,
  126. }, nil
  127. }