Search: Move entity events to transaction (#52394)
This commit is contained in:
@@ -62,10 +62,8 @@ type EventHandler func(ctx context.Context, e *EntityEvent) error
|
||||
type EntityEventsService interface {
|
||||
registry.BackgroundService
|
||||
registry.CanBeDisabled
|
||||
SaveEvent(ctx context.Context, cmd SaveEventCmd) error
|
||||
GetLastEvent(ctx context.Context) (*EntityEvent, error)
|
||||
GetAllEventsAfter(ctx context.Context, id int64) ([]*EntityEvent, error)
|
||||
OnEvent(handler EventHandler)
|
||||
|
||||
deleteEventsOlderThan(ctx context.Context, duration time.Duration) error
|
||||
}
|
||||
@@ -90,36 +88,6 @@ type entityEventService struct {
|
||||
eventHandlers []EventHandler
|
||||
}
|
||||
|
||||
func (e *entityEventService) SaveEvent(ctx context.Context, cmd SaveEventCmd) error {
|
||||
entityEvent := &EntityEvent{
|
||||
EventType: cmd.EventType,
|
||||
EntityId: cmd.EntityId,
|
||||
Created: time.Now().Unix(),
|
||||
}
|
||||
err := e.sql.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
_, err := sess.Insert(entityEvent)
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return e.broadcastEvent(ctx, entityEvent)
|
||||
}
|
||||
|
||||
func (e *entityEventService) broadcastEvent(ctx context.Context, event *EntityEvent) error {
|
||||
for _, h := range e.eventHandlers {
|
||||
err := h(ctx, event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *entityEventService) OnEvent(handler EventHandler) {
|
||||
e.eventHandlers = append(e.eventHandlers, handler)
|
||||
}
|
||||
|
||||
func (e *entityEventService) GetLastEvent(ctx context.Context) (*EntityEvent, error) {
|
||||
var entityEvent *EntityEvent
|
||||
err := e.sql.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
@@ -187,13 +155,6 @@ func (d dummyEntityEventsService) IsDisabled() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (d dummyEntityEventsService) SaveEvent(ctx context.Context, cmd SaveEventCmd) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d dummyEntityEventsService) OnEvent(handler EventHandler) {
|
||||
}
|
||||
|
||||
func (d dummyEntityEventsService) GetLastEvent(ctx context.Context) (*EntityEvent, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -10,25 +10,34 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func saveEvent(ctx context.Context, sql *sqlstore.SQLStore, cmd SaveEventCmd) error {
|
||||
entityEvent := &EntityEvent{
|
||||
EventType: cmd.EventType,
|
||||
EntityId: cmd.EntityId,
|
||||
Created: time.Now().Unix(),
|
||||
}
|
||||
return sql.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
_, err := sess.Insert(entityEvent)
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
func TestIntegrationEntityEventsService(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping integration test")
|
||||
}
|
||||
var ctx context.Context
|
||||
var service EntityEventsService
|
||||
ctx := context.Background()
|
||||
|
||||
setup := func() {
|
||||
service = &entityEventService{
|
||||
setup := func() *entityEventService {
|
||||
return &entityEventService{
|
||||
sql: sqlstore.InitTestDB(t),
|
||||
log: log.New("entity-event-test"),
|
||||
}
|
||||
ctx = context.Background()
|
||||
}
|
||||
|
||||
t.Run("Should insert an entity event", func(t *testing.T) {
|
||||
setup()
|
||||
|
||||
err := service.SaveEvent(ctx, SaveEventCmd{
|
||||
service := setup()
|
||||
err := saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/1",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
@@ -36,28 +45,27 @@ func TestIntegrationEntityEventsService(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should retrieve nil entity if database is empty", func(t *testing.T) {
|
||||
setup()
|
||||
|
||||
service := setup()
|
||||
ev, err := service.GetLastEvent(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, ev)
|
||||
})
|
||||
|
||||
t.Run("Should retrieve last entity event", func(t *testing.T) {
|
||||
setup()
|
||||
service := setup()
|
||||
lastEventEntityId := "database/dash/1"
|
||||
|
||||
err := service.SaveEvent(ctx, SaveEventCmd{
|
||||
err := saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/3",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
err = service.SaveEvent(ctx, SaveEventCmd{
|
||||
err = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/2",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
err = service.SaveEvent(ctx, SaveEventCmd{
|
||||
err = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: lastEventEntityId,
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
@@ -69,10 +77,10 @@ func TestIntegrationEntityEventsService(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should retrieve sorted events after an id", func(t *testing.T) {
|
||||
setup()
|
||||
service := setup()
|
||||
lastEventEntityId := "database/dash/1"
|
||||
|
||||
err := service.SaveEvent(ctx, SaveEventCmd{
|
||||
err := saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/3",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
@@ -81,12 +89,12 @@ func TestIntegrationEntityEventsService(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
firstEvId := firstEv.Id
|
||||
|
||||
err = service.SaveEvent(ctx, SaveEventCmd{
|
||||
err = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/2",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
err = service.SaveEvent(ctx, SaveEventCmd{
|
||||
err = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: lastEventEntityId,
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
@@ -100,16 +108,16 @@ func TestIntegrationEntityEventsService(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should delete old events", func(t *testing.T) {
|
||||
setup()
|
||||
_ = service.SaveEvent(ctx, SaveEventCmd{
|
||||
service := setup()
|
||||
_ = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/3",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
_ = service.SaveEvent(ctx, SaveEventCmd{
|
||||
_ = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/2",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
_ = service.SaveEvent(ctx, SaveEventCmd{
|
||||
_ = saveEvent(ctx, service.sql, SaveEventCmd{
|
||||
EntityId: "database/dash/1",
|
||||
EventType: EntityEventTypeCreate,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user