@tapis/tapisui-api
Version:
Typescript library for making api calls with react query
113 lines (112 loc) • 5.48 kB
JavaScript
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;
};