Skip to content
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ jest.mock('ssh2-sftp-client', () => {
return jest.fn(() => sftpClient)
})

jest.mock('../audienceEnteredSftp/sftp', () => ({
...jest.requireActual('../audienceEnteredSftp/sftp'),
testAuthenticationSFTP: jest.fn().mockResolvedValue(true)
}))

describe(`Testing snapshot for ${destinationSlug}'s audienceEnteredS3 destination action:`, () => {
const actionSlug = 'audienceEnteredS3'
const seedName = `${destinationSlug}#${actionSlug}`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ActionDefinition, PayloadValidationError } from '@segment/actions-core'
import { uploadSFTP, validateSFTP, Client as ClientSFTP } from './sftp'
import { ActionDefinition, InvalidAuthenticationError, PayloadValidationError } from '@segment/actions-core'
import { uploadSFTP, validateSFTP, Client as ClientSFTP, testAuthenticationSFTP } from './sftp'
import { generateFile } from '../operations'
import { sendEventToAWS } from '../awsClient'
import { LIVERAMP_MIN_RECORD_COUNT, LIVERAMP_LEGACY_FLOW_FLAG_NAME } from '../properties'
import { LIVERAMP_LEGACY_FLOW_FLAG_NAME, LIVERAMP_MIN_RECORD_COUNT } from '../properties'

import type { Settings } from '../generated-types'
import type { Payload } from './generated-types'
Expand Down Expand Up @@ -87,35 +87,57 @@ const action: ActionDefinition<Settings, Payload> = {
},
perform: async (
request,
{ payload, features, rawData, subscriptionMetadata }: ExecuteInputRaw<Settings, Payload, RawData>
{ payload, features, rawData, subscriptionMetadata, settings }: ExecuteInputRaw<Settings, Payload, RawData>
) => {
return processData(
{
request,
payloads: [payload],
features,
rawData: rawData ? [rawData] : []
rawData: rawData ? [rawData] : [],
settings
},
subscriptionMetadata
)
},
performBatch: (
request,
{ payload, features, rawData, subscriptionMetadata }: ExecuteInputRaw<Settings, Payload[], RawData[]>
{ payload, features, rawData, subscriptionMetadata, settings }: ExecuteInputRaw<Settings, Payload[], RawData[]>
) => {
return processData(
{
request,
payloads: payload,
features,
rawData
rawData,
settings
},
subscriptionMetadata
)
}
}

async function processData(input: ProcessDataInput<Payload>, subscriptionMetadata?: SubscriptionMetadata) {
// Check if this request is from the event tester first
if (input.settings && input.settings.__segment_internal_from_event_tester === true) {
try {
// Create a new SFTP client for authentication
const authSftpClient = new ClientSFTP()
await testAuthenticationSFTP(authSftpClient, input.payloads[0])

// Return early with a validation-only response
return {
status: 200,
data: {
message:
'SFTP credentials validated successfully. Event not delivered as this is a validation-only request from the event tester.'
}
}
} catch (error) {
throw new InvalidAuthenticationError(`SFTP authentication failed: ${error.message}`)
}
}

if (input.payloads.length < LIVERAMP_MIN_RECORD_COUNT) {
throw new PayloadValidationError(
`received payload count below LiveRamp's ingestion limits. expected: >=${LIVERAMP_MIN_RECORD_COUNT} actual: ${input.payloads.length}`
Expand All @@ -130,8 +152,10 @@ async function processData(input: ProcessDataInput<Payload>, subscriptionMetadat
//------------
// LEGACY FLOW
// -----------
const sftpClient = new ClientSFTP()
return uploadSFTP(sftpClient, input.payloads[0], filename, fileContents)

// Create a new SFTP client for the actual upload operation
const uploadSftpClient = new ClientSFTP()
return uploadSFTP(uploadSftpClient, input.payloads[0], filename, fileContents)
} else {
//------------
// AWS FLOW
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ const destination: DestinationDefinition<Settings> = {
type: 'boolean',
required: true,
default: true
},
__segment_internal_from_event_tester: {
label: 'From Event Tester',
description: 'Flag to indicate if the request is coming from the event tester',
type: 'boolean',
required: true,
default: false
}
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { RequestClient, ExecuteInput } from '@segment/actions-core'
import type { Payload as s3Payload } from './audienceEnteredS3/generated-types'
import type { Payload as sftpPayload } from './audienceEnteredSftp/generated-types'
import type { Settings } from './generated-types'
import { processHashing } from '../../lib/hashing-utils'

// Type definitions
Expand All @@ -19,6 +20,7 @@ export type ProcessDataInput<T extends s3Payload | sftpPayload> = {
payloads: T[]
features?: Record<string, boolean>
rawData?: RawData[]
settings?: Settings
}

export type ExecuteInputRaw<Settings, Payload, RawData, AudienceSettings = unknown> = ExecuteInput<
Expand Down