whitelist.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 && !errors.Is(err, mongo.ErrNoDocuments) {
  30. mhayaLogger.Warnf("Add InsertOne error:%v", err)
  31. return common.NewResult(code.InternalError)
  32. }
  33. if errors.Is(err, mongo.ErrNoDocuments) {
  34. _, err = collection.InsertOne(ctx, bson.M{
  35. "ip": req.IP,
  36. "created_at": time.Now().Unix(),
  37. "updated_at": time.Now().Unix(),
  38. "desc": req.Desc,
  39. })
  40. if err != nil {
  41. mhayaLogger.Warnf("Add InsertOne error:%v", err)
  42. return common.NewResult(code.InternalError)
  43. }
  44. }
  45. return nil
  46. }
  47. // Remove 删除IP白名单
  48. func (w *Whitelist) Remove(req entity.WhitelistRemoveReq) *code.Result {
  49. whitelistModel := models.Whitelist{}
  50. collection := mdb.MDB.Collection(whitelistModel.TableName())
  51. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  52. defer cancel()
  53. _, err := collection.DeleteOne(ctx, bson.M{"ip": req.IP})
  54. if err != nil {
  55. mhayaLogger.Warnf("Remove DeleteOne error:%v", err)
  56. return common.NewResult(code.InternalError)
  57. }
  58. return nil
  59. }
  60. // Check 检查IP是否在白名单中
  61. func (w *Whitelist) Check(ip string) *code.Result {
  62. whitelistModel := models.Whitelist{}
  63. collection := mdb.MDB.Collection(whitelistModel.TableName())
  64. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  65. defer cancel()
  66. // 判断是否已经存在
  67. err := collection.FindOne(ctx, bson.M{"ip": ip}).Decode(&whitelistModel)
  68. if err == nil {
  69. mhayaLogger.Warnf("Check FindOne error:%v", err)
  70. return common.NewResult(code.InternalError)
  71. }
  72. return nil
  73. }
  74. // GetAll 获取所有白名单数据
  75. func (w *Whitelist) GetAll(req entity.WhitelistListReq) (*entity.WhitelistListResp, *code.Result) {
  76. // 定义集合
  77. whitelistModel := models.Whitelist{}
  78. collection := mdb.MDB.Collection(whitelistModel.TableName())
  79. // 设置上下文
  80. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  81. defer cancel()
  82. // 解析分页参数
  83. page, pageSize := checkPageParam(req.Page, req.Size)
  84. // 设置分页选项
  85. skip := (page - 1) * pageSize
  86. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(pageSize))
  87. count, err := collection.CountDocuments(ctx, bson.D{})
  88. if err != nil {
  89. mhayaLogger.Warnf("GetAll CountDocuments error:%v", err)
  90. return nil, common.NewResult(code.InternalError)
  91. }
  92. // 查询数据库
  93. var results []models.Whitelist
  94. cursor, err := collection.Find(ctx, bson.D{}, findOptions)
  95. if err != nil {
  96. mhayaLogger.Warnf("GetAll Find error:%v", err)
  97. return nil, common.NewResult(code.InternalError)
  98. }
  99. defer cursor.Close(ctx)
  100. // 解析查询结果
  101. for cursor.Next(ctx) {
  102. var whitelist models.Whitelist
  103. if err := cursor.Decode(&whitelist); err != nil {
  104. mhayaLogger.Warnf("GetAll Decode error:%v", err)
  105. return nil, common.NewResult(code.InternalError)
  106. }
  107. results = append(results, whitelist)
  108. }
  109. if err := cursor.Err(); err != nil {
  110. mhayaLogger.Warnf("GetAll cursor error:%v", err)
  111. return nil, common.NewResult(code.InternalError)
  112. }
  113. return &entity.WhitelistListResp{
  114. Details: results,
  115. Total: count,
  116. }, nil
  117. }