ultisuite-backend/internal/search/validate.go
R3D347HR4Y 0435e27ce6 Enhance search functionality with multi-engine support and configuration updates
- 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.
2026-05-22 19:14:27 +02:00

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
}