From efc7fdb669002ab8ed6363141e1ea0400cd2355b Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Tue, 15 Aug 2023 11:49:32 -0400 Subject: [PATCH] fix(web,server): use POST request to get download info (#3694) * fix(web,server): use POST request to get download info * chore: open api --- cli/src/api/open-api/api.ts | 107 ++++++------ mobile/openapi/.openapi-generator/FILES | 3 + mobile/openapi/README.md | Bin 18132 -> 18192 bytes mobile/openapi/doc/AssetApi.md | Bin 55038 -> 54728 bytes mobile/openapi/doc/DownloadInfoDto.md | Bin 0 -> 577 bytes mobile/openapi/lib/api.dart | Bin 5851 -> 5888 bytes mobile/openapi/lib/api/asset_api.dart | Bin 52003 -> 51365 bytes mobile/openapi/lib/api_client.dart | Bin 18473 -> 18555 bytes .../openapi/lib/model/download_info_dto.dart | Bin 0 -> 4891 bytes mobile/openapi/test/asset_api_test.dart | Bin 5255 -> 5217 bytes .../openapi/test/download_info_dto_test.dart | Bin 0 -> 901 bytes server/immich-openapi-specs.json | 153 +++++++++--------- server/src/domain/asset/asset.service.ts | 6 +- server/src/domain/asset/dto/download.dto.ts | 3 +- .../immich/controllers/asset.controller.ts | 8 +- web/src/api/open-api/api.ts | 107 ++++++------ web/src/lib/utils/asset-utils.ts | 10 +- 17 files changed, 190 insertions(+), 207 deletions(-) create mode 100644 mobile/openapi/doc/DownloadInfoDto.md create mode 100644 mobile/openapi/lib/model/download_info_dto.dart create mode 100644 mobile/openapi/test/download_info_dto_test.dart diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 956f19ba7..8ade1d5fd 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -1132,6 +1132,37 @@ export interface DownloadArchiveInfo { */ 'size': number; } +/** + * + * @export + * @interface DownloadInfoDto + */ +export interface DownloadInfoDto { + /** + * + * @type {string} + * @memberof DownloadInfoDto + */ + 'albumId'?: string; + /** + * + * @type {number} + * @memberof DownloadInfoDto + */ + 'archiveSize'?: number; + /** + * + * @type {Array} + * @memberof DownloadInfoDto + */ + 'assetIds'?: Array; + /** + * + * @type {string} + * @memberof DownloadInfoDto + */ + 'userId'?: string; +} /** * * @export @@ -4880,7 +4911,7 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration downloadArchive: async (assetIdsDto: AssetIdsDto, key?: string, options: AxiosRequestConfig = {}): Promise => { // verify required parameter 'assetIdsDto' is not null or undefined assertParamExists('downloadArchive', 'assetIdsDto', assetIdsDto) - const localVarPath = `/asset/download`; + const localVarPath = `/asset/download/archive`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -5379,16 +5410,15 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration }, /** * - * @param {Array} [assetIds] - * @param {string} [albumId] - * @param {string} [userId] - * @param {number} [archiveSize] + * @param {DownloadInfoDto} downloadInfoDto * @param {string} [key] * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getDownloadInfo: async (assetIds?: Array, albumId?: string, userId?: string, archiveSize?: number, key?: string, options: AxiosRequestConfig = {}): Promise => { - const localVarPath = `/asset/download`; + getDownloadInfo: async (downloadInfoDto: DownloadInfoDto, key?: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'downloadInfoDto' is not null or undefined + assertParamExists('getDownloadInfo', 'downloadInfoDto', downloadInfoDto) + const localVarPath = `/asset/download/info`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -5396,7 +5426,7 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -5409,31 +5439,18 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration // http bearer authentication required await setBearerAuthToObject(localVarHeaderParameter, configuration) - if (assetIds) { - localVarQueryParameter['assetIds'] = assetIds; - } - - if (albumId !== undefined) { - localVarQueryParameter['albumId'] = albumId; - } - - if (userId !== undefined) { - localVarQueryParameter['userId'] = userId; - } - - if (archiveSize !== undefined) { - localVarQueryParameter['archiveSize'] = archiveSize; - } - if (key !== undefined) { localVarQueryParameter['key'] = key; } + localVarHeaderParameter['Content-Type'] = 'application/json'; + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(downloadInfoDto, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -6141,16 +6158,13 @@ export const AssetApiFp = function(configuration?: Configuration) { }, /** * - * @param {Array} [assetIds] - * @param {string} [albumId] - * @param {string} [userId] - * @param {number} [archiveSize] + * @param {DownloadInfoDto} downloadInfoDto * @param {string} [key] * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getDownloadInfo(assetIds?: Array, albumId?: string, userId?: string, archiveSize?: number, key?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getDownloadInfo(assetIds, albumId, userId, archiveSize, key, options); + async getDownloadInfo(downloadInfoDto: DownloadInfoDto, key?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getDownloadInfo(downloadInfoDto, key, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -6406,8 +6420,8 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest = {}, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.getDownloadInfo(requestParameters.assetIds, requestParameters.albumId, requestParameters.userId, requestParameters.archiveSize, requestParameters.key, options).then((request) => request(axios, basePath)); + getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest, options?: AxiosRequestConfig): AxiosPromise { + return localVarFp.getDownloadInfo(requestParameters.downloadInfoDto, requestParameters.key, options).then((request) => request(axios, basePath)); }, /** * @@ -6788,31 +6802,10 @@ export interface AssetApiGetByTimeBucketRequest { export interface AssetApiGetDownloadInfoRequest { /** * - * @type {Array} + * @type {DownloadInfoDto} * @memberof AssetApiGetDownloadInfo */ - readonly assetIds?: Array - - /** - * - * @type {string} - * @memberof AssetApiGetDownloadInfo - */ - readonly albumId?: string - - /** - * - * @type {string} - * @memberof AssetApiGetDownloadInfo - */ - readonly userId?: string - - /** - * - * @type {number} - * @memberof AssetApiGetDownloadInfo - */ - readonly archiveSize?: number + readonly downloadInfoDto: DownloadInfoDto /** * @@ -7281,8 +7274,8 @@ export class AssetApi extends BaseAPI { * @throws {RequiredError} * @memberof AssetApi */ - public getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest = {}, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).getDownloadInfo(requestParameters.assetIds, requestParameters.albumId, requestParameters.userId, requestParameters.archiveSize, requestParameters.key, options).then((request) => request(this.axios, this.basePath)); + public getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).getDownloadInfo(requestParameters.downloadInfoDto, requestParameters.key, options).then((request) => request(this.axios, this.basePath)); } /** diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index ea0993be8..bf485ef08 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -45,6 +45,7 @@ doc/DeleteAssetDto.md doc/DeleteAssetResponseDto.md doc/DeleteAssetStatus.md doc/DownloadArchiveInfo.md +doc/DownloadInfoDto.md doc/DownloadResponseDto.md doc/ExifResponseDto.md doc/ImportAssetDto.md @@ -186,6 +187,7 @@ lib/model/delete_asset_dto.dart lib/model/delete_asset_response_dto.dart lib/model/delete_asset_status.dart lib/model/download_archive_info.dart +lib/model/download_info_dto.dart lib/model/download_response_dto.dart lib/model/exif_response_dto.dart lib/model/import_asset_dto.dart @@ -298,6 +300,7 @@ test/delete_asset_dto_test.dart test/delete_asset_response_dto_test.dart test/delete_asset_status_test.dart test/download_archive_info_test.dart +test/download_info_dto_test.dart test/download_response_dto_test.dart test/exif_response_dto_test.dart test/import_asset_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 1e20582fae1d103b070d5b18b28577768c1f92f4..9167613b255d463913bc2f4e4a1af0025c9aadaa 100644 GIT binary patch delta 80 zcmcc8%Q&HraRaLWhkjyFazSk7f$IO$>#Q7%w<>z44&&*59pR6Y=zF9=%gtCk$ fkmpj8AFGj)pRBL%l3$*elb@IZ5#4;soQod-N_87$ delta 45 ycmbQx$9SceaRaNsWJYn3&58o&nJ2dk^Kzu*m*?f=C#HZ!w$f~rhI(^^4aA4PQXebJD~M$@dxs)L`22+LSukesAdHpr$EWFy%mp*C<45 zX(8LCr4_3Iu~siPMRT&jWf{)o{Ji24pu1uxzsS~`d^lT61n&A&un}5Xd8N6N8*}_7 Rr!-%jydd}0W|h_@0RZgrZp{Dy diff --git a/mobile/openapi/doc/DownloadInfoDto.md b/mobile/openapi/doc/DownloadInfoDto.md new file mode 100644 index 0000000000000000000000000000000000000000..14d5d1e712ea8e24bac2454baaa28b33d3c3db6b GIT binary patch literal 577 zcma)((M!WH5XRs0R~+4MyTPZ9yw=LM_LUL6U|9F$G;1tE>C486P zeP6gsfGiqmb>5M}HZSPav?Nt&_EazlktDDT8u*AXAYf(lEDtDlyPcAbh3+glhRImJ z9t~&FGy;>Ghz?F07akpJ^kOYLgb#Rpv+*j>H%?pDWP(}~2O>K=p?IdU>_08iRJKoj zSE@7(Y?^M_X>%Av&=n0)vaKPKt~u%#-0F86X>Irq)O+Mo`H@>{&$lP*yI&eAg?rhz z3{23F@eEa6hrr&WyWnS{s_w(AWA`d92ig!<*H?Kydsxhi)gtdyqNwRRG%VxnvOT$M f*pi>ZSND8VUf3IUmZ4FW!UVoqoC1G@PlXVl9B{O3 literal 0 HcmV?d00001 diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 644244a103b1401e8253b2c7e2476ddb7ea948d7..a38d8784e34111d5cc8a58a44c15517c2187811d 100644 GIT binary patch delta 21 ccmcbu+n~4M3KvUeURwTSMsA7Cr?~`p09-@|Pyhe` delta 12 TcmZqByREz73fJbJTPQYSx@@SLom>@`_mU1+kG!X$)*VWstEamDpMli$ta znLJmGlO;1REgz`dOFq9mFDE}S#S_SPDansjNI?~t+!&)Wc>*urc*jtT(GGuJ@VzE|HrfCBHl`CqFR-q(amu zv$(`2xTGjEFWoLyA+fkPwZt=J@<%nP$#HE8lkMBY`SVJ1ff7Z@8JT6N!I@Q)*M*r* zo}MQuQLTWi*B+*~c(P@?w0LQ8YLRD(jsj3KPzIs7zCCWTUOorVLB~0umK9GHj53zV zEzK#(RM$~Zhlv8&Fy>@~$l}SbI^wzD=A;7km`fncO$Dij%TB&nF1&fqiWo++e5Wz_ zYM~mrzLTG4r@@__7EL;&YvZBG1`I}E&=MW1l|_%FVt8r(`<^4I z7t2l)4CuEOsAG|L$K!L)y~syLoueaq^XKLG`ERG^r=Q+jo}SRVvk#{cos8*xd`Tb2 zCui^eK7bfYzD|U;!Kue6EDXUn{kNac%ai$0|2gU82v7(*v&oo7lUXZc*6SVgxTq9fe@ zleC4-4GGHSnkFr=D@vVnvFt;>wb^AGM0SyyzQ|_9@+^rOD>`1JH}WF=S2kCTk@hSx zG$eO#np`z@fxPxc?t1XtdFVgsk4y?9DOVOTy2O#R(zvI#8!`)3WC<g@y~Ug5_mlEX_rh(M-f&2$6u_Y#RXx zE|cA?9NrwCw_pc|p-Ci(7u(|i{J!Uc?f~dx8;~)297q_(=Y`dpaaxMxU{SmboK+d-ux0na;`4up-rg4?}5%oP~)#4DKIZ!CJF%doy<=Gc;L$G9tfE zi@^=jt)puU=-%UNnT8AX;sb8ff=;{bO6_mJy>UiZ@ds3J1(qoHAPm0)3^H<#anem>x`&VFaf#L&Niq&5{y^ZIW7^un~ z+vQw}s7{5RA3&XIO|Ttx6v$DnTMHgG^#jWWRpQh{#LcUe$bqoz5cXLV$^buva(mT*^EA}4Y zTh~LcwOaEWj(UTs*U0Fu489M&mWIb{)V8+m$yJ@KY>_)EJAp3g;O(d8T-np*%5F-N z;1jxaH&|9{o{L$v-Y*&F**I(yxzDNO?gF<1GK@}5;GI&z+x`-LjOd=`4NZ@0iSHK5 zLCY$>Rks9cK;<`Qr5S=|zi6YyY~LG*^6nlKNHzON+e)*al$hhxZ$j?mhCU?s3$_hf@(IRgZ}zZjqM ai+c#Y|LLSu{+)HJ;c#>dIgEuU9RC5;?Iz;@ literal 0 HcmV?d00001 diff --git a/mobile/openapi/test/asset_api_test.dart b/mobile/openapi/test/asset_api_test.dart index 588902a14c3923c09cd2e772872298de7d1827b8..ebb472c4a05228ea212ef5ed9f972e33f225a724 100644 GIT binary patch delta 45 rcmZqIe5kQuF^`N(etBL_eqxGeURu6ONxnh~5`S_mv({#Q-U@aAm2MD^ delta 88 zcmaE;(XP2+F^_w-f=^~~iA``xQD$DcokC)9acYTYO0kXtL_{GmC#f{oGX>5sElw>0 eaq~)Z6%vb*GcwCkgEOmAC%@y=*!+g4lpO%ET_EZJ diff --git a/mobile/openapi/test/download_info_dto_test.dart b/mobile/openapi/test/download_info_dto_test.dart new file mode 100644 index 0000000000000000000000000000000000000000..5efd4e11eb4812b4c8b871589f20783ab96dc50e GIT binary patch literal 901 zcmb7CUu)Dr5P#377@zJA&PMwrtrZKoN}x7i&j%4n$7GTl-0a5P$(6J8yF1xj5$ZwP zhirD1-@h3qO_MZ*^RMgT^{3U<>dX0hmBB@RxmrS2z*Vt^&qbDBe0!y^5&5x3FK5R` zZ;z9)=39f$xugDmJc;|z4LOAf#w!>q3j1KJ^dcoE8SwJXOCY0 zLO!Ut4~OZMvq8{G$+a4C!{j4995gd*DU`<9R$;P1TfTc!RvYvoNv4c2>#_QUEuFZY zEcTr0cQkfAJN*wL6eJyw2f%1L)&X=RkhxoH9M-vQTqZ8rI)O;*rEZB zJyZl|k2&+jX`;y1yP==YM(M|h*%J10QSe$k+ZNFL9J;(#D#Sp_b@2kSA?Up}=Vb>s zd)&>Wf?;Q?7;WTfymgTkQR9Bf5g*wKpszN(rEC5}Pka2szR2g2gS?;m`2ZLKNnQt- s*VN!(1h!}f-MF{_@cqZ)=^T5B7lqi*Q@7ebW1JK0c?Oy{PW3+d3+DnGjQ{`u literal 0 HcmV?d00001 diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 59543353f..f193eb25e 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1026,84 +1026,7 @@ ] } }, - "/asset/download": { - "get": { - "operationId": "getDownloadInfo", - "parameters": [ - { - "name": "assetIds", - "required": false, - "in": "query", - "schema": { - "format": "uuid", - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "albumId", - "required": false, - "in": "query", - "schema": { - "format": "uuid", - "type": "string" - } - }, - { - "name": "userId", - "required": false, - "in": "query", - "schema": { - "format": "uuid", - "type": "string" - } - }, - { - "name": "archiveSize", - "required": false, - "in": "query", - "schema": { - "type": "number" - } - }, - { - "name": "key", - "required": false, - "in": "query", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DownloadResponseDto" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Asset" - ] - }, + "/asset/download/archive": { "post": { "operationId": "downloadArchive", "parameters": [ @@ -1155,6 +1078,57 @@ ] } }, + "/asset/download/info": { + "post": { + "operationId": "getDownloadInfo", + "parameters": [ + { + "name": "key", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DownloadInfoDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DownloadResponseDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Asset" + ] + } + }, "/asset/download/{id}": { "post": { "operationId": "downloadFile", @@ -5549,6 +5523,29 @@ ], "type": "object" }, + "DownloadInfoDto": { + "properties": { + "albumId": { + "format": "uuid", + "type": "string" + }, + "archiveSize": { + "type": "integer" + }, + "assetIds": { + "items": { + "format": "uuid", + "type": "string" + }, + "type": "array" + }, + "userId": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, "DownloadResponseDto": { "properties": { "archives": { diff --git a/server/src/domain/asset/asset.service.ts b/server/src/domain/asset/asset.service.ts index fdd6df6ef..ac655b807 100644 --- a/server/src/domain/asset/asset.service.ts +++ b/server/src/domain/asset/asset.service.ts @@ -13,7 +13,7 @@ import { IAssetRepository } from './asset.repository'; import { AssetIdsDto, DownloadArchiveInfo, - DownloadDto, + DownloadInfoDto, DownloadResponseDto, MemoryLaneDto, TimeBucketAssetDto, @@ -176,7 +176,7 @@ export class AssetService { return this.storageRepository.createReadStream(asset.originalPath, mimeTypes.lookup(asset.originalPath)); } - async getDownloadInfo(authUser: AuthUserDto, dto: DownloadDto): Promise { + async getDownloadInfo(authUser: AuthUserDto, dto: DownloadInfoDto): Promise { const targetSize = dto.archiveSize || HumanReadableSize.GiB * 4; const archives: DownloadArchiveInfo[] = []; let archive: DownloadArchiveInfo = { size: 0, assetIds: [] }; @@ -234,7 +234,7 @@ export class AssetService { return { stream: zip.stream }; } - private async getDownloadAssets(authUser: AuthUserDto, dto: DownloadDto): Promise> { + private async getDownloadAssets(authUser: AuthUserDto, dto: DownloadInfoDto): Promise> { const PAGINATION_SIZE = 2500; if (dto.assetIds) { diff --git a/server/src/domain/asset/dto/download.dto.ts b/server/src/domain/asset/dto/download.dto.ts index c2cf85685..604a8ea5f 100644 --- a/server/src/domain/asset/dto/download.dto.ts +++ b/server/src/domain/asset/dto/download.dto.ts @@ -2,7 +2,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsInt, IsOptional, IsPositive } from 'class-validator'; import { ValidateUUID } from '../../domain.util'; -export class DownloadDto { +export class DownloadInfoDto { @ValidateUUID({ each: true, optional: true }) assetIds?: string[]; @@ -15,6 +15,7 @@ export class DownloadDto { @IsInt() @IsPositive() @IsOptional() + @ApiProperty({ type: 'integer' }) archiveSize?: number; } diff --git a/server/src/immich/controllers/asset.controller.ts b/server/src/immich/controllers/asset.controller.ts index ba3de02cc..b55cbb870 100644 --- a/server/src/immich/controllers/asset.controller.ts +++ b/server/src/immich/controllers/asset.controller.ts @@ -5,7 +5,7 @@ import { AssetStatsDto, AssetStatsResponseDto, AuthUserDto, - DownloadDto, + DownloadInfoDto, DownloadResponseDto, MapMarkerResponseDto, MemoryLaneDto, @@ -39,13 +39,13 @@ export class AssetController { } @SharedLinkRoute() - @Get('download') - getDownloadInfo(@AuthUser() authUser: AuthUserDto, @Query() dto: DownloadDto): Promise { + @Post('download/info') + getDownloadInfo(@AuthUser() authUser: AuthUserDto, @Body() dto: DownloadInfoDto): Promise { return this.service.getDownloadInfo(authUser, dto); } @SharedLinkRoute() - @Post('download') + @Post('download/archive') @HttpCode(HttpStatus.OK) @ApiOkResponse({ content: { 'application/octet-stream': { schema: { type: 'string', format: 'binary' } } } }) downloadArchive(@AuthUser() authUser: AuthUserDto, @Body() dto: AssetIdsDto): Promise { diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 956f19ba7..8ade1d5fd 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -1132,6 +1132,37 @@ export interface DownloadArchiveInfo { */ 'size': number; } +/** + * + * @export + * @interface DownloadInfoDto + */ +export interface DownloadInfoDto { + /** + * + * @type {string} + * @memberof DownloadInfoDto + */ + 'albumId'?: string; + /** + * + * @type {number} + * @memberof DownloadInfoDto + */ + 'archiveSize'?: number; + /** + * + * @type {Array} + * @memberof DownloadInfoDto + */ + 'assetIds'?: Array; + /** + * + * @type {string} + * @memberof DownloadInfoDto + */ + 'userId'?: string; +} /** * * @export @@ -4880,7 +4911,7 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration downloadArchive: async (assetIdsDto: AssetIdsDto, key?: string, options: AxiosRequestConfig = {}): Promise => { // verify required parameter 'assetIdsDto' is not null or undefined assertParamExists('downloadArchive', 'assetIdsDto', assetIdsDto) - const localVarPath = `/asset/download`; + const localVarPath = `/asset/download/archive`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -5379,16 +5410,15 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration }, /** * - * @param {Array} [assetIds] - * @param {string} [albumId] - * @param {string} [userId] - * @param {number} [archiveSize] + * @param {DownloadInfoDto} downloadInfoDto * @param {string} [key] * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getDownloadInfo: async (assetIds?: Array, albumId?: string, userId?: string, archiveSize?: number, key?: string, options: AxiosRequestConfig = {}): Promise => { - const localVarPath = `/asset/download`; + getDownloadInfo: async (downloadInfoDto: DownloadInfoDto, key?: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'downloadInfoDto' is not null or undefined + assertParamExists('getDownloadInfo', 'downloadInfoDto', downloadInfoDto) + const localVarPath = `/asset/download/info`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -5396,7 +5426,7 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -5409,31 +5439,18 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration // http bearer authentication required await setBearerAuthToObject(localVarHeaderParameter, configuration) - if (assetIds) { - localVarQueryParameter['assetIds'] = assetIds; - } - - if (albumId !== undefined) { - localVarQueryParameter['albumId'] = albumId; - } - - if (userId !== undefined) { - localVarQueryParameter['userId'] = userId; - } - - if (archiveSize !== undefined) { - localVarQueryParameter['archiveSize'] = archiveSize; - } - if (key !== undefined) { localVarQueryParameter['key'] = key; } + localVarHeaderParameter['Content-Type'] = 'application/json'; + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(downloadInfoDto, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -6141,16 +6158,13 @@ export const AssetApiFp = function(configuration?: Configuration) { }, /** * - * @param {Array} [assetIds] - * @param {string} [albumId] - * @param {string} [userId] - * @param {number} [archiveSize] + * @param {DownloadInfoDto} downloadInfoDto * @param {string} [key] * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getDownloadInfo(assetIds?: Array, albumId?: string, userId?: string, archiveSize?: number, key?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getDownloadInfo(assetIds, albumId, userId, archiveSize, key, options); + async getDownloadInfo(downloadInfoDto: DownloadInfoDto, key?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getDownloadInfo(downloadInfoDto, key, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -6406,8 +6420,8 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest = {}, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.getDownloadInfo(requestParameters.assetIds, requestParameters.albumId, requestParameters.userId, requestParameters.archiveSize, requestParameters.key, options).then((request) => request(axios, basePath)); + getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest, options?: AxiosRequestConfig): AxiosPromise { + return localVarFp.getDownloadInfo(requestParameters.downloadInfoDto, requestParameters.key, options).then((request) => request(axios, basePath)); }, /** * @@ -6788,31 +6802,10 @@ export interface AssetApiGetByTimeBucketRequest { export interface AssetApiGetDownloadInfoRequest { /** * - * @type {Array} + * @type {DownloadInfoDto} * @memberof AssetApiGetDownloadInfo */ - readonly assetIds?: Array - - /** - * - * @type {string} - * @memberof AssetApiGetDownloadInfo - */ - readonly albumId?: string - - /** - * - * @type {string} - * @memberof AssetApiGetDownloadInfo - */ - readonly userId?: string - - /** - * - * @type {number} - * @memberof AssetApiGetDownloadInfo - */ - readonly archiveSize?: number + readonly downloadInfoDto: DownloadInfoDto /** * @@ -7281,8 +7274,8 @@ export class AssetApi extends BaseAPI { * @throws {RequiredError} * @memberof AssetApi */ - public getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest = {}, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).getDownloadInfo(requestParameters.assetIds, requestParameters.albumId, requestParameters.userId, requestParameters.archiveSize, requestParameters.key, options).then((request) => request(this.axios, this.basePath)); + public getDownloadInfo(requestParameters: AssetApiGetDownloadInfoRequest, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).getDownloadInfo(requestParameters.downloadInfoDto, requestParameters.key, options).then((request) => request(this.axios, this.basePath)); } /** diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts index 0a8ff758d..cb29b503a 100644 --- a/web/src/lib/utils/asset-utils.ts +++ b/web/src/lib/utils/asset-utils.ts @@ -1,6 +1,6 @@ import { notificationController, NotificationType } from '$lib/components/shared-components/notification/notification'; import { downloadManager } from '$lib/stores/download'; -import { api, AssetApiGetDownloadInfoRequest, BulkIdResponseDto, AssetResponseDto, DownloadResponseDto } from '@api'; +import { api, BulkIdResponseDto, AssetResponseDto, DownloadResponseDto, DownloadInfoDto } from '@api'; import { handleError } from './handle-error'; export const addAssetsToAlbum = async ( @@ -32,15 +32,11 @@ const downloadBlob = (data: Blob, filename: string) => { URL.revokeObjectURL(url); }; -export const downloadArchive = async ( - fileName: string, - options: Omit, - key?: string, -) => { +export const downloadArchive = async (fileName: string, options: DownloadInfoDto, key?: string) => { let downloadInfo: DownloadResponseDto | null = null; try { - const { data } = await api.assetApi.getDownloadInfo({ ...options, key }); + const { data } = await api.assetApi.getDownloadInfo({ downloadInfoDto: options, key }); downloadInfo = data; } catch (error) { handleError(error, 'Unable to download files');