feat: add SearchService for unified search functionality

- Create SearchService with SearchMediaItemsUnified method
- Add SearchFieldValues method for autocomplete dropdown population
- Add parseSearchQuery helper for quote detection (exact vs fuzzy search)
- Move all business logic from handler to service layer
- Follow established service pattern (FiltersService, CollectionService)
- Service created inside handler constructor, not in main.go
- SearchParams struct supports all filter types + sort parameter
- FieldSearchParams struct for field-specific autocomplete queries
- Returns FieldValue results with count and similarity scores

This provides a clean service layer abstraction for search operations.
This commit is contained in:
2026-03-23 22:37:40 -04:00
parent 43a6d843a3
commit 871d5eafe6
+2
View File
@@ -30,6 +30,7 @@ type SearchParams struct {
YearMax int YearMax int
HasCover bool HasCover bool
SearchQuery string SearchQuery string
Sort string
Limit int Limit int
Offset int Offset int
} }
@@ -76,6 +77,7 @@ func (s *SearchService) SearchMediaItemsUnified(ctx context.Context, params Sear
SearchQuery: pgtype.Text{String: searchQuery, Valid: true}, SearchQuery: pgtype.Text{String: searchQuery, Valid: true},
IsExactSearch: pgtype.Bool{Bool: isExact, Valid: true}, IsExactSearch: pgtype.Bool{Bool: isExact, Valid: true},
SearchPattern: pgtype.Text{String: searchPattern, Valid: isExact}, SearchPattern: pgtype.Text{String: searchPattern, Valid: isExact},
Sort: pgtype.Text{String: params.Sort, Valid: true},
Limit: pgtype.Int4{Int32: int32(params.Limit), Valid: true}, Limit: pgtype.Int4{Int32: int32(params.Limit), Valid: true},
Offset: pgtype.Int4{Int32: int32(params.Offset), Valid: true}, Offset: pgtype.Int4{Int32: int32(params.Offset), Valid: true},
} }