mirror of
https://github.com/ForFarmTeam/ForFarm.git
synced 2025-12-19 05:54:08 +01:00
49 lines
1.1 KiB
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
|
|
}
|