diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 3828babd7..c4a62ca05 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -2794,19 +2794,6 @@ export interface SearchAlbumResponseDto { */ 'total': number; } -/** - * - * @export - * @interface SearchAssetDto - */ -export interface SearchAssetDto { - /** - * - * @type {string} - * @memberof SearchAssetDto - */ - 'searchTerm': string; -} /** * * @export @@ -7792,50 +7779,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, - /** - * - * @param {SearchAssetDto} searchAssetDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - searchAsset: async (searchAssetDto: SearchAssetDto, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'searchAssetDto' is not null or undefined - assertParamExists('searchAsset', 'searchAssetDto', searchAssetDto) - const localVarPath = `/asset/search`; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication cookie required - - // authentication api_key required - await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration) - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(searchAssetDto, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, /** * * @param {string} [id] @@ -8698,16 +8641,6 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.runAssetJobs(assetJobsDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, - /** - * - * @param {SearchAssetDto} searchAssetDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async searchAsset(searchAssetDto: SearchAssetDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { - const localVarAxiosArgs = await localVarAxiosParamCreator.searchAsset(searchAssetDto, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, /** * * @param {string} [id] @@ -9047,15 +8980,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath runAssetJobs(requestParameters: AssetApiRunAssetJobsRequest, options?: AxiosRequestConfig): AxiosPromise { return localVarFp.runAssetJobs(requestParameters.assetJobsDto, options).then((request) => request(axios, basePath)); }, - /** - * - * @param {AssetApiSearchAssetRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - searchAsset(requestParameters: AssetApiSearchAssetRequest, options?: AxiosRequestConfig): AxiosPromise> { - return localVarFp.searchAsset(requestParameters.searchAssetDto, options).then((request) => request(axios, basePath)); - }, /** * * @param {AssetApiSearchAssetsRequest} requestParameters Request parameters. @@ -9645,20 +9569,6 @@ export interface AssetApiRunAssetJobsRequest { readonly assetJobsDto: AssetJobsDto } -/** - * Request parameters for searchAsset operation in AssetApi. - * @export - * @interface AssetApiSearchAssetRequest - */ -export interface AssetApiSearchAssetRequest { - /** - * - * @type {SearchAssetDto} - * @memberof AssetApiSearchAsset - */ - readonly searchAssetDto: SearchAssetDto -} - /** * Request parameters for searchAssets operation in AssetApi. * @export @@ -10415,17 +10325,6 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).runAssetJobs(requestParameters.assetJobsDto, options).then((request) => request(this.axios, this.basePath)); } - /** - * - * @param {AssetApiSearchAssetRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof AssetApi - */ - public searchAsset(requestParameters: AssetApiSearchAssetRequest, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).searchAsset(requestParameters.searchAssetDto, options).then((request) => request(this.axios, this.basePath)); - } - /** * * @param {AssetApiSearchAssetsRequest} requestParameters Request parameters. diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 8545c35ad..9fa09ace2 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -109,7 +109,6 @@ doc/RecognitionConfig.md doc/ScanLibraryDto.md doc/SearchAlbumResponseDto.md doc/SearchApi.md -doc/SearchAssetDto.md doc/SearchAssetResponseDto.md doc/SearchExploreItem.md doc/SearchExploreResponseDto.md @@ -293,7 +292,6 @@ lib/model/reaction_type.dart lib/model/recognition_config.dart lib/model/scan_library_dto.dart lib/model/search_album_response_dto.dart -lib/model/search_asset_dto.dart lib/model/search_asset_response_dto.dart lib/model/search_explore_item.dart lib/model/search_explore_response_dto.dart @@ -458,7 +456,6 @@ test/recognition_config_test.dart test/scan_library_dto_test.dart test/search_album_response_dto_test.dart test/search_api_test.dart -test/search_asset_dto_test.dart test/search_asset_response_dto_test.dart test/search_explore_item_test.dart test/search_explore_response_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 272c1742e..a3c42639e 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/doc/AssetApi.md b/mobile/openapi/doc/AssetApi.md index 8b505994e..e57d58c26 100644 Binary files a/mobile/openapi/doc/AssetApi.md and b/mobile/openapi/doc/AssetApi.md differ diff --git a/mobile/openapi/doc/SearchAssetDto.md b/mobile/openapi/doc/SearchAssetDto.md deleted file mode 100644 index 1eadd2a0c..000000000 Binary files a/mobile/openapi/doc/SearchAssetDto.md and /dev/null differ diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 73a83263b..6fa19074d 100644 Binary files a/mobile/openapi/lib/api.dart and b/mobile/openapi/lib/api.dart differ diff --git a/mobile/openapi/lib/api/asset_api.dart b/mobile/openapi/lib/api/asset_api.dart index 426c25b46..95cc99e6e 100644 Binary files a/mobile/openapi/lib/api/asset_api.dart and b/mobile/openapi/lib/api/asset_api.dart differ diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 317292f30..23b8764c1 100644 Binary files a/mobile/openapi/lib/api_client.dart and b/mobile/openapi/lib/api_client.dart differ diff --git a/mobile/openapi/lib/model/search_asset_dto.dart b/mobile/openapi/lib/model/search_asset_dto.dart deleted file mode 100644 index 02c744a06..000000000 Binary files a/mobile/openapi/lib/model/search_asset_dto.dart and /dev/null differ diff --git a/mobile/openapi/test/asset_api_test.dart b/mobile/openapi/test/asset_api_test.dart index 5a74bcaa2..275e5d127 100644 Binary files a/mobile/openapi/test/asset_api_test.dart and b/mobile/openapi/test/asset_api_test.dart differ diff --git a/mobile/openapi/test/search_asset_dto_test.dart b/mobile/openapi/test/search_asset_dto_test.dart deleted file mode 100644 index 60021265c..000000000 Binary files a/mobile/openapi/test/search_asset_dto_test.dart and /dev/null differ diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index ad53f7e1b..8ece619f7 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1763,51 +1763,6 @@ ] } }, - "/asset/search": { - "post": { - "operationId": "searchAsset", - "parameters": [], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SearchAssetDto" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AssetResponseDto" - }, - "type": "array" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Asset" - ] - } - }, "/asset/search-terms": { "get": { "operationId": "getAssetSearchTerms", @@ -8346,17 +8301,6 @@ ], "type": "object" }, - "SearchAssetDto": { - "properties": { - "searchTerm": { - "type": "string" - } - }, - "required": [ - "searchTerm" - ], - "type": "object" - }, "SearchAssetResponseDto": { "properties": { "count": { diff --git a/server/src/immich/api-v1/asset/asset.controller.ts b/server/src/immich/api-v1/asset/asset.controller.ts index 24127e873..4ff1fef27 100644 --- a/server/src/immich/api-v1/asset/asset.controller.ts +++ b/server/src/immich/api-v1/asset/asset.controller.ts @@ -27,7 +27,6 @@ import { CheckExistingAssetsDto } from './dto/check-existing-assets.dto'; import { CreateAssetDto, ImportAssetDto } from './dto/create-asset.dto'; import { DeviceIdDto } from './dto/device-id.dto'; import { GetAssetThumbnailDto } from './dto/get-asset-thumbnail.dto'; -import { SearchAssetDto } from './dto/search-asset.dto'; import { ServeFileDto } from './dto/serve-file.dto'; import { AssetBulkUploadCheckResponseDto } from './response-dto/asset-check-response.dto'; import { AssetFileUploadResponseDto } from './response-dto/asset-file-upload-response.dto'; @@ -144,15 +143,6 @@ export class AssetController { return this.assetService.getAssetSearchTerm(authUser); } - @Post('/search') - @HttpCode(HttpStatus.OK) - searchAsset( - @AuthUser() authUser: AuthUserDto, - @Body(ValidationPipe) dto: SearchAssetDto, - ): Promise { - return this.assetService.searchAsset(authUser, dto); - } - /** * Get all AssetEntity belong to the user */ diff --git a/server/src/immich/api-v1/asset/asset.service.spec.ts b/server/src/immich/api-v1/asset/asset.service.spec.ts index a293a7875..80af06e25 100644 --- a/server/src/immich/api-v1/asset/asset.service.spec.ts +++ b/server/src/immich/api-v1/asset/asset.service.spec.ts @@ -13,7 +13,7 @@ import { newStorageRepositoryMock, } from '@test'; import { when } from 'jest-when'; -import { QueryFailedError, Repository } from 'typeorm'; +import { QueryFailedError } from 'typeorm'; import { IAssetRepository } from './asset-repository'; import { AssetService } from './asset.service'; import { CreateAssetDto } from './dto/create-asset.dto'; @@ -85,7 +85,6 @@ const _getAssets = () => { describe('AssetService', () => { let sut: AssetService; - let a: Repository; // TO BE DELETED AFTER FINISHED REFACTORING let accessMock: IAccessRepositoryMock; let assetRepositoryMock: jest.Mocked; let cryptoMock: jest.Mocked; @@ -115,7 +114,7 @@ describe('AssetService', () => { storageMock = newStorageRepositoryMock(); libraryMock = newLibraryRepositoryMock(); - sut = new AssetService(accessMock, assetRepositoryMock, a, cryptoMock, jobMock, libraryMock, storageMock); + sut = new AssetService(accessMock, assetRepositoryMock, cryptoMock, jobMock, libraryMock, storageMock); when(assetRepositoryMock.get) .calledWith(assetStub.livePhotoStillAsset.id) diff --git a/server/src/immich/api-v1/asset/asset.service.ts b/server/src/immich/api-v1/asset/asset.service.ts index f6886a255..83e36808a 100644 --- a/server/src/immich/api-v1/asset/asset.service.ts +++ b/server/src/immich/api-v1/asset/asset.service.ts @@ -24,12 +24,11 @@ import { Logger, NotFoundException, } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; import { Response as Res, Response } from 'express'; import { constants } from 'fs'; import fs from 'fs/promises'; import path from 'path'; -import { QueryFailedError, Repository } from 'typeorm'; +import { QueryFailedError } from 'typeorm'; import { IAssetRepository } from './asset-repository'; import { AssetCore } from './asset.core'; import { AssetBulkUploadCheckDto } from './dto/asset-check.dto'; @@ -37,7 +36,6 @@ import { AssetSearchDto } from './dto/asset-search.dto'; import { CheckExistingAssetsDto } from './dto/check-existing-assets.dto'; import { CreateAssetDto, ImportAssetDto } from './dto/create-asset.dto'; import { GetAssetThumbnailDto, GetAssetThumbnailFormatEnum } from './dto/get-asset-thumbnail.dto'; -import { SearchAssetDto } from './dto/search-asset.dto'; import { SearchPropertiesDto } from './dto/search-properties.dto'; import { ServeFileDto } from './dto/serve-file.dto'; import { @@ -62,7 +60,6 @@ export class AssetService { constructor( @Inject(IAccessRepository) accessRepository: IAccessRepository, @Inject(IAssetRepository) private _assetRepository: IAssetRepository, - @InjectRepository(AssetEntity) private assetRepository: Repository, @Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository, @Inject(IJobRepository) private jobRepository: IJobRepository, @Inject(ILibraryRepository) private libraryRepository: ILibraryRepository, @@ -285,30 +282,6 @@ export class AssetService { return Array.from(possibleSearchTerm).filter((x) => x != null && x != ''); } - async searchAsset(authUser: AuthUserDto, searchAssetDto: SearchAssetDto): Promise { - const query = ` - SELECT a.* - FROM assets a - LEFT JOIN smart_info si ON a.id = si."assetId" - LEFT JOIN exif e ON a.id = e."assetId" - - WHERE a."ownerId" = $1 - AND - ( - TO_TSVECTOR('english', ARRAY_TO_STRING(si.tags, ',')) @@ PLAINTO_TSQUERY('english', $2) OR - TO_TSVECTOR('english', ARRAY_TO_STRING(si.objects, ',')) @@ PLAINTO_TSQUERY('english', $2) OR - e."exifTextSearchableColumn" @@ PLAINTO_TSQUERY('english', $2) - ); - `; - - const searchResults: AssetEntity[] = await this.assetRepository.query(query, [ - authUser.id, - searchAssetDto.searchTerm, - ]); - - return searchResults.map((asset) => mapAsset(asset)); - } - async getCuratedLocation(authUser: AuthUserDto): Promise { return this._assetRepository.getLocationsByUserId(authUser.id); } diff --git a/server/src/immich/api-v1/asset/dto/search-asset.dto.ts b/server/src/immich/api-v1/asset/dto/search-asset.dto.ts deleted file mode 100644 index 83a34239d..000000000 --- a/server/src/immich/api-v1/asset/dto/search-asset.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IsNotEmpty } from 'class-validator'; - -export class SearchAssetDto { - @IsNotEmpty() - searchTerm!: string; -} diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 3828babd7..c4a62ca05 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -2794,19 +2794,6 @@ export interface SearchAlbumResponseDto { */ 'total': number; } -/** - * - * @export - * @interface SearchAssetDto - */ -export interface SearchAssetDto { - /** - * - * @type {string} - * @memberof SearchAssetDto - */ - 'searchTerm': string; -} /** * * @export @@ -7792,50 +7779,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, - /** - * - * @param {SearchAssetDto} searchAssetDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - searchAsset: async (searchAssetDto: SearchAssetDto, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'searchAssetDto' is not null or undefined - assertParamExists('searchAsset', 'searchAssetDto', searchAssetDto) - const localVarPath = `/asset/search`; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication cookie required - - // authentication api_key required - await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration) - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(searchAssetDto, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, /** * * @param {string} [id] @@ -8698,16 +8641,6 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.runAssetJobs(assetJobsDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, - /** - * - * @param {SearchAssetDto} searchAssetDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async searchAsset(searchAssetDto: SearchAssetDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { - const localVarAxiosArgs = await localVarAxiosParamCreator.searchAsset(searchAssetDto, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, /** * * @param {string} [id] @@ -9047,15 +8980,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath runAssetJobs(requestParameters: AssetApiRunAssetJobsRequest, options?: AxiosRequestConfig): AxiosPromise { return localVarFp.runAssetJobs(requestParameters.assetJobsDto, options).then((request) => request(axios, basePath)); }, - /** - * - * @param {AssetApiSearchAssetRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - searchAsset(requestParameters: AssetApiSearchAssetRequest, options?: AxiosRequestConfig): AxiosPromise> { - return localVarFp.searchAsset(requestParameters.searchAssetDto, options).then((request) => request(axios, basePath)); - }, /** * * @param {AssetApiSearchAssetsRequest} requestParameters Request parameters. @@ -9645,20 +9569,6 @@ export interface AssetApiRunAssetJobsRequest { readonly assetJobsDto: AssetJobsDto } -/** - * Request parameters for searchAsset operation in AssetApi. - * @export - * @interface AssetApiSearchAssetRequest - */ -export interface AssetApiSearchAssetRequest { - /** - * - * @type {SearchAssetDto} - * @memberof AssetApiSearchAsset - */ - readonly searchAssetDto: SearchAssetDto -} - /** * Request parameters for searchAssets operation in AssetApi. * @export @@ -10415,17 +10325,6 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).runAssetJobs(requestParameters.assetJobsDto, options).then((request) => request(this.axios, this.basePath)); } - /** - * - * @param {AssetApiSearchAssetRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof AssetApi - */ - public searchAsset(requestParameters: AssetApiSearchAssetRequest, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).searchAsset(requestParameters.searchAssetDto, options).then((request) => request(this.axios, this.basePath)); - } - /** * * @param {AssetApiSearchAssetsRequest} requestParameters Request parameters.