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 }