Skip to content

Commit bfe0ebb

Browse files
committed
Add asyncEncrypted
1 parent cf27cb7 commit bfe0ebb

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/__tests__/cloudDeviceApi/cloudDeviceAPI.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { connectedDevicesResponse, deviceStatusResponse } from "../../__mocks__/
88
import Client from "../../client";
99
import CloudDeviceAPI, { CLOUD_DEVICE_API_VERSION } from "../../services/cloudDevice/cloudDeviceApi";
1010
import { cloudDevice } from "../../typings";
11+
import { EncryptionCredentialDetails } from "../../security/encryptionCredentialDetails";
1112

1213

1314
let client: Client;
@@ -182,4 +183,25 @@ describe("Cloud device API", (): void => {
182183
expect(response.status).toEqual(cloudDevice.DeviceStatusResponse.StatusEnum.ONLINE);
183184
});
184185

186+
test("should make an encrypted async request", async (): Promise<void> => {
187+
scope.post("/").reply(200, "ok");
188+
const merchantAccount = "TestMerchantAccount";
189+
const deviceId = "AMS1-000168242800763";
190+
191+
const cloudDeviceApiSecuredRequest = createCloudDeviceApiRequest();
192+
193+
const encryptionCredentialDetails: EncryptionCredentialDetails = {
194+
AdyenCryptoVersion: 0,
195+
KeyIdentifier: "CryptoKeyIdentifier12345",
196+
KeyVersion: 0,
197+
Passphrase: "p@ssw0rd123456",
198+
};
199+
200+
const response = await cloudDeviceAPI.asyncEncrypted(merchantAccount, deviceId, cloudDeviceApiSecuredRequest, encryptionCredentialDetails);
201+
202+
expect(response).toBeDefined();
203+
// expect(response.SaleToPOIResponse?.PaymentResponse).toBeDefined();
204+
// expect(response.SaleToPOIResponse?.MessageHeader).toBeDefined();
205+
});
206+
185207
});

src/services/cloudDevice/cloudDeviceApi.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import Client from "../../client";
2222
import getJsonResponse from "../../helpers/getJsonResponse";
2323
import mergeDeep from "../../utils/mergeDeep";
2424
import { ApplicationInfo } from "../../typings/applicationInfo";
25-
import { ObjectSerializer, CloudDeviceApiRequest, CloudDeviceApiResponse, ConnectedDevicesResponse, DeviceStatusResponse } from "../../typings/cloudDevice/models";
25+
import { ObjectSerializer, CloudDeviceApiRequest, CloudDeviceApiResponse, ConnectedDevicesResponse, DeviceStatusResponse, CloudDeviceApiSecuredRequest, CloudDeviceApiSecuredResponse, SaleToPOISecuredMessage } from "../../typings/cloudDevice/models";
2626
import Resource from "../resource";
2727
import { IRequest } from "../../typings/requestOptions";
28+
import NexoSecurityManager from "../../security/nexoSecurityManager";
29+
import { EncryptionCredentialDetails } from "../../security/encryptionCredentialDetails";
2830

2931
// Cloud Device API version
3032
export const CLOUD_DEVICE_API_VERSION = "v1";
@@ -73,6 +75,7 @@ class CloudDeviceAPI extends Service {
7375
const resource = new Resource(this, endpoint);
7476

7577
const request = CloudDeviceAPI.setApplicationInfo(cloudDeviceApiRequest);
78+
7679
// set deviceId
7780
request.SaleToPOIRequest.MessageHeader.POIID = deviceId;
7881

@@ -82,6 +85,55 @@ class CloudDeviceAPI extends Service {
8285
);
8386
}
8487

88+
/**
89+
* Send an asynchronous payment request.
90+
*
91+
* @param merchantAccount - The unique identifier of the merchant account.
92+
* @param deviceId - The unique identifier of the payment device that you send this request to (must match POIID in the MessageHeader).
93+
* @param cloudDeviceApiRequest - The request to send.
94+
* @param encryptionCredentialDetails - The details of the encryption credential used for encrypting the request payload (nexoBlob)
95+
* @returns A promise that resolves to "ok" if the request was successful, or a CloudDeviceApiResponse if there is an error.
96+
*/
97+
public asyncEncrypted(merchantAccount: string, deviceId: string, cloudDeviceApiRequest: CloudDeviceApiRequest, encryptionCredentialDetails: EncryptionCredentialDetails): Promise<string | CloudDeviceApiSecuredResponse> {
98+
const endpoint = this.baseUrl + "/merchants/{merchantAccount}/devices/{deviceId}/async"
99+
.replace("{" + "merchantAccount" + "}", encodeURIComponent(String(merchantAccount)))
100+
.replace("{" + "deviceId" + "}", encodeURIComponent(String(deviceId)));
101+
102+
const resource = new Resource(this, endpoint);
103+
104+
const formattedRequest = ObjectSerializer.serialize(cloudDeviceApiRequest, "CloudDeviceApiRequest");
105+
106+
const saleToPoiSecuredMessage: SaleToPOISecuredMessage = NexoSecurityManager.encrypt(
107+
cloudDeviceApiRequest.SaleToPOIRequest?.MessageHeader,
108+
JSON.stringify(formattedRequest),
109+
encryptionCredentialDetails,
110+
);
111+
112+
const securedPaymentRequest: CloudDeviceApiSecuredRequest = ObjectSerializer.serialize({
113+
SaleToPOIRequest: saleToPoiSecuredMessage,
114+
}, "CloudDeviceApiSecuredRequest");
115+
116+
117+
//const request = CloudDeviceAPI.setApplicationInfo(cloudDeviceApiRequest);
118+
// set deviceId
119+
//request.SaleToPOIRequest.MessageHeader.POIID = deviceId;
120+
121+
const jsonResponse = getJsonResponse<CloudDeviceApiSecuredRequest, CloudDeviceApiSecuredResponse>(
122+
resource,
123+
securedPaymentRequest
124+
);
125+
126+
const cloudDeviceApiSecuredResponse: CloudDeviceApiSecuredResponse =
127+
ObjectSerializer.deserialize(jsonResponse, "CloudDeviceApiSecuredResponse");
128+
129+
const response = NexoSecurityManager.decrypt(
130+
cloudDeviceApiSecuredResponse.SaleToPOIResponse,
131+
encryptionCredentialDetails,
132+
);
133+
return ObjectSerializer.deserialize(JSON.parse(response), "CloudDeviceApiSecuredResponse");
134+
}
135+
136+
85137
/**
86138
* Send a synchronous payment request.
87139
* @param cloudDeviceApiRequest - The request to send.

0 commit comments

Comments
 (0)