Refactoring complete: v0.4.0 architectural milestone (#1)
## Summary Completed Phase 5 refactoring and reached the target architecture. **Architectural milestone achieved:** - Service layer owns all state and is the sole writer - UI is a thin Fyne view, all widget updates marshaled via `fyne.Do` - Core engines are stateless and injectable - Domain types are pure (no `yaml:"-"` fields) - Full module builds and `go vet ./...` clean ## Changes - Bump version: 0.3.6 → 0.4.0 - Update CHANGELOG with Phase 5 summary - Add ROADMAP "Refactoring Follow-Ups" section ## Known follow-up work 1. **Linux test build broken** — `runner_test.go` needs `//go:build windows` tag 2. **File-size limits exceeded** — `operations.go` (486 lines), `jobs_view.go` (415 lines) See ROADMAP.md for details. --------- Co-authored-by: mixeme <mix.public@ya.ru> Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package domain
|
||||
|
||||
import "time"
|
||||
|
||||
// JobRuntime is the transient execution state for a Job. It is never written to
|
||||
// jobs.yaml: it is rebuilt from scratch each time GoSentry starts and is held in
|
||||
// memory keyed by Job.ID for the lifetime of the process. Keeping it separate
|
||||
// from Job is what lets the durable configuration file stay free of run records,
|
||||
// status strings, and scheduling bookkeeping.
|
||||
type JobRuntime struct {
|
||||
LastRun string
|
||||
NextRun string
|
||||
LastState string
|
||||
Output string
|
||||
Logs []RunRecord
|
||||
|
||||
// NextDue is the next scheduled execution time, kept as time.Time for
|
||||
// scheduler comparisons. NextRun above is its formatted display string and is
|
||||
// the only form shown in the GUI.
|
||||
NextDue time.Time
|
||||
}
|
||||
|
||||
// NewRuntime builds the initial runtime state for a freshly loaded or created
|
||||
// job. Enabled jobs start "Ready" and wait for the scheduler to compute their
|
||||
// first run; disabled jobs start "Paused".
|
||||
func NewRuntime(job Job) *JobRuntime {
|
||||
runtime := &JobRuntime{
|
||||
LastRun: "Never",
|
||||
Output: "No command output captured yet.",
|
||||
}
|
||||
if job.Enabled {
|
||||
runtime.LastState = "Ready"
|
||||
runtime.NextRun = "After start"
|
||||
} else {
|
||||
runtime.LastState = "Paused"
|
||||
runtime.NextRun = "Paused"
|
||||
}
|
||||
return runtime
|
||||
}
|
||||
|
||||
// NewRuntimes builds a runtime map for a slice of jobs, keyed by Job.ID. It is
|
||||
// the convenience entry point used when a whole jobs file has just been loaded.
|
||||
func NewRuntimes(jobs []Job) map[int]*JobRuntime {
|
||||
runtimes := make(map[int]*JobRuntime, len(jobs))
|
||||
for _, job := range jobs {
|
||||
runtimes[job.ID] = NewRuntime(job)
|
||||
}
|
||||
return runtimes
|
||||
}
|
||||
Reference in New Issue
Block a user