feat(server): new search API (#30179)

This commit is contained in:
Timon
2026-08-27 20:39:55 +02:00
committed by GitHub
parent 25c60ef99e
commit 8b3d6b320b
18 changed files with 5039 additions and 384 deletions
+177
View File
@@ -2154,6 +2154,168 @@ export type SearchExploreResponseDto = {
fieldName: string;
items: SearchExploreItem[];
};
export type IdsFilter = {
all?: string[];
"any"?: string[];
none?: string[];
};
export type StringFilter = {
eq?: string;
"in"?: string[];
ne?: string;
notIn?: string[];
};
export type StringFilterNullable = {
eq?: string | null;
"in"?: string[];
ne?: string | null;
notIn?: string[];
};
export type DateFilter = {
eq?: string;
gt?: string;
gte?: string;
lt?: string;
lte?: string;
ne?: string;
};
export type StringPatternFilter = {
endsWith?: string;
eq?: string | null;
"in"?: string[];
like?: string;
ne?: string | null;
notIn?: string[];
notLike?: string;
startsWith?: string;
};
export type NumberFilter = {
eq?: number;
gt?: number;
gte?: number;
"in"?: number[];
lt?: number;
lte?: number;
ne?: number;
notIn?: number[];
};
export type BoolFilter = {
eq: boolean;
};
export type IdFilter = {
eq?: string;
ne?: string;
};
export type IdFilterNullable = {
eq?: string | null;
ne?: string | null;
};
export type StringSimilarityFilter = {
matches: string;
};
export type NumberFilterNullable = {
eq?: number | null;
gt?: number;
gte?: number;
"in"?: number[];
lt?: number;
lte?: number;
ne?: number | null;
notIn?: number[];
};
export type DateFilterNullable = {
eq?: string | null;
gt?: string;
gte?: string;
lt?: string;
lte?: string;
ne?: string | null;
};
export type EnumFilterAssetType = {
eq?: AssetTypeEnum;
"in"?: AssetTypeEnum[];
ne?: AssetTypeEnum;
notIn?: AssetTypeEnum[];
};
export type EnumFilterAssetVisibility = {
eq?: AssetVisibility;
"in"?: AssetVisibility[];
ne?: AssetVisibility;
notIn?: AssetVisibility[];
};
export type SearchFilterBranch = {
albumIds?: IdsFilter;
checksum?: StringFilter;
city?: StringFilterNullable;
country?: StringFilterNullable;
createdAt?: DateFilter;
description?: StringPatternFilter;
encodedVideoPath?: StringFilter;
fileSizeInBytes?: NumberFilter;
hasAlbums?: BoolFilter;
hasPeople?: BoolFilter;
hasTags?: BoolFilter;
id?: IdFilter;
isEncoded?: BoolFilter;
isFavorite?: BoolFilter;
isMotion?: BoolFilter;
isOffline?: BoolFilter;
lensModel?: StringFilterNullable;
libraryId?: IdFilterNullable;
make?: StringFilterNullable;
model?: StringFilterNullable;
ocr?: StringSimilarityFilter;
originalFileName?: StringPatternFilter;
originalPath?: StringPatternFilter;
personIds?: IdsFilter;
rating?: NumberFilterNullable;
state?: StringFilterNullable;
tagIds?: IdsFilter;
takenAt?: DateFilter;
trashedAt?: DateFilterNullable;
"type"?: EnumFilterAssetType;
updatedAt?: DateFilter;
visibility?: EnumFilterAssetVisibility;
};
export type SearchFilter = {
albumIds?: IdsFilter;
checksum?: StringFilter;
city?: StringFilterNullable;
country?: StringFilterNullable;
createdAt?: DateFilter;
description?: StringPatternFilter;
encodedVideoPath?: StringFilter;
fileSizeInBytes?: NumberFilter;
hasAlbums?: BoolFilter;
hasPeople?: BoolFilter;
hasTags?: BoolFilter;
id?: IdFilter;
isEncoded?: BoolFilter;
isFavorite?: BoolFilter;
isMotion?: BoolFilter;
isOffline?: BoolFilter;
lensModel?: StringFilterNullable;
libraryId?: IdFilterNullable;
make?: StringFilterNullable;
model?: StringFilterNullable;
ocr?: StringSimilarityFilter;
or?: SearchFilterBranch[];
originalFileName?: StringPatternFilter;
originalPath?: StringPatternFilter;
personIds?: IdsFilter;
rating?: NumberFilterNullable;
state?: StringFilterNullable;
tagIds?: IdsFilter;
takenAt?: DateFilter;
trashedAt?: DateFilterNullable;
"type"?: EnumFilterAssetType;
updatedAt?: DateFilter;
visibility?: EnumFilterAssetVisibility;
};
export type SearchOrder = {
direction?: AssetOrder;
field?: SearchOrderField;
};
export type MetadataSearchDto = {
/** Filter by album IDs */
albumIds?: string[];
@@ -2167,10 +2329,13 @@ export type MetadataSearchDto = {
createdAfter?: string;
/** Filter by creation date (before) */
createdBefore?: string;
/** Cursor for the next page of results */
cursor?: string;
/** Filter by description text */
description?: string;
/** Filter by encoded video file path */
encodedVideoPath?: string;
filter?: SearchFilter;
/** Filter by asset ID */
id?: string;
/** Filter by encoded status */
@@ -2195,6 +2360,7 @@ export type MetadataSearchDto = {
ocr?: string;
/** Sort order */
order?: AssetOrder;
orderBy?: SearchOrder;
/** Filter by original file name */
originalFileName?: string;
/** Filter by original file path */
@@ -2262,6 +2428,8 @@ export type SearchAssetResponseDto = {
count: number;
facets: SearchFacetResponseDto[];
items: AssetResponseDto[];
/** Cursor for the next page of results */
nextCursor: string | null;
/** Next page token */
nextPage: string | null;
/** Total number of matching assets */
@@ -2294,6 +2462,7 @@ export type RandomSearchDto = {
createdAfter?: string;
/** Filter by creation date (before) */
createdBefore?: string;
filter?: SearchFilter;
/** Filter by encoded status */
isEncoded?: boolean;
/** Filter by favorite status */
@@ -2358,6 +2527,7 @@ export type SmartSearchDto = {
createdAfter?: string;
/** Filter by creation date (before) */
createdBefore?: string;
filter?: SearchFilter;
/** Filter by encoded status */
isEncoded?: boolean;
/** Filter by favorite status */
@@ -2428,6 +2598,7 @@ export type StatisticsSearchDto = {
createdBefore?: string;
/** Filter by description text */
description?: string;
filter?: SearchFilter;
/** Filter by encoded status */
isEncoded?: boolean;
/** Filter by favorite status */
@@ -8095,6 +8266,12 @@ export enum JobName {
IntegrityDeleteReportType = "IntegrityDeleteReportType",
IntegrityDeleteReports = "IntegrityDeleteReports"
}
export enum SearchOrderField {
FileCreatedAt = "fileCreatedAt",
LocalDateTime = "localDateTime",
FileSizeInBytes = "fileSizeInBytes",
Rating = "rating"
}
export enum SearchSuggestionType {
Country = "country",
State = "state",