| 
									
										
										
										
											2024-01-29 20:37:20 +00:00
										 |  |  | package service | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"x-ui/database" | 
					
						
							|  |  |  | 	"x-ui/database/model" | 
					
						
							|  |  |  | 	"x-ui/logger" | 
					
						
							|  |  |  | 	"x-ui/xray" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"gorm.io/gorm" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-10 21:31:24 +00:00
										 |  |  | type OutboundService struct{} | 
					
						
							| 
									
										
										
										
											2024-01-29 20:37:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (s *OutboundService) AddTraffic(traffics []*xray.Traffic, clientTraffics []*xray.ClientTraffic) (error, bool) { | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 	db := database.GetDB() | 
					
						
							|  |  |  | 	tx := db.Begin() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			tx.Rollback() | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			tx.Commit() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = s.addOutboundTraffic(tx, traffics) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil, false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *OutboundService) addOutboundTraffic(tx *gorm.DB, traffics []*xray.Traffic) error { | 
					
						
							|  |  |  | 	if len(traffics) == 0 { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, traffic := range traffics { | 
					
						
							|  |  |  | 		if traffic.IsOutbound { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var outbound model.OutboundTraffics | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			err = tx.Model(&model.OutboundTraffics{}).Where("tag = ?", traffic.Tag). | 
					
						
							|  |  |  | 				FirstOrCreate(&outbound).Error | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			outbound.Tag = traffic.Tag | 
					
						
							|  |  |  | 			outbound.Up = outbound.Up + traffic.Up | 
					
						
							|  |  |  | 			outbound.Down = outbound.Down + traffic.Down | 
					
						
							|  |  |  | 			outbound.Total = outbound.Up + outbound.Down | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			err = tx.Save(&outbound).Error | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *OutboundService) GetOutboundsTraffic() ([]*model.OutboundTraffics, error) { | 
					
						
							|  |  |  | 	db := database.GetDB() | 
					
						
							|  |  |  | 	var traffics []*model.OutboundTraffics | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := db.Model(model.OutboundTraffics{}).Find(&traffics).Error | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-07-08 21:08:00 +00:00
										 |  |  | 		logger.Warning("Error retrieving OutboundTraffics: ", err) | 
					
						
							| 
									
										
										
										
											2024-01-29 20:37:20 +00:00
										 |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return traffics, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-07 07:55:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (s *OutboundService) ResetOutboundTraffic(tag string) error { | 
					
						
							|  |  |  | 	db := database.GetDB() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	whereText := "tag " | 
					
						
							|  |  |  | 	if tag == "-alltags-" { | 
					
						
							|  |  |  | 		whereText += " <> ?" | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		whereText += " = ?" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	result := db.Model(model.OutboundTraffics{}). | 
					
						
							|  |  |  | 		Where(whereText, tag). | 
					
						
							|  |  |  | 		Updates(map[string]interface{}{"up": 0, "down": 0, "total": 0}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := result.Error | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |