package service import ( "encoding/json" "os" "s-ui/database" "s-ui/database/model" "gorm.io/gorm" ) type OutboundService struct{} func (o *OutboundService) GetAll() (*[]map[string]interface{}, error) { db := database.GetDB() outbounds := []*model.Outbound{} err := db.Model(model.Outbound{}).Scan(&outbounds).Error if err != nil { return nil, err } var data []map[string]interface{} for _, outbound := range outbounds { outData := map[string]interface{}{ "id": outbound.Id, "type": outbound.Type, "tag": outbound.Tag, } if outbound.Options != nil { var restFields map[string]json.RawMessage if err := json.Unmarshal(outbound.Options, &restFields); err != nil { return nil, err } for k, v := range restFields { outData[k] = v } } data = append(data, outData) } return &data, nil } func (o *OutboundService) GetAllConfig(db *gorm.DB) ([]json.RawMessage, error) { var outboundsJson []json.RawMessage var outbounds []*model.Outbound err := db.Model(model.Outbound{}).Scan(&outbounds).Error if err != nil { return nil, err } for _, outbound := range outbounds { outboundJson, err := outbound.MarshalJSON() if err != nil { return nil, err } outboundsJson = append(outboundsJson, outboundJson) } return outboundsJson, nil } func (s *OutboundService) Save(tx *gorm.DB, action string, data json.RawMessage) error { var err error switch action { case "new", "edit": var outbound model.Outbound err = outbound.UnmarshalJSON(data) if err != nil { return err } if corePtr.IsRunning() { configData, err := outbound.MarshalJSON() if err != nil { return err } if action == "edit" { var oldTag string err = tx.Model(model.Outbound{}).Select("tag").Where("id = ?", outbound.Id).Find(&oldTag).Error if err != nil { return err } err = corePtr.RemoveOutbound(oldTag) if err != nil && err != os.ErrInvalid { return err } } err = corePtr.AddOutbound(configData) if err != nil { return err } } err = tx.Save(&outbound).Error if err != nil { return err } case "del": var tag string err = json.Unmarshal(data, &tag) if err != nil { return err } if corePtr.IsRunning() { err = corePtr.RemoveOutbound(tag) if err != nil && err != os.ErrInvalid { return err } } err = tx.Where("tag = ?", tag).Delete(model.Outbound{}).Error if err != nil { return err } } return nil }