sync.go
package search
import (
"log"
"github.com/readysite/readysite/website/internal/content"
)
// StartSync subscribes to the event bus and keeps the search index updated
// in real-time as content changes. This function blocks and should be called
// in a goroutine.
func StartSync() {
sub := content.CollectionEvents.SubscribeAll()
log.Printf("[search] Started real-time index sync")
for event := range sub.Events {
switch event.EntityType {
case content.EntityPage:
pageID := event.PageID
if pageID == "" {
continue
}
switch event.Type {
case content.EventCreate, content.EventUpdate:
IndexEntity("page", pageID)
case content.EventDelete:
RemoveEntity("page", pageID)
}
case content.EntityCollection:
collectionID := event.CollectionID
if collectionID == "" {
continue
}
switch event.Type {
case content.EventCreate, content.EventUpdate:
IndexEntity("collection", collectionID)
case content.EventDelete:
RemoveEntity("collection", collectionID)
}
case content.EntityDocument:
recordID := event.RecordID
if recordID == "" {
continue
}
switch event.Type {
case content.EventCreate, content.EventUpdate:
IndexEntity("document", recordID)
case content.EventDelete:
RemoveEntity("document", recordID)
}
}
}
}