· 5 years ago · Feb 16, 2021, 12:44 PM
1/**
2 * Created by catalin.tanasie on 5/16/2018.
3 */
4
5public class HLFISShipmentService {
6 private final static Integer API_CALLS_LIMIT= 2;
7 private static Integer CURRENT_API_CALLS = 0;
8 //Path: /shipment/api/core/v1/shipments
9 public static HLFISShipmentComponents.ShipmentResponse listShipments(HLFISShipmentComponents.ShipmentRequest requestItem, HLFISShipmentComponents.AuthTokenRequest authRequestItem) {
10 System.debug('Starting the call - list shipments');
11 //return HLFISShipmentService.processFISQueryRequest(requestItem, 'shipment/api/core/v1/shipments');
12 //return HLFISShipmentService.processFISQueryRequest(requestItem, authRequestItem, (String.isNotBlank(HLFISShipmentUtils.contextMetadataItemsMap.get('BasePath').keyValue) ? (HLFISShipmentUtils.contextMetadataItemsMap.get('BasePath').keyValue + '/' ) : '') + HLFISShipmentUtils.contextMetadataItemsMap.get('ListShipmentsPath').keyValue, HLFISShipmentUtils.contextMetadataItemsMap.get('GetAuthPath').keyValue);
13 return HLFISShipmentService.processFISQueryRequest(requestItem, authRequestItem, (String.isNotBlank(HLFISShipmentUtils.ConnectionContextItems.HLBasePath__c) ? (HLFISShipmentUtils.ConnectionContextItems.HLBasePath__c + '/' ) : '') + HLFISShipmentUtils.ConnectionContextItems.HLListShipment__c, HLFISShipmentUtils.ConnectionContextItems.HLGetAuthToken__c);
14 }
15 //Path: /shipment/api/core/v1/shipments/{number}
16 public static HLFISShipmentComponents.ShipmentResponse getShipment(HLFISShipmentComponents.ShipmentRequest requestItem, HLFISShipmentComponents.AuthTokenRequest authRequestItem) {
17 //return processFISQueryRequest(null, 'shipment/api/core/v1/shipments/' + shipmentNumber);
18 //return processFISQueryRequest(null, 'shipment/v1/shipments/' + shipmentNumber);
19 /**
20 * @Arne, 20.09.2018 - the shipment number is no longer passed directly in a separate method; a search is made using the previously acquired shipment number
21 * current getShipment() method - to be removed?
22 */
23 //return processFISQueryRequest(requestItem, authRequestItem, (String.isNotBlank(HLFISShipmentUtils.contextMetadataItemsMap.get('BasePath').keyValue) ? (HLFISShipmentUtils.contextMetadataItemsMap.get('BasePath').keyValue + '/' ) : '') + HLFISShipmentUtils.contextMetadataItemsMap.get('GetShipmentPath').keyValue, HLFISShipmentUtils.contextMetadataItemsMap.get('GetAuthPath').keyValue);
24 return processFISQueryRequest(requestItem, authRequestItem, (String.isNotBlank(HLFISShipmentUtils.ConnectionContextItems.HLBasePath__c) ? (HLFISShipmentUtils.ConnectionContextItems.HLBasePath__c + '/' ) : '') + HLFISShipmentUtils.ConnectionContextItems.HLGetShipment__c, HLFISShipmentUtils.ConnectionContextItems.HLGetAuthToken__c);
25 }
26
27 private static HLFISShipmentComponents.ShipmentResponse processFISQueryRequest(HLFISShipmentComponents.ShipmentRequest requestItem, HLFISShipmentComponents.AuthTokenRequest authRequestItem, String path, String authPath) {
28 HLFISShipmentComponents.ShipmentResponse shipmentResponseItem = new HLFISShipmentComponents.ShipmentResponse();
29 //test the type of request filter sent
30 //acquire request type - let's start with shipmentNumber
31 try {
32 System.debug('Current API calls: ' + CURRENT_API_CALLS);
33 String currentAuthorizationToken;
34 if (Cache.Session.contains('local.HLPartition1.FISToken')) {
35 currentAuthorizationToken = (String)Cache.Session.get('local.HLPartition1.FISToken');
36 }
37 //String currentAuthorizationToken = HLFISShipmentUtils.getCurrentUserAuthorizationToken();;
38 //if (String.isNotBlank(currentAuthorizationToken)) {
39 Http fisServiceClient = new Http();
40 HttpRequest fisServiceRequest = new HttpRequest();
41
42 //at least encode the value (though it could be problematic due to the SSO config for ADFS)
43 //fisServiceRequest.setHeader('Authorization', String.isNotBlank(HLFISShipmentUtils.contextMetadataItemsMap.get('UseUpperCase').keyValue) && Boolean.valueOf(HLFISShipmentUtils.contextMetadataItemsMap.get('UseUpperCase').keyValue) == true ? currentAuthorizationToken.toUpperCase() : currentAuthorizationToken);
44 fisServiceRequest.setHeader('Authorization', 'Bearer ' + currentAuthorizationToken);
45 fisServiceRequest.setHeader('Content-Type', 'application/json');
46 fisServiceRequest.setHeader('Accept', 'application/json');
47 //the consumer key and secret are stored in a Base64-encoded format and must be decoded
48 //fisServiceRequest.setHeader(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerId').keyName, EncodingUtil.base64Decode(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerId').keyValue).toString());
49 fisServiceRequest.setHeader(HLFISShipmentUtils.ConnectionContextItems.HLClientIdKey__c, EncodingUtil.base64Decode(HLFISShipmentUtils.ConnectionContextItems.HLEncodedClientId__c).toString());
50 //fisServiceRequest.setHeader(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerSecret').keyName, EncodingUtil.base64Decode(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerSecret').keyValue).toString());
51 fisServiceRequest.setHeader(HLFISShipmentUtils.ConnectionContextItems.HLClientSecretKey__c, EncodingUtil.base64Decode(HLFISShipmentUtils.ConnectionContextItems.HLEncodedClientSecret__c).toString());
52
53 fisServiceRequest.setEndpoint(HLFISShipmentUtils.appendQueryParametersToRequestURL(HLFISShipmentUtils.ConnectionContextItems.HLNamedCredentials__c + path, requestItem));
54 fisServiceRequest.setMethod('GET');
55 //set the maximum timeout
56 fisServiceRequest.setTimeout(10000);
57 //call the FIS WS
58 System.debug('### Request endpoint: ' + fisServiceRequest.getEndpoint());
59 System.debug('### Request: ' + fisServiceRequest);
60
61 HttpResponse fisServiceResponse = fisServiceClient.send(fisServiceRequest);
62 CURRENT_API_CALLS++;
63 System.debug('### Response: ' + fisServiceResponse);
64 System.assertEquals(false, fisServiceResponse == null);
65 //parse the response
66 System.debug('### The raw FIS WS response message is:' + fisServiceResponse);
67 if (fisServiceResponse.getStatusCode() == 200) {
68 System.debug('### FIS response body is ' + fisServiceResponse.getBody());
69
70 List<HLFISShipmentComponents.Shipment> responseSHItems = (List<HLFISShipmentComponents.Shipment>)JSON.deserialize(fisServiceResponse.getBody(), List<HLFISShipmentComponents.Shipment>.class);
71 System.debug(responseSHItems);
72 if (responseSHItems != null) {
73 shipmentResponseItem.shipmentItems = responseSHItems;
74 }
75 else {
76 shipmentResponseItem.shipmentItems = new List<HLFISShipmentComponents.Shipment>();
77 }
78 } else if(fisServiceResponse.getStatusCode() == 401){
79 System.debug('Unauthorized!!');
80 Http fisServiceAuthClient = new Http();
81 HttpRequest fisServiceAuthRequest = new HttpRequest();
82 //fisServiceAuthRequest.setHeader(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerId').keyName, EncodingUtil.base64Decode(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerId').keyValue).toString());
83 fisServiceAuthRequest.setHeader(HLFISShipmentUtils.ConnectionContextItems.HLClientIdKey__c, EncodingUtil.base64Decode(HLFISShipmentUtils.ConnectionContextItems.HLEncodedClientId__c).toString());
84 //fisServiceAuthRequest.setHeader(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerSecret').keyName, EncodingUtil.base64Decode(HLFISShipmentUtils.contextMetadataItemsMap.get('ConsumerSecret').keyValue).toString());
85 fisServiceAuthRequest.setHeader(HLFISShipmentUtils.ConnectionContextItems.HLClientSecretKey__c, EncodingUtil.base64Decode(HLFISShipmentUtils.ConnectionContextItems.HLEncodedClientSecret__c).toString());
86 fisServiceAuthRequest.setHeader('Content-Type', 'application/json');
87 fisServiceAuthRequest.setHeader('Accept', 'application/json');
88
89 fisServiceAuthRequest.setEndpoint('callout:HLAPIServiceTest/' + authPath);
90
91 System.debug('authRequestItem serialized:');
92 System.debug(JSON.serialize(authRequestItem));
93
94 fisServiceAuthRequest.setBody(JSON.serialize(authRequestItem));
95 fisServiceAuthRequest.setMethod('POST');
96 fisServiceAuthRequest.setTimeout(10000);
97
98 //authenticate
99
100 //call the FIS WS
101 System.debug('### Authentication Request endpoint: ' + fisServiceAuthRequest.getEndpoint());
102 System.debug('### Authentication Request: ' + fisServiceAuthRequest);
103 HttpResponse fisAuthResponse = fisServiceAuthClient.send(fisServiceAuthRequest);
104 System.debug('### Authentication Response: ' + fisAuthResponse);
105
106 if(fisAuthResponse.getStatusCode() == 200){
107 System.debug('Authorization successful!');
108 HLFISShipmentComponents.AuthTokenResponse authTokenResponse = (HLFISShipmentComponents.AuthTokenResponse)JSON.deserialize(fisAuthResponse.getBody(), HLFISShipmentComponents.AuthTokenResponse.class);
109 System.debug('Current token deserialized: ' + authTokenResponse.token);
110
111 Cache.Session.put('local.HLPartition1.FISToken', authTokenResponse.token);
112
113 if(CURRENT_API_CALLS < API_CALLS_LIMIT){
114 System.debug('Querying FIS after authorization with a new authorization token.');
115 CURRENT_API_CALLS++;
116 shipmentResponseItem = processFISQueryRequest(requestItem, authRequestItem, path, authPath);
117 }
118 //TODO: Store token to cache make another fis call with the new token
119 } else {
120 System.debug('Authorization error');
121 //parse technical error
122 shipmentResponseItem.error = (HLFISShipmentComponents.Error)JSON.deserialize(fisServiceResponse.getBody(), HLFISShipmentComponents.Error.class);
123 }
124 } else {
125 //parse technical error
126 shipmentResponseItem.error = (HLFISShipmentComponents.Error)JSON.deserialize(fisServiceResponse.getBody(), HLFISShipmentComponents.Error.class);
127 }
128 //}
129 }
130 catch (Exception e) {
131 System.debug('### Error while consuming FIS Query Service: ' + e.getMessage());
132 }
133 return shipmentResponseItem;
134 }
135}