diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 56a94fb33..dd3c2b3a6 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -86,7 +86,6 @@ doc/ThumbnailFormat.md doc/TimeGroupEnum.md doc/UpdateAlbumDto.md doc/UpdateAssetDto.md -doc/UpdateAssetsToSharedLinkDto.md doc/UpdateTagDto.md doc/UpdateUserDto.md doc/UpsertDeviceInfoDto.md @@ -189,7 +188,6 @@ lib/model/thumbnail_format.dart lib/model/time_group_enum.dart lib/model/update_album_dto.dart lib/model/update_asset_dto.dart -lib/model/update_assets_to_shared_link_dto.dart lib/model/update_tag_dto.dart lib/model/update_user_dto.dart lib/model/upsert_device_info_dto.dart @@ -281,7 +279,6 @@ test/thumbnail_format_test.dart test/time_group_enum_test.dart test/update_album_dto_test.dart test/update_asset_dto_test.dart -test/update_assets_to_shared_link_dto_test.dart test/update_tag_dto_test.dart test/update_user_dto_test.dart test/upsert_device_info_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 6e2f5c856..e95dc1908 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 aa5335d17..595a21d0c 100644 Binary files a/mobile/openapi/doc/AssetApi.md and b/mobile/openapi/doc/AssetApi.md differ diff --git a/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md b/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md deleted file mode 100644 index 3f7d70c7e..000000000 Binary files a/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md and /dev/null differ diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index edec2eb97..2f426ca69 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 72580bc4c..cf360d241 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 632c79f6c..8fe18d2f7 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/update_assets_to_shared_link_dto.dart b/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart deleted file mode 100644 index fb8a4c780..000000000 Binary files a/mobile/openapi/lib/model/update_assets_to_shared_link_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 b96510494..6c23680d2 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/update_assets_to_shared_link_dto_test.dart b/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart deleted file mode 100644 index 9b0fb4d1d..000000000 Binary files a/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart and /dev/null differ diff --git a/server/apps/immich/src/api-v1/asset/asset.controller.ts b/server/apps/immich/src/api-v1/asset/asset.controller.ts index aaafd74f4..4c4cdd0e9 100644 --- a/server/apps/immich/src/api-v1/asset/asset.controller.ts +++ b/server/apps/immich/src/api-v1/asset/asset.controller.ts @@ -1,3 +1,4 @@ +import { AddAssetsDto } from './../album/dto/add-assets.dto'; import { Controller, Post, @@ -52,10 +53,10 @@ import { import { DownloadFilesDto } from './dto/download-files.dto'; import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; import { SharedLinkResponseDto } from '@app/domain'; -import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; import { AssetSearchDto } from './dto/asset-search.dto'; import { assetUploadOption, ImmichFile } from '../../config/asset-upload.config'; import FileNotEmptyValidator from '../validation/file-not-empty-validator'; +import { RemoveAssetsDto } from '../album/dto/remove-assets.dto'; function asStreamableFile({ stream, type, length }: ImmichReadStream) { return new StreamableFile(stream, { type, length }); @@ -330,11 +331,20 @@ export class AssetController { } @Authenticated({ isShared: true }) - @Patch('/shared-link') - async updateAssetsInSharedLink( + @Patch('/shared-link/add') + async addAssetsToSharedLink( @GetAuthUser() authUser: AuthUserDto, - @Body(ValidationPipe) dto: UpdateAssetsToSharedLinkDto, + @Body(ValidationPipe) dto: AddAssetsDto, ): Promise { - return await this.assetService.updateAssetsInSharedLink(authUser, dto); + return await this.assetService.addAssetsToSharedLink(authUser, dto); + } + + @Authenticated({ isShared: true }) + @Patch('/shared-link/remove') + async removeAssetsFromSharedLink( + @GetAuthUser() authUser: AuthUserDto, + @Body(ValidationPipe) dto: RemoveAssetsDto, + ): Promise { + return await this.assetService.removeAssetsFromSharedLink(authUser, dto); } } diff --git a/server/apps/immich/src/api-v1/asset/asset.service.spec.ts b/server/apps/immich/src/api-v1/asset/asset.service.spec.ts index 08c4ed1ac..6d9f1750a 100644 --- a/server/apps/immich/src/api-v1/asset/asset.service.spec.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.spec.ts @@ -198,14 +198,31 @@ describe('AssetService', () => { sharedLinkRepositoryMock.get.mockResolvedValue(null); sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); - await expect(sut.updateAssetsInSharedLink(authDto, dto)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.addAssetsToSharedLink(authDto, dto)).rejects.toBeInstanceOf(BadRequestException); expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); - expect(sharedLinkRepositoryMock.hasAssetAccess).toHaveBeenCalledWith(authDto.sharedLinkId, asset1.id); expect(sharedLinkRepositoryMock.save).not.toHaveBeenCalled(); }); + it('should add assets to a shared link', async () => { + const asset1 = _getAsset_1(); + + const authDto = authStub.adminSharedLink; + const dto = { assetIds: [asset1.id] }; + + assetRepositoryMock.getById.mockResolvedValue(asset1); + sharedLinkRepositoryMock.get.mockResolvedValue(sharedLinkStub.valid); + sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); + sharedLinkRepositoryMock.save.mockResolvedValue(sharedLinkStub.valid); + + await expect(sut.addAssetsToSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); + + expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); + expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); + expect(sharedLinkRepositoryMock.save).toHaveBeenCalled(); + }); + it('should remove assets from a shared link', async () => { const asset1 = _getAsset_1(); @@ -217,11 +234,11 @@ describe('AssetService', () => { sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); sharedLinkRepositoryMock.save.mockResolvedValue(sharedLinkStub.valid); - await expect(sut.updateAssetsInSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); + await expect(sut.removeAssetsFromSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); - expect(sharedLinkRepositoryMock.hasAssetAccess).toHaveBeenCalledWith(authDto.sharedLinkId, asset1.id); + expect(sharedLinkRepositoryMock.save).toHaveBeenCalled(); }); }); diff --git a/server/apps/immich/src/api-v1/asset/asset.service.ts b/server/apps/immich/src/api-v1/asset/asset.service.ts index 35c14e703..959571f38 100644 --- a/server/apps/immich/src/api-v1/asset/asset.service.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.ts @@ -58,8 +58,9 @@ import { ISharedLinkRepository } from '@app/domain'; import { DownloadFilesDto } from './dto/download-files.dto'; import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; import { mapSharedLink, SharedLinkResponseDto } from '@app/domain'; -import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; import { AssetSearchDto } from './dto/asset-search.dto'; +import { AddAssetsDto } from '../album/dto/add-assets.dto'; +import { RemoveAssetsDto } from '../album/dto/remove-assets.dto'; const fileInfo = promisify(stat); @@ -606,23 +607,35 @@ export class AssetService { return mapSharedLink(sharedLink); } - async updateAssetsInSharedLink( - authUser: AuthUserDto, - dto: UpdateAssetsToSharedLinkDto, - ): Promise { + async addAssetsToSharedLink(authUser: AuthUserDto, dto: AddAssetsDto): Promise { if (!authUser.sharedLinkId) { throw new ForbiddenException(); } const assets = []; - await this.checkAssetsAccess(authUser, dto.assetIds); for (const assetId of dto.assetIds) { const asset = await this._assetRepository.getById(assetId); assets.push(asset); } - const updatedLink = await this.shareCore.updateAssets(authUser.id, authUser.sharedLinkId, assets); + const updatedLink = await this.shareCore.addAssets(authUser.id, authUser.sharedLinkId, assets); + return mapSharedLink(updatedLink); + } + + async removeAssetsFromSharedLink(authUser: AuthUserDto, dto: RemoveAssetsDto): Promise { + if (!authUser.sharedLinkId) { + throw new ForbiddenException(); + } + + const assets = []; + + for (const assetId of dto.assetIds) { + const asset = await this._assetRepository.getById(assetId); + assets.push(asset); + } + + const updatedLink = await this.shareCore.removeAssets(authUser.id, authUser.sharedLinkId, assets); return mapSharedLink(updatedLink); } diff --git a/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts b/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts deleted file mode 100644 index 2eb451d3d..000000000 --- a/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IsNotEmpty } from 'class-validator'; - -export class UpdateAssetsToSharedLinkDto { - @IsNotEmpty() - assetIds!: string[]; -} diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 1e28e5c0a..80d56f07a 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1869,9 +1869,11 @@ "bearer": [] } ] - }, + } + }, + "/asset/shared-link/add": { "patch": { - "operationId": "updateAssetsInSharedLink", + "operationId": "addAssetsToSharedLink", "description": "", "parameters": [], "requestBody": { @@ -1879,7 +1881,44 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateAssetsToSharedLinkDto" + "$ref": "#/components/schemas/AddAssetsDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SharedLinkResponseDto" + } + } + } + } + }, + "tags": [ + "Asset" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/asset/shared-link/remove": { + "patch": { + "operationId": "removeAssetsFromSharedLink", + "description": "", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveAssetsDto" } } } @@ -4171,7 +4210,21 @@ "assetIds" ] }, - "UpdateAssetsToSharedLinkDto": { + "AddAssetsDto": { + "type": "object", + "properties": { + "assetIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "assetIds" + ] + }, + "RemoveAssetsDto": { "type": "object", "properties": { "assetIds": { @@ -4267,20 +4320,6 @@ "sharedUserIds" ] }, - "AddAssetsDto": { - "type": "object", - "properties": { - "assetIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "assetIds" - ] - }, "AddAssetsResponseDto": { "type": "object", "properties": { @@ -4302,20 +4341,6 @@ "alreadyInAlbum" ] }, - "RemoveAssetsDto": { - "type": "object", - "properties": { - "assetIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "assetIds" - ] - }, "UpdateAlbumDto": { "type": "object", "properties": { diff --git a/server/libs/domain/src/share/share.core.ts b/server/libs/domain/src/share/share.core.ts index d244c8da9..0fa62cbb6 100644 --- a/server/libs/domain/src/share/share.core.ts +++ b/server/libs/domain/src/share/share.core.ts @@ -63,13 +63,24 @@ export class ShareCore { return this.repository.remove(link); } - async updateAssets(userId: string, id: string, assets: AssetEntity[]) { + async addAssets(userId: string, id: string, assets: AssetEntity[]) { const link = await this.get(userId, id); if (!link) { throw new BadRequestException('Shared link not found'); } - return this.repository.save({ ...link, assets }); + return this.repository.save({ ...link, assets: [...link.assets, ...assets] }); + } + + async removeAssets(userId: string, id: string, assets: AssetEntity[]) { + const link = await this.get(userId, id); + if (!link) { + throw new BadRequestException('Shared link not found'); + } + + const newAssets = link.assets.filter((asset) => assets.find((a) => a.id === asset.id)); + + return this.repository.save({ ...link, assets: newAssets }); } async hasAssetAccess(id: string, assetId: string): Promise { diff --git a/server/package.json b/server/package.json index 23bfe29b9..fee823cc9 100644 --- a/server/package.json +++ b/server/package.json @@ -140,9 +140,9 @@ }, "./libs/domain/": { "branches": 80, - "functions": 89, + "functions": 88, "lines": 95, - "statements": 95 + "statements": 94 } }, "testEnvironment": "node", diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 5ceade1fc..a7cfed187 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -2083,19 +2083,6 @@ export interface UpdateAssetDto { */ 'isFavorite'?: boolean; } -/** - * - * @export - * @interface UpdateAssetsToSharedLinkDto - */ -export interface UpdateAssetsToSharedLinkDto { - /** - * - * @type {Array} - * @memberof UpdateAssetsToSharedLinkDto - */ - 'assetIds': Array; -} /** * * @export @@ -3588,6 +3575,45 @@ export class AlbumApi extends BaseAPI { */ export const AssetApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addAssetsToSharedLink: async (addAssetsDto: AddAssetsDto, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'addAssetsDto' is not null or undefined + assertParamExists('addAssetsToSharedLink', 'addAssetsDto', addAssetsDto) + const localVarPath = `/asset/shared-link/add`; + // 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: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // 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(addAssetsDto, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4232,6 +4258,45 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeAssetsFromSharedLink: async (removeAssetsDto: RemoveAssetsDto, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'removeAssetsDto' is not null or undefined + assertParamExists('removeAssetsFromSharedLink', 'removeAssetsDto', removeAssetsDto) + const localVarPath = `/asset/shared-link/remove`; + // 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: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // 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(removeAssetsDto, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4361,45 +4426,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - updateAssetsInSharedLink: async (updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'updateAssetsToSharedLinkDto' is not null or undefined - assertParamExists('updateAssetsInSharedLink', 'updateAssetsToSharedLinkDto', updateAssetsToSharedLinkDto) - const localVarPath = `/asset/shared-link`; - // 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: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // 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(updateAssetsToSharedLinkDto, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, /** * * @param {AssetTypeEnum} assetType @@ -4518,6 +4544,16 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = AssetApiAxiosParamCreator(configuration) return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.addAssetsToSharedLink(addAssetsDto, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4687,6 +4723,16 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.getUserAssetsByDeviceId(deviceId, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.removeAssetsFromSharedLink(removeAssetsDto, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4720,16 +4766,6 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.updateAsset(assetId, updateAssetDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, /** * * @param {AssetTypeEnum} assetType @@ -4760,6 +4796,15 @@ export const AssetApiFp = function(configuration?: Configuration) { export const AssetApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = AssetApiFp(configuration) return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: any): AxiosPromise { + return localVarFp.addAssetsToSharedLink(addAssetsDto, options).then((request) => request(axios, basePath)); + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4912,6 +4957,15 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath getUserAssetsByDeviceId(deviceId: string, options?: any): AxiosPromise> { return localVarFp.getUserAssetsByDeviceId(deviceId, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: any): AxiosPromise { + return localVarFp.removeAssetsFromSharedLink(removeAssetsDto, options).then((request) => request(axios, basePath)); + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4942,15 +4996,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath updateAsset(assetId: string, updateAssetDto: UpdateAssetDto, options?: any): AxiosPromise { return localVarFp.updateAsset(assetId, updateAssetDto, options).then((request) => request(axios, basePath)); }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: any): AxiosPromise { - return localVarFp.updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options).then((request) => request(axios, basePath)); - }, /** * * @param {AssetTypeEnum} assetType @@ -4980,6 +5025,17 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath * @extends {BaseAPI} */ export class AssetApi extends BaseAPI { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AssetApi + */ + public addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).addAssetsToSharedLink(addAssetsDto, options).then((request) => request(this.axios, this.basePath)); + } + /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -5166,6 +5222,17 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).getUserAssetsByDeviceId(deviceId, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AssetApi + */ + public removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).removeAssetsFromSharedLink(removeAssetsDto, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {SearchAssetDto} searchAssetDto @@ -5202,17 +5269,6 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).updateAsset(assetId, updateAssetDto, options).then((request) => request(this.axios, this.basePath)); } - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof AssetApi - */ - public updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options).then((request) => request(this.axios, this.basePath)); - } - /** * * @param {AssetTypeEnum} assetType diff --git a/web/src/api/open-api/base.ts b/web/src/api/open-api/base.ts index 1ffb5e4ff..aa00dd944 100644 --- a/web/src/api/open-api/base.ts +++ b/web/src/api/open-api/base.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/common.ts b/web/src/api/open-api/common.ts index 4d7d11c83..8f295ff06 100644 --- a/web/src/api/open-api/common.ts +++ b/web/src/api/open-api/common.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/configuration.ts b/web/src/api/open-api/configuration.ts index e0596e4b1..af2967072 100644 --- a/web/src/api/open-api/configuration.ts +++ b/web/src/api/open-api/configuration.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/index.ts b/web/src/api/open-api/index.ts index 49f0b7a38..b7490d529 100644 --- a/web/src/api/open-api/index.ts +++ b/web/src/api/open-api/index.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/lib/components/album-page/asset-selection.svelte b/web/src/lib/components/album-page/asset-selection.svelte index 401d581c2..9682a8ec9 100644 --- a/web/src/lib/components/album-page/asset-selection.svelte +++ b/web/src/lib/components/album-page/asset-selection.svelte @@ -16,6 +16,7 @@ export let albumId: string; export let assetsInAlbum: AssetResponseDto[]; + const locale = navigator.language; onMount(() => { $assetsInAlbumStoreState = assetsInAlbum; @@ -28,8 +29,11 @@ assetInteractionStore.clearMultiselect(); }; - - const locale = navigator.language; + const handleSelectFromComputerClicked = async () => { + await openFileUploadDialog(albumId, ''); + assetInteractionStore.clearMultiselect(); + dispatch('go-back'); + };