mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
SearchV2: instant local updates, folder events (#50001)
This commit is contained in:
@@ -24,6 +24,7 @@ type EntityType string
|
||||
|
||||
const (
|
||||
EntityTypeDashboard EntityType = "dashboard"
|
||||
EntityTypeFolder EntityType = "folder"
|
||||
)
|
||||
|
||||
// CreateDatabaseEntityId creates entityId for entities stored in the existing SQL tables
|
||||
@@ -51,6 +52,8 @@ type SaveEventCmd struct {
|
||||
EventType EntityEventType
|
||||
}
|
||||
|
||||
type EventHandler func(ctx context.Context, e *EntityEvent) error
|
||||
|
||||
// EntityEventsService is a temporary solution to support change notifications in an HA setup
|
||||
// With this service each system can query for any events that have happened since a fixed time
|
||||
//go:generate mockery --name EntityEventsService --structname MockEntityEventsService --inpackage --filename entity_events_mock.go
|
||||
@@ -60,6 +63,7 @@ type EntityEventsService interface {
|
||||
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
|
||||
}
|
||||
@@ -70,27 +74,48 @@ func ProvideEntityEventsService(cfg *setting.Cfg, sqlStore *sqlstore.SQLStore, f
|
||||
}
|
||||
|
||||
return &entityEventService{
|
||||
sql: sqlStore,
|
||||
features: features,
|
||||
log: log.New("entity-events"),
|
||||
sql: sqlStore,
|
||||
features: features,
|
||||
log: log.New("entity-events"),
|
||||
eventHandlers: make([]EventHandler, 0),
|
||||
}
|
||||
}
|
||||
|
||||
type entityEventService struct {
|
||||
sql *sqlstore.SQLStore
|
||||
log log.Logger
|
||||
features featuremgmt.FeatureToggles
|
||||
sql *sqlstore.SQLStore
|
||||
log log.Logger
|
||||
features featuremgmt.FeatureToggles
|
||||
eventHandlers []EventHandler
|
||||
}
|
||||
|
||||
func (e *entityEventService) SaveEvent(ctx context.Context, cmd SaveEventCmd) error {
|
||||
return e.sql.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
_, err := sess.Insert(&EntityEvent{
|
||||
EventType: cmd.EventType,
|
||||
EntityId: cmd.EntityId,
|
||||
Created: time.Now().Unix(),
|
||||
})
|
||||
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) {
|
||||
@@ -164,6 +189,9 @@ func (d dummyEntityEventsService) SaveEvent(ctx context.Context, cmd SaveEventCm
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d dummyEntityEventsService) OnEvent(handler EventHandler) {
|
||||
}
|
||||
|
||||
func (d dummyEntityEventsService) GetLastEvent(ctx context.Context) (*EntityEvent, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user