package db import ( "context" "github.com/xlgmokha/x/pkg/event" "github.com/xlgmokha/x/pkg/x" "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/app/domain" ) type publisher[T domain.Entity] struct { aggregator *event.TypedAggregator[T] domain.Repository[T] } func WithPublishing[T domain.Entity](aggregator *event.TypedAggregator[T]) x.Option[domain.Repository[T]] { return func(repository domain.Repository[T]) domain.Repository[T] { return &publisher[T]{ aggregator: aggregator, Repository: repository, } } } func (r *publisher[T]) Save(ctx context.Context, item T) error { err := r.Repository.Save(ctx, item) if err == nil { r.aggregator.Publish("after.create", item) } return err }