124 lines
3.0 KiB
Go
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
|
|
}
|