readysite / website / internal / search / sync.go
1.3 KB
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)
			}
		}
	}
}
← Back