fix: automatically remove leading/trailing whitespace from search que… (#22214)

fix: automatically remove leading/trailing whitespace from search queries
This commit is contained in:
Jason Rasmussen 2025-09-19 12:19:26 -04:00 committed by GitHub
parent 3f2e0780d5
commit 6da039780e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 13 deletions

View file

@ -6,7 +6,7 @@ import { PropertyLifecycle } from 'src/decorators';
import { AlbumResponseDto } from 'src/dtos/album.dto'; import { AlbumResponseDto } from 'src/dtos/album.dto';
import { AssetResponseDto } from 'src/dtos/asset-response.dto'; import { AssetResponseDto } from 'src/dtos/asset-response.dto';
import { AssetOrder, AssetType, AssetVisibility } from 'src/enum'; import { AssetOrder, AssetType, AssetVisibility } from 'src/enum';
import { Optional, ValidateBoolean, ValidateDate, ValidateEnum, ValidateUUID } from 'src/validation'; import { Optional, ValidateBoolean, ValidateDate, ValidateEnum, ValidateString, ValidateUUID } from 'src/validation';
class BaseSearchDto { class BaseSearchDto {
@ValidateUUID({ optional: true, nullable: true }) @ValidateUUID({ optional: true, nullable: true })
@ -144,9 +144,7 @@ export class MetadataSearchDto extends RandomSearchDto {
@Optional() @Optional()
deviceAssetId?: string; deviceAssetId?: string;
@IsString() @ValidateString({ optional: true, trim: true })
@IsNotEmpty()
@Optional()
description?: string; description?: string;
@IsString() @IsString()
@ -154,9 +152,7 @@ export class MetadataSearchDto extends RandomSearchDto {
@Optional() @Optional()
checksum?: string; checksum?: string;
@IsString() @ValidateString({ optional: true, trim: true })
@IsNotEmpty()
@Optional()
originalFileName?: string; originalFileName?: string;
@IsString() @IsString()
@ -190,16 +186,12 @@ export class MetadataSearchDto extends RandomSearchDto {
} }
export class StatisticsSearchDto extends BaseSearchDto { export class StatisticsSearchDto extends BaseSearchDto {
@IsString() @ValidateString({ optional: true, trim: true })
@IsNotEmpty()
@Optional()
description?: string; description?: string;
} }
export class SmartSearchDto extends BaseSearchWithResultsDto { export class SmartSearchDto extends BaseSearchWithResultsDto {
@IsString() @ValidateString({ optional: true, trim: true })
@IsNotEmpty()
@Optional()
query?: string; query?: string;
@ValidateUUID({ optional: true }) @ValidateUUID({ optional: true })

View file

@ -211,6 +211,18 @@ export const ValidateDate = (options?: DateOptions & ApiPropertyOptions) => {
return applyDecorators(...decorators); return applyDecorators(...decorators);
}; };
type StringOptions = { optional?: boolean; nullable?: boolean; trim?: boolean };
export const ValidateString = (options?: StringOptions & ApiPropertyOptions) => {
const { optional, nullable, trim, ...apiPropertyOptions } = options || {};
const decorators = [ApiProperty(apiPropertyOptions), IsString(), optional ? Optional({ nullable }) : IsNotEmpty()];
if (trim) {
decorators.push(Transform(({ value }: { value: string }) => value?.trim()));
}
return applyDecorators(...decorators);
};
type BooleanOptions = { optional?: boolean; nullable?: boolean }; type BooleanOptions = { optional?: boolean; nullable?: boolean };
export const ValidateBoolean = (options?: BooleanOptions & ApiPropertyOptions) => { export const ValidateBoolean = (options?: BooleanOptions & ApiPropertyOptions) => {
const { optional, nullable, ...apiPropertyOptions } = options || {}; const { optional, nullable, ...apiPropertyOptions } = options || {};