udpforwarding.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package repository
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "go.mongodb.org/mongo-driver/bson/primitive"
  9. "go.mongodb.org/mongo-driver/mongo"
  10. "time"
  11. )
  12. type UdpForWardingRepository interface {
  13. GetUdpForWarding(ctx context.Context, id int64) (*model.UdpForWarding, error)
  14. AddUdpForwarding(ctx context.Context, req *model.UdpForWarding) (int, error)
  15. EditUdpForwarding(ctx context.Context, req *model.UdpForWarding) error
  16. DeleteUdpForwarding(ctx context.Context, id int64) error
  17. GetUdpForwardingWafUdpIdById(ctx context.Context, id int) (int, error)
  18. GetUdpForwardingPortCountByHostId(ctx context.Context, hostId int) (int64, error)
  19. AddUdpForwardingIps(ctx context.Context, req model.UdpForwardingRule) (primitive.ObjectID, error)
  20. EditUdpForwardingIps(ctx context.Context, req model.UdpForwardingRule) error
  21. GetUdpForwardingIpsByID(ctx context.Context, udpId int) (*model.UdpForwardingRule, error)
  22. DeleteUdpForwardingIpsById(ctx context.Context, udpId int) error
  23. }
  24. func NewUdpForWardingRepository(
  25. repository *Repository,
  26. ) UdpForWardingRepository {
  27. return &udpForWardingRepository{
  28. Repository: repository,
  29. }
  30. }
  31. type udpForWardingRepository struct {
  32. *Repository
  33. }
  34. func (r *udpForWardingRepository) GetUdpForWarding(ctx context.Context, id int64) (*model.UdpForWarding, error) {
  35. var udpForWarding model.UdpForWarding
  36. if err := r.db.Where("id = ?", id).First(&udpForWarding).Error; err != nil {
  37. return nil, err
  38. }
  39. return &udpForWarding, nil
  40. }
  41. func (r *udpForWardingRepository) AddUdpForwarding(ctx context.Context, req *model.UdpForWarding) (int, error) {
  42. if err := r.db.Create(req).Error; err != nil {
  43. return 0, err
  44. }
  45. return req.Id, nil
  46. }
  47. func (r *udpForWardingRepository) EditUdpForwarding(ctx context.Context, req *model.UdpForWarding) error {
  48. if err := r.db.Updates(req).Error; err != nil {
  49. return err
  50. }
  51. return nil
  52. }
  53. func (r *udpForWardingRepository) DeleteUdpForwarding(ctx context.Context, id int64) error {
  54. if err := r.db.Where("id = ?", id).Delete(&model.UdpForWarding{}).Error; err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func (r *udpForWardingRepository) GetUdpForwardingWafUdpIdById(ctx context.Context, id int) (int, error) {
  60. var WafUdpId int
  61. if err := r.db.Model(&model.UdpForWarding{}).Where("id = ?", id).Select("waf_udp_id").Find(&WafUdpId).Error; err != nil {
  62. return 0, err
  63. }
  64. return WafUdpId, nil
  65. }
  66. func (r *udpForWardingRepository) GetUdpForwardingPortCountByHostId(ctx context.Context, hostId int) (int64, error) {
  67. var count int64
  68. if err := r.db.Model(&model.UdpForWarding{}).Where("host_id = ?", hostId).Count(&count).Error; err != nil {
  69. return 0, err
  70. }
  71. return count, nil
  72. }
  73. // mongodb 插入
  74. func (r *udpForWardingRepository) AddUdpForwardingIps(ctx context.Context, req model.UdpForwardingRule) (primitive.ObjectID, error) {
  75. collection := r.mongoDB.Collection("udp_forwarding_rules")
  76. req.CreatedAt = time.Now()
  77. result, err := collection.InsertOne(ctx, req)
  78. if err != nil {
  79. return primitive.NilObjectID, fmt.Errorf("插入MongoDB失败: %w", err)
  80. }
  81. // 返回插入文档的ID
  82. return result.InsertedID.(primitive.ObjectID), nil
  83. }
  84. func (r *udpForWardingRepository) EditUdpForwardingIps(ctx context.Context, req model.UdpForwardingRule) error {
  85. collection := r.mongoDB.Collection("udp_forwarding_rules")
  86. updateData := bson.M{}
  87. if req.Uid != 0 {
  88. updateData["uid"] = req.Uid
  89. }
  90. if req.HostId != 0 {
  91. updateData["host_id"] = req.HostId
  92. }
  93. if req.UdpId != 0 {
  94. updateData["udp_id"] = req.UdpId
  95. }
  96. if req.AccessRule != "" {
  97. updateData["access_rule"] = req.AccessRule
  98. }
  99. if len(req.BackendList) > 0 {
  100. updateData["backend_list"] = req.BackendList
  101. }
  102. if len(req.AllowIpList) > 0 {
  103. updateData["allow_ip_list"] = req.AllowIpList
  104. }
  105. if len(req.DenyIpList) > 0 {
  106. updateData["deny_ip_list"] = req.DenyIpList
  107. }
  108. // 始终更新更新时间
  109. updateData["updated_at"] = time.Now()
  110. // 如果没有任何字段需要更新,则直接返回
  111. if len(updateData) == 0 {
  112. return nil
  113. }
  114. // 执行更新
  115. update := bson.M{"$set": updateData}
  116. err := collection.UpdateOne(ctx, bson.M{"udp_id": req.UdpId}, update)
  117. if err != nil {
  118. return fmt.Errorf("更新MongoDB文档失败: %w", err)
  119. }
  120. return nil
  121. }
  122. func (r *udpForWardingRepository) GetUdpForwardingIpsByID(ctx context.Context, udpId int) (*model.UdpForwardingRule, error) {
  123. collection := r.mongoDB.Collection("udp_forwarding_rules")
  124. var result model.UdpForwardingRule
  125. err := collection.Find(ctx, bson.M{"udp_id": udpId}).One(&result)
  126. if err != nil {
  127. if errors.Is(err, mongo.ErrNoDocuments) {
  128. return nil, nil
  129. }
  130. return nil, fmt.Errorf("从MongoDB中获取文档失败: %w", err)
  131. }
  132. return &result, nil
  133. }
  134. func (r *udpForWardingRepository) DeleteUdpForwardingIpsById(ctx context.Context, udpId int) error {
  135. collection := r.mongoDB.Collection("udp_forwarding_rules")
  136. err := collection.Remove(ctx, bson.M{"host_id": udpId})
  137. if err != nil {
  138. if errors.Is(err, mongo.ErrNoDocuments) {
  139. return fmt.Errorf("记录不存在")
  140. }
  141. return fmt.Errorf("删除MongoDB文档失败: %w", err)
  142. }
  143. return nil
  144. }