Browse Source

Add Salesforce Apex codegen (#1285)

Matthew Crumley 4 years ago
parent
commit
b6b3cbcb9a

+ 78 - 0
helpers/codegen/__tests__/__snapshots__/codegen.spec.js.snap

@@ -1002,6 +1002,84 @@ else
 end"
 `;
 
+exports[`generate request for Salesforce Apex generate GET request 1`] = `
+"HttpRequest request = new HttpRequest();
+request.setMethod('GET');
+request.setEndpoint('https://httpbin.org/path/to?a=b');
+
+request.setHeader('Authorization', 'Basic bW9ja1VzZXI6bW9ja1Bhc3N3b3Jk');
+request.setHeader('h1', 'h1v');
+request.setHeader('h2', 'h2v');
+
+try {
+    Http client = new Http();
+    HttpResponse response = client.send(request);
+    System.debug(response.getBody());
+} catch (CalloutException ex) {
+    System.debug('An error occured ' + ex.getMessage());
+}"
+`;
+
+exports[`generate request for Salesforce Apex generate POST request for JSON 1`] = `
+"HttpRequest request = new HttpRequest();
+request.setMethod('POST');
+request.setEndpoint('https://httpbin.org/path/to?a=b');
+
+request.setHeader('Authorization', 'Bearer abcdefghijklmn');
+request.setHeader('Content-Type', 'application/json');
+request.setHeader('h1', 'h1v');
+request.setHeader('h2', 'h2v');
+
+request.setBody('{\\"foo\\": \\"bar\\", \\"baz\\": \\"qux\\"}');
+
+try {
+    Http client = new Http();
+    HttpResponse response = client.send(request);
+    System.debug(response.getBody());
+} catch (CalloutException ex) {
+    System.debug('An error occured ' + ex.getMessage());
+}"
+`;
+
+exports[`generate request for Salesforce Apex generate POST request for XML 1`] = `
+"HttpRequest request = new HttpRequest();
+request.setMethod('POST');
+request.setEndpoint('https://httpbin.org/path/to?a=b');
+
+request.setHeader('Authorization', 'Bearer abcdefghijklmn');
+request.setHeader('Content-Type', 'application/xml');
+request.setHeader('h1', 'h1v');
+request.setHeader('h2', 'h2v');
+
+request.setBody('<?xml version=\\\\'1.0\\\\' encoding=\\\\'utf-8\\\\'?>\\\\n<xml>\\\\n  <element foo=\\"bar\\"></element>\\\\n</xml>');
+
+try {
+    Http client = new Http();
+    HttpResponse response = client.send(request);
+    System.debug(response.getBody());
+} catch (CalloutException ex) {
+    System.debug('An error occured ' + ex.getMessage());
+}"
+`;
+
+exports[`generate request for Salesforce Apex generate PUT request for www-form-urlencoded 1`] = `
+"HttpRequest request = new HttpRequest();
+request.setMethod('PUT');
+request.setEndpoint('https://httpbin.org/path/to?a=b');
+
+request.setHeader('Content-Type', 'application/x-www-form-urlencoded');
+
+request.setBody('foo=bar&baz=qux');
+
+try {
+    Http client = new Http();
+    HttpResponse response = client.send(request);
+    System.debug(response.getBody());
+} catch (CalloutException ex) {
+    System.debug('An error occured ' + ex.getMessage());
+}"
+`;
+
 exports[`generate request for cURL generate GET request 1`] = `
 "curl -X GET \\\\
   'https://httpbin.org/path/to?a=b' \\\\

+ 2 - 0
helpers/codegen/codegen.js

@@ -13,6 +13,7 @@ import { PythonHttpClientCodegen } from "./generators/python-http-client"
 import { WgetCodegen } from "./generators/wget"
 import { CsRestSharpCodegen } from "./generators/cs-restsharp"
 import { RubyNetHttpCodeGen } from "./generators/ruby-net-http"
+import { SalesforceApexCodegen } from "./generators/salesforce-apex"
 
 /* Register code generators here.
  * A code generator is defined as an object with the following structure.
@@ -37,6 +38,7 @@ export const codegens = [
   PythonRequestsCodegen,
   PythonHttpClientCodegen,
   RubyNetHttpCodeGen,
+  SalesforceApexCodegen,
   WgetCodegen,
 ]
 

+ 77 - 0
helpers/codegen/generators/salesforce-apex.js

@@ -0,0 +1,77 @@
+export const SalesforceApexCodegen = {
+  id: "salesforce-apex",
+  name: "Salesforce Apex",
+  generator: ({
+    url,
+    pathName,
+    queryString,
+    auth,
+    httpUser,
+    httpPassword,
+    bearerToken,
+    method,
+    rawInput,
+    rawParams,
+    rawRequestBody,
+    contentType,
+    headers,
+  }) => {
+    const requestString = []
+
+    // initial request setup
+    let requestBody = rawInput ? rawParams : rawRequestBody
+    requestBody = JSON.stringify(requestBody)
+      .replace(/^"|"$/g, "")
+      .replace(/\\"/g, '"')
+      .replace(/'/g, "\\'") // Apex uses single quotes for strings
+
+    // create request
+    requestString.push(`HttpRequest request = new HttpRequest();\n`)
+    requestString.push(`request.setMethod('${method}');\n`)
+    requestString.push(`request.setEndpoint('${url}${pathName}${queryString}');\n\n`)
+
+    // authentification
+    if (auth === "Basic Auth") {
+      const basic = `${httpUser}:${httpPassword}`
+      requestString.push(
+        `request.setHeader('Authorization', 'Basic ${window.btoa(
+          unescape(encodeURIComponent(basic))
+        )}');\n`
+      )
+    } else if (auth === "Bearer Token" || auth === "OAuth 2.0") {
+      requestString.push(`request.setHeader('Authorization', 'Bearer ${bearerToken}');\n`)
+    }
+
+    // content type
+    if (contentType) {
+      requestString.push(`request.setHeader('Content-Type', '${contentType}');\n`)
+    }
+
+    // custom headers
+    if (headers) {
+      headers.forEach(({ key, value }) => {
+        if (key) {
+          requestString.push(`request.setHeader('${key}', '${value}');\n`)
+        }
+      })
+    }
+
+    requestString.push(`\n`)
+
+    // set body
+    if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
+      requestString.push(`request.setBody('${requestBody}');\n\n`)
+    }
+
+    // process
+    requestString.push(`try {\n`)
+    requestString.push(`    Http client = new Http();\n`)
+    requestString.push(`    HttpResponse response = client.send(request);\n`)
+    requestString.push(`    System.debug(response.getBody());\n`)
+    requestString.push(`} catch (CalloutException ex) {\n`)
+    requestString.push(`    System.debug('An error occured ' + ex.getMessage());\n`)
+    requestString.push(`}`)
+
+    return requestString.join("")
+  },
+}