package service import ( "encoding/json" "os" "s-ui/database" "s-ui/database/model" "s-ui/util/common" "gorm.io/gorm" ) type EndpointService struct { WarpService } func (o *EndpointService) GetAll() (*[]map[string]interface{}, error) { db := database.GetDB() endpoints := []*model.Endpoint{} err := db.Model(model.Endpoint{}).Scan(&endpoints).Error if err != nil { return nil, err } var data []map[string]interface{} for _, endpoint := range endpoints { epData := map[string]interface{}{ "id": endpoint.Id, "type": endpoint.Type, "tag": endpoint.Tag, "ext": endpoint.Ext, } if endpoint.Options != nil { var restFields map[string]json.RawMessage if err := json.Unmarshal(endpoint.Options, &restFields); err != nil { return nil, err } for k, v := range restFields { epData[k] = v } } data = append(data, epData) } return &data, nil } func (o *EndpointService) GetAllConfig(db *gorm.DB) ([]json.RawMessage, error) { var endpointsJson []json.RawMessage var endpoints []*model.Endpoint err := db.Model(model.Endpoint{}).Scan(&endpoints).Error if err != nil { return nil, err } for _, endpoint := range endpoints { endpointJson, err := endpoint.MarshalJSON() if err != nil { return nil, err } endpointsJson = append(endpointsJson, endpointJson) } return endpointsJson, nil } func (s *EndpointService) Save(tx *gorm.DB, act string, data json.RawMessage) error { var err error switch act { case "new", "edit": var endpoint model.Endpoint err = endpoint.UnmarshalJSON(data) if err != nil { return err } if endpoint.Type == "warp" { if act == "new" { err = s.WarpService.RegisterWarp(&endpoint) if err != nil { return err } } else { var old_license string err = tx.Model(model.Endpoint{}).Select("json_extract(ext, '$.license_key')").Where("id = ?", endpoint.Id).Find(&old_license).Error if err != nil { return err } err = s.WarpService.SetWarpLicense(old_license, &endpoint) if err != nil { return err } } } if corePtr.IsRunning() { configData, err := endpoint.MarshalJSON() if err != nil { return err } if act == "edit" { var oldTag string err = tx.Model(model.Endpoint{}).Select("tag").Where("id = ?", endpoint.Id).Find(&oldTag).Error if err != nil { return err } err = corePtr.RemoveEndpoint(oldTag) if err != nil && err != os.ErrInvalid { return err } } err = corePtr.AddEndpoint(configData) if err != nil { return err } } err = tx.Save(&endpoint).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.RemoveEndpoint(tag) if err != nil && err != os.ErrInvalid { return err } } err = tx.Where("tag = ?", tag).Delete(model.Endpoint{}).Error if err != nil { return err } default: return common.NewErrorf("unknown action: %s", act) } return nil }