move outJson build process to backend

This commit is contained in:
Alireza Ahmadi
2025-01-04 21:52:41 +01:00
parent fe428ed412
commit 753d1f9256
8 changed files with 300 additions and 215 deletions
+43 -25
View File
@@ -123,7 +123,7 @@ func (s *ConfigService) StopCore() error {
return nil
}
func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userLinks json.RawMessage, outJsons json.RawMessage, loginUser string) error {
func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userLinks json.RawMessage, loginUser string, hostname string) ([]string, error) {
var err error
var inboundIds []uint
@@ -132,16 +132,6 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userL
defer func() {
if err == nil {
tx.Commit()
if len(inboundIds) > 0 && corePtr.IsRunning() {
err1 := s.InboundService.RestartInbounds(tx, inboundIds)
if err1 != nil {
logger.Error("unable to restart inbounds: ", err1)
}
}
// Try to start core if it is not running
if !corePtr.IsRunning() {
s.StartCore("")
}
} else {
tx.Rollback()
}
@@ -153,7 +143,7 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userL
case "tls":
inboundIds, err = s.TlsService.Save(tx, act, data)
case "inbounds":
err = s.InboundService.Save(tx, act, data)
err = s.InboundService.Save(tx, act, data, hostname)
case "outbounds":
err = s.OutboundService.Save(tx, act, data)
case "endpoints":
@@ -161,27 +151,20 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userL
case "config":
err = s.SettingService.SaveConfig(tx, data)
if err != nil {
return err
return nil, err
}
err = s.restartCoreWithConfig(data)
default:
return common.NewError("unknown object: ", obj)
return nil, common.NewError("unknown object: ", obj)
}
if err != nil {
return err
return nil, err
}
if len(userLinks) > 0 {
err = s.ClientService.UpdateLinks(tx, userLinks)
if err != nil {
return err
}
}
if len(outJsons) > 0 {
err = s.InboundService.UpdateOutJsons(tx, outJsons)
if err != nil {
return err
return nil, err
}
}
@@ -194,11 +177,46 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, userL
Obj: data,
}).Error
if err != nil {
return err
return nil, err
}
// Commit changes so far
tx.Commit()
LastUpdate = time.Now().Unix()
var objs []string = []string{obj}
tx = db.Begin()
return nil
// Update side changes
// Update client links
if len(userLinks) > 0 {
err = s.ClientService.UpdateLinks(tx, userLinks)
if err != nil {
return nil, err
}
objs = append(objs, "clients")
}
// Update out_json of inbounds when tls is changed
if obj == "tls" && len(inboundIds) > 0 {
err = s.InboundService.UpdateOutJsons(tx, inboundIds, hostname)
if err != nil {
return nil, common.NewError("unable to update out_json of inbounds: ", err.Error())
}
objs = append(objs, "inbounds")
}
if len(inboundIds) > 0 && corePtr.IsRunning() {
err1 := s.InboundService.RestartInbounds(tx, inboundIds)
if err1 != nil {
logger.Error("unable to restart inbounds: ", err1)
}
}
// Try to start core if it is not running
if !corePtr.IsRunning() {
s.StartCore("")
}
return objs, nil
}
func (s *ConfigService) CheckChanges(lu string) (bool, error) {
+20 -16
View File
@@ -5,6 +5,7 @@ import (
"os"
"s-ui/database"
"s-ui/database/model"
"s-ui/util"
"strings"
"gorm.io/gorm"
@@ -75,7 +76,7 @@ func (s *InboundService) FromIds(ids []uint) ([]*model.Inbound, error) {
return inbounds, nil
}
func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage) error {
func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hostname string) error {
var err error
switch act {
@@ -85,6 +86,13 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage) err
if err != nil {
return err
}
if inbound.TlsId > 0 {
err = tx.Model(model.Tls{}).Where("id = ?", inbound.TlsId).Find(&inbound.Tls).Error
if err != nil {
return err
}
}
if corePtr.IsRunning() {
if act == "edit" {
err = corePtr.RemoveInbound(inbound.Tag)
@@ -93,13 +101,6 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage) err
}
}
if inbound.TlsId > 0 {
err = tx.Model(model.Tls{}).Where("id = ?", inbound.TlsId).Find(&inbound.Tls).Error
if err != nil {
return err
}
}
inboundConfig, err := inbound.MarshalJSON()
if err != nil {
return err
@@ -116,6 +117,11 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage) err
}
}
err = util.FillOutJson(&inbound, hostname)
if err != nil {
return err
}
err = tx.Save(&inbound).Error
if err != nil {
return err
@@ -140,20 +146,18 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage) err
return nil
}
func (s *InboundService) UpdateOutJsons(tx *gorm.DB, data json.RawMessage) error {
var outJsons []interface{}
err := json.Unmarshal(data, &outJsons)
func (s *InboundService) UpdateOutJsons(tx *gorm.DB, inboundIds []uint, hostname string) error {
var inbounds []model.Inbound
err := tx.Model(model.Inbound{}).Preload("Tls").Where("id in ?", inboundIds).Find(&inbounds).Error
if err != nil {
return err
}
for _, outJson := range outJsons {
outJsonData := outJson.(map[string]interface{})
tag := outJsonData["tag"].(string)
outJson, err := json.MarshalIndent(outJsonData["out_json"], "", " ")
for _, inbound := range inbounds {
err = util.FillOutJson(&inbound, hostname)
if err != nil {
return err
}
err = tx.Model(model.Inbound{}).Where("tag = ?", tag).Update("out_json", outJson).Error
err = tx.Model(model.Inbound{}).Where("tag = ?", inbound.Tag).Update("out_json", inbound.OutJson).Error
if err != nil {
return err
}