diff --git a/src/api/uploads/BaseUpload.js b/src/api/uploads/BaseUpload.js index 3fc8dcbb6f..e712d3bdc4 100644 --- a/src/api/uploads/BaseUpload.js +++ b/src/api/uploads/BaseUpload.js @@ -44,6 +44,8 @@ class BaseUpload extends Base { isUploadFallbackLogicEnabled: boolean = false; + enableModernizedUploads: boolean = false; + /** * Sends an upload pre-flight request. If a file ID is available, * send a pre-flight request to that file version. diff --git a/src/api/uploads/MultiputUpload.js b/src/api/uploads/MultiputUpload.js index fdf42a23f3..f378f8fa40 100644 --- a/src/api/uploads/MultiputUpload.js +++ b/src/api/uploads/MultiputUpload.js @@ -18,6 +18,7 @@ import { HTTP_STATUS_CODE_FORBIDDEN, MS_IN_S, } from '../../constants'; +import { updateQueryParameters } from '../../utils/url'; import MultiputPart, { PART_STATE_UPLOADED, PART_STATE_UPLOADING, @@ -28,6 +29,7 @@ import BaseMultiput from './BaseMultiput'; import type { MultiputConfig } from '../../common/types/upload'; import type { StringAnyMap } from '../../common/types/core'; import type { APIOptions } from '../../common/types/api'; +import { STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER } from '../../utils/fields'; // Constants used for specifying log event types. @@ -177,12 +179,14 @@ class MultiputUpload extends BaseMultiput { overwrite = true, conflictCallback, fileId, + enableModernizedUploads = false, }: { conflictCallback?: Function, errorCallback?: Function, file: File, fileId: ?string, folderId: string, + enableModernizedUploads?: boolean, overwrite?: boolean | 'error', progressCallback?: Function, successCallback?: Function, @@ -196,6 +200,7 @@ class MultiputUpload extends BaseMultiput { this.overwrite = overwrite; this.conflictCallback = conflictCallback; this.fileId = fileId; + this.enableModernizedUploads = Boolean(enableModernizedUploads); } /** @@ -222,6 +227,7 @@ class MultiputUpload extends BaseMultiput { overwrite = true, conflictCallback, fileId, + enableModernizedUploads = false, }: { conflictCallback?: Function, errorCallback?: Function, @@ -229,6 +235,7 @@ class MultiputUpload extends BaseMultiput { fileDescription: ?string, fileId: ?string, folderId: string, + enableModernizedUploads?: boolean, overwrite?: boolean | 'error', progressCallback?: Function, successCallback?: Function, @@ -251,6 +258,7 @@ class MultiputUpload extends BaseMultiput { this.overwrite = overwrite; this.fileId = fileId; this.fileDescription = fileDescription; + this.enableModernizedUploads = enableModernizedUploads; this.makePreflightRequest(); } @@ -447,6 +455,7 @@ class MultiputUpload extends BaseMultiput { overwrite = true, conflictCallback, fileId, + enableModernizedUploads = false, }: { conflictCallback?: Function, errorCallback?: Function, @@ -457,6 +466,7 @@ class MultiputUpload extends BaseMultiput { progressCallback?: Function, sessionId: string, successCallback?: Function, + enableModernizedUploads?: boolean, }): void { this.setFileInfo({ file, @@ -467,6 +477,7 @@ class MultiputUpload extends BaseMultiput { conflictCallback, overwrite, fileId, + enableModernizedUploads, }); this.sessionId = sessionId; @@ -571,6 +582,7 @@ class MultiputUpload extends BaseMultiput { successCallback: this.successCallback, overwrite: this.overwrite, fileId: this.fileId, + enableModernizedUploads: this.enableModernizedUploads, }; this.upload(uploadOptions); } else { @@ -967,8 +979,15 @@ class MultiputUpload extends BaseMultiput { 'X-Box-Client-Event-Info': JSON.stringify(clientEventInfo), }; + let commitUrl = this.sessionEndpoints.commit; + if (this.enableModernizedUploads && !!this.fileId) { + commitUrl = updateQueryParameters(commitUrl, { + fields: STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER.join(','), + }); + } + this.xhr - .post({ url: this.sessionEndpoints.commit, data, headers }) + .post({ url: commitUrl, data, headers }) .then(this.commitSessionSuccessHandler) .catch(this.commitSessionErrorHandler); }; diff --git a/src/api/uploads/PlainUpload.js b/src/api/uploads/PlainUpload.js index 9ecb0a829a..54b7f57112 100644 --- a/src/api/uploads/PlainUpload.js +++ b/src/api/uploads/PlainUpload.js @@ -7,6 +7,8 @@ import noop from 'lodash/noop'; import { digest } from '../../utils/webcrypto'; import { getFileLastModifiedAsISONoMSIfPossible } from '../../utils/uploads'; +import { STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER } from '../../utils/fields'; +import { updateQueryParameters } from '../../utils/url'; import BaseUpload from './BaseUpload'; import type { BoxItem } from '../../common/types/core'; @@ -74,6 +76,12 @@ class PlainUpload extends BaseUpload { } } + if (this.enableModernizedUploads && !!this.fileId) { + uploadUrl = updateQueryParameters(uploadUrl, { + fields: STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER.join(','), + }); + } + const attributes = JSON.stringify({ name: this.fileName, parent: { id: this.folderId }, @@ -130,6 +138,7 @@ class PlainUpload extends BaseUpload { conflictCallback, // $FlowFixMe overwrite = true, + enableModernizedUploads = false, }: { conflictCallback?: Function, errorCallback: Function, @@ -137,6 +146,7 @@ class PlainUpload extends BaseUpload { fileDescription: ?string, fileId: ?string, folderId: string, + enableModernizedUploads?: boolean, overwrite: boolean | 'error', progressCallback: Function, successCallback: Function, @@ -156,6 +166,7 @@ class PlainUpload extends BaseUpload { this.progressCallback = progressCallback; this.overwrite = overwrite; this.conflictCallback = conflictCallback; + this.enableModernizedUploads = enableModernizedUploads; this.makePreflightRequest(); } diff --git a/src/constants.js b/src/constants.js index 0f8a4b8777..7128e96f75 100644 --- a/src/constants.js +++ b/src/constants.js @@ -106,6 +106,7 @@ export const FIELD_SIZE: 'size' = 'size'; export const FIELD_PARENT = 'parent'; export const FIELD_EXTENSION = 'extension'; export const FIELD_ITEM_EXPIRATION = 'expires_at'; +export const FIELD_ITEM_STATUS = 'item_status'; export const FIELD_PERMISSIONS = 'permissions'; export const FIELD_PERMISSIONS_CAN_SHARE = `${FIELD_PERMISSIONS}.can_share`; export const FIELD_PERMISSIONS_CAN_UPLOAD = `${FIELD_PERMISSIONS}.can_upload`; @@ -136,6 +137,7 @@ export const FIELD_CREATED_BY = 'created_by'; export const FIELD_MODIFIED_BY = 'modified_by'; export const FIELD_OWNED_BY = 'owned_by'; export const FIELD_PROMOTED_BY = 'promoted_by'; +export const FIELD_PURGED_AT = 'purged_at'; export const FIELD_RESTORED_BY = 'restored_by'; export const FIELD_TRASHED_BY = 'trashed_by'; export const FIELD_DESCRIPTION = 'description'; diff --git a/src/elements/content-uploader/ContentUploader.tsx b/src/elements/content-uploader/ContentUploader.tsx index 9923bf3ced..c38f5da758 100644 --- a/src/elements/content-uploader/ContentUploader.tsx +++ b/src/elements/content-uploader/ContentUploader.tsx @@ -815,7 +815,7 @@ class ContentUploader extends Component { * @return {void} */ uploadFile(item: UploadItem) { - const { overwrite, rootFolderId } = this.props; + const { enableModernizedUploads, overwrite, rootFolderId } = this.props; const { api, file, options } = item; const numItemsUploading = this.itemsRef.current.filter(item_t => item_t.status === STATUS_IN_PROGRESS).length; @@ -831,6 +831,7 @@ class ContentUploader extends Component { progressCallback: event => this.handleUploadProgress(item, event), successCallback: entries => this.handleUploadSuccess(item, entries), overwrite, + enableModernizedUploads, fileId: options && options.fileId ? options.fileId : null, }; @@ -850,7 +851,7 @@ class ContentUploader extends Component { * @return {void} */ resumeFile(item: UploadItem) { - const { onResume, overwrite, rootFolderId } = this.props; + const { enableModernizedUploads, onResume, overwrite, rootFolderId } = this.props; const { api, file, options } = item; const numItemsUploading = this.itemsRef.current.filter(item_t => item_t.status === STATUS_IN_PROGRESS).length; @@ -866,6 +867,7 @@ class ContentUploader extends Component { progressCallback: event => this.handleUploadProgress(item, event), successCallback: entries => this.handleUploadSuccess(item, entries), overwrite, + enableModernizedUploads, sessionId: api && api.sessionId ? api.sessionId : null, fileId: options && options.fileId ? options.fileId : null, }; diff --git a/src/utils/fields.js b/src/utils/fields.js index 8290d34844..37dbf52dff 100644 --- a/src/utils/fields.js +++ b/src/utils/fields.js @@ -16,6 +16,7 @@ import { FIELD_PERMISSIONS, FIELD_ITEM_COLLECTION, FIELD_ITEM_EXPIRATION, + FIELD_ITEM_STATUS, FIELD_PATH_COLLECTION, FIELD_CONTENT_CREATED_AT, FIELD_CONTENT_MODIFIED_AT, @@ -30,6 +31,7 @@ import { FIELD_OWNED_BY, FIELD_PROMOTED_BY, FIELD_RESTORED_BY, + FIELD_PURGED_AT, FIELD_TRASHED_BY, FIELD_DESCRIPTION, FIELD_REPRESENTATIONS, @@ -222,6 +224,26 @@ const APP_ACTIVITY_FIELDS_TO_FETCH = [ FIELD_RENDERED_TEXT, ]; +const STANDARD_UPLOAD_FIELDS = [ + FIELD_DESCRIPTION, + FIELD_SIZE, + FIELD_PATH_COLLECTION, + FIELD_CREATED_AT, + FIELD_MODIFIED_AT, + FIELD_TRASHED_AT, + FIELD_PURGED_AT, + FIELD_CONTENT_CREATED_AT, + FIELD_CONTENT_MODIFIED_AT, + FIELD_CREATED_BY, + FIELD_MODIFIED_BY, + FIELD_OWNED_BY, + FIELD_SHARED_LINK, + FIELD_PARENT, + FIELD_ITEM_STATUS, +]; + +const STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER = [...STANDARD_UPLOAD_FIELDS, FIELD_VERSION_NUMBER]; + /** * Finds properties missing in an object * @@ -294,6 +316,7 @@ export { PREVIEW_FIELDS_TO_FETCH, SIDEBAR_FIELDS_TO_FETCH, SIDEBAR_FIELDS_TO_FETCH_ARCHIVE, + STANDARD_UPLOAD_FIELDS_WITH_VERSION_NUMBER, TASK_ASSIGNMENTS_FIELDS_TO_FETCH, TASKS_FIELDS_TO_FETCH, USER_FIELDS,