outbound.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package service
  2. import (
  3. "x-ui/database"
  4. "x-ui/database/model"
  5. "x-ui/logger"
  6. "x-ui/xray"
  7. "gorm.io/gorm"
  8. )
  9. type OutboundService struct {
  10. }
  11. func (s *OutboundService) AddTraffic(traffics []*xray.Traffic, clientTraffics []*xray.ClientTraffic) (error, bool) {
  12. var err error
  13. db := database.GetDB()
  14. tx := db.Begin()
  15. defer func() {
  16. if err != nil {
  17. tx.Rollback()
  18. } else {
  19. tx.Commit()
  20. }
  21. }()
  22. err = s.addOutboundTraffic(tx, traffics)
  23. if err != nil {
  24. return err, false
  25. }
  26. return nil, false
  27. }
  28. func (s *OutboundService) addOutboundTraffic(tx *gorm.DB, traffics []*xray.Traffic) error {
  29. if len(traffics) == 0 {
  30. return nil
  31. }
  32. var err error
  33. for _, traffic := range traffics {
  34. if traffic.IsOutbound {
  35. var outbound model.OutboundTraffics
  36. err = tx.Model(&model.OutboundTraffics{}).Where("tag = ?", traffic.Tag).
  37. FirstOrCreate(&outbound).Error
  38. if err != nil {
  39. return err
  40. }
  41. outbound.Tag = traffic.Tag
  42. outbound.Up = outbound.Up + traffic.Up
  43. outbound.Down = outbound.Down + traffic.Down
  44. outbound.Total = outbound.Up + outbound.Down
  45. err = tx.Save(&outbound).Error
  46. if err != nil {
  47. return err
  48. }
  49. }
  50. }
  51. return nil
  52. }
  53. func (s *OutboundService) GetOutboundsTraffic() ([]*model.OutboundTraffics, error) {
  54. db := database.GetDB()
  55. var traffics []*model.OutboundTraffics
  56. err := db.Model(model.OutboundTraffics{}).Find(&traffics).Error
  57. if err != nil {
  58. logger.Warning(err)
  59. return nil, err
  60. }
  61. return traffics, nil
  62. }
  63. func (s *OutboundService) ResetOutboundTraffic(tag string) error {
  64. db := database.GetDB()
  65. whereText := "tag "
  66. if tag == "-alltags-" {
  67. whereText += " <> ?"
  68. } else {
  69. whereText += " = ?"
  70. }
  71. result := db.Model(model.OutboundTraffics{}).
  72. Where(whereText, tag).
  73. Updates(map[string]interface{}{"up": 0, "down": 0, "total": 0})
  74. err := result.Error
  75. if err != nil {
  76. return err
  77. }
  78. return nil
  79. }