diff --git a/internal/app/app.go b/internal/app/app.go index bb7a4cb..b44afa2 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -46,7 +46,7 @@ func New(ctx context.Context, config Config, opts ...Option) (*App, func(), erro StartTime: time.Now(), }) - jsonStatService, err := NewStatisticsService(statStore) + jsonStatService, err := NewStatisticsService(statStore, b.logger) if err != nil { return nil, nil, err } @@ -58,8 +58,9 @@ func New(ctx context.Context, config Config, opts ...Option) (*App, func(), erro Config: config, Logger: b.logger, - Issues: b.issueService, - Stats: b.statsService, + Issues: b.issueService, + Stats: b.statsService, + ActionLogger: config.ActionLogger, } return app, b.lifecycle.Close, nil diff --git a/internal/models/action_event.go b/internal/models/action_event.go new file mode 100644 index 0000000..3b43b1d --- /dev/null +++ b/internal/models/action_event.go @@ -0,0 +1,29 @@ +package models + +import "encoding/json" + +type ActionEvent struct { + Source string `json:"source"` + Action string `json:"action"` + Target string `json:"target,omitempty"` + Result string `json:"result,omitempty"` +} + +func EncodeActionEvent(event ActionEvent) string { + bytes, err := json.Marshal(event) + if err != nil { + return event.Action + } + return string(bytes) +} + +func DecodeActionEvent(raw string) (ActionEvent, bool) { + var event ActionEvent + if err := json.Unmarshal([]byte(raw), &event); err != nil { + return ActionEvent{}, false + } + if event.Source == "" && event.Action == "" && event.Target == "" && event.Result == "" { + return ActionEvent{}, false + } + return event, true +} diff --git a/internal/models/app.go b/internal/models/app.go index 4a3b30d..efeb815 100644 --- a/internal/models/app.go +++ b/internal/models/app.go @@ -16,6 +16,19 @@ type App struct { Interfaces map[string]Interface CurrentFeedback *ValidationFeedback + ActionLogger func(string) +} + +func (a *App) LogAction(action string) { + if a == nil || action == "" { + return + } + if a.Logger != nil { + a.Logger.Info("action event", "action", action) + } + if a.ActionLogger != nil { + a.ActionLogger(action) + } } // IssueService defines the interface for managing issues in the application. @@ -42,4 +55,5 @@ type StatsService interface { Load(ctx context.Context) error Save(ctx context.Context) error GetStatistics() (Statistics, error) + RecordTaskRun(ctx context.Context, run TaskRunMetrics) error }