UNPKG

@tapis/tapisui-api

Version:

Typescript library for making api calls with react query

113 lines (112 loc) 5.48 kB
import { Apps } from '@tapis/tapis-typescript'; export const getIncompleteAppInputs = (app) => { return (app.jobAttributes?.fileInputs?.filter((fileInput) => !fileInput.sourceUrl) ?? []); }; export const getIncompleteAppInputsOfType = (app, inputType) => { return getIncompleteAppInputs(app).filter((fileInput) => fileInput.inputMode === inputType); }; export const generateFileInputFromAppInput = (input) => ({ name: input.name, sourceUrl: input.sourceUrl, targetPath: input.targetPath, description: input.description, autoMountLocal: input.autoMountLocal, }); export const generateRequiredFileInputsFromApp = (app) => { const requiredInputs = app.jobAttributes?.fileInputs?.filter((fileInput) => fileInput.inputMode === Apps.FileInputModeEnum.Required) ?? []; const fileInputs = requiredInputs.map((appFileInput) => { return generateFileInputFromAppInput(appFileInput); }); return fileInputs; }; export const getAppInputsIncludedByDefault = (appFileInputs, jobFileInputs) => { return appFileInputs.filter((appFileInput) => { const includedInJob = jobFileInputs.some((jobFileInput) => jobFileInput.name === appFileInput.name); return (appFileInput.inputMode === Apps.FileInputModeEnum.Required && !!appFileInput.sourceUrl && !includedInJob); }); }; /** * @param appFileInputs * @param jobFileInputs * @returns An array of jobFileInputs that are underspecified */ export const getIncompleteJobInputs = (appFileInputs, jobFileInputs) => { // Get job inputs that are REQUIRED in the app but do not specify sourceUrl const incompleteRequiredAppInputs = appFileInputs.filter((appFileInput) => appFileInput.inputMode === Apps.FileInputModeEnum.Required && !appFileInput.sourceUrl); const incompleteRequiredJobInputs = jobFileInputs.filter((jobFileInput) => { // Is this jobFileInput part of required app inputs? const requiredInApp = incompleteRequiredAppInputs.some((appInput) => appInput.name === jobFileInput.name); if (requiredInApp) { return !jobFileInput.sourceUrl; } else { return false; } }); // Get job inputs that are OPTIONAL in the app but do not specify sourceUrl const incompleteOptionalAppInputs = appFileInputs.filter((appFileInput) => appFileInput.inputMode === Apps.FileInputModeEnum.Optional && !appFileInput.sourceUrl); const incompleteOptionalJobInputs = jobFileInputs.filter((jobFileInput) => { // Is this jobFileInput part of optional app inputs? const optionalInApp = incompleteOptionalAppInputs.some((appInput) => appInput.name === jobFileInput.name); if (optionalInApp) { return !jobFileInput.sourceUrl; } else { return false; } }); // Get job inputs that are neither OPTIONAL or REQUIRED, but are incomplete const incompleteUserInputs = jobFileInputs.filter((jobFileInput) => { // Is this jobFileInput neither OPTIONAL or REQUIRED? const userInput = !incompleteRequiredAppInputs.some((appInput) => appInput.name === jobFileInput.name) && !incompleteOptionalAppInputs.some((appInput) => appInput.name === jobFileInput.name); if (userInput) { return !jobFileInput.sourceUrl || !jobFileInput.targetPath; } else { return false; } }); return incompleteRequiredJobInputs .concat(incompleteOptionalJobInputs) .concat(incompleteUserInputs); }; export const fileInputsComplete = (app, fileInputs) => { // Check to make sure job has filled in all REQUIRED app inputs that are missing sourceUrl const incompleteRequiredInputs = getIncompleteAppInputsOfType(app, Apps.FileInputModeEnum.Required); const hasIncompleteRequiredInput = incompleteRequiredInputs.some((requiredInput) => { // Find JobFileInput with name matching the required input const jobFileInput = fileInputs.find((jobFileInput) => jobFileInput.name === requiredInput.name); if (!jobFileInput) { // Matching jobFileInput not found, therefore there is an incomplete required input return true; } else { // Verify that this input has a sourceUrl specified return !jobFileInput.sourceUrl; } }); if (hasIncompleteRequiredInput) { return false; } // Check to see if an OPTIONAL input was included but not fully specified const optionalAppInputs = getIncompleteAppInputs(app).filter((appFileInput) => !appFileInput.sourceUrl); // get any optional app file input that was included in the job. const optionalJobInputs = fileInputs.filter((jobFileInput) => optionalAppInputs.some((optionalAppInput) => jobFileInput.name === optionalAppInput.name)) ?? []; const hasIncompleteOptionalInput = !!optionalJobInputs.length && optionalJobInputs.some((jobInput) => !jobInput.sourceUrl); if (hasIncompleteOptionalInput) { return false; } // Check to see if any app inputs that did not exist const namedInputs = app.jobAttributes?.fileInputs?.map((input) => input.name) ?? []; const otherInputs = fileInputs.filter((jobInput) => !namedInputs.some((name) => name === jobInput.name)) ?? []; if (otherInputs.some((otherInput) => !otherInput.sourceUrl || !otherInput.targetPath)) { return false; } return true; };