104 lines
2.0 KiB
Go
104 lines
2.0 KiB
Go
package search
|
|
|
|
import (
|
|
"encoding/json"
|
|
"voltaserve/infra"
|
|
"voltaserve/model"
|
|
"voltaserve/repo"
|
|
)
|
|
|
|
type FileSearch struct {
|
|
search *infra.SearchManager
|
|
index string
|
|
s3 *infra.S3Manager
|
|
}
|
|
|
|
func NewFileSearch() *FileSearch {
|
|
return &FileSearch{
|
|
index: infra.FileSearchIndex,
|
|
search: infra.NewSearchManager(),
|
|
s3: infra.NewS3Manager(),
|
|
}
|
|
}
|
|
|
|
func (s *FileSearch) Index(files []model.File) (err error) {
|
|
if len(files) == 0 {
|
|
return nil
|
|
}
|
|
if err = s.populateTextField(files); err != nil {
|
|
return err
|
|
}
|
|
var res []infra.SearchModel
|
|
for _, f := range files {
|
|
res = append(res, f)
|
|
}
|
|
if err := s.search.Index(s.index, res); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *FileSearch) Update(files []model.File) (err error) {
|
|
if len(files) == 0 {
|
|
return nil
|
|
}
|
|
if err = s.populateTextField(files); err != nil {
|
|
return err
|
|
}
|
|
var res []infra.SearchModel
|
|
for _, f := range files {
|
|
res = append(res, f)
|
|
}
|
|
if err := s.search.Update(s.index, res); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *FileSearch) Delete(ids []string) error {
|
|
if len(ids) == 0 {
|
|
return nil
|
|
}
|
|
if err := s.search.Delete(s.index, ids); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *FileSearch) Query(query string) ([]model.File, error) {
|
|
hits, err := s.search.Query(s.index, query)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var res []model.File
|
|
for _, v := range hits {
|
|
var b []byte
|
|
b, err = json.Marshal(v)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
file := repo.NewFile()
|
|
if err = json.Unmarshal(b, &file); err != nil {
|
|
return nil, err
|
|
}
|
|
res = append(res, file)
|
|
}
|
|
return res, nil
|
|
}
|
|
|
|
func (s *FileSearch) populateTextField(files []model.File) error {
|
|
for _, f := range files {
|
|
if f.GetSnapshots() != nil &&
|
|
len(f.GetSnapshots()) > 0 &&
|
|
f.GetSnapshots()[0].HasText() {
|
|
var text string
|
|
text, err := s.s3.GetText(f.GetSnapshots()[0].GetText().Key, f.GetSnapshots()[0].GetText().Bucket)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
f.SetText(&text)
|
|
}
|
|
}
|
|
return nil
|
|
}
|