From 9bcac61e0b446195427513180d0c641ac8ebb685 Mon Sep 17 00:00:00 2001 From: ryunsong-contentful Date: Wed, 1 Nov 2023 15:21:57 -0600 Subject: [PATCH] fix: update createUpload to accept environment id in its params --- lib/adapters/REST/endpoints/asset.ts | 2 +- lib/adapters/REST/endpoints/upload.ts | 29 +++++++++++++------ lib/common-types.ts | 7 +++-- lib/create-environment-api.ts | 2 ++ lib/entities/upload.ts | 1 + .../adapters/REST/endpoints/upload-test.js | 29 ++++++++++++++++++- 6 files changed, 56 insertions(+), 14 deletions(-) diff --git a/lib/adapters/REST/endpoints/asset.ts b/lib/adapters/REST/endpoints/asset.ts index 4991ba3e2b..6ace82a201 100644 --- a/lib/adapters/REST/endpoints/asset.ts +++ b/lib/adapters/REST/endpoints/asset.ts @@ -202,7 +202,7 @@ export const createFromFiles: RestEndpoint<'Asset', 'createFromFiles'> = ( */ const ASSET_PROCESSING_CHECK_WAIT = 3000 -const ASSET_PROCESSING_CHECK_RETRIES = 10 +const ASSET_PROCESSING_CHECK_RETRIES = 20 function checkIfAssetHasUrl( http: AxiosInstance, diff --git a/lib/adapters/REST/endpoints/upload.ts b/lib/adapters/REST/endpoints/upload.ts index e34bb3ee50..068842b099 100644 --- a/lib/adapters/REST/endpoints/upload.ts +++ b/lib/adapters/REST/endpoints/upload.ts @@ -1,13 +1,23 @@ import type { AxiosInstance } from 'contentful-sdk-core' import { Stream } from 'stream' -import { GetSpaceParams } from '../../../common-types' +import { GetSpaceEnvironmentUploadParams } from '../../../common-types' import { getUploadHttpClient } from '../../../upload-http-client' import { RestEndpoint } from '../types' import * as raw from './raw' +const getUploadUrlPath = (params: GetSpaceEnvironmentUploadParams) => { + const spacePath = `/spaces/${params.spaceId}/uploads` + const environmentPath = `/spaces/${params.spaceId}/environments/${params.environmentId}/uploads` + const path = params.environmentId ? environmentPath : spacePath + + // Return path as is if uploadId is not provided, otherwise append it to the path + if (!params.uploadId) return path + return path + `/${params.uploadId}` +} + export const create: RestEndpoint<'Upload', 'create'> = ( http: AxiosInstance, - params: GetSpaceParams, + params: GetSpaceEnvironmentUploadParams, data: { file: string | ArrayBuffer | Stream } ) => { const httpUpload = getUploadHttpClient(http) @@ -16,7 +26,8 @@ export const create: RestEndpoint<'Upload', 'create'> = ( if (!file) { return Promise.reject(new Error('Unable to locate a file to upload.')) } - return raw.post(httpUpload, `/spaces/${params.spaceId}/uploads`, file, { + const path = getUploadUrlPath(params) + return raw.post(httpUpload, path, file, { headers: { 'Content-Type': 'application/octet-stream', }, @@ -25,18 +36,18 @@ export const create: RestEndpoint<'Upload', 'create'> = ( export const del: RestEndpoint<'Upload', 'delete'> = ( http: AxiosInstance, - params: GetSpaceParams & { uploadId: string } + params: GetSpaceEnvironmentUploadParams ) => { const httpUpload = getUploadHttpClient(http) - - return raw.del(httpUpload, `/spaces/${params.spaceId}/uploads/${params.uploadId}`) + const path = getUploadUrlPath(params) + return raw.del(httpUpload, path) } export const get: RestEndpoint<'Upload', 'get'> = ( http: AxiosInstance, - params: GetSpaceParams & { uploadId: string } + params: GetSpaceEnvironmentUploadParams ) => { const httpUpload = getUploadHttpClient(http) - - return raw.get(httpUpload, `/spaces/${params.spaceId}/uploads/${params.uploadId}`) + const path = getUploadUrlPath(params) + return raw.get(httpUpload, path) } diff --git a/lib/common-types.ts b/lib/common-types.ts index 0a15acd529..0a585fed07 100644 --- a/lib/common-types.ts +++ b/lib/common-types.ts @@ -1668,13 +1668,13 @@ export type MRActions = { update: { params: GetUIConfigParams; payload: UIConfigProps; return: UIConfigProps } } Upload: { - get: { params: GetSpaceParams & { uploadId: string }; return: any } + get: { params: GetSpaceEnvironmentParams & { uploadId: string }; return: any } create: { - params: GetSpaceParams + params: GetSpaceEnvironmentParams payload: { file: string | ArrayBuffer | Stream } return: any } - delete: { params: GetSpaceParams & { uploadId: string }; return: any } + delete: { params: GetSpaceEnvironmentParams & { uploadId: string }; return: any } } Usage: { getManyForSpace: { @@ -1884,6 +1884,7 @@ export type GetSnapshotForContentTypeParams = GetSpaceEnvironmentParams & { cont export type GetSnapshotForEntryParams = GetSpaceEnvironmentParams & { entryId: string } export type GetSpaceEnvAliasParams = GetSpaceParams & { environmentAliasId: string } export type GetSpaceEnvironmentParams = { spaceId: string; environmentId: string } +export type GetSpaceEnvironmentUploadParams = GetSpaceEnvironmentParams & { uploadId?: string } export type GetSpaceMembershipProps = GetSpaceParams & { spaceMembershipId: string } export type GetSpaceParams = { spaceId: string } export type GetTagParams = GetSpaceEnvironmentParams & { tagId: string } diff --git a/lib/create-environment-api.ts b/lib/create-environment-api.ts index 4f09d42678..5b634a0cea 100644 --- a/lib/create-environment-api.ts +++ b/lib/create-environment-api.ts @@ -1127,6 +1127,7 @@ export default function createEnvironmentApi(makeRequest: MakeRequest) { action: 'get', params: { spaceId: raw.sys.space.sys.id, + environmentId: raw.sys.id, uploadId: id, }, }).then((data) => wrapUpload(makeRequest, data)) @@ -1157,6 +1158,7 @@ export default function createEnvironmentApi(makeRequest: MakeRequest) { action: 'create', params: { spaceId: raw.sys.space.sys.id, + environmentId: raw.sys.id, }, payload: data, }).then((data) => wrapUpload(makeRequest, data)) diff --git a/lib/entities/upload.ts b/lib/entities/upload.ts index fc1ee8f662..bd73f8a1dd 100644 --- a/lib/entities/upload.ts +++ b/lib/entities/upload.ts @@ -43,6 +43,7 @@ function createUploadApi(makeRequest: MakeRequest) { action: 'delete', params: { spaceId: raw.sys.space.sys.id, + environmentId: raw.sys.id, uploadId: raw.sys.id, }, }) diff --git a/test/unit/adapters/REST/endpoints/upload-test.js b/test/unit/adapters/REST/endpoints/upload-test.js index 4ade83f970..309018b090 100644 --- a/test/unit/adapters/REST/endpoints/upload-test.js +++ b/test/unit/adapters/REST/endpoints/upload-test.js @@ -11,7 +11,34 @@ function setup(promise, params = {}) { } describe('Rest Upload', async () => { - test('API call createUpload', async () => { + test('API call createUpload with envId', async () => { + const { adapterMock, httpMock } = setup(Promise.resolve({})) + + return adapterMock + .makeRequest({ + entityType: 'Upload', + action: 'create', + params: { + spaceId: 'id', + environmentId: 'envId', + }, + payload: { + contentType: 'image/svg', + fileName: 'filename.svg', + file: '', + }, + }) + .then(() => { + expect(httpMock.post.args[0][0]).equals('/spaces/id/environments/envId/uploads') + expect(httpMock.post.args[0][2].headers['Content-Type']).equals('application/octet-stream') + expect(httpMock.post.args[0][1]).equals( + '', + 'uploads file to upload endpoint' + ) + }) + }) + + test('API call createUpload without envId', async () => { const { adapterMock, httpMock } = setup(Promise.resolve({})) return adapterMock