PromucFlow_constructor/app/client/src/utils/ApiPaneUtils.tsx

107 lines
3.3 KiB
TypeScript
Raw Normal View History

import { CONTENT_TYPE_HEADER_KEY } from "constants/ApiEditorConstants/CommonApiConstants";
import {
getDynamicStringSegments,
isDynamicValue,
} from "./DynamicBindingUtils";
feat: Support body in GET API requests (#7127) * WIP * Refactoring HTTP Method & Content Type to be objects instead of arrays TODO: 1. Set the default content-type for Get request to "None". Currently, it's raw 2. For None content-type, don't send the body field in the API request * Almost working implementation for the None type Currently, the body still gets sent in non-GET requests even if the None tab is selected. * Adding object.freeze to prevent any modifications to HTTP_METHOD_ENUM * WIP: Using enum & const for ts autocomplete * working implementation for NONE type, apiContentType prop added to API actions * WIP * Refactoring HTTP Method & Content Type to be objects instead of arrays TODO: 1. Set the default content-type for Get request to "None". Currently, it's raw 2. For None content-type, don't send the body field in the API request * Almost working implementation for the None type Currently, the body still gets sent in non-GET requests even if the None tab is selected. * Adding object.freeze to prevent any modifications to HTTP_METHOD_ENUM * WIP: Using enum & const for ts autocomplete * working implementation for NONE type, apiContentType prop added to API actions * adds apiContentType to actionConfiguration.formData object * Handling apiContentType property in Rest API formData * change apiContentType when user types content-type value and switches http method * makes api editor as similar as possible to postman, project postman. * Correcting the import in ApiEditorConstants * Resolved all merge conflicts * replay DSL functtionality * removes unneccessary files from worker * Fixes type declarations, naming e.t.c. * fix server side merge conflicts * fix client side merge conflicts * fix failing cypress tests Co-authored-by: Irongade <adeoluayangade@yahoo.com> Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
2022-02-15 11:13:48 +00:00
/**
* This function updates the header at a given index.
* If headerIndexToUpdate is -1, i.e the header we are looking for is not present, then
* update the header key-value pair in the first non-empty row
* @param headers
* @param headerIndexToUpdate
* @returns
*/
export const getIndextoUpdate = (headers: any, headerIndexToUpdate: number) => {
fix: Return undefined for nonexistent action headers (#18724) This issue occurs when users switch the datasource of an API action, and the actionConfiguration headers is empty. This PR adds conditional checks to prevent an error from happening. Fixes #18682 Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video - Bug fix (non-breaking change which fixes an issue) ### Test Plan > Add Testsmith test cases links that relate to this PR ### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) ## Checklist: ### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [ ] Test plan has been approved by relevant developers - [ ] Test plan has been peer reviewed by QA - [ ] Cypress test cases have been added and approved by either SDET or manual QA - [ ] Organized project review call with relevant stakeholders after Round 1/2 of QA - [ ] Added Test Plan Approved label after reveiwing all Cypress test
2023-01-18 10:01:08 +00:00
const firstEmptyHeaderRowIndex: number = headers?.findIndex(
2021-03-23 09:44:44 +00:00
(element: { key: string; value: string }) =>
element && element.key === "" && element.value === "",
);
const newHeaderIndex =
firstEmptyHeaderRowIndex > -1 ? firstEmptyHeaderRowIndex : headers.length;
const indexToUpdate =
feat: Support body in GET API requests (#7127) * WIP * Refactoring HTTP Method & Content Type to be objects instead of arrays TODO: 1. Set the default content-type for Get request to "None". Currently, it's raw 2. For None content-type, don't send the body field in the API request * Almost working implementation for the None type Currently, the body still gets sent in non-GET requests even if the None tab is selected. * Adding object.freeze to prevent any modifications to HTTP_METHOD_ENUM * WIP: Using enum & const for ts autocomplete * working implementation for NONE type, apiContentType prop added to API actions * WIP * Refactoring HTTP Method & Content Type to be objects instead of arrays TODO: 1. Set the default content-type for Get request to "None". Currently, it's raw 2. For None content-type, don't send the body field in the API request * Almost working implementation for the None type Currently, the body still gets sent in non-GET requests even if the None tab is selected. * Adding object.freeze to prevent any modifications to HTTP_METHOD_ENUM * WIP: Using enum & const for ts autocomplete * working implementation for NONE type, apiContentType prop added to API actions * adds apiContentType to actionConfiguration.formData object * Handling apiContentType property in Rest API formData * change apiContentType when user types content-type value and switches http method * makes api editor as similar as possible to postman, project postman. * Correcting the import in ApiEditorConstants * Resolved all merge conflicts * replay DSL functtionality * removes unneccessary files from worker * Fixes type declarations, naming e.t.c. * fix server side merge conflicts * fix client side merge conflicts * fix failing cypress tests Co-authored-by: Irongade <adeoluayangade@yahoo.com> Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
2022-02-15 11:13:48 +00:00
headerIndexToUpdate > -1 ? headerIndexToUpdate : newHeaderIndex;
2021-03-23 09:44:44 +00:00
return indexToUpdate;
};
export const queryParamsRegEx = /([\s\S]*?)(\?(?![^{]*})[\s\S]*)?$/;
export function parseUrlForQueryParams(url: string) {
const padQueryParams = { key: "", value: "" };
let params = Array(2).fill(padQueryParams);
const dynamicValuesDetected: string[] = [];
const matchGroup = url.match(queryParamsRegEx) || [];
const parsedUrlWithQueryParams = matchGroup[2] || "";
const dynamicStringSegments = getDynamicStringSegments(
parsedUrlWithQueryParams,
);
const templateStringSegments = dynamicStringSegments.map((segment) => {
if (isDynamicValue(segment)) {
dynamicValuesDetected.push(segment);
return "~";
}
return segment;
});
if (parsedUrlWithQueryParams.indexOf("?") > -1) {
const paramsString = templateStringSegments
.join("")
.slice(parsedUrlWithQueryParams.indexOf("?") + 1);
const paramsWithDynamicValues = paramsString.split("&").map((p) => {
const firstEqualPos = p.indexOf("=");
const keyValue =
firstEqualPos > -1
? [p.substring(0, firstEqualPos), p.substring(firstEqualPos + 1)]
: [];
return { key: keyValue[0] || "", value: keyValue[1] || "" };
});
params = paramsWithDynamicValues.map((queryParam) => {
// this time around we check for both key and values.
if (queryParam.value.includes("~") || queryParam.key.includes("~")) {
let newVal = queryParam.value;
let newKey = queryParam.key;
if (queryParam.key.includes("~")) {
newKey = queryParam?.key?.replace(/~/, dynamicValuesDetected[0]);
// remove the first index from detected dynamic values.
dynamicValuesDetected.shift();
}
if (queryParam.value.includes("~")) {
newVal = queryParam?.value?.replace(/~/, dynamicValuesDetected[0]);
// remove the first index from detected dynamic values.
dynamicValuesDetected.shift();
}
// dynamicValuesDetected.shift();
return { key: newKey, value: newVal };
}
return queryParam;
});
}
return params;
}
/**
*
* @param headers Array of key value pairs
* @returns string body type of API request
*/
export function getContentTypeHeaderValue(
headers: Array<{ key: string; value: string }>,
): string {
return (
headers.find(
(h: { key: string; value: string }) =>
h.key?.trim().toLowerCase() === CONTENT_TYPE_HEADER_KEY,
)?.value || ""
);
}