import { AlbumEntity, AssetEntity, AssetType } from '@app/infra/entities'; export enum SearchCollection { ASSETS = 'assets', ALBUMS = 'albums', } export enum SearchStrategy { CLIP = 'CLIP', TEXT = 'TEXT', } export interface SearchFilter { id?: string; userId: string; type?: AssetType; isFavorite?: boolean; city?: string; state?: string; country?: string; make?: string; model?: string; objects?: string[]; tags?: string[]; recent?: boolean; motion?: boolean; debug?: boolean; } export interface SearchResult { /** total matches */ total: number; /** collection size */ count: number; /** current page */ page: number; /** items for page */ items: T[]; facets: SearchFacet[]; } export interface SearchFacet { fieldName: string; counts: Array<{ count: number; value: string; }>; } export interface SearchExploreItem { fieldName: string; items: Array<{ value: string; data: T; }>; } export type SearchCollectionIndexStatus = Record; export const ISearchRepository = 'ISearchRepository'; export interface ISearchRepository { setup(): Promise; checkMigrationStatus(): Promise; importAlbums(items: AlbumEntity[], done: boolean): Promise; importAssets(items: AssetEntity[], done: boolean): Promise; deleteAlbums(ids: string[]): Promise; deleteAssets(ids: string[]): Promise; searchAlbums(query: string, filters: SearchFilter): Promise>; searchAssets(query: string, filters: SearchFilter): Promise>; vectorSearch(query: number[], filters: SearchFilter): Promise>; explore(userId: string): Promise[]>; }