refactor(di): restore compile-time Wire injection

Replace the samber/do runtime container with explicit constructor dependencies and generated Wire graphs for ace and cli. Keep CLI application loading isolated and verify generated files in CI.
This commit is contained in:
耗子
2026-07-27 02:54:44 +08:00
parent ad4559eea3
commit ea22c2f0a7
251 changed files with 2416 additions and 1594 deletions
+4
View File
@@ -18,6 +18,10 @@ jobs:
with:
cache: true
go-version: 'stable'
- name: Check Wire generated code
run: |
go generate ./cmd/ace ./cmd/cli
git diff --exit-code -- cmd/ace/wire_gen.go cmd/cli/wire_gen.go
- name: Run golangci-lint
uses: golangci/golangci-lint-action@v9
with:
+2 -2
View File
@@ -11,8 +11,8 @@ _cgo_gotypes.go
_cgo_export.*
# 编译文件
ace
cli
/ace
/cli
*.com
*.class
*.dll
+4 -9
View File
@@ -6,11 +6,6 @@ import (
"os"
"runtime/debug"
_ "time/tzdata"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/injector"
)
func main() {
@@ -27,13 +22,13 @@ func run() error {
debug.SetGCPercent(10)
inj := injector.New()
defer func() { _ = inj.Shutdown() }()
ace, err := do.Invoke[*app.Ace](inj)
ace, cleanup, err := initAce()
if err != nil {
return err
}
if cleanup != nil {
defer cleanup()
}
return ace.Run()
}
+29
View File
@@ -0,0 +1,29 @@
//go:build wireinject
package main
import (
"github.com/google/wire"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/apps"
"github.com/acepanel/panel/v3/internal/biz"
"github.com/acepanel/panel/v3/internal/bootstrap"
"github.com/acepanel/panel/v3/internal/data"
"github.com/acepanel/panel/v3/internal/job"
"github.com/acepanel/panel/v3/internal/route"
"github.com/acepanel/panel/v3/internal/service"
)
func initAce() (*app.Ace, func(), error) {
panic(wire.Build(
bootstrap.ProviderSet,
apps.ProviderSet,
biz.ProviderSet,
data.ProviderSet,
service.ProviderSet,
route.ProviderSet,
job.ProviderSet,
app.NewAce,
))
}
+928
View File
@@ -0,0 +1,928 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/apps/apache"
"github.com/acepanel/panel/v3/internal/apps/clickhouse"
"github.com/acepanel/panel/v3/internal/apps/codeserver"
"github.com/acepanel/panel/v3/internal/apps/docker"
"github.com/acepanel/panel/v3/internal/apps/elasticsearch"
"github.com/acepanel/panel/v3/internal/apps/fail2ban"
"github.com/acepanel/panel/v3/internal/apps/frp"
"github.com/acepanel/panel/v3/internal/apps/gitea"
"github.com/acepanel/panel/v3/internal/apps/grafana"
"github.com/acepanel/panel/v3/internal/apps/kafka"
"github.com/acepanel/panel/v3/internal/apps/mariadb"
"github.com/acepanel/panel/v3/internal/apps/memcached"
"github.com/acepanel/panel/v3/internal/apps/minio"
"github.com/acepanel/panel/v3/internal/apps/mongodb"
"github.com/acepanel/panel/v3/internal/apps/mysql"
"github.com/acepanel/panel/v3/internal/apps/nginx"
"github.com/acepanel/panel/v3/internal/apps/openresty"
"github.com/acepanel/panel/v3/internal/apps/opensearch"
"github.com/acepanel/panel/v3/internal/apps/percona"
"github.com/acepanel/panel/v3/internal/apps/pgadmin"
"github.com/acepanel/panel/v3/internal/apps/phpmyadmin"
"github.com/acepanel/panel/v3/internal/apps/podman"
"github.com/acepanel/panel/v3/internal/apps/postgresql"
"github.com/acepanel/panel/v3/internal/apps/prometheus"
"github.com/acepanel/panel/v3/internal/apps/pureftpd"
"github.com/acepanel/panel/v3/internal/apps/redis"
"github.com/acepanel/panel/v3/internal/apps/rocketmq"
"github.com/acepanel/panel/v3/internal/apps/rsync"
"github.com/acepanel/panel/v3/internal/apps/s3fs"
"github.com/acepanel/panel/v3/internal/apps/supervisor"
"github.com/acepanel/panel/v3/internal/apps/valkey"
"github.com/acepanel/panel/v3/internal/biz"
"github.com/acepanel/panel/v3/internal/bootstrap"
"github.com/acepanel/panel/v3/internal/data"
"github.com/acepanel/panel/v3/internal/job"
"github.com/acepanel/panel/v3/internal/middleware"
"github.com/acepanel/panel/v3/internal/route"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/websitestat"
)
import (
_ "time/tzdata"
)
// Injectors from wire.go:
func initAce() (*app.Ace, func(), error) {
config, err := bootstrap.NewConf()
if err != nil {
return nil, nil, err
}
locale, err := bootstrap.NewT(config)
if err != nil {
return nil, nil, err
}
apacheApp, err := apache.NewApp(locale)
if err != nil {
return nil, nil, err
}
db, err := bootstrap.NewDB(config)
if err != nil {
return nil, nil, err
}
databaseServerRepo, err := data.NewDatabaseServerRepo(db)
if err != nil {
return nil, nil, err
}
settingRepo, err := data.NewSettingRepo(config, db)
if err != nil {
return nil, nil, err
}
clickhouseApp, err := clickhouse.NewApp(locale, databaseServerRepo, settingRepo)
if err != nil {
return nil, nil, err
}
codeserverApp, err := codeserver.NewApp()
if err != nil {
return nil, nil, err
}
dockerApp, err := docker.NewApp()
if err != nil {
return nil, nil, err
}
elasticsearchApp, err := elasticsearch.NewApp(locale)
if err != nil {
return nil, nil, err
}
websiteRepo, err := data.NewWebsiteRepo(db, locale, settingRepo)
if err != nil {
return nil, nil, err
}
fail2banApp, err := fail2ban.NewApp(locale, websiteRepo)
if err != nil {
return nil, nil, err
}
frpApp, err := frp.NewApp()
if err != nil {
return nil, nil, err
}
giteaApp, err := gitea.NewApp()
if err != nil {
return nil, nil, err
}
grafanaApp, err := grafana.NewApp(locale)
if err != nil {
return nil, nil, err
}
kafkaApp, err := kafka.NewApp(locale)
if err != nil {
return nil, nil, err
}
mysqlApp, err := mysql.NewApp(locale, databaseServerRepo, settingRepo)
if err != nil {
return nil, nil, err
}
mariadbApp, err := mariadb.NewApp(mysqlApp)
if err != nil {
return nil, nil, err
}
memcachedApp, err := memcached.NewApp(locale)
if err != nil {
return nil, nil, err
}
minioApp, err := minio.NewApp()
if err != nil {
return nil, nil, err
}
mongodbApp, err := mongodb.NewApp(locale, databaseServerRepo, settingRepo)
if err != nil {
return nil, nil, err
}
nginxApp, err := nginx.NewApp(locale)
if err != nil {
return nil, nil, err
}
openrestyApp, err := openresty.NewApp(nginxApp)
if err != nil {
return nil, nil, err
}
opensearchApp, err := opensearch.NewApp(locale)
if err != nil {
return nil, nil, err
}
perconaApp, err := percona.NewApp(mysqlApp)
if err != nil {
return nil, nil, err
}
pgadminApp, err := pgadmin.NewApp(config, locale, databaseServerRepo)
if err != nil {
return nil, nil, err
}
phpmyadminApp, err := phpmyadmin.NewApp(config, locale, databaseServerRepo)
if err != nil {
return nil, nil, err
}
podmanApp, err := podman.NewApp()
if err != nil {
return nil, nil, err
}
postgresqlApp, err := postgresql.NewApp(locale, databaseServerRepo, settingRepo)
if err != nil {
return nil, nil, err
}
logger, cleanup, err := bootstrap.NewLogger(config)
if err != nil {
return nil, nil, err
}
slogLogger := bootstrap.NewSlog(logger)
notifyChannelRepo, err := data.NewNotifyChannelRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
notifyUsecase, err := biz.NewNotifyUsecase(locale, slogLogger, notifyChannelRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
taskRunner, err := bootstrap.NewRunner(notifyUsecase, db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
taskRepo, err := data.NewTaskRepo(db, locale, slogLogger, taskRunner)
if err != nil {
cleanup()
return nil, nil, err
}
prometheusApp, err := prometheus.NewApp(config, locale, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
pureftpdApp, err := pureftpd.NewApp(locale)
if err != nil {
cleanup()
return nil, nil, err
}
redisApp, err := redis.NewApp(locale, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
rocketmqApp, err := rocketmq.NewApp(locale)
if err != nil {
cleanup()
return nil, nil, err
}
rsyncApp, err := rsync.NewApp(locale)
if err != nil {
cleanup()
return nil, nil, err
}
s3fsApp, err := s3fs.NewApp(locale)
if err != nil {
cleanup()
return nil, nil, err
}
supervisorApp, err := supervisor.NewApp(locale)
if err != nil {
cleanup()
return nil, nil, err
}
valkeyApp, err := valkey.NewApp(locale, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
loader, err := bootstrap.NewLoader(apacheApp, clickhouseApp, codeserverApp, dockerApp, elasticsearchApp, fail2banApp, frpApp, giteaApp, grafanaApp, kafkaApp, mariadbApp, memcachedApp, minioApp, mongodbApp, mysqlApp, nginxApp, openrestyApp, opensearchApp, perconaApp, pgadminApp, phpmyadminApp, podmanApp, postgresqlApp, prometheusApp, pureftpdApp, redisApp, rocketmqApp, rsyncApp, s3fsApp, supervisorApp, valkeyApp)
if err != nil {
cleanup()
return nil, nil, err
}
manager, err := bootstrap.NewSession(config, db, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
appRepo, err := data.NewAppRepo(config, db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
userTokenRepo, err := data.NewUserTokenRepo(config, db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
middlewares, err := middleware.NewMiddlewares(config, locale, manager, appRepo, userTokenRepo)
if err != nil {
cleanup()
return nil, nil, err
}
validator, err := bootstrap.NewValidator(config, db)
if err != nil {
cleanup()
return nil, nil, err
}
alertRepo, err := data.NewAlertRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
containerRepo, err := data.NewContainerRepo()
if err != nil {
cleanup()
return nil, nil, err
}
alertUsecase, err := biz.NewAlertUsecase(notifyUsecase, loader, locale, slogLogger, alertRepo, appRepo, containerRepo, databaseServerRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
alertService, err := service.NewAlertService(alertUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
cacheRepo, err := data.NewCacheRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
appUsecase, err := biz.NewAppUsecase(locale, appRepo, cacheRepo, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
cacheUsecase := biz.NewCacheUsecase(cacheRepo)
settingUsecase, err := biz.NewSettingUsecase(locale, slogLogger, settingRepo, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
appService, err := service.NewAppService(loader, appUsecase, cacheUsecase, settingUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
backupRepo, err := data.NewBackupRepo(config, db, locale, slogLogger, settingRepo, websiteRepo)
if err != nil {
cleanup()
return nil, nil, err
}
backupUsecase, err := biz.NewBackupUsecase(notifyUsecase, locale, slogLogger, backupRepo)
if err != nil {
cleanup()
return nil, nil, err
}
taskUsecase := biz.NewTaskUsecase(taskRepo)
backupService, err := service.NewBackupService(backupUsecase, taskUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
backupAccountRepo, err := data.NewBackupAccountRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
backupAccountUsecase, err := biz.NewBackupAccountUsecase(locale, slogLogger, backupAccountRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
backupStorageService, err := service.NewBackupStorageService(backupAccountUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
certRepo, err := data.NewCertRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
certUsecase, err := biz.NewCertUsecase(locale, slogLogger, certRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
certService, err := service.NewCertService(certUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
certAccountRepo, err := data.NewCertAccountRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
userRepo, err := data.NewUserRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
certAccountUsecase, err := biz.NewCertAccountUsecase(locale, slogLogger, certAccountRepo, userRepo)
if err != nil {
cleanup()
return nil, nil, err
}
certAccountService, err := service.NewCertAccountService(certAccountUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
certDNSRepo, err := data.NewCertDNSRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
certDNSUsecase := biz.NewCertDNSUsecase(certDNSRepo, slogLogger)
certDNSService, err := service.NewCertDNSService(certDNSUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
containerUsecase := biz.NewContainerUsecase(containerRepo, settingRepo)
containerService, err := service.NewContainerService(containerUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
containerComposeRepo, err := data.NewContainerComposeRepo()
if err != nil {
cleanup()
return nil, nil, err
}
containerComposeUsecase := biz.NewContainerComposeUsecase(containerComposeRepo)
containerComposeService, err := service.NewContainerComposeService(containerComposeUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
containerImageRepo, err := data.NewContainerImageRepo()
if err != nil {
cleanup()
return nil, nil, err
}
containerImageUsecase := biz.NewContainerImageUsecase(containerImageRepo, settingRepo)
containerImageService, err := service.NewContainerImageService(containerImageUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
containerNetworkRepo, err := data.NewContainerNetworkRepo()
if err != nil {
cleanup()
return nil, nil, err
}
containerNetworkUsecase := biz.NewContainerNetworkUsecase(containerNetworkRepo, settingRepo)
containerNetworkService, err := service.NewContainerNetworkService(containerNetworkUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
containerVolumeRepo, err := data.NewContainerVolumeRepo()
if err != nil {
cleanup()
return nil, nil, err
}
containerVolumeUsecase := biz.NewContainerVolumeUsecase(containerVolumeRepo, settingRepo)
containerVolumeService, err := service.NewContainerVolumeService(containerVolumeUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
cronRepo, err := data.NewCronRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
cronUsecase := biz.NewCronUsecase(cronRepo, slogLogger)
cronService, err := service.NewCronService(cronUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUserRepo, err := data.NewDatabaseUserRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUserUsecase, err := biz.NewDatabaseUserUsecase(slogLogger, databaseServerRepo, databaseUserRepo)
if err != nil {
cleanup()
return nil, nil, err
}
databaseRepo, err := data.NewDatabaseRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUsecase, err := biz.NewDatabaseUsecase(databaseUserUsecase, locale, slogLogger, databaseRepo, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
databaseService, err := service.NewDatabaseService(databaseUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
databaseElasticsearchRepo, err := data.NewDatabaseElasticsearchRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
databaseElasticsearchUsecase := biz.NewDatabaseElasticsearchUsecase(databaseElasticsearchRepo)
databaseElasticsearchService, err := service.NewDatabaseElasticsearchService(databaseElasticsearchUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
databaseRedisRepo, err := data.NewDatabaseRedisRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
databaseRedisUsecase := biz.NewDatabaseRedisUsecase(databaseRedisRepo)
databaseRedisService, err := service.NewDatabaseRedisService(databaseRedisUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
databaseServerUsecase, err := biz.NewDatabaseServerUsecase(locale, slogLogger, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
databaseServerService, err := service.NewDatabaseServerService(databaseServerUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUserService, err := service.NewDatabaseUserService(databaseUserUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
environmentRepo, err := data.NewEnvironmentRepo(config, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentUsecase, err := biz.NewEnvironmentUsecase(locale, cacheRepo, environmentRepo, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
environmentService, err := service.NewEnvironmentService(environmentUsecase, taskUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentDotnetService, err := service.NewEnvironmentDotnetService(environmentUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentGoService, err := service.NewEnvironmentGoService(environmentUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentJavaService, err := service.NewEnvironmentJavaService(environmentUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentNodejsService, err := service.NewEnvironmentNodejsService(environmentUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentPHPService, err := service.NewEnvironmentPHPService(environmentUsecase, taskUsecase, config, locale)
if err != nil {
cleanup()
return nil, nil, err
}
environmentPythonService, err := service.NewEnvironmentPythonService(environmentUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
tamperRepo, err := data.NewTamperRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
tamperUsecase, err := biz.NewTamperUsecase(notifyUsecase, settingUsecase, locale, slogLogger, tamperRepo)
if err != nil {
cleanup()
return nil, nil, err
}
fileService, err := service.NewFileService(containerUsecase, tamperUsecase, taskUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
fileShareRepo, err := data.NewFileShareRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
fileShareUsecase, err := biz.NewFileShareUsecase(slogLogger, fileShareRepo)
if err != nil {
cleanup()
return nil, nil, err
}
fileShareService, err := service.NewFileShareService(fileShareUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
firewallService, err := service.NewFirewallService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
scanEventRepo, err := data.NewScanEventRepo()
if err != nil {
cleanup()
return nil, nil, err
}
scanEventUsecase := biz.NewScanEventUsecase(scanEventRepo, settingRepo)
firewallScanService, err := service.NewFirewallScanService(scanEventUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
projectRepo, err := data.NewProjectRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
projectUsecase, err := biz.NewProjectUsecase(locale, slogLogger, projectRepo)
if err != nil {
cleanup()
return nil, nil, err
}
websiteStatRepo, err := data.NewWebsiteStatRepo()
if err != nil {
cleanup()
return nil, nil, err
}
websiteStatUsecase := biz.NewWebsiteStatUsecase(websiteStatRepo)
websiteUsecase, err := biz.NewWebsiteUsecase(certAccountUsecase, certUsecase, databaseUsecase, databaseUserUsecase, tamperUsecase, websiteStatUsecase, locale, slogLogger, databaseServerRepo, websiteRepo)
if err != nil {
cleanup()
return nil, nil, err
}
homeService, err := service.NewHomeService(appUsecase, backupUsecase, containerUsecase, cronUsecase, databaseServerUsecase, environmentUsecase, projectUsecase, settingUsecase, taskUsecase, websiteUsecase, config, locale)
if err != nil {
cleanup()
return nil, nil, err
}
logRepo, err := data.NewLogRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
logUsecase := biz.NewLogUsecase(logRepo)
logService, err := service.NewLogService(logUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
monitorRepo, err := data.NewMonitorRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
monitorUsecase := biz.NewMonitorUsecase(monitorRepo, settingRepo)
monitorService, err := service.NewMonitorService(monitorUsecase, settingUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
notifyService, err := service.NewNotifyService(notifyUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
processService, err := service.NewProcessService()
if err != nil {
cleanup()
return nil, nil, err
}
projectService, err := service.NewProjectService(projectUsecase, settingUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
safeRepo, err := data.NewSafeRepo()
if err != nil {
cleanup()
return nil, nil, err
}
safeUsecase := biz.NewSafeUsecase(safeRepo, slogLogger)
safeService, err := service.NewSafeService(safeUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
settingService, err := service.NewSettingService(certAccountUsecase, certUsecase, settingUsecase, db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
sshRepo, err := data.NewSSHRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
sshUsecase := biz.NewSSHUsecase(sshRepo, slogLogger)
sshService, err := service.NewSSHService(sshUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
systemctlService, err := service.NewSystemctlService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
tamperService, err := service.NewTamperService(tamperUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
taskService, err := service.NewTaskService(taskUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
templateRepo, err := data.NewTemplateRepo(slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
templateUsecase, err := biz.NewTemplateUsecase(locale, cacheRepo, templateRepo)
if err != nil {
cleanup()
return nil, nil, err
}
templateService, err := service.NewTemplateService(settingUsecase, templateUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxBenchmarkService, err := service.NewToolboxBenchmarkService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxDiskService, err := service.NewToolboxDiskService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxLogService, err := service.NewToolboxLogService(containerImageUsecase, settingUsecase, db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxMigrationService, err := service.NewToolboxMigrationService(appUsecase, databaseServerUsecase, databaseUsecase, databaseUserUsecase, environmentUsecase, projectUsecase, settingUsecase, websiteUsecase, config, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxNetworkService, err := service.NewToolboxNetworkService()
if err != nil {
cleanup()
return nil, nil, err
}
toolboxSSHService, err := service.NewToolboxSSHService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
toolboxSystemService, err := service.NewToolboxSystemService(locale)
if err != nil {
cleanup()
return nil, nil, err
}
userUsecase, err := biz.NewUserUsecase(locale, slogLogger, userRepo)
if err != nil {
cleanup()
return nil, nil, err
}
userService, err := service.NewUserService(notifyUsecase, userUsecase, config, locale, manager)
if err != nil {
cleanup()
return nil, nil, err
}
userPasskeyRepo, err := data.NewUserPasskeyRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
userPasskeyUsecase := biz.NewUserPasskeyUsecase(userPasskeyRepo)
userPasskeyService, err := service.NewUserPasskeyService(notifyUsecase, userPasskeyUsecase, userUsecase, config, locale, manager)
if err != nil {
cleanup()
return nil, nil, err
}
userTokenUsecase := biz.NewUserTokenUsecase(userTokenRepo)
userTokenService, err := service.NewUserTokenService(userTokenUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
webHookRepo, err := data.NewWebHookRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
webHookUsecase, err := biz.NewWebHookUsecase(locale, slogLogger, webHookRepo)
if err != nil {
cleanup()
return nil, nil, err
}
webHookService, err := service.NewWebHookService(webHookUsecase)
if err != nil {
cleanup()
return nil, nil, err
}
websiteService, err := service.NewWebsiteService(settingUsecase, websiteUsecase, locale)
if err != nil {
cleanup()
return nil, nil, err
}
aggregator := websitestat.NewAggregator()
websiteStatService, err := service.NewWebsiteStatService(settingUsecase, websiteStatUsecase, websiteUsecase, aggregator)
if err != nil {
cleanup()
return nil, nil, err
}
wsService, err := service.NewWsService(backupUsecase, certUsecase, sshUsecase, settingUsecase, taskUsecase, config, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
services := &route.Services{
Alert: alertService,
App: appService,
Backup: backupService,
BackupStorage: backupStorageService,
Cert: certService,
CertAccount: certAccountService,
CertDNS: certDNSService,
Container: containerService,
ContainerCompose: containerComposeService,
ContainerImage: containerImageService,
ContainerNetwork: containerNetworkService,
ContainerVolume: containerVolumeService,
Cron: cronService,
Database: databaseService,
DatabaseElasticsearch: databaseElasticsearchService,
DatabaseRedis: databaseRedisService,
DatabaseServer: databaseServerService,
DatabaseUser: databaseUserService,
Environment: environmentService,
EnvironmentDotnet: environmentDotnetService,
EnvironmentGo: environmentGoService,
EnvironmentJava: environmentJavaService,
EnvironmentNodejs: environmentNodejsService,
EnvironmentPHP: environmentPHPService,
EnvironmentPython: environmentPythonService,
File: fileService,
FileShare: fileShareService,
Firewall: firewallService,
FirewallScan: firewallScanService,
Home: homeService,
Log: logService,
Monitor: monitorService,
Notify: notifyService,
Process: processService,
Project: projectService,
Safe: safeService,
Setting: settingService,
SSH: sshService,
Systemctl: systemctlService,
Tamper: tamperService,
Task: taskService,
Template: templateService,
ToolboxBenchmark: toolboxBenchmarkService,
ToolboxDisk: toolboxDiskService,
ToolboxLog: toolboxLogService,
ToolboxMigration: toolboxMigrationService,
ToolboxNetwork: toolboxNetworkService,
ToolboxSSH: toolboxSSHService,
ToolboxSystem: toolboxSystemService,
User: userService,
UserPasskey: userPasskeyService,
UserToken: userTokenService,
WebHook: webHookService,
Website: websiteService,
WebsiteStat: websiteStatService,
Ws: wsService,
}
v := route.NewEndpoints(services)
mux, err := bootstrap.NewRouter(loader, config, locale, middlewares, validator, v)
if err != nil {
cleanup()
return nil, nil, err
}
dependencies := &job.Dependencies{
Alert: alertUsecase,
Backup: backupUsecase,
Cache: cacheUsecase,
Cert: certUsecase,
CertAccount: certAccountUsecase,
FileShare: fileShareUsecase,
Notify: notifyUsecase,
ScanEvent: scanEventUsecase,
Setting: settingUsecase,
Tamper: tamperUsecase,
Task: taskUsecase,
Website: websiteUsecase,
WebsiteStat: websiteStatUsecase,
Conf: config,
DB: db,
T: locale,
Log: slogLogger,
Aggregator: aggregator,
}
v2 := job.NewJobs(dependencies)
cron, err := bootstrap.NewCron(slogLogger, v2)
if err != nil {
cleanup()
return nil, nil, err
}
gormigrate, err := bootstrap.NewMigrate(db)
if err != nil {
cleanup()
return nil, nil, err
}
reloader, err := bootstrap.NewTLSReloader(config)
if err != nil {
cleanup()
return nil, nil, err
}
server, err := bootstrap.NewHttp(mux, config, reloader)
if err != nil {
cleanup()
return nil, nil, err
}
ace, err := app.NewAce(mux, config, cron, gormigrate, server, reloader, taskRunner)
if err != nil {
cleanup()
return nil, nil, err
}
return ace, func() {
cleanup()
}, nil
}
+4 -8
View File
@@ -6,10 +6,6 @@ import (
_ "time/tzdata"
"github.com/gookit/color"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/injector"
)
func main() {
@@ -24,13 +20,13 @@ func run() error {
return errors.New("panel must run as root")
}
inj := injector.New()
defer func() { _ = inj.Shutdown() }()
cli, err := do.Invoke[*app.Cli](inj)
cli, cleanup, err := initCli()
if err != nil {
return err
}
if cleanup != nil {
defer cleanup()
}
return cli.Run()
}
+25
View File
@@ -0,0 +1,25 @@
//go:build wireinject
package main
import (
"github.com/google/wire"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/biz"
"github.com/acepanel/panel/v3/internal/bootstrap"
"github.com/acepanel/panel/v3/internal/command"
"github.com/acepanel/panel/v3/internal/data"
"github.com/acepanel/panel/v3/internal/service"
)
func initCli() (*app.Cli, func(), error) {
panic(wire.Build(
bootstrap.ProviderSet,
biz.ProviderSet,
data.ProviderSet,
service.ProviderSet,
command.ProviderSet,
app.NewCli,
))
}
+220
View File
@@ -0,0 +1,220 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/biz"
"github.com/acepanel/panel/v3/internal/bootstrap"
"github.com/acepanel/panel/v3/internal/command"
"github.com/acepanel/panel/v3/internal/data"
"github.com/acepanel/panel/v3/internal/service"
)
import (
_ "time/tzdata"
)
// Injectors from wire.go:
func initCli() (*app.Cli, func(), error) {
config, err := bootstrap.NewConf()
if err != nil {
return nil, nil, err
}
locale, err := bootstrap.NewT(config)
if err != nil {
return nil, nil, err
}
db, err := bootstrap.NewDB(config)
if err != nil {
return nil, nil, err
}
logger, cleanup, err := bootstrap.NewLogger(config)
if err != nil {
return nil, nil, err
}
slogLogger := bootstrap.NewSlog(logger)
appRepo, err := data.NewAppRepo(config, db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
cacheRepo, err := data.NewCacheRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
notifyChannelRepo, err := data.NewNotifyChannelRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
settingRepo, err := data.NewSettingRepo(config, db)
if err != nil {
cleanup()
return nil, nil, err
}
notifyUsecase, err := biz.NewNotifyUsecase(locale, slogLogger, notifyChannelRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
taskRunner, err := bootstrap.NewRunner(notifyUsecase, db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
taskRepo, err := data.NewTaskRepo(db, locale, slogLogger, taskRunner)
if err != nil {
cleanup()
return nil, nil, err
}
appUsecase, err := biz.NewAppUsecase(locale, appRepo, cacheRepo, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
websiteRepo, err := data.NewWebsiteRepo(db, locale, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
backupRepo, err := data.NewBackupRepo(config, db, locale, slogLogger, settingRepo, websiteRepo)
if err != nil {
cleanup()
return nil, nil, err
}
backupUsecase, err := biz.NewBackupUsecase(notifyUsecase, locale, slogLogger, backupRepo)
if err != nil {
cleanup()
return nil, nil, err
}
cacheUsecase := biz.NewCacheUsecase(cacheRepo)
certAccountRepo, err := data.NewCertAccountRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
userRepo, err := data.NewUserRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
certAccountUsecase, err := biz.NewCertAccountUsecase(locale, slogLogger, certAccountRepo, userRepo)
if err != nil {
cleanup()
return nil, nil, err
}
certRepo, err := data.NewCertRepo(db, locale, slogLogger)
if err != nil {
cleanup()
return nil, nil, err
}
certUsecase, err := biz.NewCertUsecase(locale, slogLogger, certRepo, settingRepo)
if err != nil {
cleanup()
return nil, nil, err
}
cronRepo, err := data.NewCronRepo(db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
cronUsecase := biz.NewCronUsecase(cronRepo, slogLogger)
databaseServerRepo, err := data.NewDatabaseServerRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
databaseServerUsecase, err := biz.NewDatabaseServerUsecase(locale, slogLogger, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
settingUsecase, err := biz.NewSettingUsecase(locale, slogLogger, settingRepo, taskRepo)
if err != nil {
cleanup()
return nil, nil, err
}
userPasskeyRepo, err := data.NewUserPasskeyRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
userPasskeyUsecase := biz.NewUserPasskeyUsecase(userPasskeyRepo)
userUsecase, err := biz.NewUserUsecase(locale, slogLogger, userRepo)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUserRepo, err := data.NewDatabaseUserRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUserUsecase, err := biz.NewDatabaseUserUsecase(slogLogger, databaseServerRepo, databaseUserRepo)
if err != nil {
cleanup()
return nil, nil, err
}
databaseRepo, err := data.NewDatabaseRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
databaseUsecase, err := biz.NewDatabaseUsecase(databaseUserUsecase, locale, slogLogger, databaseRepo, databaseServerRepo)
if err != nil {
cleanup()
return nil, nil, err
}
tamperRepo, err := data.NewTamperRepo(db)
if err != nil {
cleanup()
return nil, nil, err
}
tamperUsecase, err := biz.NewTamperUsecase(notifyUsecase, settingUsecase, locale, slogLogger, tamperRepo)
if err != nil {
cleanup()
return nil, nil, err
}
websiteStatRepo, err := data.NewWebsiteStatRepo()
if err != nil {
cleanup()
return nil, nil, err
}
websiteStatUsecase := biz.NewWebsiteStatUsecase(websiteStatRepo)
websiteUsecase, err := biz.NewWebsiteUsecase(certAccountUsecase, certUsecase, databaseUsecase, databaseUserUsecase, tamperUsecase, websiteStatUsecase, locale, slogLogger, databaseServerRepo, websiteRepo)
if err != nil {
cleanup()
return nil, nil, err
}
cliService, err := service.NewCliService(appUsecase, backupUsecase, cacheUsecase, certAccountUsecase, certUsecase, cronUsecase, databaseServerUsecase, notifyUsecase, settingUsecase, userPasskeyUsecase, userUsecase, websiteUsecase, config, db, locale)
if err != nil {
cleanup()
return nil, nil, err
}
v := command.Commands(locale, cliService)
cliCommand, err := bootstrap.NewCli(locale, v)
if err != nil {
cleanup()
return nil, nil, err
}
gormigrate, err := bootstrap.NewMigrate(db)
if err != nil {
cleanup()
return nil, nil, err
}
cli, err := app.NewCli(cliCommand, gormigrate)
if err != nil {
cleanup()
return nil, nil, err
}
return cli, func() {
cleanup()
}, nil
}
+7 -2
View File
@@ -20,6 +20,7 @@ require (
github.com/go-sql-driver/mysql v1.10.0
github.com/go-webauthn/webauthn v0.17.4
github.com/gomodule/redigo v1.9.3
github.com/google/wire v0.7.0
github.com/gookit/color v1.6.1
github.com/hashicorp/go-version v1.9.0
github.com/leonelquinteros/gotext v1.7.2
@@ -50,7 +51,6 @@ require (
github.com/orandin/slog-gorm v1.4.0
github.com/pkg/sftp v1.13.11
github.com/pquerna/otp v1.5.0
github.com/samber/do/v2 v2.1.0
github.com/samber/lo v1.53.0
github.com/sethvargo/go-limiter v1.2.0
github.com/shirou/gopsutil/v4 v4.26.6
@@ -97,6 +97,7 @@ require (
github.com/gofiber/utils/v2 v2.2.0 // indirect
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
github.com/google/go-tpm v0.9.8 // indirect
github.com/google/subcommands v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/imega/luaformatter v0.0.0-20211025140405-86b0a68d6bef // indirect
github.com/jaevor/go-nanoid v1.4.0 // indirect
@@ -111,11 +112,11 @@ require (
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/philhofer/fwd v1.2.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/richardlehane/mscfb v1.0.7 // indirect
github.com/richardlehane/msoleps v1.0.6 // indirect
github.com/samber/go-type-to-string v1.8.0 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/tiendc/go-deepcopy v1.7.2 // indirect
github.com/timtadh/data-structures v0.6.2 // indirect
@@ -134,7 +135,9 @@ require (
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
golang.org/x/exp v0.0.0-20260603202125-055de637280b // indirect
golang.org/x/mod v0.37.0 // indirect
golang.org/x/text v0.40.0 // indirect
golang.org/x/tools v0.47.0 // indirect
modernc.org/libc v1.74.1 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
@@ -144,3 +147,5 @@ replace (
github.com/mholt/acmez/v3 => github.com/libtnb/acmez/v3 v3.0.0-20260406165834-a264acd02292
github.com/stretchr/testify => github.com/libtnb/testify v0.0.0-20260406170114-25da2dad39e7
)
tool github.com/google/wire/cmd/wire
+6 -4
View File
@@ -159,8 +159,12 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4=
github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0=
@@ -337,6 +341,8 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
github.com/pkg/sftp v1.13.11 h1:0N92SLTB8JqASJB14ZLHHzFnBV8mG9zw4K7jghEFWuE=
github.com/pkg/sftp v1.13.11/go.mod h1:uNkH9roSXglNJqM+glJJi+TQXQUm0fXFWqCFmT8hsN0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
@@ -363,10 +369,6 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samber/do/v2 v2.1.0 h1:lqCHn05XvY3VqwxvZDQPSkH+jIGWSVHUrSVLEbPOopo=
github.com/samber/do/v2 v2.1.0/go.mod h1:wJBoiaZcUZyGuraOhfz15b517ZMogGs+U03DvnqvT6Q=
github.com/samber/go-type-to-string v1.8.0 h1:5z6tDTjtXxkIAoAuHAZYMYR8mkBZjVgeSH7jcSLqc8w=
github.com/samber/go-type-to-string v1.8.0/go.mod h1:jpU77vIDoIxkahknKDoEx9C8bQ1ADnh2sotZ8I4QqBU=
github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM=
github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+8 -9
View File
@@ -14,7 +14,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/go-gormigrate/gormigrate/v2"
"github.com/libtnb/cron"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/pkg/config"
"github.com/acepanel/panel/v3/pkg/tlscert"
@@ -31,15 +30,15 @@ type Ace struct {
runner types.TaskRunner
}
func NewAce(i do.Injector) (*Ace, error) {
func NewAce(router *chi.Mux, conf *config.Config, cron *cron.Cron, migrator *gormigrate.Gormigrate, server *hlfhr.Server, reloader *tlscert.Reloader, runner types.TaskRunner) (*Ace, error) {
return &Ace{
conf: do.MustInvoke[*config.Config](i),
router: do.MustInvoke[*chi.Mux](i),
server: do.MustInvoke[*hlfhr.Server](i),
reloader: do.MustInvoke[*tlscert.Reloader](i),
migrator: do.MustInvoke[*gormigrate.Gormigrate](i),
cron: do.MustInvoke[*cron.Cron](i),
runner: do.MustInvoke[types.TaskRunner](i),
conf: conf,
router: router,
server: server,
reloader: reloader,
migrator: migrator,
cron: cron,
runner: runner,
}, nil
}
+3 -7
View File
@@ -5,10 +5,7 @@ import (
"os"
"github.com/go-gormigrate/gormigrate/v2"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/pkg/apploader"
)
type Cli struct {
@@ -16,12 +13,11 @@ type Cli struct {
migrator *gormigrate.Gormigrate
}
func NewCli(i do.Injector) (*Cli, error) {
func NewCli(cmd *cli.Command, migrator *gormigrate.Gormigrate) (*Cli, error) {
IsCli = true
_ = do.MustInvoke[*apploader.Loader](i) // 强制构造 loader,触发全局应用注册
return &Cli{
cmd: do.MustInvoke[*cli.Command](i),
migrator: do.MustInvoke[*gormigrate.Gormigrate](i),
cmd: cmd,
migrator: migrator,
}, nil
}
-70
View File
@@ -1,70 +0,0 @@
package app_test
import (
"os"
"path/filepath"
"testing"
"github.com/samber/do/v2"
"github.com/stretchr/testify/require"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/bootstrap"
"github.com/acepanel/panel/v3/internal/command"
"github.com/acepanel/panel/v3/internal/injector"
"github.com/acepanel/panel/v3/internal/job"
"github.com/acepanel/panel/v3/internal/registry"
"github.com/acepanel/panel/v3/internal/route"
"github.com/acepanel/panel/v3/pkg/config"
)
// TestContainer 构建完整对象图,在测试期而非启动期暴露装配错误
func TestContainer(t *testing.T) {
tmp := t.TempDir()
require.NoError(t, os.MkdirAll(filepath.Join(tmp, "panel/storage/logs"), 0o755))
// 直接构造内存配置并注入
conf := &config.Config{
App: config.AppConfig{
Debug: true,
Key: "12345678901234567890123456789012",
Locale: "zh_CN",
Timezone: "UTC",
Root: tmp,
},
HTTP: config.HTTPConfig{Port: 8888, TLS: "off"},
Session: config.SessionConfig{Lifetime: 120},
}
require.NoError(t, bootstrap.InitGlobal(conf))
inj := injector.New()
defer func() { _ = inj.Shutdown() }()
// 覆盖配置提供者,跳过 config.Load 与全局副作用
do.OverrideValue(inj, conf)
// 构造两个入口即触发全图:路由 + SpecJSON + cron 注册(5 段表达式)+ nil 证书重载器
_, err := do.Invoke[*app.Ace](inj)
require.NoError(t, err)
_, err = do.Invoke[*app.Cli](inj)
require.NoError(t, err)
// 每个带冒号的命名贡献必须命中已知前缀(拼错如 route:user 会被静默丢弃)
require.NoError(t, registry.Verify(inj, route.RoutePrefix, command.Prefix, job.Prefix))
routes, err := registry.Collect[route.Endpoints](inj, route.RoutePrefix)
require.NoError(t, err)
require.NotEmpty(t, routes)
cmds, err := command.Commands(inj)
require.NoError(t, err)
require.NotEmpty(t, cmds)
jobs, err := registry.Collect[job.Job](inj, job.Prefix)
require.NoError(t, err)
require.NotEmpty(t, jobs)
spec, err := route.SpecJSON(inj, "AcePanel")
require.NoError(t, err)
require.NotEmpty(t, spec)
}
+2 -3
View File
@@ -7,7 +7,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -23,9 +22,9 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
t: t,
}, nil
}
+12 -12
View File
@@ -1,7 +1,7 @@
package apps
import (
"github.com/samber/do/v2"
"github.com/google/wire"
"github.com/acepanel/panel/v3/internal/apps/apache"
"github.com/acepanel/panel/v3/internal/apps/clickhouse"
@@ -36,15 +36,15 @@ import (
"github.com/acepanel/panel/v3/internal/apps/valkey"
)
var Package = do.Package(
do.Lazy(apache.NewApp), do.Lazy(clickhouse.NewApp), do.Lazy(codeserver.NewApp),
do.Lazy(docker.NewApp), do.Lazy(elasticsearch.NewApp), do.Lazy(fail2ban.NewApp),
do.Lazy(frp.NewApp), do.Lazy(gitea.NewApp), do.Lazy(grafana.NewApp),
do.Lazy(kafka.NewApp), do.Lazy(mariadb.NewApp), do.Lazy(memcached.NewApp),
do.Lazy(minio.NewApp), do.Lazy(mongodb.NewApp), do.Lazy(mysql.NewApp),
do.Lazy(nginx.NewApp), do.Lazy(openresty.NewApp), do.Lazy(opensearch.NewApp),
do.Lazy(percona.NewApp), do.Lazy(pgadmin.NewApp), do.Lazy(phpmyadmin.NewApp), do.Lazy(podman.NewApp),
do.Lazy(postgresql.NewApp), do.Lazy(prometheus.NewApp), do.Lazy(pureftpd.NewApp),
do.Lazy(redis.NewApp), do.Lazy(rocketmq.NewApp), do.Lazy(rsync.NewApp),
do.Lazy(s3fs.NewApp), do.Lazy(supervisor.NewApp), do.Lazy(valkey.NewApp),
var ProviderSet = wire.NewSet(
apache.NewApp, clickhouse.NewApp, codeserver.NewApp,
docker.NewApp, elasticsearch.NewApp, fail2ban.NewApp,
frp.NewApp, gitea.NewApp, grafana.NewApp,
kafka.NewApp, mariadb.NewApp, memcached.NewApp,
minio.NewApp, mongodb.NewApp, mysql.NewApp,
nginx.NewApp, openresty.NewApp, opensearch.NewApp,
percona.NewApp, pgadmin.NewApp, phpmyadmin.NewApp, podman.NewApp,
postgresql.NewApp, prometheus.NewApp, pureftpd.NewApp,
redis.NewApp, rocketmq.NewApp, rsync.NewApp,
s3fs.NewApp, supervisor.NewApp, valkey.NewApp,
)
+4 -5
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"go.yaml.in/yaml/v4"
"resty.dev/v3"
@@ -28,11 +27,11 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo, settingRepo biz.SettingRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
settingRepo: do.MustInvoke[biz.SettingRepo](i),
databaseServerRepo: do.MustInvoke[biz.DatabaseServerRepo](i),
t: t,
settingRepo: settingRepo,
databaseServerRepo: databaseServerRepo,
}, nil
}
+1 -2
View File
@@ -4,7 +4,6 @@ import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -14,7 +13,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+1 -2
View File
@@ -7,7 +7,6 @@ import (
"strings"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -17,7 +16,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"go.yaml.in/yaml/v4"
"resty.dev/v3"
@@ -26,8 +25,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
return &App{t: do.MustInvoke[*gotext.Locale](i)}, nil
func NewApp(t *gotext.Locale) (*App, error) {
return &App{t: t}, nil
}
func (s *App) Route(r chi.Router) {
+3 -4
View File
@@ -10,7 +10,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/libtnb/utils/str"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/spf13/cast"
@@ -28,10 +27,10 @@ type App struct {
websiteRepo biz.WebsiteRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale, websiteRepo biz.WebsiteRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
websiteRepo: do.MustInvoke[biz.WebsiteRepo](i),
t: t,
websiteRepo: websiteRepo,
}, nil
}
+1 -2
View File
@@ -5,7 +5,6 @@ import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/service"
@@ -16,7 +15,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+1 -2
View File
@@ -5,7 +5,6 @@ import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/service"
@@ -16,7 +15,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+2 -3
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"go.yaml.in/yaml/v4"
"resty.dev/v3"
@@ -25,8 +24,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
return &App{t: do.MustInvoke[*gotext.Locale](i)}, nil
func NewApp(t *gotext.Locale) (*App, error) {
return &App{t: t}, nil
}
func (s *App) Route(r chi.Router) {
+2 -3
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/service"
@@ -21,8 +20,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
return &App{t: do.MustInvoke[*gotext.Locale](i)}, nil
func NewApp(t *gotext.Locale) (*App, error) {
return &App{t: t}, nil
}
func (s *App) Route(r chi.Router) {
+2 -7
View File
@@ -2,7 +2,6 @@ package mariadb
import (
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/apps/mysql"
)
@@ -11,13 +10,9 @@ type App struct {
mysql *mysql.App
}
func NewApp(i do.Injector) (*App, error) {
app, err := mysql.NewApp(i)
if err != nil {
return nil, err
}
func NewApp(mysqlApp *mysql.App) (*App, error) {
return &App{
mysql: app,
mysql: mysqlApp,
}, nil
}
+2 -3
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -21,9 +20,9 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
t: t,
}, nil
}
+1 -2
View File
@@ -4,7 +4,6 @@ import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -14,7 +13,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+4 -5
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"go.yaml.in/yaml/v4"
@@ -27,11 +26,11 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo, settingRepo biz.SettingRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
settingRepo: do.MustInvoke[biz.SettingRepo](i),
databaseServerRepo: do.MustInvoke[biz.DatabaseServerRepo](i),
t: t,
settingRepo: settingRepo,
databaseServerRepo: databaseServerRepo,
}, nil
}
+4 -5
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -29,11 +28,11 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo, settingRepo biz.SettingRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
settingRepo: do.MustInvoke[biz.SettingRepo](i),
databaseServerRepo: do.MustInvoke[biz.DatabaseServerRepo](i),
t: t,
settingRepo: settingRepo,
databaseServerRepo: databaseServerRepo,
}, nil
}
+2 -3
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"resty.dev/v3"
@@ -26,8 +25,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: t,
}, nil
+2 -3
View File
@@ -2,7 +2,6 @@ package openresty
import (
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/apps/nginx"
"github.com/acepanel/panel/v3/pkg/systemctl"
@@ -13,9 +12,9 @@ type App struct {
nginx *nginx.App
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(nginxApp *nginx.App) (*App, error) {
return &App{
nginx: do.MustInvoke[*nginx.App](i),
nginx: nginxApp,
}, nil
}
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"go.yaml.in/yaml/v4"
"resty.dev/v3"
@@ -26,8 +25,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{t: t}, nil
}
+2 -3
View File
@@ -2,7 +2,6 @@ package percona
import (
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/apps/mysql"
)
@@ -11,9 +10,9 @@ type App struct {
mysql *mysql.App
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(mysqlApp *mysql.App) (*App, error) {
return &App{
mysql: do.MustInvoke[*mysql.App](i),
mysql: mysqlApp,
}, nil
}
+4 -5
View File
@@ -19,7 +19,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -39,11 +38,11 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(conf *config.Config, t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
conf: do.MustInvoke[*config.Config](i),
databaseServerRepo: do.MustInvoke[biz.DatabaseServerRepo](i),
t: t,
conf: conf,
databaseServerRepo: databaseServerRepo,
}, nil
}
+4 -5
View File
@@ -16,7 +16,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/libtnb/utils/str"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -36,11 +35,11 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
func NewApp(conf *config.Config, t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo) (*App, error) {
return &App{
t: do.MustInvoke[*gotext.Locale](i),
conf: do.MustInvoke[*config.Config](i),
databaseServerRepo: do.MustInvoke[biz.DatabaseServerRepo](i),
t: t,
conf: conf,
databaseServerRepo: databaseServerRepo,
}, nil
}
+1 -2
View File
@@ -4,7 +4,6 @@ import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -14,7 +13,7 @@ import (
type App struct{}
func NewApp(i do.Injector) (*App, error) {
func NewApp() (*App, error) {
return &App{}, nil
}
+4 -5
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -28,10 +27,10 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
setting := do.MustInvoke[biz.SettingRepo](i)
databaseServer := do.MustInvoke[biz.DatabaseServerRepo](i)
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo, settingRepo biz.SettingRepo) (*App, error) {
setting := settingRepo
databaseServer := databaseServerRepo
return &App{
t: t,
settingRepo: setting,
+2 -5
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/spf13/cast"
"go.yaml.in/yaml/v4"
@@ -30,10 +29,8 @@ type App struct {
taskRepo biz.TaskRepo
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
conf := do.MustInvoke[*config.Config](i)
taskRepo := do.MustInvoke[biz.TaskRepo](i)
func NewApp(conf *config.Config, t *gotext.Locale, taskRepo biz.TaskRepo) (*App, error) {
return &App{t: t, conf: conf, taskRepo: taskRepo}, nil
}
+2 -3
View File
@@ -9,7 +9,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/spf13/cast"
@@ -26,8 +25,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: t,
}, nil
+3 -4
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/acepanel/panel/v3/internal/app"
@@ -25,9 +24,9 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
databaseServer := do.MustInvoke[biz.DatabaseServerRepo](i)
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo) (*App, error) {
databaseServer := databaseServerRepo
return &App{
t: t,
databaseServerRepo: databaseServer,
+2 -3
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/service"
@@ -21,8 +20,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{t: t}, nil
}
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/libtnb/utils/str"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/service"
"github.com/acepanel/panel/v3/pkg/io"
@@ -23,8 +22,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: t,
}, nil
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/spf13/cast"
@@ -24,8 +23,8 @@ type App struct {
t *gotext.Locale
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
return &App{
t: t,
}, nil
+2 -3
View File
@@ -7,7 +7,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/libtnb/chix/v2"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/service"
@@ -23,8 +22,8 @@ type App struct {
name string
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewApp(t *gotext.Locale) (*App, error) {
var name string
if os.IsRHEL() {
name = "supervisord"
+3 -4
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-chi/chi/v5"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/acepanel/panel/v3/internal/app"
@@ -25,9 +24,9 @@ type App struct {
databaseServerRepo biz.DatabaseServerRepo
}
func NewApp(i do.Injector) (*App, error) {
t := do.MustInvoke[*gotext.Locale](i)
databaseServer := do.MustInvoke[biz.DatabaseServerRepo](i)
func NewApp(t *gotext.Locale, databaseServerRepo biz.DatabaseServerRepo) (*App, error) {
databaseServer := databaseServerRepo
return &App{
t: t,
databaseServerRepo: databaseServer,
+10 -11
View File
@@ -12,7 +12,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
lop "github.com/samber/lo/parallel"
"github.com/spf13/cast"
@@ -170,17 +169,17 @@ type AlertUsecase struct {
cleanedAt time.Time
}
func NewAlertUsecase(i do.Injector) (*AlertUsecase, error) {
func NewAlertUsecase(notifyUsecase *NotifyUsecase, loader *apploader.Loader, t *gotext.Locale, log *slog.Logger, alertRepo AlertRepo, appRepo AppRepo, containerRepo ContainerRepo, databaseServerRepo DatabaseServerRepo, settingRepo SettingRepo) (*AlertUsecase, error) {
return &AlertUsecase{
repo: do.MustInvoke[AlertRepo](i),
notify: do.MustInvoke[*NotifyUsecase](i),
setting: do.MustInvoke[SettingRepo](i),
container: do.MustInvoke[ContainerRepo](i),
app: do.MustInvoke[AppRepo](i),
database: do.MustInvoke[DatabaseServerRepo](i),
loader: do.MustInvoke[*apploader.Loader](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: alertRepo,
notify: notifyUsecase,
setting: settingRepo,
container: containerRepo,
app: appRepo,
database: databaseServerRepo,
loader: loader,
log: log,
t: t,
hits: make(map[string]uint),
fired: make(map[string]time.Time),
netSnaps: make(map[string]ioSnapshot),
+5 -6
View File
@@ -7,7 +7,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/acepanel/panel/v3/internal/app"
@@ -72,12 +71,12 @@ type AppUsecase struct {
t *gotext.Locale
}
func NewAppUsecase(i do.Injector) (*AppUsecase, error) {
func NewAppUsecase(t *gotext.Locale, appRepo AppRepo, cacheRepo CacheRepo, taskRepo TaskRepo) (*AppUsecase, error) {
return &AppUsecase{
repo: do.MustInvoke[AppRepo](i),
cache: do.MustInvoke[CacheRepo](i),
task: do.MustInvoke[TaskRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: appRepo,
cache: cacheRepo,
task: taskRepo,
t: t,
}, nil
}
+5 -6
View File
@@ -6,7 +6,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/pkg/types"
)
@@ -47,12 +46,12 @@ type BackupUsecase struct {
t *gotext.Locale
}
func NewBackupUsecase(i do.Injector) (*BackupUsecase, error) {
func NewBackupUsecase(notifyUsecase *NotifyUsecase, t *gotext.Locale, log *slog.Logger, backupRepo BackupRepo) (*BackupUsecase, error) {
return &BackupUsecase{
repo: do.MustInvoke[BackupRepo](i),
log: do.MustInvoke[*slog.Logger](i),
notify: do.MustInvoke[*NotifyUsecase](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: backupRepo,
log: log,
notify: notifyUsecase,
t: t,
}, nil
}
+5 -6
View File
@@ -7,7 +7,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/crypt"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/app"
@@ -146,12 +145,12 @@ type BackupAccountUsecase struct {
log *slog.Logger
}
func NewBackupAccountUsecase(i do.Injector) (*BackupAccountUsecase, error) {
func NewBackupAccountUsecase(t *gotext.Locale, log *slog.Logger, backupAccountRepo BackupAccountRepo, settingRepo SettingRepo) (*BackupAccountUsecase, error) {
return &BackupAccountUsecase{
repo: do.MustInvoke[BackupAccountRepo](i),
setting: do.MustInvoke[SettingRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: backupAccountRepo,
setting: settingRepo,
t: t,
log: log,
}, nil
}
+14 -18
View File
@@ -1,22 +1,18 @@
package biz
import (
"github.com/samber/do/v2"
import "github.com/google/wire"
"github.com/acepanel/panel/v3/internal/registry"
)
var Package = do.Package(
do.Lazy(NewAlertUsecase), do.Lazy(NewAppUsecase), do.Lazy(NewBackupUsecase), do.Lazy(NewBackupAccountUsecase),
registry.Lazy(NewCacheUsecase), do.Lazy(NewCertUsecase), do.Lazy(NewCertAccountUsecase),
registry.Lazy2(NewCertDNSUsecase), registry.Lazy2(NewContainerUsecase), registry.Lazy(NewContainerComposeUsecase),
registry.Lazy2(NewContainerImageUsecase), registry.Lazy2(NewContainerNetworkUsecase), registry.Lazy2(NewContainerVolumeUsecase),
registry.Lazy2(NewCronUsecase), do.Lazy(NewDatabaseUsecase), registry.Lazy(NewDatabaseRedisUsecase),
registry.Lazy(NewDatabaseElasticsearchUsecase), do.Lazy(NewDatabaseServerUsecase), do.Lazy(NewDatabaseUserUsecase),
do.Lazy(NewEnvironmentUsecase), do.Lazy(NewFileShareUsecase), registry.Lazy(NewLogUsecase), registry.Lazy2(NewMonitorUsecase),
do.Lazy(NewNotifyUsecase), do.Lazy(NewProjectUsecase), registry.Lazy2(NewSafeUsecase), registry.Lazy2(NewScanEventUsecase),
do.Lazy(NewSettingUsecase), registry.Lazy2(NewSSHUsecase), do.Lazy(NewTamperUsecase), registry.Lazy(NewTaskUsecase),
do.Lazy(NewTemplateUsecase), do.Lazy(NewUserUsecase), registry.Lazy(NewUserPasskeyUsecase),
registry.Lazy(NewUserTokenUsecase), do.Lazy(NewWebHookUsecase), do.Lazy(NewWebsiteUsecase),
registry.Lazy(NewWebsiteStatUsecase),
var ProviderSet = wire.NewSet(
NewAlertUsecase, NewAppUsecase, NewBackupUsecase, NewBackupAccountUsecase,
NewCacheUsecase, NewCertUsecase, NewCertAccountUsecase,
NewCertDNSUsecase, NewContainerUsecase, NewContainerComposeUsecase,
NewContainerImageUsecase, NewContainerNetworkUsecase, NewContainerVolumeUsecase,
NewCronUsecase, NewDatabaseUsecase, NewDatabaseRedisUsecase,
NewDatabaseElasticsearchUsecase, NewDatabaseServerUsecase, NewDatabaseUserUsecase,
NewEnvironmentUsecase, NewFileShareUsecase, NewLogUsecase, NewMonitorUsecase,
NewNotifyUsecase, NewProjectUsecase, NewSafeUsecase, NewScanEventUsecase,
NewSettingUsecase, NewSSHUsecase, NewTamperUsecase, NewTaskUsecase,
NewTemplateUsecase, NewUserUsecase, NewUserPasskeyUsecase,
NewUserTokenUsecase, NewWebHookUsecase, NewWebsiteUsecase,
NewWebsiteStatUsecase,
)
+1 -1
View File
@@ -72,7 +72,7 @@ func (uc *CacheUsecase) UpdateApps() error {
// 去除本地不存在的应用
*remote = slices.Clip(slices.DeleteFunc(*remote, func(item *api.App) bool {
return !slices.Contains(apploader.Slugs(), item.Slug)
return !slices.Contains(apploader.SupportedSlugs(), item.Slug)
}))
encoded, err := json.Marshal(remote)
+5 -6
View File
@@ -12,7 +12,6 @@ import (
"github.com/leonelquinteros/gotext"
mholtacme "github.com/mholt/acmez/v3/acme"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/request"
@@ -69,12 +68,12 @@ type CertUsecase struct {
log *slog.Logger
}
func NewCertUsecase(i do.Injector) (*CertUsecase, error) {
func NewCertUsecase(t *gotext.Locale, log *slog.Logger, certRepo CertRepo, settingRepo SettingRepo) (*CertUsecase, error) {
return &CertUsecase{
repo: do.MustInvoke[CertRepo](i),
setting: do.MustInvoke[SettingRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: certRepo,
setting: settingRepo,
t: t,
log: log,
}, nil
}
+5 -6
View File
@@ -7,7 +7,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/request"
"github.com/acepanel/panel/v3/pkg/acme"
@@ -47,12 +46,12 @@ type CertAccountUsecase struct {
log *slog.Logger
}
func NewCertAccountUsecase(i do.Injector) (*CertAccountUsecase, error) {
func NewCertAccountUsecase(t *gotext.Locale, log *slog.Logger, certAccountRepo CertAccountRepo, userRepo UserRepo) (*CertAccountUsecase, error) {
return &CertAccountUsecase{
repo: do.MustInvoke[CertAccountRepo](i),
userRepo: do.MustInvoke[UserRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: certAccountRepo,
userRepo: userRepo,
t: t,
log: log,
}, nil
}
+6 -7
View File
@@ -6,7 +6,6 @@ import (
"log/slog"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/request"
"github.com/acepanel/panel/v3/pkg/db"
@@ -49,13 +48,13 @@ type DatabaseUsecase struct {
log *slog.Logger
}
func NewDatabaseUsecase(i do.Injector) (*DatabaseUsecase, error) {
func NewDatabaseUsecase(databaseUserUsecase *DatabaseUserUsecase, t *gotext.Locale, log *slog.Logger, databaseRepo DatabaseRepo, databaseServerRepo DatabaseServerRepo) (*DatabaseUsecase, error) {
return &DatabaseUsecase{
repo: do.MustInvoke[DatabaseRepo](i),
server: do.MustInvoke[DatabaseServerRepo](i),
user: do.MustInvoke[*DatabaseUserUsecase](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: databaseRepo,
server: databaseServerRepo,
user: databaseUserUsecase,
t: t,
log: log,
}, nil
}
+1
View File
@@ -2,6 +2,7 @@ package biz
import (
"context"
"github.com/acepanel/panel/v3/internal/request"
"github.com/acepanel/panel/v3/pkg/db"
)
+1
View File
@@ -2,6 +2,7 @@ package biz
import (
"context"
"github.com/acepanel/panel/v3/internal/request"
"github.com/acepanel/panel/v3/pkg/db"
)
+4 -5
View File
@@ -10,7 +10,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/crypt"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/app"
@@ -93,11 +92,11 @@ type DatabaseServerUsecase struct {
log *slog.Logger
}
func NewDatabaseServerUsecase(i do.Injector) (*DatabaseServerUsecase, error) {
func NewDatabaseServerUsecase(t *gotext.Locale, log *slog.Logger, databaseServerRepo DatabaseServerRepo) (*DatabaseServerUsecase, error) {
return &DatabaseServerUsecase{
repo: do.MustInvoke[DatabaseServerRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: databaseServerRepo,
t: t,
log: log,
}, nil
}
+4 -5
View File
@@ -7,7 +7,6 @@ import (
"time"
"github.com/libtnb/utils/crypt"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/app"
@@ -86,11 +85,11 @@ type DatabaseUserUsecase struct {
log *slog.Logger
}
func NewDatabaseUserUsecase(i do.Injector) (*DatabaseUserUsecase, error) {
func NewDatabaseUserUsecase(log *slog.Logger, databaseServerRepo DatabaseServerRepo, databaseUserRepo DatabaseUserRepo) (*DatabaseUserUsecase, error) {
return &DatabaseUserUsecase{
repo: do.MustInvoke[DatabaseUserRepo](i),
server: do.MustInvoke[DatabaseServerRepo](i),
log: do.MustInvoke[*slog.Logger](i),
repo: databaseUserRepo,
server: databaseServerRepo,
log: log,
}, nil
}
+5 -6
View File
@@ -7,7 +7,6 @@ import (
"slices"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/pkg/api"
@@ -28,12 +27,12 @@ type EnvironmentUsecase struct {
t *gotext.Locale
}
func NewEnvironmentUsecase(i do.Injector) (*EnvironmentUsecase, error) {
func NewEnvironmentUsecase(t *gotext.Locale, cacheRepo CacheRepo, environmentRepo EnvironmentRepo, taskRepo TaskRepo) (*EnvironmentUsecase, error) {
return &EnvironmentUsecase{
repo: do.MustInvoke[EnvironmentRepo](i),
cache: do.MustInvoke[CacheRepo](i),
task: do.MustInvoke[TaskRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: environmentRepo,
cache: cacheRepo,
task: taskRepo,
t: t,
}, nil
}
+3 -5
View File
@@ -5,8 +5,6 @@ import (
"log/slog"
"time"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/request"
)
@@ -35,10 +33,10 @@ type FileShareUsecase struct {
log *slog.Logger
}
func NewFileShareUsecase(i do.Injector) (*FileShareUsecase, error) {
func NewFileShareUsecase(log *slog.Logger, fileShareRepo FileShareRepo) (*FileShareUsecase, error) {
return &FileShareUsecase{
repo: do.MustInvoke[FileShareRepo](i),
log: do.MustInvoke[*slog.Logger](i),
repo: fileShareRepo,
log: log,
}, nil
}
+5 -6
View File
@@ -13,7 +13,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/crypt"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/app"
@@ -98,12 +97,12 @@ type NotifyUsecase struct {
pending chan struct{}
}
func NewNotifyUsecase(i do.Injector) (*NotifyUsecase, error) {
func NewNotifyUsecase(t *gotext.Locale, log *slog.Logger, notifyChannelRepo NotifyChannelRepo, settingRepo SettingRepo) (*NotifyUsecase, error) {
return &NotifyUsecase{
repo: do.MustInvoke[NotifyChannelRepo](i),
setting: do.MustInvoke[SettingRepo](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: notifyChannelRepo,
setting: settingRepo,
log: log,
t: t,
pending: make(chan struct{}, notifyMaxPending),
}, nil
}
+4 -5
View File
@@ -9,7 +9,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"github.com/acepanel/panel/v3/internal/request"
@@ -45,11 +44,11 @@ type ProjectUsecase struct {
t *gotext.Locale
}
func NewProjectUsecase(i do.Injector) (*ProjectUsecase, error) {
func NewProjectUsecase(t *gotext.Locale, log *slog.Logger, projectRepo ProjectRepo) (*ProjectUsecase, error) {
return &ProjectUsecase{
repo: do.MustInvoke[ProjectRepo](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: projectRepo,
log: log,
t: t,
}, nil
}
+5 -6
View File
@@ -8,7 +8,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/app"
@@ -100,12 +99,12 @@ type SettingUsecase struct {
log *slog.Logger
}
func NewSettingUsecase(i do.Injector) (*SettingUsecase, error) {
func NewSettingUsecase(t *gotext.Locale, log *slog.Logger, settingRepo SettingRepo, taskRepo TaskRepo) (*SettingUsecase, error) {
return &SettingUsecase{
repo: do.MustInvoke[SettingRepo](i),
task: do.MustInvoke[TaskRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
log: do.MustInvoke[*slog.Logger](i),
repo: settingRepo,
task: taskRepo,
t: t,
log: log,
}, nil
}
+9 -8
View File
@@ -11,7 +11,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/pkg/tamper"
@@ -78,13 +77,13 @@ type TamperUsecase struct {
drainC chan struct{}
}
func NewTamperUsecase(i do.Injector) (*TamperUsecase, error) {
func NewTamperUsecase(notifyUsecase *NotifyUsecase, settingUsecase *SettingUsecase, t *gotext.Locale, log *slog.Logger, tamperRepo TamperRepo) (*TamperUsecase, error) {
return &TamperUsecase{
repo: do.MustInvoke[TamperRepo](i),
setting: do.MustInvoke[*SettingUsecase](i),
notify: do.MustInvoke[*NotifyUsecase](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: tamperRepo,
setting: settingUsecase,
notify: notifyUsecase,
log: log,
t: t,
}, nil
}
@@ -138,7 +137,8 @@ func (uc *TamperUsecase) SaveSetting(s *TamperSetting) error {
}
// Rules 规则管理
func (uc *TamperUsecase) ListRules() ([]*TamperRule, error) { return uc.repo.ListRules() }
func (uc *TamperUsecase) ListRules() ([]*TamperRule, error) { return uc.repo.ListRules() }
func (uc *TamperUsecase) GetRule(id uint) (*TamperRule, error) { return uc.repo.GetRule(id) }
func (uc *TamperUsecase) CreateRule(rule *TamperRule) error {
@@ -168,6 +168,7 @@ func (uc *TamperUsecase) ListLogs(page, limit uint) ([]*TamperLog, int64, error)
uc.FlushLogs()
return uc.repo.ListLogs(page, limit)
}
func (uc *TamperUsecase) ClearLogs() error { return uc.repo.ClearLogs() }
// buildConfig 从设置与规则构造运行配置
+4 -5
View File
@@ -7,7 +7,6 @@ import (
"path/filepath"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/pkg/api"
@@ -27,11 +26,11 @@ type TemplateUsecase struct {
t *gotext.Locale
}
func NewTemplateUsecase(i do.Injector) (*TemplateUsecase, error) {
func NewTemplateUsecase(t *gotext.Locale, cacheRepo CacheRepo, templateRepo TemplateRepo) (*TemplateUsecase, error) {
return &TemplateUsecase{
repo: do.MustInvoke[TemplateRepo](i),
cache: do.MustInvoke[CacheRepo](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: templateRepo,
cache: cacheRepo,
t: t,
}, nil
}
+4 -5
View File
@@ -8,7 +8,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"gorm.io/gorm"
)
@@ -46,11 +45,11 @@ type UserUsecase struct {
t *gotext.Locale
}
func NewUserUsecase(i do.Injector) (*UserUsecase, error) {
func NewUserUsecase(t *gotext.Locale, log *slog.Logger, userRepo UserRepo) (*UserUsecase, error) {
return &UserUsecase{
repo: do.MustInvoke[UserRepo](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: userRepo,
log: log,
t: t,
}, nil
}
+4 -5
View File
@@ -7,7 +7,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/utils/str"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/request"
)
@@ -43,11 +42,11 @@ type WebHookUsecase struct {
t *gotext.Locale
}
func NewWebHookUsecase(i do.Injector) (*WebHookUsecase, error) {
func NewWebHookUsecase(t *gotext.Locale, log *slog.Logger, webHookRepo WebHookRepo) (*WebHookUsecase, error) {
return &WebHookUsecase{
repo: do.MustInvoke[WebHookRepo](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
repo: webHookRepo,
log: log,
t: t,
}, nil
}
+11 -12
View File
@@ -11,7 +11,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"github.com/acepanel/panel/v3/internal/request"
@@ -79,18 +78,18 @@ type WebsiteUsecase struct {
stat *WebsiteStatUsecase
}
func NewWebsiteUsecase(i do.Injector) (*WebsiteUsecase, error) {
func NewWebsiteUsecase(certAccountUsecase *CertAccountUsecase, certUsecase *CertUsecase, databaseUsecase *DatabaseUsecase, databaseUserUsecase *DatabaseUserUsecase, tamperUsecase *TamperUsecase, websiteStatUsecase *WebsiteStatUsecase, t *gotext.Locale, log *slog.Logger, databaseServerRepo DatabaseServerRepo, websiteRepo WebsiteRepo) (*WebsiteUsecase, error) {
return &WebsiteUsecase{
repo: do.MustInvoke[WebsiteRepo](i),
log: do.MustInvoke[*slog.Logger](i),
t: do.MustInvoke[*gotext.Locale](i),
cert: do.MustInvoke[*CertUsecase](i),
certAccount: do.MustInvoke[*CertAccountUsecase](i),
database: do.MustInvoke[*DatabaseUsecase](i),
databaseUser: do.MustInvoke[*DatabaseUserUsecase](i),
databaseServer: do.MustInvoke[DatabaseServerRepo](i),
tamper: do.MustInvoke[*TamperUsecase](i),
stat: do.MustInvoke[*WebsiteStatUsecase](i),
repo: websiteRepo,
log: log,
t: t,
cert: certUsecase,
certAccount: certAccountUsecase,
database: databaseUsecase,
databaseUser: databaseUserUsecase,
databaseServer: databaseServerRepo,
tamper: tamperUsecase,
stat: websiteStatUsecase,
}, nil
}
+2 -36
View File
@@ -1,8 +1,6 @@
package bootstrap
import (
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/apps/apache"
"github.com/acepanel/panel/v3/internal/apps/clickhouse"
"github.com/acepanel/panel/v3/internal/apps/codeserver"
@@ -37,40 +35,8 @@ import (
"github.com/acepanel/panel/v3/pkg/apploader"
)
func NewLoader(i do.Injector) (*apploader.Loader, error) {
func NewLoader(apacheApp *apache.App, clickhouseApp *clickhouse.App, codeserverApp *codeserver.App, dockerApp *docker.App, elasticsearchApp *elasticsearch.App, fail2banApp *fail2ban.App, frpApp *frp.App, giteaApp *gitea.App, grafanaApp *grafana.App, kafkaApp *kafka.App, mariadbApp *mariadb.App, memcachedApp *memcached.App, minioApp *minio.App, mongodbApp *mongodb.App, mysqlApp *mysql.App, nginxApp *nginx.App, openrestyApp *openresty.App, opensearchApp *opensearch.App, perconaApp *percona.App, pgadminApp *pgadmin.App, phpmyadminApp *phpmyadmin.App, podmanApp *podman.App, postgresqlApp *postgresql.App, prometheusApp *prometheus.App, pureftpdApp *pureftpd.App, redisApp *redis.App, rocketmqApp *rocketmq.App, rsyncApp *rsync.App, s3fsApp *s3fs.App, supervisorApp *supervisor.App, valkeyApp *valkey.App) (*apploader.Loader, error) {
loader := new(apploader.Loader)
loader.Add(
do.MustInvoke[*apache.App](i),
do.MustInvoke[*clickhouse.App](i),
do.MustInvoke[*codeserver.App](i),
do.MustInvoke[*docker.App](i),
do.MustInvoke[*elasticsearch.App](i),
do.MustInvoke[*fail2ban.App](i),
do.MustInvoke[*frp.App](i),
do.MustInvoke[*gitea.App](i),
do.MustInvoke[*grafana.App](i),
do.MustInvoke[*kafka.App](i),
do.MustInvoke[*mariadb.App](i),
do.MustInvoke[*memcached.App](i),
do.MustInvoke[*minio.App](i),
do.MustInvoke[*mongodb.App](i),
do.MustInvoke[*mysql.App](i),
do.MustInvoke[*nginx.App](i),
do.MustInvoke[*openresty.App](i),
do.MustInvoke[*opensearch.App](i),
do.MustInvoke[*percona.App](i),
do.MustInvoke[*pgadmin.App](i),
do.MustInvoke[*phpmyadmin.App](i),
do.MustInvoke[*podman.App](i),
do.MustInvoke[*postgresql.App](i),
do.MustInvoke[*prometheus.App](i),
do.MustInvoke[*pureftpd.App](i),
do.MustInvoke[*redis.App](i),
do.MustInvoke[*rocketmq.App](i),
do.MustInvoke[*rsync.App](i),
do.MustInvoke[*s3fs.App](i),
do.MustInvoke[*supervisor.App](i),
do.MustInvoke[*valkey.App](i),
)
loader.Add(apacheApp, clickhouseApp, codeserverApp, dockerApp, elasticsearchApp, fail2banApp, frpApp, giteaApp, grafanaApp, kafkaApp, mariadbApp, memcachedApp, minioApp, mongodbApp, mysqlApp, nginxApp, openrestyApp, opensearchApp, perconaApp, pgadminApp, phpmyadminApp, podmanApp, postgresqlApp, prometheusApp, pureftpdApp, redisApp, rocketmqApp, rsyncApp, s3fsApp, supervisorApp, valkeyApp)
return loader, nil
}
+20 -22
View File
@@ -1,31 +1,29 @@
package bootstrap
import (
"github.com/samber/do/v2"
"github.com/google/wire"
"github.com/acepanel/panel/v3/internal/middleware"
"github.com/acepanel/panel/v3/pkg/websitestat"
)
// Package 装配基础设施层
var Package = do.Package(
do.Lazy(NewConf),
do.Lazy(NewT),
do.Lazy(NewLogger),
do.Lazy(NewSlog),
do.Lazy(NewDB),
do.Lazy(NewMigrate),
do.Lazy(NewSession),
do.Lazy(NewRunner),
do.Lazy(NewValidator),
do.Lazy(middleware.NewMiddlewares),
do.Lazy(NewLoader),
do.Lazy(NewRouter),
do.Lazy(NewTLSReloader),
do.Lazy(NewHttp),
do.Lazy(NewCron),
do.Lazy(NewCli),
do.Lazy(func(i do.Injector) (*websitestat.Aggregator, error) {
return websitestat.NewAggregator(), nil
}),
// ProviderSet 装配基础设施层
var ProviderSet = wire.NewSet(
NewConf,
NewT,
NewLogger,
NewSlog,
NewDB,
NewMigrate,
NewSession,
NewRunner,
NewValidator,
middleware.NewMiddlewares,
NewLoader,
NewRouter,
NewTLSReloader,
NewHttp,
NewCron,
NewCli,
websitestat.NewAggregator,
)
+2 -10
View File
@@ -4,15 +4,12 @@ import (
"strings"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/command"
)
func NewCli(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func NewCli(t *gotext.Locale, commands []*cli.Command) (*cli.Command, error) {
cli.RootCommandHelpTemplate = strings.ReplaceAll(cli.RootCommandHelpTemplate, "NAME", t.Get("NAME"))
cli.RootCommandHelpTemplate = strings.ReplaceAll(cli.RootCommandHelpTemplate, "USAGE", t.Get("USAGE"))
@@ -37,15 +34,10 @@ func NewCli(i do.Injector) (*cli.Command, error) {
cli.RootCommandHelpTemplate += "\n" + t.Get("Forumhttps://tom.moe")
cli.RootCommandHelpTemplate += "\n" + t.Get("QQ Group12370907") + "\n"
cmds, err := command.Commands(i)
if err != nil {
return nil, err
}
return &cli.Command{
Name: "acepanel",
Usage: t.Get("AcePanel CLI Tool"),
Version: app.Version,
Commands: cmds,
Commands: commands,
}, nil
}
+1 -3
View File
@@ -5,13 +5,11 @@ import (
"fmt"
"time"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/pkg/config"
)
func NewConf(i do.Injector) (*config.Config, error) {
func NewConf() (*config.Config, error) {
conf, err := config.Load()
if err != nil {
return nil, err
+2 -9
View File
@@ -7,24 +7,17 @@ import (
"github.com/libtnb/cron"
"github.com/libtnb/cron/wrap"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/job"
"github.com/acepanel/panel/v3/internal/registry"
)
func NewCron(i do.Injector) (*cron.Cron, error) {
func NewCron(log *slog.Logger, jobs []job.Job) (*cron.Cron, error) {
// 面板任务均为 5 段表达式,不启用 WithSecondsField
c := cron.New(
cron.WithLogger(do.MustInvoke[*slog.Logger](i)),
cron.WithLogger(log),
cron.WithChain(wrap.Recover(), wrap.SkipIfRunning()),
)
// 收集全部任务贡献并注册到调度器
jobs, err := registry.Collect[job.Job](i, job.Prefix)
if err != nil {
return nil, err
}
for _, j := range jobs {
id, err := c.Add(j.Spec, j.Task)
if err != nil {
+3 -5
View File
@@ -9,7 +9,6 @@ import (
"github.com/libtnb/logrotate"
"github.com/libtnb/sqlite"
sloggorm "github.com/orandin/slog-gorm"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/app"
@@ -17,8 +16,7 @@ import (
"github.com/acepanel/panel/v3/pkg/config"
)
func NewDB(i do.Injector) (*gorm.DB, error) {
conf := do.MustInvoke[*config.Config](i)
func NewDB(conf *config.Config) (*gorm.DB, error) {
// db 日志写入轮转文件
w, err := logrotate.New(filepath.Join(app.Root, "panel/storage/logs/db.log"),
@@ -58,8 +56,8 @@ func NewDB(i do.Injector) (*gorm.DB, error) {
return db, nil
}
func NewMigrate(i do.Injector) (*gormigrate.Gormigrate, error) {
db := do.MustInvoke[*gorm.DB](i)
func NewMigrate(db *gorm.DB) (*gormigrate.Gormigrate, error) {
return gormigrate.New(db, &gormigrate.Options{
UseTransaction: true, // Note: MySQL not support DDL transaction
}, migration.Migrations), nil
+12 -21
View File
@@ -17,7 +17,6 @@ import (
"github.com/leonelquinteros/gotext"
"github.com/libtnb/validator"
"github.com/libtnb/validator/contrib/openapi"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/internal/middleware"
@@ -28,27 +27,20 @@ import (
"github.com/acepanel/panel/v3/pkg/tlscert"
)
func NewRouter(i do.Injector) (*chi.Mux, error) {
t := do.MustInvoke[*gotext.Locale](i)
mws := do.MustInvoke[*middleware.Middlewares](i)
conf := do.MustInvoke[*config.Config](i)
loader := do.MustInvoke[*apploader.Loader](i)
func NewRouter(loader *apploader.Loader, conf *config.Config, t *gotext.Locale, middlewares *middleware.Middlewares, v *validator.Validator, endpoints []route.Endpoints) (*chi.Mux, error) {
mws := middlewares
// 供 service.Bind / route.SpecJSON 使用
validator.SetDefault(do.MustInvoke[*validator.Validator](i))
validator.SetDefault(v)
// 数据驱动的登录白名单
public, err := route.PublicPaths(i)
if err != nil {
return nil, err
}
public := route.PublicPaths(endpoints)
r := chi.NewRouter()
r.Use(mws.Globals(t, r, public)...)
// 注册各域路由
if err := route.HTTP(i, r); err != nil {
return nil, err
}
route.HTTP(conf, endpoints, r)
// 动态应用子路由
r.Route("/api/apps", func(r chi.Router) {
@@ -57,7 +49,7 @@ func NewRouter(i do.Injector) (*chi.Mux, error) {
// 仅调试模式挂载 OpenAPI 文档
if conf.App.Debug {
spec, err := route.SpecJSON(i, "AcePanel")
spec, err := route.SpecJSON(endpoints, "AcePanel")
if err != nil {
return nil, err
}
@@ -86,8 +78,8 @@ func NewRouter(i do.Injector) (*chi.Mux, error) {
return r, nil
}
func NewTLSReloader(i do.Injector) (*tlscert.Reloader, error) {
conf := do.MustInvoke[*config.Config](i)
func NewTLSReloader(conf *config.Config) (*tlscert.Reloader, error) {
if !conf.HTTP.IsHTTPS() {
return nil, nil
}
@@ -101,10 +93,9 @@ func NewTLSReloader(i do.Injector) (*tlscert.Reloader, error) {
return reloader, nil
}
func NewHttp(i do.Injector) (*hlfhr.Server, error) {
conf := do.MustInvoke[*config.Config](i)
mux := do.MustInvoke[*chi.Mux](i)
reloader := do.MustInvoke[*tlscert.Reloader](i)
func NewHttp(router *chi.Mux, conf *config.Config, reloader *tlscert.Reloader) (*hlfhr.Server, error) {
mux := router
srv := hlfhr.New(&http.Server{
Addr: fmt.Sprintf(":%d", conf.HTTP.Port),
+6 -13
View File
@@ -6,7 +6,6 @@ import (
"time"
"github.com/libtnb/logrotate"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/internal/app"
"github.com/acepanel/panel/v3/pkg/config"
@@ -14,17 +13,10 @@ import (
type Logger struct {
*slog.Logger
close func() error
}
func (l *Logger) Shutdown() error {
return l.close()
}
// NewLogger 构建写入轮转文件的应用日志。
func NewLogger(i do.Injector) (*Logger, error) {
conf := do.MustInvoke[*config.Config](i)
func NewLogger(conf *config.Config) (*Logger, func(), error) {
w, err := logrotate.New(filepath.Join(app.Root, "panel/storage/logs/app.log"),
logrotate.WithMaxSize(10*logrotate.MB),
logrotate.WithMaxAge(30*logrotate.Day),
@@ -33,7 +25,7 @@ func NewLogger(i do.Injector) (*Logger, error) {
logrotate.WithLocation(time.Local),
)
if err != nil {
return nil, err
return nil, nil, err
}
level := slog.LevelInfo
@@ -46,10 +38,11 @@ func NewLogger(i do.Injector) (*Logger, error) {
}))
slog.SetDefault(log)
return &Logger{Logger: log, close: w.Close}, nil
cleanup := func() { _ = w.Close() }
return &Logger{Logger: log}, cleanup, nil
}
// NewSlog 解包出纯 *slog.Logger 供应用其余部分使用。
func NewSlog(i do.Injector) (*slog.Logger, error) {
return do.MustInvoke[*Logger](i).Logger, nil
func NewSlog(logger *Logger) *slog.Logger {
return logger.Logger
}
+2 -8
View File
@@ -4,7 +4,6 @@ import (
"log/slog"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/biz"
@@ -13,11 +12,6 @@ import (
)
// NewRunner 创建任务运行器
func NewRunner(i do.Injector) (types.TaskRunner, error) {
return taskqueue.NewRunner(
do.MustInvoke[*gorm.DB](i),
do.MustInvoke[*slog.Logger](i),
do.MustInvoke[*biz.NotifyUsecase](i),
do.MustInvoke[*gotext.Locale](i),
), nil
func NewRunner(notifyUsecase *biz.NotifyUsecase, db *gorm.DB, t *gotext.Locale, log *slog.Logger) (types.TaskRunner, error) {
return taskqueue.NewRunner(db, log, notifyUsecase, t), nil
}
+3 -6
View File
@@ -5,29 +5,26 @@ import (
"github.com/libtnb/gormstore"
"github.com/libtnb/sessions"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/pkg/config"
)
func NewSession(i do.Injector) (*sessions.Manager, error) {
conf := do.MustInvoke[*config.Config](i)
func NewSession(conf *config.Config, db *gorm.DB, log *slog.Logger) (*sessions.Manager, error) {
// initialize session manager
manager, err := sessions.NewManager(&sessions.ManagerOptions{
Key: conf.App.Key,
Lifetime: int(conf.Session.Lifetime),
GcInterval: 5,
DisableDefaultDriver: true,
Logger: do.MustInvoke[*slog.Logger](i),
Logger: log,
})
if err != nil {
return nil, err
}
// extend gorm store driver
store := gormstore.New(do.MustInvoke[*gorm.DB](i))
store := gormstore.New(db)
if err = manager.Extend("default", store); err != nil {
return nil, err
}
+1 -3
View File
@@ -2,14 +2,12 @@ package bootstrap
import (
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/acepanel/panel/v3/pkg/config"
"github.com/acepanel/panel/v3/pkg/embed"
)
func NewT(i do.Injector) (*gotext.Locale, error) {
conf := do.MustInvoke[*config.Config](i)
func NewT(conf *config.Config) (*gotext.Locale, error) {
l := gotext.NewLocaleFSWithPath(conf.App.Locale, embed.LocalesFS, "locales")
l.AddDomain("backend")
+2 -4
View File
@@ -3,7 +3,6 @@ package bootstrap
import (
"github.com/libtnb/validator"
"github.com/libtnb/validator/translations"
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/rule"
@@ -11,8 +10,7 @@ import (
)
// NewValidator 构建校验器
func NewValidator(i do.Injector) (*validator.Validator, error) {
conf := do.MustInvoke[*config.Config](i)
func NewValidator(conf *config.Config, db *gorm.DB) (*validator.Validator, error) {
opts := []validator.Option{validator.WithStrictRequired()}
switch conf.App.Locale {
@@ -23,7 +21,7 @@ func NewValidator(i do.Injector) (*validator.Validator, error) {
}
v := validator.NewValidator(opts...)
rule.RegisterRules(v, do.MustInvoke[*gorm.DB](i))
rule.RegisterRules(v, db)
return v, nil
}
+8 -9
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// AppCommand 应用管理命令组
func AppCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func AppCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "app",
Usage: t.Get("Application management"),
@@ -21,21 +20,21 @@ func AppCommand(i do.Injector) (*cli.Command, error) {
Name: "install",
Usage: t.Get("Install application"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).AppInstall(ctx, cmd)
return cliService.AppInstall(ctx, cmd)
},
},
{
Name: "uninstall",
Usage: t.Get("Uninstall application"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).AppUnInstall(ctx, cmd)
return cliService.AppUnInstall(ctx, cmd)
},
},
{
Name: "update",
Usage: t.Get("Update application"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).AppUpdate(ctx, cmd)
return cliService.AppUpdate(ctx, cmd)
},
},
{
@@ -43,7 +42,7 @@ func AppCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Add panel application mark (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).AppWrite(ctx, cmd)
return cliService.AppWrite(ctx, cmd)
},
},
{
@@ -51,9 +50,9 @@ func AppCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Remove panel application mark (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).AppRemove(ctx, cmd)
return cliService.AppRemove(ctx, cmd)
},
},
},
}, nil
}
}
+8 -9
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// BackupCommand 数据备份命令组
func BackupCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func BackupCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "backup",
Usage: t.Get("Data backup"),
@@ -34,7 +33,7 @@ func BackupCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BackupWebsite(ctx, cmd)
return cliService.BackupWebsite(ctx, cmd)
},
},
{
@@ -60,7 +59,7 @@ func BackupCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BackupDatabase(ctx, cmd)
return cliService.BackupDatabase(ctx, cmd)
},
},
{
@@ -80,7 +79,7 @@ func BackupCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BackupPath(ctx, cmd)
return cliService.BackupPath(ctx, cmd)
},
},
{
@@ -88,7 +87,7 @@ func BackupCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Backup panel"),
Flags: []cli.Flag{},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BackupPanel(ctx, cmd)
return cliService.BackupPanel(ctx, cmd)
},
},
{
@@ -120,9 +119,9 @@ func BackupCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BackupClear(ctx, cmd)
return cliService.BackupClear(ctx, cmd)
},
},
},
}, nil
}
}
+34 -22
View File
@@ -1,31 +1,43 @@
package command
import (
"github.com/samber/do/v2"
"github.com/google/wire"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/registry"
"github.com/acepanel/panel/v3/internal/service"
)
const Prefix = "commands:"
var ProviderSet = wire.NewSet(Commands)
var Package = do.Package(
do.LazyNamed(Prefix+"status", StatusCommand), do.LazyNamed(Prefix+"restart", RestartCommand),
do.LazyNamed(Prefix+"stop", StopCommand), do.LazyNamed(Prefix+"start", StartCommand),
do.LazyNamed(Prefix+"update", UpdateCommand), do.LazyNamed(Prefix+"sync", SyncCommand),
do.LazyNamed(Prefix+"fix", FixCommand), do.LazyNamed(Prefix+"info", InfoCommand),
do.LazyNamed(Prefix+"port", PortCommand), do.LazyNamed(Prefix+"sync-time", SyncTimeCommand),
do.LazyNamed(Prefix+"clear-task", ClearTaskCommand), do.LazyNamed(Prefix+"init", InitCommand),
do.LazyNamed(Prefix+"user", UserCommand), do.LazyNamed(Prefix+"https", HttpsCommand),
do.LazyNamed(Prefix+"entrance", EntranceCommand), do.LazyNamed(Prefix+"bind-domain", BindDomainCommand),
do.LazyNamed(Prefix+"bind-ip", BindIPCommand), do.LazyNamed(Prefix+"bind-ua", BindUACommand),
do.LazyNamed(Prefix+"website", WebsiteCommand), do.LazyNamed(Prefix+"database", DatabaseCommand),
do.LazyNamed(Prefix+"backup", BackupCommand), do.LazyNamed(Prefix+"restore", RestoreCommand),
do.LazyNamed(Prefix+"cutoff", CutoffCommand), do.LazyNamed(Prefix+"cron", CronCommand),
do.LazyNamed(Prefix+"app", AppCommand), do.LazyNamed(Prefix+"setting", SettingCommand),
)
// Commands 收集全部命令贡献。
func Commands(i do.Injector) ([]*cli.Command, error) {
return registry.Collect[*cli.Command](i, Prefix)
// Commands 组装全部 CLI 命令。
func Commands(t *gotext.Locale, cliService *service.CliService) []*cli.Command {
return []*cli.Command{
StatusCommand(t, cliService),
RestartCommand(t, cliService),
StopCommand(t, cliService),
StartCommand(t, cliService),
UpdateCommand(t, cliService),
SyncCommand(t, cliService),
FixCommand(t, cliService),
InfoCommand(t, cliService),
PortCommand(t, cliService),
SyncTimeCommand(t, cliService),
ClearTaskCommand(t, cliService),
InitCommand(t, cliService),
UserCommand(t, cliService),
HttpsCommand(t, cliService),
EntranceCommand(t, cliService),
BindDomainCommand(t, cliService),
BindIPCommand(t, cliService),
BindUACommand(t, cliService),
WebsiteCommand(t, cliService),
DatabaseCommand(t, cliService),
BackupCommand(t, cliService),
RestoreCommand(t, cliService),
CutoffCommand(t, cliService),
CronCommand(t, cliService),
AppCommand(t, cliService),
SettingCommand(t, cliService),
}
}
+4 -5
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// CronCommand 计划任务命令组
func CronCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func CronCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "cron",
Usage: t.Get("Cron task"),
@@ -34,9 +33,9 @@ func CronCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).CronFailed(ctx, cmd)
return cliService.CronFailed(ctx, cmd)
},
},
},
}, nil
}
}
+6 -7
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// CutoffCommand 日志切割命令组
func CutoffCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func CutoffCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "cutoff",
Usage: t.Get("Log rotation"),
@@ -34,7 +33,7 @@ func CutoffCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).CutoffWebsite(ctx, cmd)
return cliService.CutoffWebsite(ctx, cmd)
},
},
{
@@ -54,7 +53,7 @@ func CutoffCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).CutoffContainer(ctx, cmd)
return cliService.CutoffContainer(ctx, cmd)
},
},
{
@@ -86,9 +85,9 @@ func CutoffCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).CutoffClear(ctx, cmd)
return cliService.CutoffClear(ctx, cmd)
},
},
},
}, nil
}
}
+5 -6
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// DatabaseCommand 数据库管理命令组
func DatabaseCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func DatabaseCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "database",
Usage: t.Get("Database management"),
@@ -55,7 +54,7 @@ func DatabaseCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).DatabaseAddServer(ctx, cmd)
return cliService.DatabaseAddServer(ctx, cmd)
},
},
{
@@ -70,9 +69,9 @@ func DatabaseCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).DatabaseDeleteServer(ctx, cmd)
return cliService.DatabaseDeleteServer(ctx, cmd)
},
},
},
}, nil
}
}
+17 -18
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// EntranceCommand 访问入口管理命令组
func EntranceCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func EntranceCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "entrance",
Usage: t.Get("Operate AcePanel access entrance"),
@@ -21,23 +20,23 @@ func EntranceCommand(i do.Injector) (*cli.Command, error) {
Name: "on",
Usage: t.Get("Enable access entrance"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).EntranceOn(ctx, cmd)
return cliService.EntranceOn(ctx, cmd)
},
},
{
Name: "off",
Usage: t.Get("Disable access entrance"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).EntranceOff(ctx, cmd)
return cliService.EntranceOff(ctx, cmd)
},
},
},
}, nil
}
}
// BindDomainCommand 域名绑定管理命令组
func BindDomainCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func BindDomainCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "bind-domain",
Usage: t.Get("Operate AcePanel domain binding"),
@@ -46,16 +45,16 @@ func BindDomainCommand(i do.Injector) (*cli.Command, error) {
Name: "off",
Usage: t.Get("Disable domain binding"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BindDomainOff(ctx, cmd)
return cliService.BindDomainOff(ctx, cmd)
},
},
},
}, nil
}
}
// BindIPCommand IP 绑定管理命令组
func BindIPCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func BindIPCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "bind-ip",
Usage: t.Get("Operate AcePanel IP binding"),
@@ -64,16 +63,16 @@ func BindIPCommand(i do.Injector) (*cli.Command, error) {
Name: "off",
Usage: t.Get("Disable IP binding"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BindIPOff(ctx, cmd)
return cliService.BindIPOff(ctx, cmd)
},
},
},
}, nil
}
}
// BindUACommand UA 绑定管理命令组
func BindUACommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func BindUACommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "bind-ua",
Usage: t.Get("Operate AcePanel UA binding"),
@@ -82,9 +81,9 @@ func BindUACommand(i do.Injector) (*cli.Command, error) {
Name: "off",
Usage: t.Get("Disable UA binding"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).BindUAOff(ctx, cmd)
return cliService.BindUAOff(ctx, cmd)
},
},
},
}, nil
}
}
+6 -7
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// HttpsCommand 面板 HTTPS 管理命令组
func HttpsCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func HttpsCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "https",
Usage: t.Get("Operate AcePanel HTTPS"),
@@ -21,23 +20,23 @@ func HttpsCommand(i do.Injector) (*cli.Command, error) {
Name: "on",
Usage: t.Get("Enable HTTPS"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).HTTPSOn(ctx, cmd)
return cliService.HTTPSOn(ctx, cmd)
},
},
{
Name: "off",
Usage: t.Get("Disable HTTPS"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).HTTPSOff(ctx, cmd)
return cliService.HTTPSOff(ctx, cmd)
},
},
{
Name: "generate",
Usage: t.Get("Obtain a free certificate or generate a self-signed certificate"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).HTTPSGenerate(ctx, cmd)
return cliService.HTTPSGenerate(ctx, cmd)
},
},
},
}, nil
}
}
+32 -33
View File
@@ -4,51 +4,50 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// UpdateCommand 更新面板
func UpdateCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func UpdateCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "update",
Usage: t.Get("Update AcePanel to the latest version"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Update(ctx, cmd)
return cliService.Update(ctx, cmd)
},
}, nil
}
}
// SyncCommand 同步云端缓存数据
func SyncCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func SyncCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "sync",
Usage: t.Get("Sync AcePanel cached data with cloud"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Sync(ctx, cmd)
return cliService.Sync(ctx, cmd)
},
}, nil
}
}
// FixCommand 修复升级问题
func FixCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func FixCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "fix",
Usage: t.Get("Fix AcePanel upgrade issues"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Fix(ctx, cmd)
return cliService.Fix(ctx, cmd)
},
}, nil
}
}
// InfoCommand 输出面板基础信息
func InfoCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func InfoCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "info",
Usage: t.Get("Output AcePanel basic information"),
@@ -60,57 +59,57 @@ func InfoCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Info(ctx, cmd)
return cliService.Info(ctx, cmd)
},
}, nil
}
}
// PortCommand 修改监听端口
func PortCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func PortCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "port",
Usage: t.Get("Change the AcePanel listening port"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Port(ctx, cmd)
return cliService.Port(ctx, cmd)
},
}, nil
}
}
// SyncTimeCommand 通过 NTP 同步系统时间
func SyncTimeCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func SyncTimeCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "sync-time",
Usage: t.Get("Sync server time with NTP"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).SyncTime(ctx, cmd)
return cliService.SyncTime(ctx, cmd)
},
}, nil
}
}
// ClearTaskCommand 清理卡住的任务队列
func ClearTaskCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func ClearTaskCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "clear-task",
Usage: t.Get("Clear all tasks in the task queue if they are stuck (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).ClearTask(ctx, cmd)
return cliService.ClearTask(ctx, cmd)
},
}, nil
}
}
// InitCommand 初始化面板
func InitCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func InitCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "init",
Usage: t.Get("Initialize AcePanel (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Init(ctx, cmd)
return cliService.Init(ctx, cmd)
},
}, nil
}
}
+5 -6
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// RestoreCommand 数据恢复命令组
func RestoreCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func RestoreCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "restore",
Usage: t.Get("Data restore"),
@@ -35,7 +34,7 @@ func RestoreCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).RestoreWebsite(ctx, cmd)
return cliService.RestoreWebsite(ctx, cmd)
},
},
{
@@ -62,9 +61,9 @@ func RestoreCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).RestoreDatabase(ctx, cmd)
return cliService.RestoreDatabase(ctx, cmd)
},
},
},
}, nil
}
}
+16 -17
View File
@@ -4,56 +4,55 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// StatusCommand 查询服务状态
func StatusCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func StatusCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "status",
Usage: t.Get("Get AcePanel service status"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Status(ctx, cmd)
return cliService.Status(ctx, cmd)
},
}, nil
}
}
// RestartCommand 重启服务
func RestartCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func RestartCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "restart",
Usage: t.Get("Restart AcePanel service"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Restart(ctx, cmd)
return cliService.Restart(ctx, cmd)
},
}, nil
}
}
// StopCommand 停止服务
func StopCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func StopCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "stop",
Usage: t.Get("Stop AcePanel service"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Stop(ctx, cmd)
return cliService.Stop(ctx, cmd)
},
}, nil
}
}
// StartCommand 启动服务
func StartCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func StartCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "start",
Usage: t.Get("Start AcePanel service"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).Start(ctx, cmd)
return cliService.Start(ctx, cmd)
},
}, nil
}
}
+6 -7
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// SettingCommand 面板设置管理命令组
func SettingCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func SettingCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "setting",
Usage: t.Get("Setting management"),
@@ -23,7 +22,7 @@ func SettingCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Get panel setting (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).GetSetting(ctx, cmd)
return cliService.GetSetting(ctx, cmd)
},
},
{
@@ -31,7 +30,7 @@ func SettingCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Write panel setting (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).WriteSetting(ctx, cmd)
return cliService.WriteSetting(ctx, cmd)
},
},
{
@@ -39,9 +38,9 @@ func SettingCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Remove panel setting (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).RemoveSetting(ctx, cmd)
return cliService.RemoveSetting(ctx, cmd)
},
},
},
}, nil
}
}
+8 -9
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// UserCommand 用户管理命令组
func UserCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func UserCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "user",
Usage: t.Get("Operate AcePanel users"),
@@ -21,37 +20,37 @@ func UserCommand(i do.Injector) (*cli.Command, error) {
Name: "list",
Usage: t.Get("List all users"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).UserList(ctx, cmd)
return cliService.UserList(ctx, cmd)
},
},
{
Name: "username",
Usage: t.Get("Change a user's username"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).UserName(ctx, cmd)
return cliService.UserName(ctx, cmd)
},
},
{
Name: "password",
Usage: t.Get("Change a user's password"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).UserPassword(ctx, cmd)
return cliService.UserPassword(ctx, cmd)
},
},
{
Name: "2fa",
Usage: t.Get("Toggle two-factor authentication for a user"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).UserTwoFA(ctx, cmd)
return cliService.UserTwoFA(ctx, cmd)
},
},
{
Name: "passkey",
Usage: t.Get("Clear all passkeys for a user"),
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).UserPasskey(ctx, cmd)
return cliService.UserPasskey(ctx, cmd)
},
},
},
}, nil
}
}
+7 -8
View File
@@ -4,15 +4,14 @@ import (
"context"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/urfave/cli/v3"
"github.com/acepanel/panel/v3/internal/service"
)
// WebsiteCommand 网站管理命令组
func WebsiteCommand(i do.Injector) (*cli.Command, error) {
t := do.MustInvoke[*gotext.Locale](i)
func WebsiteCommand(t *gotext.Locale, cliService *service.CliService) *cli.Command {
return &cli.Command{
Name: "website",
Usage: t.Get("Website management"),
@@ -49,7 +48,7 @@ func WebsiteCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).WebsiteCreate(ctx, cmd)
return cliService.WebsiteCreate(ctx, cmd)
},
},
{
@@ -64,7 +63,7 @@ func WebsiteCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).WebsiteRemove(ctx, cmd)
return cliService.WebsiteRemove(ctx, cmd)
},
},
{
@@ -79,7 +78,7 @@ func WebsiteCommand(i do.Injector) (*cli.Command, error) {
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).WebsiteDelete(ctx, cmd)
return cliService.WebsiteDelete(ctx, cmd)
},
},
{
@@ -87,9 +86,9 @@ func WebsiteCommand(i do.Injector) (*cli.Command, error) {
Usage: t.Get("Write website data (use only under guidance)"),
Hidden: true,
Action: func(ctx context.Context, cmd *cli.Command) error {
return do.MustInvoke[*service.CliService](i).WebsiteWrite(ctx, cmd)
return cliService.WebsiteWrite(ctx, cmd)
},
},
},
}, nil
}
}
+2 -3
View File
@@ -4,7 +4,6 @@ import (
"strings"
"time"
"github.com/samber/do/v2"
"github.com/samber/lo"
"gorm.io/gorm"
@@ -17,14 +16,14 @@ type alertRepo struct {
statDB *gorm.DB // 网站统计独立库
}
func NewAlertRepo(i do.Injector) (biz.AlertRepo, error) {
func NewAlertRepo(db *gorm.DB) (biz.AlertRepo, error) {
statDB, err := openDB("stat")
if err != nil {
return nil, err
}
return &alertRepo{
db: do.MustInvoke[*gorm.DB](i),
db: db,
statDB: statDB,
}, nil
}
+5 -6
View File
@@ -12,7 +12,6 @@ import (
"github.com/expr-lang/expr"
"github.com/hashicorp/go-version"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/spf13/cast"
"gorm.io/gorm"
@@ -32,12 +31,12 @@ type appRepo struct {
api *api.API
}
func NewAppRepo(i do.Injector) (biz.AppRepo, error) {
func NewAppRepo(conf *config.Config, db *gorm.DB, t *gotext.Locale, log *slog.Logger) (biz.AppRepo, error) {
return &appRepo{
t: do.MustInvoke[*gotext.Locale](i),
conf: do.MustInvoke[*config.Config](i),
db: do.MustInvoke[*gorm.DB](i),
log: do.MustInvoke[*slog.Logger](i),
t: t,
conf: conf,
db: db,
log: log,
api: api.NewAPI(app.Version, app.Locale),
}, nil
}
+7 -8
View File
@@ -13,7 +13,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"gorm.io/gorm"
@@ -40,15 +39,15 @@ type backupRepo struct {
updating atomic.Bool // 面板升级进行中标志,防止并发触发
}
func NewBackupRepo(i do.Injector) (biz.BackupRepo, error) {
func NewBackupRepo(conf *config.Config, db *gorm.DB, t *gotext.Locale, log *slog.Logger, settingRepo biz.SettingRepo, websiteRepo biz.WebsiteRepo) (biz.BackupRepo, error) {
return &backupRepo{
hr: "+----------------------------------------------------",
t: do.MustInvoke[*gotext.Locale](i),
conf: do.MustInvoke[*config.Config](i),
db: do.MustInvoke[*gorm.DB](i),
log: do.MustInvoke[*slog.Logger](i),
setting: do.MustInvoke[biz.SettingRepo](i),
website: do.MustInvoke[biz.WebsiteRepo](i),
t: t,
conf: conf,
db: db,
log: log,
setting: settingRepo,
website: websiteRepo,
}, nil
}
+2 -3
View File
@@ -1,7 +1,6 @@
package data
import (
"github.com/samber/do/v2"
"gorm.io/gorm"
"github.com/acepanel/panel/v3/internal/biz"
@@ -11,9 +10,9 @@ type backupAccountRepo struct {
db *gorm.DB
}
func NewBackupAccountRepo(i do.Injector) (biz.BackupAccountRepo, error) {
func NewBackupAccountRepo(db *gorm.DB) (biz.BackupAccountRepo, error) {
return &backupAccountRepo{
db: do.MustInvoke[*gorm.DB](i),
db: db,
}, nil
}
+2 -3
View File
@@ -3,7 +3,6 @@ package data
import (
"errors"
"github.com/samber/do/v2"
"gorm.io/gorm"
"gorm.io/gorm/clause"
@@ -17,10 +16,10 @@ type cacheRepo struct {
db *gorm.DB
}
func NewCacheRepo(i do.Injector) (biz.CacheRepo, error) {
func NewCacheRepo(db *gorm.DB) (biz.CacheRepo, error) {
return &cacheRepo{
api: api.NewAPI(app.Version, app.Locale),
db: do.MustInvoke[*gorm.DB](i),
db: db,
}, nil
}
+4 -5
View File
@@ -13,7 +13,6 @@ import (
"time"
"github.com/leonelquinteros/gotext"
"github.com/samber/do/v2"
"github.com/samber/lo"
"gorm.io/gorm"
@@ -36,11 +35,11 @@ type certRepo struct {
log *slog.Logger
}
func NewCertRepo(i do.Injector) (biz.CertRepo, error) {
func NewCertRepo(db *gorm.DB, t *gotext.Locale, log *slog.Logger) (biz.CertRepo, error) {
return &certRepo{
t: do.MustInvoke[*gotext.Locale](i),
db: do.MustInvoke[*gorm.DB](i),
log: do.MustInvoke[*slog.Logger](i),
t: t,
db: db,
log: log,
}, nil
}

Some files were not shown because too many files have changed in this diff Show More