-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Task/WP-724: Mutation Hooks: Compress Files (#1009)
* Starting from scratch * Set up useCompress.ts * Still working on useCompress() * Progressing with useCompress mutation * Committing branch in its current state; not fully functioning * wip * Reworked useCompress.ts * wip * Still trying to fix it; much closer now * handle undefined execSystemId * Compress mutation finally successful * Toasts and modals work correctly * Linted client-side code * Added an additional asynchronous call; updated Compress modal * Refactored types into useSubmitJob.ts * Corrected mutation hook to return archive in current directory instead of root * Update client/src/hooks/datafiles/mutations/useCompress.ts Co-authored-by: Sal Tijerina <[email protected]> * Linted client-side code * Can't get this test to pass still * Linted client-side code * Finally got the failing test to pass * Skipping tests temporarily, cleaned up code * Skipping saga tests * Corrected defaultPrivateSystem and edited package-lock.json * Made corrections to files based on feedback * Added final change to account for empty strings or undefined in job_post['appVersion'] * Task/WP-725: Mutation Hooks: Extract Files (#1035) * Set up new branch to branch off of Compress branch * Reversed changes to files based on feedback after rebasing branch * Skipping failing test temporarily * Linted client-side code * Removed changes to files unrelated to task due to pointing a branch to a branch other than main --------- Co-authored-by: Jeff McMillen <[email protected]> * update example; add comment --------- Co-authored-by: Jeff McMillen <[email protected]> Co-authored-by: Sal Tijerina <[email protected]>
- Loading branch information
1 parent
928dc75
commit 698d919
Showing
14 changed files
with
796 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
import { useMutation } from '@tanstack/react-query'; | ||
import { useSelector, useDispatch, shallowEqual } from 'react-redux'; | ||
import { getCompressParams } from 'utils/getCompressParams'; | ||
import { apiClient } from 'utils/apiClient'; | ||
import { TTapisFile, TPortalSystem } from 'utils/types'; | ||
import { TJobBody, TJobPostResponse } from './useSubmitJob'; | ||
|
||
async function submitJobUtil(body: TJobBody) { | ||
const res = await apiClient.post<TJobPostResponse>( | ||
`/api/workspace/jobs`, | ||
body | ||
); | ||
return res.data.response; | ||
} | ||
|
||
function useCompress() { | ||
const dispatch = useDispatch(); | ||
const status = useSelector( | ||
(state: any) => state.files.operationStatus.compress, | ||
shallowEqual | ||
); | ||
|
||
const setStatus = (newStatus: any) => { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: newStatus, operation: 'compress' }, | ||
}); | ||
}; | ||
|
||
const compressErrorAction = (errorMessage: any) => { | ||
return { | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { | ||
status: { type: 'ERROR', message: errorMessage }, | ||
operation: 'compress', | ||
}, | ||
}; | ||
}; | ||
|
||
const compressApp = useSelector( | ||
(state: any) => state.workbench.config.compressApp | ||
); | ||
|
||
const defaultAllocation = useSelector( | ||
(state: any) => | ||
state.allocations.portal_alloc || state.allocations.active[0].projectName | ||
); | ||
|
||
const systems = useSelector( | ||
(state: any) => state.systems.storage.configuration | ||
); | ||
|
||
const { mutateAsync } = useMutation({ mutationFn: submitJobUtil }); | ||
|
||
const compress = ({ | ||
scheme, | ||
files, | ||
filename, | ||
compressionType, | ||
}: { | ||
scheme: string; | ||
files: TTapisFile[]; | ||
filename: string; | ||
compressionType: string; | ||
}) => { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: 'RUNNING', operation: 'compress' }, | ||
}); | ||
|
||
let defaultPrivateSystem: TPortalSystem | undefined; | ||
|
||
if (files[0].scheme === 'private' && files[0].api === 'tapis') { | ||
defaultPrivateSystem = undefined; | ||
} | ||
|
||
if (scheme !== 'private' && scheme !== 'projects') { | ||
defaultPrivateSystem = systems.find((s: any) => s.default); | ||
|
||
if (!defaultPrivateSystem) { | ||
throw new Error('Folder downloads are unavailable in this portal', { | ||
cause: 'compressError', | ||
}); | ||
} | ||
} | ||
|
||
const params = getCompressParams( | ||
files, | ||
filename, | ||
compressionType, | ||
compressApp, | ||
defaultAllocation, | ||
defaultPrivateSystem | ||
); | ||
|
||
return mutateAsync( | ||
{ | ||
job: params, | ||
}, | ||
{ | ||
onSuccess: (response: any) => { | ||
// If the execution system requires pushing keys, then | ||
// bring up the modal and retry the compress action | ||
if (response.execSys) { | ||
dispatch({ | ||
type: 'SYSTEMS_TOGGLE_MODAL', | ||
payload: { | ||
operation: 'pushKeys', | ||
props: { | ||
system: response.execSys, | ||
onCancel: compressErrorAction('An error has occurred'), | ||
}, | ||
}, | ||
}); | ||
} else if (response.status === 'PENDING') { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: { type: 'SUCCESS' }, operation: 'compress' }, | ||
}); | ||
dispatch({ | ||
type: 'ADD_TOAST', | ||
payload: { | ||
message: 'Compress job submitted.', | ||
}, | ||
}); | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { operation: 'compress', status: {} }, | ||
}); | ||
dispatch({ | ||
type: 'DATA_FILES_TOGGLE_MODAL', | ||
payload: { operation: 'compress', props: {} }, | ||
}); | ||
} | ||
}, | ||
onError: (response) => { | ||
const errorMessage = | ||
response.cause === 'compressError' | ||
? response.message | ||
: 'An error has occurred.'; | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { | ||
status: { type: 'ERROR', message: errorMessage }, | ||
operation: 'compress', | ||
}, | ||
}); | ||
}, | ||
} | ||
); | ||
}; | ||
|
||
return { compress, status, setStatus }; | ||
} | ||
|
||
export default useCompress; |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
import { useMutation } from '@tanstack/react-query'; | ||
import { useSelector, useDispatch, shallowEqual } from 'react-redux'; | ||
import { getExtractParams } from 'utils/getExtractParams'; | ||
import { apiClient } from 'utils/apiClient'; | ||
import { fetchUtil } from 'utils/fetchUtil'; | ||
import { TTapisFile } from 'utils/types'; | ||
import { TJobBody, TJobPostResponse } from './useSubmitJob'; | ||
|
||
const getAppUtil = async function fetchAppDefinitionUtil( | ||
appId: string, | ||
appVersion: string | ||
) { | ||
const params = { appId, appVersion }; | ||
const result = await fetchUtil({ | ||
url: '/api/workspace/apps', | ||
params, | ||
}); | ||
return result.response; | ||
}; | ||
|
||
async function submitJobUtil(body: TJobBody) { | ||
const res = await apiClient.post<TJobPostResponse>( | ||
`/api/workspace/jobs`, | ||
body | ||
); | ||
return res.data.response; | ||
} | ||
|
||
function useExtract() { | ||
const dispatch = useDispatch(); | ||
const status = useSelector( | ||
(state: any) => state.files.operationStatus.extract, | ||
shallowEqual | ||
); | ||
|
||
const setStatus = (newStatus: any) => { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: newStatus, operation: 'extract' }, | ||
}); | ||
}; | ||
|
||
const extractApp = useSelector( | ||
(state: any) => state.workbench.config.extractApp | ||
); | ||
|
||
const defaultAllocation = useSelector( | ||
(state: any) => | ||
state.allocations.portal_alloc || state.allocations.active[0].projectName | ||
); | ||
|
||
const latestExtract = getAppUtil(extractApp.id, extractApp.version); | ||
|
||
const { mutateAsync } = useMutation({ mutationFn: submitJobUtil }); | ||
|
||
const extract = ({ file }: { file: TTapisFile }) => { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: 'RUNNING', operation: 'extract' }, | ||
}); | ||
|
||
const params = getExtractParams( | ||
file, | ||
extractApp, | ||
latestExtract, | ||
defaultAllocation | ||
); | ||
|
||
return mutateAsync( | ||
{ | ||
job: params, | ||
}, | ||
{ | ||
onSuccess: (response: any) => { | ||
if (response.execSys) { | ||
dispatch({ | ||
type: 'SYSTEMS_TOGGLE_MODAL', | ||
payload: { | ||
operation: 'pushKeys', | ||
props: { | ||
system: response.execSys, | ||
}, | ||
}, | ||
}); | ||
} else if (response.status === 'PENDING') { | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { status: { type: 'SUCCESS' }, operation: 'extract' }, | ||
}); | ||
dispatch({ | ||
type: 'ADD_TOAST', | ||
payload: { | ||
message: 'File extraction in progress', | ||
}, | ||
}); | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { operation: 'extract', status: {} }, | ||
}); | ||
dispatch({ | ||
type: 'DATA_FILES_TOGGLE_MODAL', | ||
payload: { operation: 'extract', props: {} }, | ||
}); | ||
} | ||
}, | ||
onError: (response) => { | ||
const errorMessage = | ||
response.cause === 'compressError' | ||
? response.message | ||
: 'An error has occurred.'; | ||
dispatch({ | ||
type: 'DATA_FILES_SET_OPERATION_STATUS', | ||
payload: { | ||
status: { type: 'ERROR', message: errorMessage }, | ||
operation: 'extract', | ||
}, | ||
}); | ||
}, | ||
} | ||
); | ||
}; | ||
|
||
return { extract, status, setStatus }; | ||
} | ||
|
||
export default useExtract; |
Oops, something went wrong.