Search: Move entity events to transaction (#52394)

This commit is contained in:
Alexander Emelin
2022-08-01 18:56:36 +03:00
committed by GitHub
parent a4f56446ee
commit e791a4e576
22 changed files with 126 additions and 159 deletions
-39
View File
@@ -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
}
+30 -22
View File
@@ -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,
})