Skip to content

Commit

Permalink
feat: update google_cloud_function implementation as per custom desti…
Browse files Browse the repository at this point in the history
…nation (#2652)

* feat: update google_cloud_function implementation as per custom destination flow

* fix: remove old test suit
  • Loading branch information
ujjwal-ab authored Sep 25, 2023
1 parent c200ef5 commit 5c981e1
Show file tree
Hide file tree
Showing 8 changed files with 850 additions and 312 deletions.
7 changes: 0 additions & 7 deletions src/v0/destinations/google_cloud_function/config.js

This file was deleted.

16 changes: 3 additions & 13 deletions src/v0/destinations/google_cloud_function/transform.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,19 @@
const _ = require('lodash');
const {
defaultRequestConfig,
defaultPostRequestConfig,
getSuccessRespEvents,
checkInvalidRtTfEvents,
handleRtTfSingleEventError,
} = require('../../util');

const { generateBatchedPayload, validateDestinationConfig, addHeader } = require('./util');
const { generateBatchedPayload, validateDestinationConfig } = require('./util');

// Main process Function to handle transformation
function process(event) {
const { message, destination } = event;
const { googleCloudFunctionUrl } = destination.Config;

// Config Validation
validateDestinationConfig(destination);

const response = defaultRequestConfig();
// adding header
addHeader(response, destination.Config);
response.method = defaultPostRequestConfig.requestMethod;
response.body.JSON = message;
response.endpoint = googleCloudFunctionUrl;

const response = message;
return response;
}

Expand All @@ -37,7 +27,7 @@ function batchEvents(successRespList, maxBatchSize = 10) {
const batchEventResponse = generateBatchedPayload(chunk);
batchedResponseList.push(
getSuccessRespEvents(
batchEventResponse.batchedRequest,
batchEventResponse.message,
batchEventResponse.metadata,
batchEventResponse.destination,
true,
Expand Down
50 changes: 10 additions & 40 deletions src/v0/destinations/google_cloud_function/util.js
Original file line number Diff line number Diff line change
@@ -1,77 +1,47 @@
const { defaultBatchRequestConfig } = require('../../util');
const { JSON_MIME_TYPE } = require('../../util/constant');
const { ConfigurationError } = require('../../util/errorTypes');

const { TRIGGERTYPE } = require('./config');

/**
* validate destination config
* @param {*} param0
*/
const validateDestinationConfig = ({ Config }) => {
// throw error if google Cloud Function is not provided
// throw error if google Cloud Function URL is not provided
if (!Config.googleCloudFunctionUrl) {
throw new ConfigurationError('[GCF]:: Url not found. Aborting');
}
if (
Config.triggerType === 'https' && // for triggerType https gcloud Authorization is mandatory
!Config.gcloudAuthorization
) {
throw new ConfigurationError('[GCF]:: Access Token not found. Aborting');
if (Config.requireAuthentication && !Config.credentials) {
throw new ConfigurationError(
'[GCF]:: Service Account credentials are required if your function required authentication. Aborting',
);
}
};

/**
* add headers in the payload that is provided in destination config
* @param {*} response
* @param {*} Config
*/
function addHeader(response, Config) {
const { triggerType, apiKeyId, gcloudAuthorization } = Config;

response.headers = { 'content-type': JSON_MIME_TYPE };
if (apiKeyId) {
const basicAuth = Buffer.from(`apiKey:${apiKeyId}`).toString('base64');
response.headers.ApiKey = `Basic ${basicAuth}`;
}
if (TRIGGERTYPE.HTTPS === triggerType.toLowerCase()) {
response.headers.Authorization = `bearer ${gcloudAuthorization}`;
}
}

/**
* Create GoogleCloudFunction Batch payload based on the passed events
* @param {*} events
* @returns
*/

function generateBatchedPayload(events) {
const batchResponseList = [];
const metadata = [];
// extracting destination
// from the first event in a batch
const { destination } = events[0];
const { googleCloudFunctionUrl } = destination.Config;
let batchEventResponse = defaultBatchRequestConfig();
let batchEventResponse = events.map((event) => event.message);
// Batch event into dest batch structure
events.forEach((ev) => {
batchResponseList.push(ev.message.body.JSON);
// batchResponseList.push(ev.message.body.JSON);
metadata.push(ev.metadata);
});
batchEventResponse.batchedRequest.body.JSON_ARRAY = {
batch: JSON.stringify(batchResponseList),
};
batchEventResponse.batchedRequest.endpoint = googleCloudFunctionUrl;
addHeader(batchEventResponse.batchedRequest, destination.Config);
batchEventResponse = {
...batchEventResponse,
metadata,
message: batchEventResponse,
destination,
metadata,
};
return batchEventResponse;
}

module.exports = {
validateDestinationConfig,
addHeader,
generateBatchedPayload,
};
170 changes: 0 additions & 170 deletions test/__tests__/data/google_cloud_function_router_input.json

This file was deleted.

55 changes: 0 additions & 55 deletions test/__tests__/data/google_cloud_function_router_output.json

This file was deleted.

27 changes: 0 additions & 27 deletions test/__tests__/google_cloud_function.test.js

This file was deleted.

Loading

0 comments on commit 5c981e1

Please sign in to comment.