diff --git a/go.mod b/go.mod index b12b3eb..23edc3a 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/glebarez/sqlite v1.10.0 github.com/go-kratos/aegis v0.2.0 - github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a - github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a + github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09 + github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09 github.com/go-kratos/kratos/v2 v2.7.2 github.com/go-resty/resty/v2 v2.10.0 github.com/golang-jwt/jwt/v4 v4.5.0 @@ -29,7 +29,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/spf13/cobra v1.8.0 - github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009 + github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f github.com/ulule/limiter/v3 v3.11.2 github.com/zencoder/go-dash/v3 v3.0.3 github.com/zijiren233/gencontainer v0.0.0-20231213075414-f7f4c8261dca @@ -39,10 +39,10 @@ require ( github.com/zijiren233/yaml-comment v0.2.1 go.etcd.io/etcd/client/v3 v3.5.11 golang.org/x/crypto v0.17.0 - golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 + golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 golang.org/x/oauth2 v0.15.0 google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.5.4 @@ -112,7 +112,7 @@ require ( github.com/ugorji/go/codec v1.2.12 // indirect go.etcd.io/etcd/api/v3 v3.5.11 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect - go.uber.org/mock v0.3.0 // indirect + go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.6.0 // indirect @@ -127,7 +127,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - modernc.org/libc v1.37.6 // indirect + modernc.org/libc v1.38.0 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.7.2 // indirect modernc.org/sqlite v1.28.0 // indirect diff --git a/go.sum b/go.sum index 5f77a7d..6eebb55 100644 --- a/go.sum +++ b/go.sum @@ -79,16 +79,16 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kratos/aegis v0.2.0 h1:dObzCDWn3XVjUkgxyBp6ZeWtx/do0DPZ7LY3yNSJLUQ= github.com/go-kratos/aegis v0.2.0/go.mod h1:v0R2m73WgEEYB3XYu6aE2WcMwsZkJ/Rzuf5eVccm7bI= -github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a h1:j+JFB6IcA0+uslBlgo4q5zZgfYq4TciPo+QRrBIbXkE= -github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a/go.mod h1:yb9i4gq3jCW5zMFqzi50J0Xh3n4MRbcMlnuDBXYpvjs= -github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a h1:3/xN+wgIuxYA3iSQhXxBaopz61z13ZDxYDrC57Mb69k= -github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a/go.mod h1:CiTe7H5Lj8WB6dGvBwS4HFukcWnobfq+vFWedIGYftA= +github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09 h1:CQLh4u2gVu4T6YqQTSw7Mg0tUAZpKpCbU9E43U9Ysew= +github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09/go.mod h1:yb9i4gq3jCW5zMFqzi50J0Xh3n4MRbcMlnuDBXYpvjs= +github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09 h1:4EK4o8ZmXalxUy2lVhXWIE8+AnzBR0GaBHJXzc8NqSw= +github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09/go.mod h1:CiTe7H5Lj8WB6dGvBwS4HFukcWnobfq+vFWedIGYftA= github.com/go-kratos/kratos/v2 v2.7.2 h1:WVPGFNLKpv+0odMnCPxM4ZHa2hy9I5FOnwpG3Vv4w5c= github.com/go-kratos/kratos/v2 v2.7.2/go.mod h1:rppuc8+pGL2UtXA29bgFHWKqaaF6b6GB2XIYiDvFBRk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -348,8 +348,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009 h1:iT6l+r8aPkjSWaXFYD1LrpaC+Vt6afpb3CvrynivyXw= -github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009/go.mod h1:C0ZGPeF8nYsx60gePPhSrgrjrONj6F72XFHW9Mh8+vU= +github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f h1:31x5Kdga//iexaMtQo8dU1mPaIBIHnt/CiU+fuRXsMI= +github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f/go.mod h1:CkgeP0V9bce02Yfl053rDy3IdAeILaanRPpN58A4VPc= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= @@ -380,8 +380,8 @@ go.etcd.io/etcd/client/v3 v3.5.11 h1:ajWtgoNSZJ1gmS8k+icvPtqsqEav+iUorF7b0qozgUU go.etcd.io/etcd/client/v3 v3.5.11/go.mod h1:a6xQUEqFJ8vztO1agJh/KQKOMfFI8og52ZconzcDJwE= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -398,8 +398,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4= -golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -511,8 +511,8 @@ google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -536,8 +536,8 @@ gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/libc v1.38.0 h1:o4Lpk0zNDSdsjfEXnF1FGXWQ9PDi1NOdWcLP5n13FGo= +modernc.org/libc v1.38.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= diff --git a/internal/db/vendorBackend.go b/internal/db/vendorBackend.go index 2422398..1462608 100644 --- a/internal/db/vendorBackend.go +++ b/internal/db/vendorBackend.go @@ -17,6 +17,22 @@ func CreateVendorBackend(backend *model.VendorBackend) error { return db.Create(backend).Error } +func EnableVendorBackend(endpoint string) error { + return db.Model(&model.VendorBackend{}).Where("backend_endpoint = ?", endpoint).Update("enabled", true).Error +} + +func EnableVendorBackends(endpoints []string) error { + return db.Model(&model.VendorBackend{}).Where("backend_endpoint IN ?", endpoints).Update("enabled", true).Error +} + +func DisableVendorBackend(endpoint string) error { + return db.Model(&model.VendorBackend{}).Where("backend_endpoint = ?", endpoint).Update("enabled", false).Error +} + +func DisableVendorBackends(endpoints []string) error { + return db.Model(&model.VendorBackend{}).Where("backend_endpoint IN ?", endpoints).Update("enabled", false).Error +} + func DeleteVendorBackend(endpoint string) error { return db.Where("backend_endpoint = ?", endpoint).Delete(&model.VendorBackend{}).Error } diff --git a/internal/model/vendorBackend.go b/internal/model/vendorBackend.go index 94fd94f..87740d1 100644 --- a/internal/model/vendorBackend.go +++ b/internal/model/vendorBackend.go @@ -51,6 +51,7 @@ func (b *Backend) Validate() error { type VendorBackend struct { Backend Backend `gorm:"embedded;embeddedPrefix:backend_" json:"backend"` + Enabled bool `gorm:"default:true" json:"enabled"` UsedBy BackendUsedBy `gorm:"embedded;embeddedPrefix:used_by_" json:"usedBy"` } diff --git a/internal/vendor/vendor.go b/internal/vendor/vendor.go index 204321a..f344ae1 100644 --- a/internal/vendor/vendor.go +++ b/internal/vendor/vendor.go @@ -84,6 +84,162 @@ func Init(ctx context.Context) error { return nil } +func EnableVendorBackend(ctx context.Context, endpoint string) (err error) { + if !lock.TryLock() { + return errors.New("vendor backend is updating") + } + defer lock.Unlock() + + raw := LoadConns() + if v, ok := raw[endpoint]; !ok { + return fmt.Errorf("endpoint not found: %s", endpoint) + } else if v.Info.Enabled { + return nil + } + + raw[endpoint].Info.Enabled = true + defer func() { + if err != nil { + raw[endpoint].Info.Enabled = false + } + }() + + vc, err := newVendorClients(raw) + if err != nil { + return err + } + + err = db.EnableVendorBackend(endpoint) + if err != nil { + return err + } + + storeBackends(raw, vc) + + return nil +} + +func EnableVendorBackends(ctx context.Context, endpoints []string) (err error) { + if !lock.TryLock() { + return errors.New("vendor backend is updating") + } + defer lock.Unlock() + + raw := LoadConns() + needChangeEndpoints := make([]string, 0, len(endpoints)) + for _, endpoint := range endpoints { + if v, ok := raw[endpoint]; !ok { + return fmt.Errorf("endpoint not found: %s", endpoint) + } else if !v.Info.Enabled { + needChangeEndpoints = append(needChangeEndpoints, endpoint) + } + } + + for _, endpoint := range needChangeEndpoints { + raw[endpoint].Info.Enabled = true + } + + defer func() { + if err != nil { + for _, endpoint := range needChangeEndpoints { + raw[endpoint].Info.Enabled = false + } + } + }() + + vc, err := newVendorClients(raw) + if err != nil { + return err + } + + err = db.EnableVendorBackends(needChangeEndpoints) + if err != nil { + return err + } + + storeBackends(raw, vc) + + return nil +} + +func DisableVendorBackend(ctx context.Context, endpoint string) (err error) { + if !lock.TryLock() { + return errors.New("vendor backend is updating") + } + defer lock.Unlock() + + raw := LoadConns() + if v, ok := raw[endpoint]; !ok { + return fmt.Errorf("endpoint not found: %s", endpoint) + } else if !v.Info.Enabled { + return nil + } + + raw[endpoint].Info.Enabled = false + defer func() { + if err != nil { + raw[endpoint].Info.Enabled = true + } + }() + + vc, err := newVendorClients(raw) + if err != nil { + return err + } + + err = db.DisableVendorBackend(endpoint) + if err != nil { + return err + } + + storeBackends(raw, vc) + + return nil +} + +func DisableVendorBackends(ctx context.Context, endpoints []string) (err error) { + if !lock.TryLock() { + return errors.New("vendor backend is updating") + } + defer lock.Unlock() + + raw := LoadConns() + needChangeEndpoints := make([]string, 0, len(endpoints)) + for _, endpoint := range endpoints { + if v, ok := raw[endpoint]; !ok { + return fmt.Errorf("endpoint not found: %s", endpoint) + } else if v.Info.Enabled { + needChangeEndpoints = append(needChangeEndpoints, endpoint) + } + } + + for _, endpoint := range needChangeEndpoints { + raw[endpoint].Info.Enabled = false + } + + defer func() { + if err != nil { + for _, endpoint := range needChangeEndpoints { + raw[endpoint].Info.Enabled = true + } + } + }() + + vc, err := newVendorClients(raw) + if err != nil { + return err + } + + err = db.DisableVendorBackends(needChangeEndpoints) + if err != nil { + return err + } + + storeBackends(raw, vc) + + return nil +} + func AddVendorBackend(ctx context.Context, backend *model.VendorBackend) error { if !lock.TryLock() { return errors.New("vendor backend is updating") @@ -290,6 +446,9 @@ func newVendorClients(conns map[string]*BackendConn) (*VendorClients, error) { emby: make(map[string]EmbyInterface), } for _, conn := range conns { + if !conn.Info.Enabled { + continue + } if conn.Info.UsedBy.Bilibili { if _, ok := clients.bilibili[conn.Info.UsedBy.BilibiliBackendName]; ok { return nil, fmt.Errorf("duplicate bilibili backend name: %s", conn.Info.UsedBy.BilibiliBackendName) diff --git a/server/handlers/admin.go b/server/handlers/admin.go index 767abdf..e888199 100644 --- a/server/handlers/admin.go +++ b/server/handlers/admin.go @@ -830,3 +830,37 @@ func AdminReconnectVendorBackends(ctx *gin.Context) { ctx.Status(http.StatusNoContent) } + +func AdminEnableVendorBackends(ctx *gin.Context) { + // user := ctx.MustGet("user").(*op.User) + + var req model.VendorBackendEndpointsReq + if err := model.Decode(ctx, &req); err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + + if err := vendor.EnableVendorBackends(ctx, req.Endpoints); err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + + ctx.Status(http.StatusNoContent) +} + +func AdminDisableVendorBackends(ctx *gin.Context) { + // user := ctx.MustGet("user").(*op.User) + + var req model.VendorBackendEndpointsReq + if err := model.Decode(ctx, &req); err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + + if err := vendor.DisableVendorBackends(ctx, req.Endpoints); err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + + ctx.Status(http.StatusNoContent) +} diff --git a/server/handlers/init.go b/server/handlers/init.go index ee17778..911d614 100644 --- a/server/handlers/init.go +++ b/server/handlers/init.go @@ -83,6 +83,10 @@ func initAdmin(admin *gin.RouterGroup, root *gin.RouterGroup) { admin.POST("/vendors/reconnect", AdminReconnectVendorBackends) + admin.POST("/vendors/enable", AdminEnableVendorBackends) + + admin.POST("/vendors/disable", AdminDisableVendorBackends) + { user := admin.Group("/user")