import { AssetFaceEntity } from 'src/entities/asset-face.entity'; import { AssetEntity } from 'src/entities/asset.entity'; import { GeodataPlacesEntity } from 'src/entities/geodata-places.entity'; import { AssetStatus, AssetType } from 'src/enum'; import { Paginated } from 'src/utils/pagination'; export const ISearchRepository = 'ISearchRepository'; export interface SearchResult { /** total matches */ total: number; /** collection size */ count: number; /** current page */ page: number; /** items for page */ items: T[]; /** score */ distances: number[]; facets: SearchFacet[]; } export interface SearchFacet { fieldName: string; counts: Array<{ count: number; value: string; }>; } export type SearchExploreItemSet = Array<{ value: string; data: T; }>; export interface SearchExploreItem { fieldName: string; items: SearchExploreItemSet; } export interface SearchAssetIDOptions { checksum?: Buffer; deviceAssetId?: string; id?: string; } export interface SearchUserIdOptions { deviceId?: string; libraryId?: string | null; userIds?: string[]; } export type SearchIdOptions = SearchAssetIDOptions & SearchUserIdOptions; export interface SearchStatusOptions { isArchived?: boolean; isEncoded?: boolean; isFavorite?: boolean; isMotion?: boolean; isOffline?: boolean; isVisible?: boolean; isNotInAlbum?: boolean; type?: AssetType; status?: AssetStatus; withArchived?: boolean; withDeleted?: boolean; } export interface SearchOneToOneRelationOptions { withExif?: boolean; withStacked?: boolean; } export interface SearchRelationOptions extends SearchOneToOneRelationOptions { withFaces?: boolean; withPeople?: boolean; } export interface SearchDateOptions { createdBefore?: Date; createdAfter?: Date; takenBefore?: Date; takenAfter?: Date; trashedBefore?: Date; trashedAfter?: Date; updatedBefore?: Date; updatedAfter?: Date; } export interface SearchPathOptions { encodedVideoPath?: string; originalFileName?: string; originalPath?: string; previewPath?: string; thumbnailPath?: string; } export interface SearchExifOptions { city?: string | null; country?: string | null; lensModel?: string | null; make?: string | null; model?: string | null; state?: string | null; } export interface SearchEmbeddingOptions { embedding: number[]; userIds: string[]; } export interface SearchPeopleOptions { personIds?: string[]; } export interface SearchOrderOptions { orderDirection?: 'ASC' | 'DESC'; } export interface SearchPaginationOptions { page: number; size: number; } type BaseAssetSearchOptions = SearchDateOptions & SearchIdOptions & SearchExifOptions & SearchOrderOptions & SearchPathOptions & SearchStatusOptions & SearchUserIdOptions & SearchPeopleOptions; export type AssetSearchOptions = BaseAssetSearchOptions & SearchRelationOptions; export type AssetSearchOneToOneRelationOptions = BaseAssetSearchOptions & SearchOneToOneRelationOptions; export type AssetSearchBuilderOptions = Omit; export type SmartSearchOptions = SearchDateOptions & SearchEmbeddingOptions & SearchExifOptions & SearchOneToOneRelationOptions & SearchStatusOptions & SearchUserIdOptions & SearchPeopleOptions; export interface FaceEmbeddingSearch extends SearchEmbeddingOptions { hasPerson?: boolean; numResults: number; maxDistance?: number; } export interface AssetDuplicateSearch { assetId: string; embedding: number[]; maxDistance?: number; type: AssetType; userIds: string[]; } export interface FaceSearchResult { distance: number; face: AssetFaceEntity; } export interface AssetDuplicateResult { assetId: string; duplicateId: string | null; distance: number; } export interface GetStatesOptions { country?: string; } export interface GetCitiesOptions extends GetStatesOptions { state?: string; } export interface GetCameraModelsOptions { make?: string; } export interface GetCameraMakesOptions { model?: string; } export interface ISearchRepository { searchMetadata(pagination: SearchPaginationOptions, options: AssetSearchOptions): Paginated; searchSmart(pagination: SearchPaginationOptions, options: SmartSearchOptions): Paginated; searchDuplicates(options: AssetDuplicateSearch): Promise; searchFaces(search: FaceEmbeddingSearch): Promise; searchRandom(size: number, options: AssetSearchOptions): Promise; upsert(assetId: string, embedding: number[]): Promise; searchPlaces(placeName: string): Promise; getAssetsByCity(userIds: string[]): Promise; deleteAllSearchEmbeddings(): Promise; getDimensionSize(): Promise; setDimensionSize(dimSize: number): Promise; getCountries(userIds: string[]): Promise>; getStates(userIds: string[], options: GetStatesOptions): Promise>; getCities(userIds: string[], options: GetCitiesOptions): Promise>; getCameraMakes(userIds: string[], options: GetCameraMakesOptions): Promise>; getCameraModels(userIds: string[], options: GetCameraModelsOptions): Promise>; }