// FILE: ./internal/sources/common/event.go package common import ( "time" "gitea.maximumdirect.net/ejr/feedkit/event" ) // SingleRawEvent constructs, validates, and returns a slice containing exactly one event. // // This removes the repetitive "event envelope ceremony" from individual sources. // Sources remain responsible for: // - fetching bytes (raw payload) // - choosing Schema (raw schema identifier) // - computing a stable Event.ID and (optional) EffectiveAt func SingleRawEvent(kind event.Kind, sourceName string, schema string, id string, effectiveAt *time.Time, payload any) ([]event.Event, error) { e := event.Event{ ID: id, Kind: kind, Source: sourceName, EmittedAt: time.Now().UTC(), EffectiveAt: effectiveAt, // RAW schema (normalizer matches on this). Schema: schema, // Raw payload (usually json.RawMessage). Normalizer will decode and map to canonical model. Payload: payload, } if err := e.Validate(); err != nil { return nil, err } return []event.Event{e}, nil }