ForFarm/backend/internal/event/projection.go

49 lines
1.1 KiB
Go

package event
import (
"context"
"log/slog"
"github.com/forfarm/backend/internal/domain"
)
type AnalyticsProjection struct {
eventSubscriber domain.EventSubscriber
repository domain.AnalyticsRepository
logger *slog.Logger
}
func NewAnalyticsProjection(
subscriber domain.EventSubscriber,
repository domain.AnalyticsRepository,
logger *slog.Logger,
) *AnalyticsProjection {
return &AnalyticsProjection{
eventSubscriber: subscriber,
repository: repository,
logger: logger,
}
}
func (p *AnalyticsProjection) Start(ctx context.Context) error {
// Subscribe to coarse-grained events
eventTypes := []string{"farm.status_changed"}
for _, eventType := range eventTypes {
if err := p.eventSubscriber.Subscribe(ctx, eventType, p.handleEvent); err != nil {
return err
}
}
return nil
}
func (p *AnalyticsProjection) handleEvent(event domain.Event) error {
// Update materialized view based on event
if event.Type == "farm.status_changed" {
return p.repository.SaveFarmAnalytics(context.Background(), event.AggregateID, event.Payload)
}
return nil
}