Skip to content

Commit

Permalink
DEVEXP-375: Enhance DX for ttl field in SendMessageRequest (#56)
Browse files Browse the repository at this point in the history
  • Loading branch information
asein-sinch authored Apr 11, 2024
1 parent 2f42625 commit 1cd8b4b
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 6 deletions.
1 change: 1 addition & 0 deletions examples/simple-examples/src/conversation/messages/send.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { getAppIdFromConfig, getContactIdFromConfig, initConversationService, pr
queue: 'HIGH_PRIORITY',
processing_strategy: 'DEFAULT',
channel_priority_order: ['MESSENGER'],
ttl: 60,
},
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export class ConversationEventService {
contact_id: message.contact_id!,
},
message: this.buildContactMessage(contactMessage),
ttl: '5s',
ttl: 5,
channel_properties: {
MESSENGER_NOTIFICATION_TYPE: 'NO_PUSH',
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,13 @@ export interface SendMessageRequestBase<T extends Recipient> {
queue?: MessageQueue;
/** @see Recipient */
recipient: T;
/** The timeout allotted for sending the message, expressed in seconds. Passed to channels which support it and emulated by the Conversation API for channels without ttl support but with message retract/unsend functionality. Channel failover will not be performed for messages with an expired TTL. The format is an integer with the suffix `s` (for seconds). Valid integer range is 3 to 315,576,000,000 (inclusive). Example values include `10s` (10 seconds) and `86400s` (24 hours). */
ttl?: string;
/** Overrides the app\'s [Processing Mode](../../../../../conversation/processing-modes/). Default value is `DEFAULT`. */
/** The timeout allotted for sending the message, expressed in seconds. Passed to channels which support it and emulated by the Conversation API for channels without ttl support but with message retract/unsend functionality. Channel failover will not be performed for messages with an expired TTL.
*
* The format is an integer with the suffix `s` (for seconds). Valid integer range is 3 to 315,576,000,000 (inclusive). Example values include `10s` (10 seconds) and `86400s` (24 hours).
* The SDK will take care of the formatting: example of valid input for 10 seconds: 10 (number), "10" (string), "10s" (string)
*/
ttl?: string | number;
/** Overrides the app's [Processing Mode](../../../../../conversation/processing-modes/). Default value is `DEFAULT`. */
processing_strategy?: ProcessingStrategy;
/** An arbitrary identifier that will be propagated to callbacks related to this message, including MO replies. Only applicable to messages sent with the `CONVERSATION` processing mode. Up to 128 characters long. */
correlation_id?: string;
Expand Down
21 changes: 19 additions & 2 deletions packages/conversation/src/rest/v1/messages/messages-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,11 @@ export class MessagesApi extends ConversationDomainApi {
'Accept': 'application/json',
};

const body: RequestBody = data['sendMessageRequestBody']
? JSON.stringify(data['sendMessageRequestBody'])
// Special fields handling: see method for details
const requestDataBody = this.performSendMessageRequestBodyTransformation(data.sendMessageRequestBody);

const body: RequestBody = requestDataBody
? JSON.stringify(requestDataBody)
: '{}';
const basePathUrl = `${this.client.apiClientOptions.hostname}/v1/projects/${this.client.apiClientOptions.projectId}/messages:send`;

Expand All @@ -377,6 +380,20 @@ export class MessagesApi extends ConversationDomainApi {
});
}

performSendMessageRequestBodyTransformation(
body: SendMessageRequest<Recipient>

Check warning on line 384 in packages/conversation/src/rest/v1/messages/messages-api.ts

View workflow job for this annotation

GitHub Actions / build (18.x)

Missing trailing comma

Check warning on line 384 in packages/conversation/src/rest/v1/messages/messages-api.ts

View workflow job for this annotation

GitHub Actions / build (20.x)

Missing trailing comma
): SendMessageRequest<Recipient> {
const requestDataBody = { ...body };
// 'ttl' field can be a number or a string and needs to be formatted as for instance "10s" to be accepted by the server
if (typeof requestDataBody.ttl === 'number') {
requestDataBody.ttl = requestDataBody.ttl.toString();
}
if (typeof requestDataBody.ttl === 'string' && !requestDataBody.ttl.endsWith('s')) {
requestDataBody.ttl = requestDataBody.ttl + 's';
}
return requestDataBody;
}

/**
* Update message metadata
* Update a specific message metadata by its ID.
Expand Down
16 changes: 16 additions & 0 deletions packages/conversation/tests/rest/v1/messages/messages-api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,22 @@ describe('MessagesApi', () => {
expect(response).toEqual(expectedResponse);
expect(fixture.send).toHaveBeenCalledWith(requestData);
});

it('should format the ttl field', () => {
const requestBody: SendMessageRequest<Recipient> = {
...sendMessageRequest,
...recipientContactId,
};
requestBody.ttl = 20;
let formattedBody = messagesApi.performSendMessageRequestBodyTransformation(requestBody);
expect(formattedBody.ttl).toBe('20s');
requestBody.ttl = '20';
formattedBody = messagesApi.performSendMessageRequestBodyTransformation(requestBody);
expect(formattedBody.ttl).toBe('20s');
requestBody.ttl = '20s';
formattedBody = messagesApi.performSendMessageRequestBodyTransformation(requestBody);
expect(formattedBody.ttl).toBe('20s');
});
});

describe ('sendCardMessage', () => {
Expand Down

0 comments on commit 1cd8b4b

Please sign in to comment.