- Added support for Typesense as a search engine alongside Meilisearch and PostgreSQL. - Updated configuration structure to include Typesense parameters in `Config` and `.env.example`. - Enhanced search handler and service to accommodate external search clients and filters. - Implemented new tests for external search clients and search service functionalities. - Updated project checklist to reflect completion of multi-index search features and contextual snippets.
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package search
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/ultisuite/ulti-backend/internal/api/apivalidate"
|
|
)
|
|
|
|
const (
|
|
minSearchQueryLen = 1
|
|
maxSearchQueryLen = 500
|
|
)
|
|
|
|
var allowedSearchTypes = map[string]struct{}{
|
|
"mail": {},
|
|
"contacts": {},
|
|
"files": {},
|
|
"events": {},
|
|
}
|
|
|
|
func validateSearchQuery(q string) *apivalidate.ValidationError {
|
|
q = strings.TrimSpace(q)
|
|
if q == "" {
|
|
return apivalidate.NewValidationError(apivalidate.FieldDetail{
|
|
Field: "q", Message: "required",
|
|
})
|
|
}
|
|
if len(q) < minSearchQueryLen {
|
|
return apivalidate.NewValidationError(apivalidate.FieldDetail{
|
|
Field: "q", Message: "too short",
|
|
})
|
|
}
|
|
if len(q) > maxSearchQueryLen {
|
|
return apivalidate.NewValidationError(apivalidate.FieldDetail{
|
|
Field: "q", Message: "too long",
|
|
})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func validateSearchTypes(typesRaw string) *apivalidate.ValidationError {
|
|
if strings.TrimSpace(typesRaw) == "" {
|
|
return nil
|
|
}
|
|
for _, part := range strings.Split(typesRaw, ",") {
|
|
t := strings.TrimSpace(part)
|
|
if t == "" {
|
|
continue
|
|
}
|
|
if _, ok := allowedSearchTypes[t]; !ok {
|
|
return apivalidate.NewValidationError(apivalidate.FieldDetail{
|
|
Field: "types", Message: "invalid value: " + t,
|
|
})
|
|
}
|
|
}
|
|
return nil
|
|
}
|