UNPKG

@tapis/tapisui-api

Version:

Typescript library for making api calls with react query

114 lines (113 loc) 6.23 kB
import { Apps } from '@tapis/tapis-typescript'; export const getIncompleteAppInputArrays = (app) => { return (app.jobAttributes?.fileInputArrays?.filter((fileInput) => !fileInput.sourceUrls) ?? []); }; export const getIncompleteAppInputArraysOfType = (app, inputType) => { return getIncompleteAppInputArrays(app).filter((fileInput) => fileInput.inputMode === inputType); }; export const generateFileInputArrayFromAppInput = (input) => ({ name: input.name, sourceUrls: input.sourceUrls ?? [], targetDir: input.targetDir, description: input.description, }); export const generateRequiredFileInputArraysFromApp = (app) => { const requiredInputArrays = app.jobAttributes?.fileInputArrays?.filter((fileInput) => fileInput.inputMode === Apps.FileInputModeEnum.Required) ?? []; const fileInputs = requiredInputArrays.map((appFileInputArray) => { return generateFileInputArrayFromAppInput(appFileInputArray); }); return fileInputs; }; export const getAppInputArraysIncludedByDefault = (appFileInputArrays, jobFileInputArrays) => { return appFileInputArrays.filter((appFileInputArray) => { const includedInJob = jobFileInputArrays.some((jobFileInputArray) => jobFileInputArray.name === appFileInputArray.name); return (appFileInputArray.inputMode === Apps.FileInputModeEnum.Required && !!appFileInputArray.sourceUrls && !includedInJob); }); }; /** * @param appFileInputsArrays * @param jobFileInputsArrays * @returns An array of JobFileInputArrays that are underspecified */ export const getIncompleteJobInputArrays = (appFileInputArrays, jobFileInputArrays) => { // Get job input arrays that are REQUIRED in the app but do not specify sourceUrl const incompleteRequiredAppInputArrays = appFileInputArrays.filter((appFileInputArray) => appFileInputArray.inputMode === Apps.FileInputModeEnum.Required && !appFileInputArray.sourceUrls); const incompleteRequiredJobInputArrays = jobFileInputArrays.filter((jobFileInputArray) => { // Is this jobFileInputArray part of required app input arrays? const requiredInApp = incompleteRequiredAppInputArrays.some((appInputArray) => appInputArray.name === jobFileInputArray.name); if (requiredInApp) { return (!jobFileInputArray.sourceUrls || !jobFileInputArray.sourceUrls.length); } else { return false; } }); // Get job input arrays that are OPTIONAL in the app but do not specify sourceUrl const incompleteOptionalAppInputArrays = appFileInputArrays.filter((appFileInputArray) => appFileInputArray.inputMode === Apps.FileInputModeEnum.Optional && !appFileInputArray.sourceUrls); const incompleteOptionalJobInputArrays = jobFileInputArrays.filter((jobFileInputArray) => { // Is this jobFileInputArray part of optional app input arrays? const optionalInApp = incompleteOptionalAppInputArrays.some((appInputArray) => appInputArray.name === jobFileInputArray.name); if (optionalInApp) { return (!jobFileInputArray.sourceUrls || !jobFileInputArray.sourceUrls.length); } else { return false; } }); // Get job input arrays that are neither OPTIONAL or REQUIRED, but are incomplete const incompleteUserInputArrays = jobFileInputArrays.filter((jobFileInputArray) => { // Is this jobFileInputArray neither OPTIONAL or REQUIRED? const userInput = !incompleteRequiredAppInputArrays.some((appInputArray) => appInputArray.name === jobFileInputArray.name) && !incompleteOptionalAppInputArrays.some((appInputArray) => appInputArray.name === jobFileInputArray.name); if (userInput) { return (!jobFileInputArray.sourceUrls || !jobFileInputArray.sourceUrls.length || !jobFileInputArray.targetDir); } else { return false; } }); return incompleteRequiredJobInputArrays .concat(incompleteOptionalJobInputArrays) .concat(incompleteUserInputArrays); }; export const fileInputArraysComplete = (app, fileInputArrays) => { // Check to make sure job has filled in all REQUIRED app inputs that are missing sourceUrl const incompleteRequiredInputs = getIncompleteAppInputArraysOfType(app, Apps.FileInputModeEnum.Required); const hasIncompleteRequiredInput = incompleteRequiredInputs.some((requiredInputArray) => { // Find JobFileInputArray with name matching the required input const jobFileInputArray = fileInputArrays.find((jobFileInputArray) => jobFileInputArray.name === requiredInputArray.name); if (!jobFileInputArray) { // Matching jobFileInput not found, therefore there is an incomplete required input return true; } else { // Verify that this input has a sourceUrl specified return (!jobFileInputArray.sourceUrls || !jobFileInputArray.sourceUrls.length); } }); if (hasIncompleteRequiredInput) { return false; } // Check to see if an OPTIONAL input was included but not fully specified const optionalAppInputArrays = getIncompleteAppInputArrays(app).filter((appFileInput) => !appFileInput.sourceUrls); // get any optional app file input that was included in the job. const optionalJobInputArrays = fileInputArrays.filter((jobFileInputArray) => optionalAppInputArrays.some((optionalAppInputArray) => jobFileInputArray.name === optionalAppInputArray.name)) ?? []; const hasIncompleteOptionalInputArray = !!optionalJobInputArrays.length && optionalJobInputArrays.some((jobInput) => !jobInput.sourceUrls); if (hasIncompleteOptionalInputArray) { return false; } // Check to see if any app inputs that did not exist const namedInputs = app.jobAttributes?.fileInputArrays?.map((input) => input.name) ?? []; const otherInputArrays = fileInputArrays.filter((jobInputArray) => !namedInputs.some((name) => name === jobInputArray.name)) ?? []; if (otherInputArrays.some((otherInputArray) => !otherInputArray.sourceUrls || !otherInputArray.targetDir)) { return false; } return true; };