diff --git a/docs/REFACTORING.md b/docs/REFACTORING.md index 51e9ce8..bdd3a2f 100644 --- a/docs/REFACTORING.md +++ b/docs/REFACTORING.md @@ -247,7 +247,7 @@ Track progress here. Mark tasks complete as they land and pass review. - [x] T1.1 — Create `src/domain`; move Job/RunRecord/Config/etc - [x] T1.2 — Create `src/platform/winproc`; move `configureHiddenWindow` - [x] T1.3 — Create `src/runner`; move runner logic -- [ ] T1.4 — Create `src/scheduler`; move scheduler +- [x] T1.4 — Create `src/scheduler`; move scheduler - [ ] T1.5 — Create `src/storage`; move store/paths - [ ] T1.6 — Create `src/platform/autostart`; move autostart logic - [ ] T1.7 — Create `src/platform/desktop`; move desktop integration diff --git a/src/gui/app.go b/src/gui/app.go index cf45493..ca16bd5 100644 --- a/src/gui/app.go +++ b/src/gui/app.go @@ -16,6 +16,7 @@ import ( "gitea.mixdep.ru/mix/gosentry/src/core" "gitea.mixdep.ru/mix/gosentry/src/domain" "gitea.mixdep.ru/mix/gosentry/src/runner" + "gitea.mixdep.ru/mix/gosentry/src/scheduler" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" @@ -263,7 +264,7 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { jobLogs.Refresh() history.Refresh() } - var scheduler *core.Scheduler + var sched *scheduler.Scheduler list := widget.NewList( func() int { return len(filteredJobs) }, @@ -353,8 +354,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { updated := newEvent(saved.ID, saved.Name, "Updated", "Job settings changed") jobs[selected].Logs = append([]event{updated}, jobs[selected].Logs...) events = append(events, updated) - if scheduler != nil { - scheduler.RefreshSchedule(selected) + if sched != nil { + sched.RefreshSchedule(selected) } _ = store.SaveJobs(jobs) folderSelect.Options = folderOptions(jobs) @@ -373,7 +374,7 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { dialog.ShowInformation("Scheduler paused", "Global pause is active. Resume the scheduler before running jobs.", w) return } - if !scheduler.RunNow(selected) { + if !sched.RunNow(selected) { return } list.Refresh() @@ -391,8 +392,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { jobs[index].NextRun = "Scheduler paused" } } - if scheduler != nil { - scheduler.SetPaused(true) + if sched != nil { + sched.SetPaused(true) } events = append(events, newEvent(0, "Scheduler", "Paused", "All job execution paused")) } else { @@ -406,8 +407,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { jobs[index].NextRun = "Waiting for scheduler" } } - if scheduler != nil { - scheduler.SetPaused(false) + if sched != nil { + sched.SetPaused(false) } events = append(events, newEvent(0, "Scheduler", "Resumed", "All job execution resumed")) } @@ -426,8 +427,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { resumed := newEvent(current.ID, current.Name, "Resumed", "Job was enabled") current.Logs = append([]event{resumed}, current.Logs...) events = append(events, resumed) - if scheduler != nil { - scheduler.RefreshSchedule(selected) + if sched != nil { + sched.RefreshSchedule(selected) } } else { current.LastState = "Paused" @@ -435,8 +436,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { paused := newEvent(current.ID, current.Name, "Paused", "Job was disabled") current.Logs = append([]event{paused}, current.Logs...) events = append(events, paused) - if scheduler != nil { - scheduler.RefreshSchedule(selected) + if sched != nil { + sched.RefreshSchedule(selected) } } _ = store.SaveJobs(jobs) @@ -503,13 +504,13 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) { jobLogs, ) - scheduler = core.NewScheduler(store, &jobs, func(record domain.RunRecord) { + sched = scheduler.NewScheduler(store, &jobs, func(record domain.RunRecord) { // Scheduled runs happen on the scheduler goroutine. The callback updates // the shared in-memory event list so History reflects background activity. events = append(events, record) refresh() }) - scheduler.Start() + sched.Start() fixedSidebar := container.New(minWidthLayout{width: minJobsSidebarWidth}, sidebar) jobsView := container.NewBorder(nil, nil, fixedSidebar, nil, container.NewPadded(details)) diff --git a/src/core/scheduler.go b/src/scheduler/scheduler.go similarity index 97% rename from src/core/scheduler.go rename to src/scheduler/scheduler.go index 46e4d7a..bf04f20 100644 --- a/src/core/scheduler.go +++ b/src/scheduler/scheduler.go @@ -1,4 +1,4 @@ -package core +package scheduler import ( "context" @@ -7,6 +7,7 @@ import ( "sync" "time" + "gitea.mixdep.ru/mix/gosentry/src/core" "gitea.mixdep.ru/mix/gosentry/src/domain" "gitea.mixdep.ru/mix/gosentry/src/runner" "github.com/robfig/cron/v3" @@ -19,7 +20,7 @@ var cronParser = cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month // this keeps the early architecture simple while storage and scheduling are // still in one desktop process. type Scheduler struct { - store *Store + store *core.Store jobs *[]domain.Job onChange func(domain.RunRecord) @@ -29,7 +30,7 @@ type Scheduler struct { paused bool } -func NewScheduler(store *Store, jobs *[]domain.Job, onChange func(domain.RunRecord)) *Scheduler { +func NewScheduler(store *core.Store, jobs *[]domain.Job, onChange func(domain.RunRecord)) *Scheduler { ctx, cancel := context.WithCancel(context.Background()) s := &Scheduler{ store: store, diff --git a/src/core/scheduler_test.go b/src/scheduler/scheduler_test.go similarity index 99% rename from src/core/scheduler_test.go rename to src/scheduler/scheduler_test.go index 11eab80..a10fe6c 100644 --- a/src/core/scheduler_test.go +++ b/src/scheduler/scheduler_test.go @@ -1,4 +1,4 @@ -package core +package scheduler import ( "strings"