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 }