diff --git a/apps/workspace-engine/main.go b/apps/workspace-engine/main.go index 1b2db50a3..37b7f00a0 100644 --- a/apps/workspace-engine/main.go +++ b/apps/workspace-engine/main.go @@ -9,6 +9,7 @@ import ( "syscall" "time" + "workspace-engine/pkg/events/handler" "workspace-engine/pkg/kafka" "workspace-engine/pkg/server" "workspace-engine/pkg/ticker" @@ -145,7 +146,7 @@ func main() { defer producer.Close() // Start periodic ticker for time-sensitive policy evaluation - workspaceTicker := ticker.New(producer) + workspaceTicker := ticker.NewDefault(producer) go func() { log.Info("Workspace ticker started") if err := workspaceTicker.Run(ctx); err != nil { @@ -153,6 +154,14 @@ func main() { } }() + workspaceSaveTicker := ticker.New(producer, 1*time.Hour, string(handler.WorkspaceSave)) + go func() { + log.Info("Workspace save ticker started") + if err := workspaceSaveTicker.Run(ctx); err != nil { + log.Error("Ticker error", "error", err) + } + }() + go func() { log.Info("Kafka consumer started") if err := kafka.RunConsumer(ctx); err != nil { diff --git a/apps/workspace-engine/pkg/ticker/ticker.go b/apps/workspace-engine/pkg/ticker/ticker.go index a82783cae..f7b8109f1 100644 --- a/apps/workspace-engine/pkg/ticker/ticker.go +++ b/apps/workspace-engine/pkg/ticker/ticker.go @@ -27,18 +27,29 @@ var tracer = otel.Tracer("ticker") // Ticker periodically emits tick events for active workspaces type Ticker struct { - producer kafka.EventProducer - interval time.Duration + producer kafka.EventProducer + interval time.Duration + eventType string } -// New creates a new ticker with the configured interval -func New(producer kafka.EventProducer) *Ticker { +// NewDefault creates a new ticker with the configured interval +func NewDefault(producer kafka.EventProducer) *Ticker { interval := getTickInterval() log.Info("Ticker initialized", "interval", interval) return &Ticker{ - producer: producer, - interval: interval, + producer: producer, + interval: interval, + eventType: WorkspaceTickEventType, + } +} + +// New creates a new ticker with the configured interval and event type +func New(producer kafka.EventProducer, interval time.Duration, eventType string) *Ticker { + return &Ticker{ + producer: producer, + interval: interval, + eventType: eventType, } } @@ -148,7 +159,7 @@ func (t *Ticker) emitTickForWorkspace(ctx context.Context, workspaceID string) e span.SetAttributes(attribute.String("workspace.id", workspaceID)) - err := t.producer.ProduceEvent(WorkspaceTickEventType, workspaceID, nil) + err := t.producer.ProduceEvent(t.eventType, workspaceID, nil) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, "failed to produce tick event") diff --git a/apps/workspace-engine/pkg/ticker/ticker_test.go b/apps/workspace-engine/pkg/ticker/ticker_test.go index 99aef7155..b37a53b96 100644 --- a/apps/workspace-engine/pkg/ticker/ticker_test.go +++ b/apps/workspace-engine/pkg/ticker/ticker_test.go @@ -32,8 +32,9 @@ func (m *MockEventProducer) Close() { func TestEmitTicks_NoWorkspaces(t *testing.T) { mockProducer := new(MockEventProducer) ticker := &Ticker{ - producer: mockProducer, - interval: time.Minute, + producer: mockProducer, + interval: time.Minute, + eventType: WorkspaceTickEventType, } // Ensure no workspaces are registered @@ -49,8 +50,9 @@ func TestEmitTicks_NoWorkspaces(t *testing.T) { func TestEmitTicks_MultipleWorkspaces(t *testing.T) { mockProducer := new(MockEventProducer) ticker := &Ticker{ - producer: mockProducer, - interval: time.Minute, + producer: mockProducer, + interval: time.Minute, + eventType: WorkspaceTickEventType, } // Register test workspaces @@ -80,8 +82,9 @@ func TestEmitTicks_MultipleWorkspaces(t *testing.T) { func TestEmitTickForWorkspace(t *testing.T) { mockProducer := new(MockEventProducer) ticker := &Ticker{ - producer: mockProducer, - interval: time.Minute, + producer: mockProducer, + interval: time.Minute, + eventType: WorkspaceTickEventType, } workspaceID := "test-workspace" @@ -133,8 +136,9 @@ func TestGetTickInterval_Zero(t *testing.T) { func TestTickerRun_Cancellation(t *testing.T) { mockProducer := new(MockEventProducer) ticker := &Ticker{ - producer: mockProducer, - interval: 10 * time.Millisecond, // Short interval for testing + producer: mockProducer, + interval: 10 * time.Millisecond, // Short interval for testing + eventType: WorkspaceTickEventType, } ctx, cancel := context.WithCancel(context.Background())