From 9629c6bc515deaf799dc4c5e3f1c3e23c008a61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 2 Oct 2025 15:30:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8B=E8=BD=BD=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/app.go | 12 +++++++++++- internal/data/database_server.go | 2 +- internal/job/cert_renew.go | 4 ++-- internal/job/panel_task.go | 16 ++++++++-------- internal/queuejob/process_task.go | 2 +- pkg/api/app.go | 15 +++++++++++++++ pkg/api/template.go | 13 +++++++++++++ 7 files changed, 51 insertions(+), 13 deletions(-) diff --git a/internal/data/app.go b/internal/data/app.go index 1b0cc331..74e4725a 100644 --- a/internal/data/app.go +++ b/internal/data/app.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "slices" "github.com/expr-lang/expr" @@ -23,17 +24,21 @@ type appRepo struct { t *gotext.Locale conf *koanf.Koanf db *gorm.DB + log *slog.Logger cache biz.CacheRepo task biz.TaskRepo + api *api.API } -func NewAppRepo(t *gotext.Locale, conf *koanf.Koanf, db *gorm.DB, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo { +func NewAppRepo(t *gotext.Locale, conf *koanf.Koanf, db *gorm.DB, log *slog.Logger, cache biz.CacheRepo, task biz.TaskRepo) biz.AppRepo { return &appRepo{ t: t, conf: conf, db: db, + log: log, cache: cache, task: task, + api: api.NewAPI(app.Version, app.Locale), } } @@ -184,6 +189,11 @@ func (r *appRepo) Install(channel, slug string) error { return err } + // 下载回调 + if err = r.api.AppCallback(slug); err != nil { + r.log.Warn("[App] download callback failed", slog.String("app", slug), slog.Any("error", err)) + } + if app.IsCli { return shell.ExecfWithOutput(`curl -sSLm 10 --retry 3 "%s" | bash -s -- "%s" "%s"`, shellUrl, shellChannel, shellVersion) } diff --git a/internal/data/database_server.go b/internal/data/database_server.go index a95f763b..91694716 100644 --- a/internal/data/database_server.go +++ b/internal/data/database_server.go @@ -161,7 +161,7 @@ func (r databaseServerRepo) Sync(id uint) error { Remark: r.t.Get("sync from server %s", server.Name), } if err = r.db.Create(newUser).Error; err != nil { - r.log.Warn("sync database user failed", slog.Any("err", err)) + r.log.Warn("[DatabaseServer] sync database user failed", slog.Any("err", err)) } } } diff --git a/internal/job/cert_renew.go b/internal/job/cert_renew.go index c1b0109c..c2c84dbf 100644 --- a/internal/job/cert_renew.go +++ b/internal/job/cert_renew.go @@ -33,7 +33,7 @@ func (r *CertRenew) Run() { var certs []biz.Cert if err := r.db.Preload("Website").Preload("Account").Preload("DNS").Find(&certs).Error; err != nil { - r.log.Warn("[Cert Renew] failed to get certs", slog.Any("err", err)) + r.log.Warn("[CertRenew] failed to get certs", slog.Any("err", err)) return } @@ -54,7 +54,7 @@ func (r *CertRenew) Run() { _, err = r.certRepo.Renew(cert.ID) if err != nil { - r.log.Warn("[Cert Renew] failed to renew cert", slog.Any("err", err)) + r.log.Warn("[CertRenew] failed to renew cert", slog.Any("err", err)) } } } diff --git a/internal/job/panel_task.go b/internal/job/panel_task.go index 79fd65aa..a0243959 100644 --- a/internal/job/panel_task.go +++ b/internal/job/panel_task.go @@ -45,29 +45,29 @@ func (r *PanelTask) Run() { // 优化数据库 if err := r.db.Exec("VACUUM").Error; err != nil { app.Status = app.StatusFailed - r.log.Warn("[Panel Task] failed to vacuum database", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to vacuum database", slog.Any("err", err)) return } if err := r.db.Exec("PRAGMA journal_mode=WAL;").Error; err != nil { app.Status = app.StatusFailed - r.log.Warn("[Panel Task] failed to set database journal_mode to WAL", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to set database journal_mode to WAL", slog.Any("err", err)) return } if err := r.db.Exec("PRAGMA wal_checkpoint(TRUNCATE);").Error; err != nil { app.Status = app.StatusFailed - r.log.Warn("[Panel Task] failed to wal checkpoint database", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to wal checkpoint database", slog.Any("err", err)) return } // 备份面板 if err := r.backupRepo.Create(biz.BackupTypePanel, ""); err != nil { - r.log.Warn("备份面板失败", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to backup panel", slog.Any("err", err)) } // 清理备份 if path, err := r.backupRepo.GetPath("panel"); err == nil { if err = r.backupRepo.ClearExpired(path, "panel_", 10); err != nil { - r.log.Warn("[Panel Task] failed to clear backup", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to clear backup", slog.Any("err", err)) } } @@ -91,7 +91,7 @@ func (r *PanelTask) Run() { func (r *PanelTask) updateApps() { time.AfterFunc(time.Duration(rand.IntN(300))*time.Second, func() { if err := r.cacheRepo.UpdateApps(); err != nil { - r.log.Warn("[Panel Task] failed to update apps cache", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to update apps cache", slog.Any("err", err)) } }) } @@ -100,7 +100,7 @@ func (r *PanelTask) updateApps() { func (r *PanelTask) updateRewrites() { time.AfterFunc(time.Duration(rand.IntN(300))*time.Second, func() { if err := r.cacheRepo.UpdateRewrites(); err != nil { - r.log.Warn("[Panel Task] failed to update rewrites cache", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to update rewrites cache", slog.Any("err", err)) } }) } @@ -132,7 +132,7 @@ func (r *PanelTask) updatePanel() { } if download := collect.First(panel.Downloads); download != nil { if err = r.backupRepo.UpdatePanel(panel.Version, download.URL, download.Checksum); err != nil { - r.log.Warn("[Panel Task] failed to update panel", slog.Any("err", err)) + r.log.Warn("[PanelTask] failed to update panel", slog.Any("err", err)) _ = r.backupRepo.FixPanel() } } diff --git a/internal/queuejob/process_task.go b/internal/queuejob/process_task.go index d8cfd69c..21ca0a8b 100644 --- a/internal/queuejob/process_task.go +++ b/internal/queuejob/process_task.go @@ -51,6 +51,6 @@ func (r *ProcessTask) Handle(args ...any) error { } func (r *ProcessTask) ErrHandle(err error) { - r.log.Warn("background task failed", slog.Any("task_id", r.taskID), slog.Any("err", err)) + r.log.Warn("[ProcessTask] background task failed", slog.Any("task_id", r.taskID), slog.Any("err", err)) _ = r.taskRepo.UpdateStatus(r.taskID, biz.TaskStatusFailed) } diff --git a/pkg/api/app.go b/pkg/api/app.go index 1da6134f..a086cd0b 100644 --- a/pkg/api/app.go +++ b/pkg/api/app.go @@ -64,3 +64,18 @@ func (r *API) AppBySlug(slug string) (*App, error) { return app, nil } + +// AppCallback 应用下载回调 +func (r *API) AppCallback(slug string) error { + resp, err := r.client.R(). + SetResult(&Response{}). + Post(fmt.Sprintf("/apps/%s/callback", slug)) + if err != nil { + return err + } + if !resp.IsSuccess() { + return fmt.Errorf("failed to callback app: %s", resp.String()) + } + + return nil +} diff --git a/pkg/api/template.go b/pkg/api/template.go index fa981aeb..4f262c66 100644 --- a/pkg/api/template.go +++ b/pkg/api/template.go @@ -60,3 +60,16 @@ func (r *API) TemplateBySlug(slug string) (*Template, error) { return template, nil } + +// TemplateCallback 模版下载回调 +func (r *API) TemplateCallback(slug string) error { + resp, err := r.client.R().SetResult(&Response{}).Post(fmt.Sprintf("/templates/%s/callback", slug)) + if err != nil { + return err + } + if !resp.IsSuccess() { + return fmt.Errorf("failed to callback template: %s", resp.String()) + } + + return nil +}