1
0

tuic_traffic_receipt.go 925 B

1234567891011121314151617181920212223242526272829303132
  1. package service
  2. import (
  3. "errors"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/clause"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database"
  7. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  8. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  9. )
  10. // AddTuicTrafficBatch commits a journal batch and its receipt atomically. A
  11. // retained journal can therefore be replayed after an ambiguous commit result.
  12. func (s *InboundService) AddTuicTrafficBatch(id string, traffic []*xray.ClientTraffic) error {
  13. if id == "" {
  14. return errors.New("TUIC traffic batch has no ID")
  15. }
  16. return submitTrafficWrite(func() error {
  17. return database.GetDB().Transaction(func(tx *gorm.DB) error {
  18. result := tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&model.TuicTrafficReceipt{ID: id})
  19. if result.Error != nil {
  20. return result.Error
  21. }
  22. if result.RowsAffected == 0 {
  23. return nil
  24. }
  25. return s.addClientTraffic(tx, traffic)
  26. })
  27. })
  28. }