46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/audit"
|
|
"RenewCMS/internal/domain/update"
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
type CheckForUpdateUseCase struct {
|
|
feed update.ReleaseFeed
|
|
store update.StatusStore
|
|
currentVersion string
|
|
now func() time.Time
|
|
recorder audit.Recorder
|
|
}
|
|
|
|
func NewCheckForUpdateUseCase(feed update.ReleaseFeed, store update.StatusStore, currentVersion string, now func() time.Time, recorder audit.Recorder) *CheckForUpdateUseCase {
|
|
return &CheckForUpdateUseCase{feed: feed, store: store, currentVersion: currentVersion, now: now, recorder: recorder}
|
|
}
|
|
|
|
func (c *CheckForUpdateUseCase) Check(ctx context.Context) (update.UpdateStatus, error) {
|
|
event := audit.NewEvent(audit.ActionUpdateChecked, audit.CategorySystem)
|
|
status, err := c.check()
|
|
if err != nil {
|
|
recordFailure(ctx, c.recorder, event, err)
|
|
return update.UpdateStatus{}, err
|
|
}
|
|
event.Target = audit.ReleaseTarget(status.Latest)
|
|
event.Params = map[string]any{audit.ParamUpdateAvailable: status.Available}
|
|
c.recorder.Record(ctx, event)
|
|
return status, nil
|
|
}
|
|
|
|
func (c *CheckForUpdateUseCase) check() (update.UpdateStatus, error) {
|
|
release, err := c.feed.Latest()
|
|
if err != nil {
|
|
return update.UpdateStatus{}, err
|
|
}
|
|
result := update.NewResult(release, c.now())
|
|
if err := c.store.Save(result); err != nil {
|
|
return update.UpdateStatus{}, err
|
|
}
|
|
return update.NewStatus(c.currentVersion, &result), nil
|
|
}
|