outbound.go 1.9 KB

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