diff --git a/app/console/commands/cert_renew.go b/app/console/commands/cert_renew.go index 30b95d26..4db81123 100644 --- a/app/console/commands/cert_renew.go +++ b/app/console/commands/cert_renew.go @@ -8,9 +8,9 @@ import ( "github.com/goravel/framework/contracts/console/command" "github.com/goravel/framework/facades" "github.com/goravel/framework/support/carbon" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" ) type CertRenew struct { diff --git a/app/console/commands/monitoring.go b/app/console/commands/monitoring.go index fe4e1ec4..6102154d 100644 --- a/app/console/commands/monitoring.go +++ b/app/console/commands/monitoring.go @@ -9,9 +9,9 @@ import ( "github.com/goravel/framework/facades" "github.com/goravel/framework/support/carbon" "github.com/spf13/cast" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) diff --git a/app/console/commands/panel.go b/app/console/commands/panel.go index 2505ad5f..1f9f45c5 100644 --- a/app/console/commands/panel.go +++ b/app/console/commands/panel.go @@ -13,9 +13,9 @@ import ( "github.com/goravel/framework/facades" "github.com/goravel/framework/support/carbon" "github.com/spf13/cast" + services2 "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) @@ -69,7 +69,7 @@ func (receiver *Panel) Handle(ctx console.Context) error { return nil } - user := services.NewUserImpl() + user := services2.NewUserImpl() _, err = user.Create("admin", hash) if err != nil { color.Redln("创建管理员失败") @@ -268,7 +268,7 @@ func (receiver *Panel) Handle(ctx console.Context) error { color.Greenln("|-备份成功") case "mysql": - rootPassword := services.NewSettingImpl().Get(models.SettingKeyMysqlRootPassword) + rootPassword := services2.NewSettingImpl().Get(models.SettingKeyMysqlRootPassword) backupFile := name + "_" + carbon.Now().ToShortDateTimeString() + ".sql" err := os.Setenv("MYSQL_PWD", rootPassword) diff --git a/app/http/controllers/asset_controller.go b/app/http/controllers/asset_controller.go index 1892ccba..ad3b2385 100644 --- a/app/http/controllers/asset_controller.go +++ b/app/http/controllers/asset_controller.go @@ -7,12 +7,13 @@ import ( "github.com/goravel/framework/contracts/http" "github.com/goravel/framework/facades" - "panel/app/services" + "panel/app/internal" + "panel/app/internal/services" "panel/pkg/tools" ) type AssetController struct { - setting services.Setting + setting internal.Setting } func NewAssetController() *AssetController { diff --git a/app/http/controllers/cert_controller.go b/app/http/controllers/cert_controller.go index dc0935f2..abaf4036 100644 --- a/app/http/controllers/cert_controller.go +++ b/app/http/controllers/cert_controller.go @@ -7,14 +7,15 @@ import ( requests "panel/app/http/requests/cert" commonrequests "panel/app/http/requests/common" responses "panel/app/http/responses/cert" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/acme" ) type CertController struct { - cron services.Cron - cert services.Cert + cron internal.Cron + cert internal.Cert } func NewCertController() *CertController { diff --git a/app/http/controllers/cron_controller.go b/app/http/controllers/cron_controller.go index 89bbb2e1..ff2b8ae8 100644 --- a/app/http/controllers/cron_controller.go +++ b/app/http/controllers/cron_controller.go @@ -8,14 +8,16 @@ import ( "github.com/goravel/framework/facades" "github.com/goravel/framework/support/carbon" "github.com/spf13/cast" + + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type CronController struct { - cron services.Cron - setting services.Setting + cron internal.Cron + setting internal.Setting } func NewCronController() *CronController { diff --git a/app/http/controllers/info_controller.go b/app/http/controllers/info_controller.go index efcc3819..b0a4f6f5 100644 --- a/app/http/controllers/info_controller.go +++ b/app/http/controllers/info_controller.go @@ -9,8 +9,9 @@ import ( "github.com/goravel/framework/contracts/http" "github.com/goravel/framework/facades" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) @@ -22,8 +23,8 @@ type MenuItem struct { } type InfoController struct { - plugin services.Plugin - setting services.Setting + plugin internal.Plugin + setting internal.Setting } func NewInfoController() *InfoController { @@ -60,7 +61,7 @@ func (r *InfoController) HomePlugins(ctx http.Context) http.Response { for _, plugin := range plugins { pluginsJson = append(pluginsJson, pluginsData{ Plugin: plugin, - Name: services.NewPluginImpl().GetBySlug(plugin.Slug).Name, + Name: r.plugin.GetBySlug(plugin.Slug).Name, }) } diff --git a/app/http/controllers/monitor_controller.go b/app/http/controllers/monitor_controller.go index 0d2f1adf..e0ac248d 100644 --- a/app/http/controllers/monitor_controller.go +++ b/app/http/controllers/monitor_controller.go @@ -8,12 +8,13 @@ import ( "github.com/goravel/framework/support/carbon" "github.com/spf13/cast" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" ) type MonitorController struct { - setting services.Setting + setting internal.Setting } func NewMonitorController() *MonitorController { diff --git a/app/http/controllers/plugin_controller.go b/app/http/controllers/plugin_controller.go index 46523e9e..1f0e59a1 100644 --- a/app/http/controllers/plugin_controller.go +++ b/app/http/controllers/plugin_controller.go @@ -6,13 +6,14 @@ import ( "github.com/goravel/framework/contracts/http" "github.com/goravel/framework/facades" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" ) type PluginController struct { - plugin services.Plugin - task services.Task + plugin internal.Plugin + task internal.Task } func NewPluginController() *PluginController { diff --git a/app/http/controllers/plugins/fail2ban_controller.go b/app/http/controllers/plugins/fail2ban_controller.go index cce9c698..6e7d0933 100644 --- a/app/http/controllers/plugins/fail2ban_controller.go +++ b/app/http/controllers/plugins/fail2ban_controller.go @@ -9,13 +9,14 @@ import ( "github.com/spf13/cast" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Fail2banController struct { - website services.Website + website internal.Website } func NewFail2banController() *Fail2banController { diff --git a/app/http/controllers/plugins/mysql57_controller.go b/app/http/controllers/plugins/mysql57_controller.go index 5fab61dd..eb54bb79 100644 --- a/app/http/controllers/plugins/mysql57_controller.go +++ b/app/http/controllers/plugins/mysql57_controller.go @@ -9,14 +9,15 @@ import ( "github.com/spf13/cast" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Mysql57Controller struct { - setting services.Setting - backup services.Backup + setting internal.Setting + backup internal.Backup } func NewMysql57Controller() *Mysql57Controller { @@ -376,7 +377,7 @@ func (r *Mysql57Controller) BackupList(ctx http.Context) http.Response { if startIndex > len(backupList) { return controllers.Success(ctx, http.Json{ "total": 0, - "items": []services.BackupFile{}, + "items": []internal.BackupFile{}, }) } if endIndex > len(backupList) { @@ -384,7 +385,7 @@ func (r *Mysql57Controller) BackupList(ctx http.Context) http.Response { } pagedBackupList := backupList[startIndex:endIndex] if pagedBackupList == nil { - pagedBackupList = []services.BackupFile{} + pagedBackupList = []internal.BackupFile{} } return controllers.Success(ctx, http.Json{ diff --git a/app/http/controllers/plugins/mysql80_controller.go b/app/http/controllers/plugins/mysql80_controller.go index d048260a..dabde79d 100644 --- a/app/http/controllers/plugins/mysql80_controller.go +++ b/app/http/controllers/plugins/mysql80_controller.go @@ -7,16 +7,17 @@ import ( "github.com/goravel/framework/contracts/http" "github.com/spf13/cast" + "panel/app/internal" + "panel/app/internal/services" "panel/app/http/controllers" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Mysql80Controller struct { - setting services.Setting - backup services.Backup + setting internal.Setting + backup internal.Backup } func NewMysql80Controller() *Mysql80Controller { @@ -376,7 +377,7 @@ func (r *Mysql80Controller) BackupList(ctx http.Context) http.Response { if startIndex > len(backupList) { return controllers.Success(ctx, http.Json{ "total": 0, - "items": []services.BackupFile{}, + "items": []internal.BackupFile{}, }) } if endIndex > len(backupList) { @@ -384,7 +385,7 @@ func (r *Mysql80Controller) BackupList(ctx http.Context) http.Response { } pagedBackupList := backupList[startIndex:endIndex] if pagedBackupList == nil { - pagedBackupList = []services.BackupFile{} + pagedBackupList = []internal.BackupFile{} } return controllers.Success(ctx, http.Json{ diff --git a/app/http/controllers/plugins/php74_controller.go b/app/http/controllers/plugins/php74_controller.go index 40b8df76..46c3ed4e 100644 --- a/app/http/controllers/plugins/php74_controller.go +++ b/app/http/controllers/plugins/php74_controller.go @@ -11,14 +11,15 @@ import ( "github.com/imroc/req/v3" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Php74Controller struct { - setting services.Setting - task services.Task + setting internal.Setting + task internal.Task version string } diff --git a/app/http/controllers/plugins/php80_controller.go b/app/http/controllers/plugins/php80_controller.go index a41cdec0..5bd43b1c 100644 --- a/app/http/controllers/plugins/php80_controller.go +++ b/app/http/controllers/plugins/php80_controller.go @@ -11,14 +11,15 @@ import ( "github.com/imroc/req/v3" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Php80Controller struct { - setting services.Setting - task services.Task + setting internal.Setting + task internal.Task version string } diff --git a/app/http/controllers/plugins/php81_controller.go b/app/http/controllers/plugins/php81_controller.go index 791f2335..0e03b787 100644 --- a/app/http/controllers/plugins/php81_controller.go +++ b/app/http/controllers/plugins/php81_controller.go @@ -11,14 +11,15 @@ import ( "github.com/imroc/req/v3" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Php81Controller struct { - setting services.Setting - task services.Task + setting internal.Setting + task internal.Task version string } diff --git a/app/http/controllers/plugins/php82_controller.go b/app/http/controllers/plugins/php82_controller.go index 27050f2d..7518b9bb 100644 --- a/app/http/controllers/plugins/php82_controller.go +++ b/app/http/controllers/plugins/php82_controller.go @@ -11,14 +11,15 @@ import ( "github.com/imroc/req/v3" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Php82Controller struct { - setting services.Setting - task services.Task + setting internal.Setting + task internal.Task version string } diff --git a/app/http/controllers/plugins/php83_controller.go b/app/http/controllers/plugins/php83_controller.go index 40e7fc46..a93bf2d0 100644 --- a/app/http/controllers/plugins/php83_controller.go +++ b/app/http/controllers/plugins/php83_controller.go @@ -11,14 +11,15 @@ import ( "github.com/imroc/req/v3" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Php83Controller struct { - setting services.Setting - task services.Task + setting internal.Setting + task internal.Task version string } diff --git a/app/http/controllers/plugins/postgresql15_controller.go b/app/http/controllers/plugins/postgresql15_controller.go index e42514b6..86976278 100644 --- a/app/http/controllers/plugins/postgresql15_controller.go +++ b/app/http/controllers/plugins/postgresql15_controller.go @@ -7,14 +7,15 @@ import ( "github.com/goravel/framework/support/carbon" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Postgresql15Controller struct { - setting services.Setting - backup services.Backup + setting internal.Setting + backup internal.Backup } func NewPostgresql15Controller() *Postgresql15Controller { @@ -319,7 +320,7 @@ func (r *Postgresql15Controller) BackupList(ctx http.Context) http.Response { if startIndex > len(backupList) { return controllers.Success(ctx, http.Json{ "total": 0, - "items": []services.BackupFile{}, + "items": []internal.BackupFile{}, }) } if endIndex > len(backupList) { @@ -327,7 +328,7 @@ func (r *Postgresql15Controller) BackupList(ctx http.Context) http.Response { } pagedBackupList := backupList[startIndex:endIndex] if pagedBackupList == nil { - pagedBackupList = []services.BackupFile{} + pagedBackupList = []internal.BackupFile{} } return controllers.Success(ctx, http.Json{ diff --git a/app/http/controllers/plugins/postgresql16_controller.go b/app/http/controllers/plugins/postgresql16_controller.go index b5b18d7e..5beb8829 100644 --- a/app/http/controllers/plugins/postgresql16_controller.go +++ b/app/http/controllers/plugins/postgresql16_controller.go @@ -7,14 +7,15 @@ import ( "github.com/goravel/framework/support/carbon" "panel/app/http/controllers" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type Postgresql16Controller struct { - setting services.Setting - backup services.Backup + setting internal.Setting + backup internal.Backup } func NewPostgresql16Controller() *Postgresql16Controller { @@ -319,7 +320,7 @@ func (r *Postgresql16Controller) BackupList(ctx http.Context) http.Response { if startIndex > len(backupList) { return controllers.Success(ctx, http.Json{ "total": 0, - "items": []services.BackupFile{}, + "items": []internal.BackupFile{}, }) } if endIndex > len(backupList) { @@ -327,7 +328,7 @@ func (r *Postgresql16Controller) BackupList(ctx http.Context) http.Response { } pagedBackupList := backupList[startIndex:endIndex] if pagedBackupList == nil { - pagedBackupList = []services.BackupFile{} + pagedBackupList = []internal.BackupFile{} } return controllers.Success(ctx, http.Json{ diff --git a/app/http/controllers/plugins/rsync_controller.go b/app/http/controllers/plugins/rsync_controller.go index 5f05c99d..bf79991d 100644 --- a/app/http/controllers/plugins/rsync_controller.go +++ b/app/http/controllers/plugins/rsync_controller.go @@ -9,12 +9,13 @@ import ( "panel/app/http/controllers" commonrequests "panel/app/http/requests/common" requests "panel/app/http/requests/plugins/rsync" - "panel/app/services" + "panel/app/internal" + "panel/app/internal/services" "panel/pkg/tools" ) type RsyncController struct { - setting services.Setting + setting internal.Setting } func NewRsyncController() *RsyncController { diff --git a/app/http/controllers/plugins/s3fs_controller.go b/app/http/controllers/plugins/s3fs_controller.go index 5d4b984a..cb3aed92 100644 --- a/app/http/controllers/plugins/s3fs_controller.go +++ b/app/http/controllers/plugins/s3fs_controller.go @@ -9,12 +9,13 @@ import ( "github.com/spf13/cast" "panel/app/http/controllers" - "panel/app/services" + "panel/app/internal" + "panel/app/internal/services" "panel/pkg/tools" ) type S3fsController struct { - setting services.Setting + setting internal.Setting } func NewS3fsController() *S3fsController { diff --git a/app/http/controllers/setting_controller.go b/app/http/controllers/setting_controller.go index 1c75764d..b2cca08e 100644 --- a/app/http/controllers/setting_controller.go +++ b/app/http/controllers/setting_controller.go @@ -7,13 +7,14 @@ import ( requests "panel/app/http/requests/setting" responses "panel/app/http/responses/setting" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type SettingController struct { - setting services.Setting + setting internal.Setting } func NewSettingController() *SettingController { diff --git a/app/http/controllers/ssh_controller.go b/app/http/controllers/ssh_controller.go index 1108336f..ab3bf79a 100644 --- a/app/http/controllers/ssh_controller.go +++ b/app/http/controllers/ssh_controller.go @@ -13,14 +13,15 @@ import ( "github.com/spf13/cast" "github.com/valyala/fasthttp" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/ssh" ) type SshController struct { AuthMethod ssh.AuthMethod - setting services.Setting + setting internal.Setting } func NewSshController() *SshController { diff --git a/app/http/controllers/website_controller.go b/app/http/controllers/website_controller.go index c19b4a63..6d672ac7 100644 --- a/app/http/controllers/website_controller.go +++ b/app/http/controllers/website_controller.go @@ -11,15 +11,16 @@ import ( commonrequests "panel/app/http/requests/common" requests "panel/app/http/requests/website" responses "panel/app/http/responses/website" + "panel/app/internal" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/pkg/tools" ) type WebsiteController struct { - website services.Website - setting services.Setting - backup services.Backup + website internal.Website + setting internal.Setting + backup internal.Backup } func NewWebsiteController() *WebsiteController { @@ -83,7 +84,7 @@ func (r *WebsiteController) Add(ctx http.Context) http.Response { addRequest.Path = r.setting.Get(models.SettingKeyWebsitePath) + "/" + addRequest.Name } - website := services.PanelWebsite{ + website := internal.PanelWebsite{ Name: addRequest.Name, Status: true, Domains: addRequest.Domains, @@ -350,7 +351,7 @@ func (r *WebsiteController) BackupList(ctx http.Context) http.Response { if startIndex > len(backupList) { return Success(ctx, http.Json{ "total": 0, - "items": []services.BackupFile{}, + "items": []internal.BackupFile{}, }) } if endIndex > len(backupList) { @@ -358,7 +359,7 @@ func (r *WebsiteController) BackupList(ctx http.Context) http.Response { } pagedBackupList := backupList[startIndex:endIndex] if pagedBackupList == nil { - pagedBackupList = []services.BackupFile{} + pagedBackupList = []internal.BackupFile{} } return Success(ctx, http.Json{ diff --git a/app/http/middleware/must_install.go b/app/http/middleware/must_install.go index eb7c6bdb..0f16552f 100644 --- a/app/http/middleware/must_install.go +++ b/app/http/middleware/must_install.go @@ -5,8 +5,7 @@ import ( "sync" "github.com/goravel/framework/contracts/http" - - "panel/app/services" + "panel/app/internal/services" ) // MustInstall 确保已安装插件 diff --git a/app/internal/backup.go b/app/internal/backup.go new file mode 100644 index 00000000..be69da92 --- /dev/null +++ b/app/internal/backup.go @@ -0,0 +1,20 @@ +package internal + +import "panel/app/models" + +type Backup interface { + WebsiteList() ([]BackupFile, error) + WebSiteBackup(website models.Website) error + WebsiteRestore(website models.Website, backupFile string) error + MysqlList() ([]BackupFile, error) + MysqlBackup(database string) error + MysqlRestore(database string, backupFile string) error + PostgresqlList() ([]BackupFile, error) + PostgresqlBackup(database string) error + PostgresqlRestore(database string, backupFile string) error +} + +type BackupFile struct { + Name string `json:"name"` + Size string `json:"size"` +} diff --git a/app/internal/cert.go b/app/internal/cert.go new file mode 100644 index 00000000..1df73bbe --- /dev/null +++ b/app/internal/cert.go @@ -0,0 +1,28 @@ +package internal + +import ( + "github.com/go-acme/lego/v4/certificate" + + requests "panel/app/http/requests/cert" + "panel/app/models" + "panel/pkg/acme" +) + +type Cert interface { + UserStore(request requests.UserStore) error + UserUpdate(request requests.UserUpdate) error + UserShow(ID uint) (models.CertUser, error) + UserDestroy(ID uint) error + DNSStore(request requests.DNSStore) error + DNSUpdate(request requests.DNSUpdate) error + DNSShow(ID uint) (models.CertDNS, error) + DNSDestroy(ID uint) error + CertStore(request requests.CertStore) error + CertUpdate(request requests.CertUpdate) error + CertShow(ID uint) (models.Cert, error) + CertDestroy(ID uint) error + ObtainAuto(ID uint) (certificate.Resource, error) + ObtainManual(ID uint) (certificate.Resource, error) + ManualDNS(ID uint) (map[string]acme.Resolve, error) + Renew(ID uint) (certificate.Resource, error) +} diff --git a/app/internal/cron.go b/app/internal/cron.go new file mode 100644 index 00000000..f52a80b2 --- /dev/null +++ b/app/internal/cron.go @@ -0,0 +1,8 @@ +package internal + +import "panel/app/models" + +type Cron interface { + AddToSystem(cron models.Cron) error + DeleteFromSystem(cron models.Cron) error +} diff --git a/app/internal/plugin.go b/app/internal/plugin.go new file mode 100644 index 00000000..b10ea4d9 --- /dev/null +++ b/app/internal/plugin.go @@ -0,0 +1,23 @@ +package internal + +import "panel/app/models" + +// PanelPlugin 插件元数据结构 +type PanelPlugin struct { + Name string + Description string + Slug string + Version string + Requires []string + Excludes []string + Install string + Uninstall string + Update string +} + +type Plugin interface { + AllInstalled() ([]models.Plugin, error) + All() []PanelPlugin + GetBySlug(slug string) PanelPlugin + GetInstalledBySlug(slug string) models.Plugin +} diff --git a/app/services/backup.go b/app/internal/services/backup.go similarity index 86% rename from app/services/backup.go rename to app/internal/services/backup.go index 2027d9f2..12c70214 100644 --- a/app/services/backup.go +++ b/app/internal/services/backup.go @@ -9,29 +9,13 @@ import ( "github.com/goravel/framework/support/carbon" + "panel/app/internal" "panel/app/models" "panel/pkg/tools" ) -type Backup interface { - WebsiteList() ([]BackupFile, error) - WebSiteBackup(website models.Website) error - WebsiteRestore(website models.Website, backupFile string) error - MysqlList() ([]BackupFile, error) - MysqlBackup(database string) error - MysqlRestore(database string, backupFile string) error - PostgresqlList() ([]BackupFile, error) - PostgresqlBackup(database string) error - PostgresqlRestore(database string, backupFile string) error -} - -type BackupFile struct { - Name string `json:"name"` - Size string `json:"size"` -} - type BackupImpl struct { - setting Setting + setting internal.Setting } func NewBackupImpl() *BackupImpl { @@ -41,30 +25,30 @@ func NewBackupImpl() *BackupImpl { } // WebsiteList 网站备份列表 -func (s *BackupImpl) WebsiteList() ([]BackupFile, error) { +func (s *BackupImpl) WebsiteList() ([]internal.BackupFile, error) { backupPath := s.setting.Get(models.SettingKeyBackupPath) if len(backupPath) == 0 { - return []BackupFile{}, nil + return []internal.BackupFile{}, nil } backupPath += "/website" if !tools.Exists(backupPath) { if err := tools.Mkdir(backupPath, 0644); err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } } files, err := os.ReadDir(backupPath) if err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } - var backupList []BackupFile + var backupList []internal.BackupFile for _, file := range files { info, err := file.Info() if err != nil { continue } - backupList = append(backupList, BackupFile{ + backupList = append(backupList, internal.BackupFile{ Name: file.Name(), Size: tools.FormatBytes(float64(info.Size())), }) @@ -131,30 +115,30 @@ func (s *BackupImpl) WebsiteRestore(website models.Website, backupFile string) e } // MysqlList MySQL备份列表 -func (s *BackupImpl) MysqlList() ([]BackupFile, error) { +func (s *BackupImpl) MysqlList() ([]internal.BackupFile, error) { backupPath := s.setting.Get(models.SettingKeyBackupPath) if len(backupPath) == 0 { - return []BackupFile{}, nil + return []internal.BackupFile{}, nil } backupPath += "/mysql" if !tools.Exists(backupPath) { if err := tools.Mkdir(backupPath, 0644); err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } } files, err := os.ReadDir(backupPath) if err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } - var backupList []BackupFile + var backupList []internal.BackupFile for _, file := range files { info, err := file.Info() if err != nil { continue } - backupList = append(backupList, BackupFile{ + backupList = append(backupList, internal.BackupFile{ Name: file.Name(), Size: tools.FormatBytes(float64(info.Size())), }) @@ -244,30 +228,30 @@ func (s *BackupImpl) MysqlRestore(database string, backupFile string) error { } // PostgresqlList PostgreSQL备份列表 -func (s *BackupImpl) PostgresqlList() ([]BackupFile, error) { +func (s *BackupImpl) PostgresqlList() ([]internal.BackupFile, error) { backupPath := s.setting.Get(models.SettingKeyBackupPath) if len(backupPath) == 0 { - return []BackupFile{}, nil + return []internal.BackupFile{}, nil } backupPath += "/postgresql" if !tools.Exists(backupPath) { if err := tools.Mkdir(backupPath, 0644); err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } } files, err := os.ReadDir(backupPath) if err != nil { - return []BackupFile{}, err + return []internal.BackupFile{}, err } - var backupList []BackupFile + var backupList []internal.BackupFile for _, file := range files { info, err := file.Info() if err != nil { continue } - backupList = append(backupList, BackupFile{ + backupList = append(backupList, internal.BackupFile{ Name: file.Name(), Size: tools.FormatBytes(float64(info.Size())), }) diff --git a/app/services/cert.go b/app/internal/services/cert.go similarity index 94% rename from app/services/cert.go rename to app/internal/services/cert.go index b4ea142c..ccf863bd 100644 --- a/app/services/cert.go +++ b/app/internal/services/cert.go @@ -14,25 +14,6 @@ import ( "panel/pkg/tools" ) -type Cert interface { - UserStore(request requests.UserStore) error - UserUpdate(request requests.UserUpdate) error - UserShow(ID uint) (models.CertUser, error) - UserDestroy(ID uint) error - DNSStore(request requests.DNSStore) error - DNSUpdate(request requests.DNSUpdate) error - DNSShow(ID uint) (models.CertDNS, error) - DNSDestroy(ID uint) error - CertStore(request requests.CertStore) error - CertUpdate(request requests.CertUpdate) error - CertShow(ID uint) (models.Cert, error) - CertDestroy(ID uint) error - ObtainAuto(ID uint) (certificate.Resource, error) - ObtainManual(ID uint) (certificate.Resource, error) - ManualDNS(ID uint) (map[string]acme.Resolve, error) - Renew(ID uint) (certificate.Resource, error) -} - type CertImpl struct { } diff --git a/app/services/cron.go b/app/internal/services/cron.go similarity index 93% rename from app/services/cron.go rename to app/internal/services/cron.go index c510896f..28642cea 100644 --- a/app/services/cron.go +++ b/app/internal/services/cron.go @@ -7,11 +7,6 @@ import ( "panel/pkg/tools" ) -type Cron interface { - AddToSystem(cron models.Cron) error - DeleteFromSystem(cron models.Cron) error -} - type CronImpl struct { } diff --git a/app/services/plugin.go b/app/internal/services/plugin.go similarity index 86% rename from app/services/plugin.go rename to app/internal/services/plugin.go index 2cc5c770..d6baae0d 100644 --- a/app/services/plugin.go +++ b/app/internal/services/plugin.go @@ -4,6 +4,7 @@ package services import ( "github.com/goravel/framework/facades" + "panel/app/internal" "panel/app/models" "panel/app/plugins/fail2ban" "panel/app/plugins/mysql57" @@ -25,26 +26,6 @@ import ( "panel/app/plugins/toolbox" ) -// PanelPlugin 插件元数据结构 -type PanelPlugin struct { - Name string - Description string - Slug string - Version string - Requires []string - Excludes []string - Install string - Uninstall string - Update string -} - -type Plugin interface { - AllInstalled() ([]models.Plugin, error) - All() []PanelPlugin - GetBySlug(slug string) PanelPlugin - GetInstalledBySlug(slug string) models.Plugin -} - type PluginImpl struct { } @@ -63,10 +44,10 @@ func (r *PluginImpl) AllInstalled() ([]models.Plugin, error) { } // All 获取所有插件 -func (r *PluginImpl) All() []PanelPlugin { - var p []PanelPlugin +func (r *PluginImpl) All() []internal.PanelPlugin { + var p []internal.PanelPlugin - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: openresty.Name, Description: openresty.Description, Slug: openresty.Slug, @@ -77,7 +58,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: openresty.Uninstall, Update: openresty.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: mysql57.Name, Description: mysql57.Description, Slug: mysql57.Slug, @@ -88,7 +69,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: mysql57.Uninstall, Update: mysql57.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: mysql80.Name, Description: mysql80.Description, Slug: mysql80.Slug, @@ -99,7 +80,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: mysql80.Uninstall, Update: mysql80.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: postgresql15.Name, Description: postgresql15.Description, Slug: postgresql15.Slug, @@ -110,7 +91,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: postgresql15.Uninstall, Update: postgresql15.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: postgresql16.Name, Description: postgresql16.Description, Slug: postgresql16.Slug, @@ -121,7 +102,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: postgresql16.Uninstall, Update: postgresql16.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: php74.Name, Description: php74.Description, Slug: php74.Slug, @@ -132,7 +113,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php74.Uninstall, Update: php74.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: php80.Name, Description: php80.Description, Slug: php80.Slug, @@ -143,7 +124,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php80.Uninstall, Update: php80.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: php81.Name, Description: php81.Description, Slug: php81.Slug, @@ -154,7 +135,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php81.Uninstall, Update: php81.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: php82.Name, Description: php82.Description, Slug: php82.Slug, @@ -165,7 +146,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php82.Uninstall, Update: php82.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: php83.Name, Description: php83.Description, Slug: php83.Slug, @@ -176,7 +157,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php83.Uninstall, Update: php83.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: phpmyadmin.Name, Description: phpmyadmin.Description, Slug: phpmyadmin.Slug, @@ -187,7 +168,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: phpmyadmin.Uninstall, Update: phpmyadmin.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: pureftpd.Name, Description: pureftpd.Description, Slug: pureftpd.Slug, @@ -198,7 +179,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: pureftpd.Uninstall, Update: pureftpd.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: redis.Name, Description: redis.Description, Slug: redis.Slug, @@ -209,7 +190,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: redis.Uninstall, Update: redis.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: s3fs.Name, Description: s3fs.Description, Slug: s3fs.Slug, @@ -220,7 +201,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: s3fs.Uninstall, Update: s3fs.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: supervisor.Name, Description: supervisor.Description, Slug: supervisor.Slug, @@ -231,7 +212,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: supervisor.Uninstall, Update: supervisor.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: fail2ban.Name, Description: fail2ban.Description, Slug: fail2ban.Slug, @@ -242,7 +223,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: fail2ban.Uninstall, Update: fail2ban.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: rsync.Name, Description: rsync.Description, Slug: rsync.Slug, @@ -253,7 +234,7 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: rsync.Uninstall, Update: rsync.Update, }) - p = append(p, PanelPlugin{ + p = append(p, internal.PanelPlugin{ Name: toolbox.Name, Description: toolbox.Description, Slug: toolbox.Slug, @@ -269,14 +250,14 @@ func (r *PluginImpl) All() []PanelPlugin { } // GetBySlug 根据slug获取插件 -func (r *PluginImpl) GetBySlug(slug string) PanelPlugin { +func (r *PluginImpl) GetBySlug(slug string) internal.PanelPlugin { for _, item := range r.All() { if item.Slug == slug { return item } } - return PanelPlugin{} + return internal.PanelPlugin{} } // GetInstalledBySlug 根据slug获取已安装的插件 diff --git a/app/services/setting.go b/app/internal/services/setting.go similarity index 89% rename from app/services/setting.go rename to app/internal/services/setting.go index 7bb2ea9a..f4d8de22 100644 --- a/app/services/setting.go +++ b/app/internal/services/setting.go @@ -6,12 +6,6 @@ import ( "panel/app/models" ) -type Setting interface { - Get(key string, defaultValue ...string) string - Set(key, value string) error - Delete(key string) error -} - type SettingImpl struct { } diff --git a/app/services/task.go b/app/internal/services/task.go similarity index 91% rename from app/services/task.go rename to app/internal/services/task.go index 06673435..c4e5a858 100644 --- a/app/services/task.go +++ b/app/internal/services/task.go @@ -7,10 +7,6 @@ import ( "panel/app/jobs" ) -type Task interface { - Process(taskID uint) -} - type TaskImpl struct { } diff --git a/app/services/user.go b/app/internal/services/user.go similarity index 83% rename from app/services/user.go rename to app/internal/services/user.go index 3bd4a830..3422832f 100644 --- a/app/services/user.go +++ b/app/internal/services/user.go @@ -7,11 +7,6 @@ import ( "panel/app/models" ) -type User interface { - Create(name, password string) (models.User, error) - Update(user models.User) (models.User, error) -} - type UserImpl struct { } diff --git a/app/services/website.go b/app/internal/services/website.go similarity index 88% rename from app/services/website.go rename to app/internal/services/website.go index 5ab02a12..e436fed8 100644 --- a/app/services/website.go +++ b/app/internal/services/website.go @@ -13,67 +13,14 @@ import ( "github.com/goravel/framework/facades" "github.com/spf13/cast" requests "panel/app/http/requests/website" + "panel/app/internal" "panel/app/models" "panel/pkg/tools" ) -type Website interface { - List(page int, limit int) (int64, []models.Website, error) - Add(website PanelWebsite) (models.Website, error) - SaveConfig(config requests.SaveConfig) error - Delete(id uint) error - GetConfig(id uint) (WebsiteSetting, error) - GetConfigByName(name string) (WebsiteSetting, error) -} - -type PanelWebsite struct { - Name string `json:"name"` - Status bool `json:"status"` - Domains []string `json:"domains"` - Ports []uint `json:"ports"` - Path string `json:"path"` - Php int `json:"php"` - Ssl bool `json:"ssl"` - Remark string `json:"remark"` - Db bool `json:"db"` - DbType string `json:"db_type"` - DbName string `json:"db_name"` - DbUser string `json:"db_user"` - DbPassword string `json:"db_password"` -} - -// WebsiteSetting 网站设置 -type WebsiteSetting struct { - Name string `json:"name"` - Domains []string `json:"domains"` - Ports []uint `json:"ports"` - Root string `json:"root"` - Path string `json:"path"` - Index string `json:"index"` - Php int `json:"php"` - OpenBasedir bool `json:"open_basedir"` - Ssl bool `json:"ssl"` - SslCertificate string `json:"ssl_certificate"` - SslCertificateKey string `json:"ssl_certificate_key"` - SslNotBefore string `json:"ssl_not_before"` - SslNotAfter string `json:"ssl_not_after"` - SSlDNSNames []string `json:"ssl_dns_names"` - SslIssuer string `json:"ssl_issuer"` - SslOCSPServer []string `json:"ssl_ocsp_server"` - HttpRedirect bool `json:"http_redirect"` - Hsts bool `json:"hsts"` - Waf bool `json:"waf"` - WafMode string `json:"waf_mode"` - WafCcDeny string `json:"waf_cc_deny"` - WafCache string `json:"waf_cache"` - Rewrite string `json:"rewrite"` - Raw string `json:"raw"` - Log string `json:"log"` -} - type WebsiteImpl struct { - setting Setting + setting internal.Setting } func NewWebsiteImpl() *WebsiteImpl { @@ -94,7 +41,7 @@ func (r *WebsiteImpl) List(page, limit int) (int64, []models.Website, error) { } // Add 添加网站 -func (r *WebsiteImpl) Add(website PanelWebsite) (models.Website, error) { +func (r *WebsiteImpl) Add(website internal.PanelWebsite) (models.Website, error) { w := models.Website{ Name: website.Name, Status: website.Status, @@ -553,18 +500,18 @@ func (r *WebsiteImpl) Delete(id uint) error { } // GetConfig 获取网站配置 -func (r *WebsiteImpl) GetConfig(id uint) (WebsiteSetting, error) { +func (r *WebsiteImpl) GetConfig(id uint) (internal.WebsiteSetting, error) { var website models.Website if err := facades.Orm().Query().Where("id", id).First(&website); err != nil { - return WebsiteSetting{}, err + return internal.WebsiteSetting{}, err } config, err := tools.Read("/www/server/vhost/" + website.Name + ".conf") if err != nil { - return WebsiteSetting{}, err + return internal.WebsiteSetting{}, err } - var setting WebsiteSetting + var setting internal.WebsiteSetting setting.Name = website.Name setting.Path = website.Path setting.Ssl = website.Ssl @@ -666,10 +613,10 @@ func (r *WebsiteImpl) GetConfig(id uint) (WebsiteSetting, error) { } // GetConfigByName 根据网站名称获取网站配置 -func (r *WebsiteImpl) GetConfigByName(name string) (WebsiteSetting, error) { +func (r *WebsiteImpl) GetConfigByName(name string) (internal.WebsiteSetting, error) { var website models.Website if err := facades.Orm().Query().Where("name", name).First(&website); err != nil { - return WebsiteSetting{}, err + return internal.WebsiteSetting{}, err } return r.GetConfig(website.ID) diff --git a/app/internal/setting.go b/app/internal/setting.go new file mode 100644 index 00000000..552063ed --- /dev/null +++ b/app/internal/setting.go @@ -0,0 +1,7 @@ +package internal + +type Setting interface { + Get(key string, defaultValue ...string) string + Set(key, value string) error + Delete(key string) error +} diff --git a/app/internal/task.go b/app/internal/task.go new file mode 100644 index 00000000..2364ea60 --- /dev/null +++ b/app/internal/task.go @@ -0,0 +1,5 @@ +package internal + +type Task interface { + Process(taskID uint) +} diff --git a/app/internal/user.go b/app/internal/user.go new file mode 100644 index 00000000..fa5e2167 --- /dev/null +++ b/app/internal/user.go @@ -0,0 +1,8 @@ +package internal + +import "panel/app/models" + +type User interface { + Create(name, password string) (models.User, error) + Update(user models.User) (models.User, error) +} diff --git a/app/internal/website.go b/app/internal/website.go new file mode 100644 index 00000000..544477d2 --- /dev/null +++ b/app/internal/website.go @@ -0,0 +1,60 @@ +package internal + +import ( + requests "panel/app/http/requests/website" + "panel/app/models" +) + +type Website interface { + List(page int, limit int) (int64, []models.Website, error) + Add(website PanelWebsite) (models.Website, error) + SaveConfig(config requests.SaveConfig) error + Delete(id uint) error + GetConfig(id uint) (WebsiteSetting, error) + GetConfigByName(name string) (WebsiteSetting, error) +} + +type PanelWebsite struct { + Name string `json:"name"` + Status bool `json:"status"` + Domains []string `json:"domains"` + Ports []uint `json:"ports"` + Path string `json:"path"` + Php int `json:"php"` + Ssl bool `json:"ssl"` + Remark string `json:"remark"` + Db bool `json:"db"` + DbType string `json:"db_type"` + DbName string `json:"db_name"` + DbUser string `json:"db_user"` + DbPassword string `json:"db_password"` +} + +// WebsiteSetting 网站设置 +type WebsiteSetting struct { + Name string `json:"name"` + Domains []string `json:"domains"` + Ports []uint `json:"ports"` + Root string `json:"root"` + Path string `json:"path"` + Index string `json:"index"` + Php int `json:"php"` + OpenBasedir bool `json:"open_basedir"` + Ssl bool `json:"ssl"` + SslCertificate string `json:"ssl_certificate"` + SslCertificateKey string `json:"ssl_certificate_key"` + SslNotBefore string `json:"ssl_not_before"` + SslNotAfter string `json:"ssl_not_after"` + SSlDNSNames []string `json:"ssl_dns_names"` + SslIssuer string `json:"ssl_issuer"` + SslOCSPServer []string `json:"ssl_ocsp_server"` + HttpRedirect bool `json:"http_redirect"` + Hsts bool `json:"hsts"` + Waf bool `json:"waf"` + WafMode string `json:"waf_mode"` + WafCcDeny string `json:"waf_cc_deny"` + WafCache string `json:"waf_cache"` + Rewrite string `json:"rewrite"` + Raw string `json:"raw"` + Log string `json:"log"` +} diff --git a/tests/setting/setting_test.go b/tests/setting/setting_test.go index db441909..94c8c5c8 100644 --- a/tests/setting/setting_test.go +++ b/tests/setting/setting_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/stretchr/testify/suite" + "panel/app/internal/services" - "panel/app/services" "panel/tests" ) diff --git a/tests/user/user_test.go b/tests/user/user_test.go index b0f14ac9..e5e4cff7 100644 --- a/tests/user/user_test.go +++ b/tests/user/user_test.go @@ -5,9 +5,9 @@ import ( "github.com/goravel/framework/facades" "github.com/stretchr/testify/suite" + "panel/app/internal/services" "panel/app/models" - "panel/app/services" "panel/tests" )