-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathDocScanClient.java
310 lines (273 loc) · 12 KB
/
DocScanClient.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
package com.yoti.api.client.docs;
import static com.yoti.api.client.spi.remote.util.Validation.notNull;
import static com.yoti.api.client.spi.remote.util.Validation.notNullOrEmpty;
import java.io.IOException;
import java.security.KeyPair;
import java.security.Security;
import java.util.List;
import com.yoti.api.client.InitialisationException;
import com.yoti.api.client.KeyPairSource;
import com.yoti.api.client.Media;
import com.yoti.api.client.docs.session.create.CreateSessionResult;
import com.yoti.api.client.docs.session.create.SessionSpec;
import com.yoti.api.client.docs.session.create.facecapture.CreateFaceCaptureResourcePayload;
import com.yoti.api.client.docs.session.create.facecapture.UploadFaceCaptureImagePayload;
import com.yoti.api.client.docs.session.devicemetadata.MetadataResponse;
import com.yoti.api.client.docs.session.instructions.Instructions;
import com.yoti.api.client.docs.session.retrieve.CreateFaceCaptureResourceResponse;
import com.yoti.api.client.docs.session.retrieve.GetSessionResult;
import com.yoti.api.client.docs.session.retrieve.configuration.SessionConfigurationResponse;
import com.yoti.api.client.docs.session.retrieve.instructions.ContactProfileResponse;
import com.yoti.api.client.docs.session.retrieve.instructions.InstructionsResponse;
import com.yoti.api.client.docs.support.SupportedDocumentsResponse;
import com.yoti.api.client.spi.remote.KeyStreamVisitor;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Client used for communication with the Yoti Doc Scan service
* <p>
* The {@code DocScanClient} facilitates requests to the Yoti Doc Scan service
*/
public class DocScanClient {
private static final Logger LOG = LoggerFactory.getLogger(DocScanClient.class);
static {
Security.addProvider(new BouncyCastleProvider());
}
private final String sdkId;
private final KeyPair keyPair;
private final DocScanService docScanService;
DocScanClient(final String sdkId,
final KeyPairSource keyPairSource,
DocScanService docScanService) {
this.sdkId = sdkId;
this.keyPair = loadKeyPair(keyPairSource);
this.docScanService = docScanService;
}
public static DocScanClient.Builder builder() {
return new DocScanClient.Builder();
}
/**
* Creates a Doc Scan session using the supplied session specification
*
* @param sessionSpec the Doc Scan session specification
* @return {@link CreateSessionResult} the session creation result
* @throws DocScanException if an error has occurred
*/
public CreateSessionResult createSession(SessionSpec sessionSpec) throws DocScanException {
LOG.debug("Creating a YotiDocs session...");
return docScanService.createSession(sdkId, keyPair, sessionSpec);
}
/**
* Retrieves the state of a previously created Yoti Doc Scan session
*
* @param sessionId the session ID
* @return {@link GetSessionResult} the session state
* @throws DocScanException if an error has occurred
*/
public GetSessionResult getSession(String sessionId) throws DocScanException {
LOG.debug("Retrieving session '{}'", sessionId);
return docScanService.retrieveSession(sdkId, keyPair, sessionId);
}
/**
* Deletes a previously created Yoti Doc Scan session and all
* of its related resources
*
* @param sessionId the session ID
* @throws DocScanException if an error has occurred
*/
public void deleteSession(String sessionId) throws DocScanException {
LOG.debug("Deleting session '{}'", sessionId);
docScanService.deleteSession(sdkId, keyPair, sessionId);
}
/**
* Retrieves media related to a Yoti Doc Scan session based
* on the supplied media ID
*
* @param sessionId the session ID
* @param mediaId the media ID
* @return {@link Media} the media
* @throws DocScanException if an error has occurred
*/
public Media getMediaContent(String sessionId, String mediaId) throws DocScanException {
LOG.debug("Retrieving media content '{}' in session '{}'", mediaId, sessionId);
return docScanService.getMediaContent(sdkId, keyPair, sessionId, mediaId);
}
/**
* Deletes media related to a Yoti Doc Scan session based
* on the supplied media ID
*
* @param sessionId the session ID
* @param mediaId the media ID
* @throws DocScanException if an error has occurred
*/
public void deleteMediaContent(String sessionId, String mediaId) throws DocScanException {
LOG.debug("Deleting media content '{}' in session '{}'", mediaId, sessionId);
docScanService.deleteMediaContent(sdkId, keyPair, sessionId, mediaId);
}
/**
* Sets the IBV instructions for the given session
*
* @param sessionId the session ID
* @param instructions the instructions
* @throws DocScanException if an error has occurred
*/
public void putIbvInstructions(String sessionId, Instructions instructions) throws DocScanException {
LOG.debug("Setting IBV instructions for session '{}'", sessionId);
docScanService.putIbvInstructions(sdkId, keyPair, sessionId, instructions);
}
/**
* Fetches the instructions PDF associated with an In-Branch Verification session.
*
* @param sessionId the sessionID
* @return the PDF media
* @throws DocScanException if an error has occurred
*/
public Media getIbvInstructionsPdf(String sessionId) throws DocScanException {
LOG.debug("Retrieving IBV instructions PDF in session '{}'", sessionId);
return docScanService.getIbvInstructionsPdf(sdkId, keyPair, sessionId);
}
/**
* Fetches the associated instructions contact profile for the given In-Branch Verification session
*
* @param sessionId the session ID
* @return the contact profile
* @throws DocScanException if an error has occurred
*/
public ContactProfileResponse fetchInstructionsContactProfile(String sessionId) throws DocScanException {
LOG.debug("Fetching instructions contact profile in session '{}'", sessionId);
return docScanService.fetchInstructionsContactProfile(sdkId, keyPair, sessionId);
}
/**
* Creates a Face Capture resource, that will be linked using
* the supplied requirement ID
*
* @param sessionId the session ID
* @param createFaceCaptureResourcePayload the {@link CreateFaceCaptureResourcePayload}
* @return the response
* @throws DocScanException if an error has occurred
*/
public CreateFaceCaptureResourceResponse createFaceCaptureResource(String sessionId, CreateFaceCaptureResourcePayload createFaceCaptureResourcePayload) throws DocScanException {
LOG.debug("Creating Face Capture resource in session '{}' for requirement '{}'", sessionId, createFaceCaptureResourcePayload.getRequirementId());
return docScanService.createFaceCaptureResource(sdkId, keyPair, sessionId, createFaceCaptureResourcePayload);
}
/**
* Uploads an image to the specified Face Capture resource
*
* @param sessionId the session ID
* @param uploadFaceCaptureImagePayload the Face Capture image payload
* @throws DocScanException if an error has occurred
*/
public void uploadFaceCaptureImage(String sessionId, String resourceId, UploadFaceCaptureImagePayload uploadFaceCaptureImagePayload) throws DocScanException {
LOG.debug("Uploading image to Face Capture resource '{}' for session '{}'", resourceId, sessionId);
docScanService.uploadFaceCaptureImage(sdkId, keyPair, sessionId, resourceId, uploadFaceCaptureImagePayload);
}
/**
* Gets a list of supported documents.
*
* @param includeNonLatin the includeNonLatin flag
* @return the supported documents
* @throws DocScanException if an error has occurred
*/
public SupportedDocumentsResponse getSupportedDocuments(boolean includeNonLatin) throws DocScanException {
LOG.debug("Getting all supported documents");
return docScanService.getSupportedDocuments(keyPair, includeNonLatin);
}
/**
* Gets a list of supported documents only with latin documents.
*
* @return the supported documents
* @throws DocScanException if an error has occurred
*/
public SupportedDocumentsResponse getSupportedDocuments() throws DocScanException {
return getSupportedDocuments(false);
}
/**
* Fetches any currently set instructions for an IBV session.
*
* @return the instructions
* @throws DocScanException if an error has occurred
*/
public InstructionsResponse getIbvInstructions(String sessionId) throws DocScanException {
LOG.debug("Fetching instructions for session '{}'", sessionId);
return docScanService.getIbvInstructions(sdkId, keyPair, sessionId);
}
/**
* Triggers an email notification for the IBV instructions at-home flow.
* This will be one of:
* - an email sent directly to the end user, using the email provided in the ContactProfile
* - if requested, a backend notification using the configured notification endpoint
*
* @param sessionId the session ID
* @throws DocScanException if an error has occurred
*/
public void triggerIbvEmailNotification(String sessionId) throws DocScanException {
LOG.debug("Triggering IBV email notification for session '{}'", sessionId);
docScanService.triggerIbvEmailNotification(sdkId, keyPair, sessionId);
}
/**
* Fetches the configuration for the given sessionID.
*
* @param sessionId the session ID
*
* @return the session configuration
* @throws DocScanException if an error has occurred
*/
public SessionConfigurationResponse getSessionConfiguration(String sessionId) throws DocScanException {
LOG.debug("Fetching configuration for session '{}'", sessionId);
return docScanService.fetchSessionConfiguration(sdkId, keyPair, sessionId);
}
/**
* Fetches details of the devices tracked at key points in completing the session.
*
* @param sessionId the session ID
*
* @return the list of tracked devices information
* @throws DocScanException if an error has occurred
*/
public List<MetadataResponse> getTrackedDevices(String sessionId) throws DocScanException {
LOG.debug("Fetching tracked devices for session '{}'", sessionId);
return docScanService.getTrackedDevices(sdkId, keyPair, sessionId);
}
/**
* Deletes the tracked devices metadata for the given sessionID.
*
* @param sessionId the session ID
*
* @throws DocScanException if an error has occurred
*/
public void deleteTrackedDevices(String sessionId) throws DocScanException {
LOG.debug("Deleting tracked devices for session '{}'", sessionId);
docScanService.deleteTrackedDevices(sdkId, keyPair, sessionId);
}
private KeyPair loadKeyPair(KeyPairSource kpSource) throws InitialisationException {
try {
LOG.debug("Loading key pair from '{}'", kpSource);
return kpSource.getFromStream(new KeyStreamVisitor());
} catch (IOException e) {
throw new InitialisationException("Cannot load key pair", e);
}
}
public static class Builder {
private static final DocScanService docScanService = DocScanService.newInstance();
private String sdkId;
private KeyPairSource keyPairSource;
public Builder withClientSdkId(String sdkId) {
this.sdkId = sdkId;
return this;
}
public Builder withKeyPairSource(KeyPairSource kps) {
this.keyPairSource = kps;
return this;
}
public DocScanClient build() {
notNullOrEmpty(sdkId, "SDK ID");
notNull(keyPairSource, "Application key Pair");
return new DocScanClient(
sdkId,
keyPairSource,
docScanService
);
}
}
}