s3-artifact-storage-ui/src/Utilities/parametersUtils.ts (137 lines of code) (raw):
import { Option } from '@jetbrains-internal/tcci-react-ui-components';
import { FormFields, keyToFormDataName } from '../App/appConstants';
import { Config, DistributionItem, IFormInput } from '../types';
import { AWS_S3, S3_COMPATIBLE } from '../App/Storage/components/StorageType';
import { PASSWORD_STUB } from '../hooks/useS3Form';
function valueOrDefault(
condition: () => boolean,
getter: () => string,
defaultVal: any = ''
) {
let r;
if (condition()) {
r = getter();
} else {
r = defaultVal;
}
return r;
}
function handleS3BucketListOrName(rkey: string, value: any) {
const v = value as Option<number>;
return {
[rkey]: valueOrDefault(
() => v.key !== 0,
() => v.label
),
};
}
function handleS3BucketName(rkey: string, value: any) {
const v = value as Option;
return { [rkey]: v.label };
}
function handleAwsEnvType(rkey: string, value: any) {
const v = value as Option<number>;
return {
[rkey]: valueOrDefault(
() => v.key !== 0,
() => v.label
),
};
}
function handleCfPublicKey(rkey: string, value: any) {
const v = value as Option;
return { [rkey]: v.key };
}
function handleCfDistribution(rkey: string, value: any) {
const v = value as DistributionItem;
return { [rkey]: v.key };
}
function handleChosenAwsConnection(rkey: string, value: any) {
const v = value as Option;
return { [rkey]: v.key };
}
export function serializeParameters(
formData: IFormInput,
appProps: Config
): { [k: string]: string } {
const awsConnectionKey = formData[FormFields.AWS_CONNECTION_ID]?.key;
if (!formData[FormFields.CONNECTION_MULTIPART_CUSTOMIZE_FLAG]) {
formData[FormFields.CONNECTION_MULTIPART_THRESHOLD] = '';
formData[FormFields.CONNECTION_MULTIPART_CHUNKSIZE] = '';
}
if (!formData[FormFields.CLOUD_FRONT_TOGGLE]) {
formData[FormFields.CLOUD_FRONT_DOWNLOAD_DISTRIBUTION] = undefined;
formData[FormFields.CLOUD_FRONT_UPLOAD_DISTRIBUTION] = undefined;
formData[FormFields.CLOUD_FRONT_PUBLIC_KEY_ID] = undefined;
formData[FormFields.CLOUD_FRONT_PRIVATE_KEY] = undefined;
}
if (formData[FormFields.STORAGE_TYPE]?.key === AWS_S3 && awsConnectionKey) {
formData[FormFields.ACCESS_KEY_ID] = undefined;
formData[FormFields.SECRET_ACCESS_KEY] = undefined;
formData[FormFields.CREDENTIALS_TYPE] = undefined;
formData[FormFields.CUSTOM_AWS_ENDPOINT_URL] = undefined;
} else if (formData[FormFields.STORAGE_TYPE]?.key === S3_COMPATIBLE) {
formData[FormFields.AWS_CONNECTION_ID] = undefined;
formData[FormFields.CUSTOM_AWS_REGION] = undefined;
} else if (
!awsConnectionKey &&
formData[FormFields.CUSTOM_AWS_ENDPOINT_URL]?.length === 0
) {
formData[FormFields.CUSTOM_AWS_ENDPOINT_URL] = undefined;
}
return Object.keys(formData)
.map((key) => {
// @ts-ignore
const value = formData[key];
const rkey = keyToFormDataName(key);
if (value || key === FormFields.CONNECTION_VERIFY_IAU_TOGGLE) {
if (typeof value === 'object') {
if (key === FormFields.S3_BUCKET_LIST_OR_NAME) {
return handleS3BucketListOrName(rkey, value);
}
if (key === FormFields.S3_BUCKET_NAME) {
return handleS3BucketName(rkey, value);
}
if (key === FormFields.STORAGE_TYPE) {
const v = value as Option;
return { [rkey]: v.key };
}
if (key === FormFields.AWS_ENVIRONMENT_TYPE) {
return handleAwsEnvType(rkey, value);
}
if (key === FormFields.CLOUD_FRONT_PUBLIC_KEY_ID) {
return handleCfPublicKey(rkey, value);
}
if (
key === FormFields.CLOUD_FRONT_DOWNLOAD_DISTRIBUTION ||
key === FormFields.CLOUD_FRONT_UPLOAD_DISTRIBUTION
) {
return handleCfDistribution(rkey, value);
}
if (key === FormFields.AWS_CONNECTION_ID) {
if (!value.key) {
return { [rkey]: '' };
} else {
return handleChosenAwsConnection(rkey, value);
}
}
}
if (key === FormFields.SECRET_ACCESS_KEY) {
const val = value as string;
if (val === PASSWORD_STUB) {
return { [rkey]: appProps.secretAcessKeyValue };
} else {
return { [rkey]: encodeSecret(value, appProps.publicKey) };
}
}
return { [rkey]: value };
} else {
return { [rkey]: '' };
}
})
.reduce((acc, cur) => ({ ...cur, ...acc }), {
projectId: appProps.projectId,
});
}
export function encodeSecret(value: string, publicKey: string): string {
return window.BS.Encrypt.encryptData(value, publicKey);
}