tcpforwarding.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 TcpforwardingRepository interface {
  13. GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error)
  14. AddTcpforwarding(ctx context.Context, req *model.Tcpforwarding) (int, error)
  15. EditTcpforwarding(ctx context.Context, req *model.Tcpforwarding) error
  16. DeleteTcpforwarding(ctx context.Context, id int64) error
  17. GetTcpforwardingWafTcpIdById(ctx context.Context, id int) (int, error)
  18. GetTcpForwardingPortCountByHostId(ctx context.Context, hostId int) (int64, error)
  19. AddTcpforwardingIps(ctx context.Context,req model.TcpForwardingRule) (primitive.ObjectID, error)
  20. EditTcpforwardingIps(ctx context.Context, req model.TcpForwardingRule) error
  21. GetTcpForwardingIpsByID(ctx context.Context, tcpId int) (*model.TcpForwardingRule, error)
  22. DeleteTcpForwardingIpsById(ctx context.Context, tcpId int) error
  23. }
  24. func NewTcpforwardingRepository(
  25. repository *Repository,
  26. ) TcpforwardingRepository {
  27. return &tcpforwardingRepository{
  28. Repository: repository,
  29. }
  30. }
  31. type tcpforwardingRepository struct {
  32. *Repository
  33. }
  34. func (r *tcpforwardingRepository) GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error) {
  35. var tcpforwarding model.Tcpforwarding
  36. if err := r.db.Where("id = ?", id).First(&tcpforwarding).Error; err != nil {
  37. return nil, err
  38. }
  39. return &tcpforwarding, nil
  40. }
  41. func (r *tcpforwardingRepository) AddTcpforwarding(ctx context.Context, req *model.Tcpforwarding) (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 *tcpforwardingRepository) EditTcpforwarding(ctx context.Context, req *model.Tcpforwarding) error {
  48. if err := r.db.Updates(req).Error; err != nil {
  49. return err
  50. }
  51. return nil
  52. }
  53. func (r *tcpforwardingRepository) DeleteTcpforwarding(ctx context.Context, id int64) error {
  54. if err := r.db.Where("id = ?", id).Delete(&model.Tcpforwarding{}).Error; err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func (r *tcpforwardingRepository) GetTcpforwardingWafTcpIdById(ctx context.Context, id int) (int, error) {
  60. var WafTcpId int
  61. if err := r.db.Model(&model.Tcpforwarding{}).Where("id = ?", id).Select("waf_tcp_id").Find(&WafTcpId).Error; err != nil {
  62. return 0, err
  63. }
  64. return WafTcpId, nil
  65. }
  66. func (r *tcpforwardingRepository) GetTcpForwardingPortCountByHostId(ctx context.Context, hostId int) (int64, error) {
  67. var count int64
  68. if err := r.db.Model(&model.Tcpforwarding{}).Where("host_id = ?", hostId).Count(&count).Error; err != nil {
  69. return 0, err
  70. }
  71. return count, nil
  72. }
  73. //mongodb 插入
  74. func (r *tcpforwardingRepository) AddTcpforwardingIps(ctx context.Context,req model.TcpForwardingRule) (primitive.ObjectID, error) {
  75. collection := r.mongoDB.Collection("tcp_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 *tcpforwardingRepository) EditTcpforwardingIps(ctx context.Context, req model.TcpForwardingRule) error {
  85. collection := r.mongoDB.Collection("tcp_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.TcpId != 0 {
  94. updateData["tcp_id"] = req.TcpId
  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{"tcp_id": req.TcpId}, update)
  117. if err != nil {
  118. if errors.Is(err, mongo.ErrNoDocuments) {
  119. return fmt.Errorf("记录不存在")
  120. }
  121. return fmt.Errorf("更新MongoDB文档失败: %w", err)
  122. }
  123. return nil
  124. }
  125. func (r *tcpforwardingRepository) GetTcpForwardingIpsByID(ctx context.Context, tcpId int) (*model.TcpForwardingRule, error) {
  126. collection := r.mongoDB.Collection("tcp_forwarding_rules")
  127. var res model.TcpForwardingRule
  128. err := collection.Find(ctx, bson.M{"tcp_id": tcpId}).One(&res)
  129. if err != nil {
  130. if errors.Is(err, mongo.ErrNoDocuments) {
  131. return nil, fmt.Errorf("记录不存在")
  132. }
  133. return nil, fmt.Errorf("查询MongoDB失败: %w", err)
  134. }
  135. return &res, nil
  136. }
  137. func (r *tcpforwardingRepository) DeleteTcpForwardingIpsById(ctx context.Context, tcpId int) error {
  138. collection := r.mongoDB.Collection("tcp_forwarding_rules")
  139. err := collection.Remove(ctx, bson.M{"tcp_id": tcpId})
  140. if err != nil {
  141. if errors.Is(err, mongo.ErrNoDocuments) {
  142. return fmt.Errorf("记录不存在")
  143. }
  144. return fmt.Errorf("删除MongoDB文档失败: %w", err)
  145. }
  146. return nil
  147. }