247 lines
7.1 KiB
Go
247 lines
7.1 KiB
Go
package httpdns
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
"github.com/iwind/TeaGo/dbs"
|
|
"strings"
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
)
|
|
|
|
// HTTPDNSAppService HTTPDNS应用服务
|
|
type HTTPDNSAppService struct {
|
|
services.BaseService
|
|
pb.UnimplementedHTTPDNSAppServiceServer
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) CreateHTTPDNSApp(ctx context.Context, req *pb.CreateHTTPDNSAppRequest) (*pb.CreateHTTPDNSAppResponse, error) {
|
|
_, err := this.ValidateAdmin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(req.Name) == 0 || len(req.AppId) == 0 {
|
|
return nil, errors.New("required 'name' and 'appId'")
|
|
}
|
|
if req.PrimaryClusterId <= 0 {
|
|
return nil, errors.New("required 'primaryClusterId'")
|
|
}
|
|
var appDbId int64
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
exists, err := models.SharedHTTPDNSAppDAO.FindEnabledAppWithAppId(tx, strings.TrimSpace(req.AppId))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if exists != nil {
|
|
return errors.New("appId already exists")
|
|
}
|
|
|
|
appDbId, err = models.SharedHTTPDNSAppDAO.CreateApp(tx, req.Name, strings.TrimSpace(req.AppId), req.PrimaryClusterId, req.BackupClusterId, req.IsOn, req.UserId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, _, err = models.SharedHTTPDNSAppSecretDAO.InitAppSecret(tx, appDbId, req.SignEnabled)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notifyHTTPDNSAppTasksByAppDbId(tx, appDbId, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pb.CreateHTTPDNSAppResponse{AppDbId: appDbId}, nil
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) UpdateHTTPDNSApp(ctx context.Context, req *pb.UpdateHTTPDNSAppRequest) (*pb.RPCSuccess, error) {
|
|
_, err := this.ValidateAdmin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
oldApp, err := models.SharedHTTPDNSAppDAO.FindEnabledApp(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if oldApp == nil {
|
|
return errors.New("app not found")
|
|
}
|
|
|
|
err = models.SharedHTTPDNSAppDAO.UpdateApp(tx, req.AppDbId, req.Name, req.PrimaryClusterId, req.BackupClusterId, req.IsOn, req.UserId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = notifyHTTPDNSAppTasksByApp(tx, oldApp, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notifyHTTPDNSAppTasksByAppDbId(tx, req.AppDbId, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return this.Success()
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) DeleteHTTPDNSApp(ctx context.Context, req *pb.DeleteHTTPDNSAppRequest) (*pb.RPCSuccess, error) {
|
|
_, err := this.ValidateAdmin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
app, err := models.SharedHTTPDNSAppDAO.FindEnabledApp(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if app == nil {
|
|
return nil
|
|
}
|
|
|
|
// 1) 先停用规则记录
|
|
rules, err := models.SharedHTTPDNSCustomRuleDAO.ListEnabledRulesWithAppId(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, rule := range rules {
|
|
err = models.SharedHTTPDNSCustomRuleRecordDAO.DisableRecordsWithRuleId(tx, int64(rule.Id))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// 2) 停用规则、域名、密钥
|
|
err = models.SharedHTTPDNSCustomRuleDAO.DisableRulesWithAppId(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = models.SharedHTTPDNSDomainDAO.DisableDomainsWithAppId(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = models.SharedHTTPDNSAppSecretDAO.DisableAppSecret(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 3) 删除该应用的 MySQL 访问日志,避免残留
|
|
err = models.SharedHTTPDNSAccessLogDAO.DeleteLogsWithAppId(tx, app.AppId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 4) 最后停用应用
|
|
err = models.SharedHTTPDNSAppDAO.DisableApp(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return notifyHTTPDNSAppTasksByApp(tx, app, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return this.Success()
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) FindHTTPDNSApp(ctx context.Context, req *pb.FindHTTPDNSAppRequest) (*pb.FindHTTPDNSAppResponse, error) {
|
|
_, _, err := this.ValidateAdminAndUser(ctx, true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
app, err := models.SharedHTTPDNSAppDAO.FindEnabledApp(this.NullTx(), req.AppDbId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
secret, err := models.SharedHTTPDNSAppSecretDAO.FindEnabledAppSecret(this.NullTx(), req.AppDbId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pb.FindHTTPDNSAppResponse{App: toPBApp(app, secret)}, nil
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) ListHTTPDNSApps(ctx context.Context, req *pb.ListHTTPDNSAppsRequest) (*pb.ListHTTPDNSAppsResponse, error) {
|
|
_, _, err := this.ValidateAdminAndUser(ctx, true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
apps, err := models.SharedHTTPDNSAppDAO.ListEnabledApps(this.NullTx(), req.Offset, req.Size, req.Keyword)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var pbApps []*pb.HTTPDNSApp
|
|
for _, app := range apps {
|
|
secret, err := models.SharedHTTPDNSAppSecretDAO.FindEnabledAppSecret(this.NullTx(), int64(app.Id))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
pbApps = append(pbApps, toPBApp(app, secret))
|
|
}
|
|
return &pb.ListHTTPDNSAppsResponse{Apps: pbApps}, nil
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) FindAllHTTPDNSApps(ctx context.Context, req *pb.FindAllHTTPDNSAppsRequest) (*pb.FindAllHTTPDNSAppsResponse, error) {
|
|
_, _, validateErr := this.ValidateAdminAndUser(ctx, true)
|
|
if validateErr != nil {
|
|
if _, nodeErr := this.ValidateHTTPDNSNode(ctx); nodeErr != nil {
|
|
return nil, validateErr
|
|
}
|
|
}
|
|
apps, err := models.SharedHTTPDNSAppDAO.FindAllEnabledApps(this.NullTx())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var pbApps []*pb.HTTPDNSApp
|
|
for _, app := range apps {
|
|
secret, err := models.SharedHTTPDNSAppSecretDAO.FindEnabledAppSecret(this.NullTx(), int64(app.Id))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
pbApps = append(pbApps, toPBApp(app, secret))
|
|
}
|
|
return &pb.FindAllHTTPDNSAppsResponse{Apps: pbApps}, nil
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) UpdateHTTPDNSAppSignEnabled(ctx context.Context, req *pb.UpdateHTTPDNSAppSignEnabledRequest) (*pb.RPCSuccess, error) {
|
|
_, err := this.ValidateAdmin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
err := models.SharedHTTPDNSAppSecretDAO.UpdateSignEnabled(tx, req.AppDbId, req.SignEnabled)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notifyHTTPDNSAppTasksByAppDbId(tx, req.AppDbId, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return this.Success()
|
|
}
|
|
|
|
func (this *HTTPDNSAppService) ResetHTTPDNSAppSignSecret(ctx context.Context, req *pb.ResetHTTPDNSAppSignSecretRequest) (*pb.ResetHTTPDNSAppSignSecretResponse, error) {
|
|
_, err := this.ValidateAdmin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var signSecret string
|
|
var updatedAt int64
|
|
err = this.RunTx(func(tx *dbs.Tx) error {
|
|
var err error
|
|
signSecret, updatedAt, err = models.SharedHTTPDNSAppSecretDAO.ResetSignSecret(tx, req.AppDbId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notifyHTTPDNSAppTasksByAppDbId(tx, req.AppDbId, models.HTTPDNSNodeTaskTypeAppChanged)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pb.ResetHTTPDNSAppSignSecretResponse{
|
|
SignSecret: signSecret,
|
|
UpdatedAt: updatedAt,
|
|
}, nil
|
|
}
|