2024-04-17 20:22:30 +02:00

124 lines
3.0 KiB
Go

package infra
import (
"voltaserve/config"
"github.com/meilisearch/meilisearch-go"
)
var searchClient *meilisearch.Client
const (
FileSearchIndex = "file"
GroupSearchIndex = "group"
WorkspaceSearchIndex = "workspace"
OrganizationSearchIndex = "organization"
UserSearchIndex = "user"
)
type SearchModel interface {
GetID() string
}
type SearchManager struct {
config config.SearchConfig
}
func NewSearchManager() *SearchManager {
if searchClient == nil {
searchClient = meilisearch.NewClient(meilisearch.ClientConfig{
Host: config.GetConfig().Search.URL,
})
if _, err := searchClient.CreateIndex(&meilisearch.IndexConfig{
Uid: FileSearchIndex,
PrimaryKey: "id",
}); err != nil {
panic(err)
}
if _, err := searchClient.Index(FileSearchIndex).UpdateSettings(&meilisearch.Settings{
SearchableAttributes: []string{"name", "text"},
}); err != nil {
panic(err)
}
if _, err := searchClient.CreateIndex(&meilisearch.IndexConfig{
Uid: GroupSearchIndex,
PrimaryKey: "id",
}); err != nil {
panic(err)
}
if _, err := searchClient.Index(GroupSearchIndex).UpdateSettings(&meilisearch.Settings{
SearchableAttributes: []string{"name"},
}); err != nil {
panic(err)
}
if _, err := searchClient.CreateIndex(&meilisearch.IndexConfig{
Uid: WorkspaceSearchIndex,
PrimaryKey: "id",
}); err != nil {
panic(err)
}
if _, err := searchClient.Index(WorkspaceSearchIndex).UpdateSettings(&meilisearch.Settings{
SearchableAttributes: []string{"name"},
}); err != nil {
panic(err)
}
if _, err := searchClient.CreateIndex(&meilisearch.IndexConfig{
Uid: OrganizationSearchIndex,
PrimaryKey: "id",
}); err != nil {
panic(err)
}
if _, err := searchClient.Index(OrganizationSearchIndex).UpdateSettings(&meilisearch.Settings{
SearchableAttributes: []string{"name"},
}); err != nil {
panic(err)
}
if _, err := searchClient.CreateIndex(&meilisearch.IndexConfig{
Uid: UserSearchIndex,
PrimaryKey: "id",
}); err != nil {
panic(err)
}
if _, err := searchClient.Index(UserSearchIndex).UpdateSettings(&meilisearch.Settings{
SearchableAttributes: []string{"fullName", "email"},
}); err != nil {
panic(err)
}
}
return &SearchManager{
config: config.GetConfig().Search,
}
}
func (mgr *SearchManager) Query(index string, query string) ([]interface{}, error) {
res, err := searchClient.Index(index).Search(query, &meilisearch.SearchRequest{})
if err != nil {
return nil, err
}
return res.Hits, nil
}
func (mgr *SearchManager) Index(index string, models []SearchModel) error {
_, err := searchClient.Index(index).AddDocuments(models)
if err != nil {
return err
}
return nil
}
func (mgr *SearchManager) Update(index string, m []SearchModel) error {
_, err := searchClient.Index(index).UpdateDocuments(m)
if err != nil {
return err
}
return nil
}
func (mgr *SearchManager) Delete(index string, ids []string) error {
_, err := searchClient.Index(index).DeleteDocuments(ids)
if err != nil {
return err
}
return nil
}