|
17 | 17 | import com.skyflow.vault.data.ErrorRecord; |
18 | 18 | import com.skyflow.vault.data.Success; |
19 | 19 | import com.skyflow.vault.data.Token; |
| 20 | +import com.skyflow.vault.data.DeleteTokensResponse; |
| 21 | +import com.skyflow.vault.data.DeleteTokensSuccess; |
| 22 | +import com.skyflow.vault.data.TokenizeResponse; |
| 23 | +import com.skyflow.vault.data.TokenizeSuccess; |
20 | 24 | import io.github.cdimascio.dotenv.Dotenv; |
21 | 25 | import io.github.cdimascio.dotenv.DotenvException; |
22 | 26 |
|
@@ -282,4 +286,215 @@ public static boolean isValidURL(String url) { |
282 | 286 | return parsedUrl.getHost() != null && !parsedUrl.getHost().isEmpty(); |
283 | 287 | } |
284 | 288 | } |
| 289 | + |
| 290 | + public static List<com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest> createDeleteTokensBatches( |
| 291 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest request, int batchSize) { |
| 292 | + List<com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest> batches = new ArrayList<>(); |
| 293 | + List<String> tokens = request.getTokens().get(); |
| 294 | + for (int i = 0; i < tokens.size(); i += batchSize) { |
| 295 | + List<String> batchTokens = tokens.subList(i, Math.min(i + batchSize, tokens.size())); |
| 296 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batchRequest = |
| 297 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder() |
| 298 | + .vaultId(request.getVaultId()) |
| 299 | + .tokens(new ArrayList<>(batchTokens)) |
| 300 | + .build(); |
| 301 | + batches.add(batchRequest); |
| 302 | + } |
| 303 | + return batches; |
| 304 | + } |
| 305 | + |
| 306 | + public static List<ErrorRecord> handleDeleteTokensBatchException( |
| 307 | + Throwable ex, |
| 308 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batch, |
| 309 | + int batchNumber, int batchSize |
| 310 | + ) { |
| 311 | + List<ErrorRecord> errorRecords = new ArrayList<>(); |
| 312 | + Throwable cause = ex.getCause(); |
| 313 | + if (cause instanceof ApiClientApiException) { |
| 314 | + ApiClientApiException apiException = (ApiClientApiException) cause; |
| 315 | + Map<String, Object> responseBody = (Map<String, Object>) apiException.body(); |
| 316 | + int indexNumber = batchNumber * batchSize; |
| 317 | + if (responseBody != null) { |
| 318 | + if (responseBody.containsKey("tokens")) { |
| 319 | + Object tokensList = responseBody.get("tokens"); |
| 320 | + if (tokensList instanceof List) { |
| 321 | + List<?> recordsList = (List<?>) tokensList; |
| 322 | + for (Object record : recordsList) { |
| 323 | + if (record instanceof Map) { |
| 324 | + Map<String, Object> recordMap = (Map<String, Object>) record; |
| 325 | + ErrorRecord err = Utils.createErrorRecord(recordMap, indexNumber); |
| 326 | + errorRecords.add(err); |
| 327 | + indexNumber++; |
| 328 | + } |
| 329 | + } |
| 330 | + } |
| 331 | + } else if (responseBody.containsKey("error")) { |
| 332 | + Map<String, Object> recordMap = (Map<String, Object>) responseBody.get("error"); |
| 333 | + for (int j = 0; j < batch.getTokens().get().size(); j++) { |
| 334 | + ErrorRecord err = Utils.createErrorRecord(recordMap, indexNumber); |
| 335 | + errorRecords.add(err); |
| 336 | + indexNumber++; |
| 337 | + } |
| 338 | + } |
| 339 | + } |
| 340 | + } else { |
| 341 | + int indexNumber = batchNumber * batchSize; |
| 342 | + for (int j = 0; j < batch.getTokens().get().size(); j++) { |
| 343 | + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); |
| 344 | + errorRecords.add(err); |
| 345 | + indexNumber++; |
| 346 | + } |
| 347 | + } |
| 348 | + return errorRecords; |
| 349 | + } |
| 350 | + |
| 351 | + public static DeleteTokensResponse formatDeleteTokensResponse( |
| 352 | + com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse response, int batch, int batchSize) { |
| 353 | + if (response != null && response.getTokens().isPresent()) { |
| 354 | + List<com.skyflow.generated.rest.types.V1DeleteTokenResponseObject> records = response.getTokens().get(); |
| 355 | + List<ErrorRecord> errorRecords = new ArrayList<>(); |
| 356 | + List<DeleteTokensSuccess> successRecords = new ArrayList<>(); |
| 357 | + int indexNumber = batch * batchSize; |
| 358 | + for (com.skyflow.generated.rest.types.V1DeleteTokenResponseObject record : records) { |
| 359 | + // The API returns the token string in "value" field regardless of success or error |
| 360 | + String tokenValue = record.getValue().orElse(null); |
| 361 | + if (record.getError().isPresent() |
| 362 | + && record.getError().get() != null |
| 363 | + && !record.getError().get().isEmpty() |
| 364 | + && record.getHttpCode().orElse(200) != 200) { |
| 365 | + ErrorRecord errorRecord = new ErrorRecord(indexNumber, record.getError().get(), |
| 366 | + record.getHttpCode().orElse(500)); |
| 367 | + errorRecords.add(errorRecord); |
| 368 | + } else { |
| 369 | + DeleteTokensSuccess success = new DeleteTokensSuccess(indexNumber, tokenValue); |
| 370 | + successRecords.add(success); |
| 371 | + } |
| 372 | + indexNumber++; |
| 373 | + } |
| 374 | + return new DeleteTokensResponse(successRecords, errorRecords); |
| 375 | + } |
| 376 | + return null; |
| 377 | + } |
| 378 | + |
| 379 | + public static List<com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest> createTokenizeBatches( |
| 380 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest request, int batchSize) { |
| 381 | + List<com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest> batches = new ArrayList<>(); |
| 382 | + List<com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject> data = request.getData().get(); |
| 383 | + for (int i = 0; i < data.size(); i += batchSize) { |
| 384 | + List<com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject> batchData = |
| 385 | + data.subList(i, Math.min(i + batchSize, data.size())); |
| 386 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batchRequest = |
| 387 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest.builder() |
| 388 | + .vaultId(request.getVaultId()) |
| 389 | + .data(new ArrayList<>(batchData)) |
| 390 | + .build(); |
| 391 | + batches.add(batchRequest); |
| 392 | + } |
| 393 | + return batches; |
| 394 | + } |
| 395 | + |
| 396 | + public static List<ErrorRecord> handleTokenizeBatchException( |
| 397 | + Throwable ex, |
| 398 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batch, |
| 399 | + int batchNumber, int batchSize |
| 400 | + ) { |
| 401 | + List<ErrorRecord> errorRecords = new ArrayList<>(); |
| 402 | + Throwable cause = ex.getCause(); |
| 403 | + if (cause instanceof ApiClientApiException) { |
| 404 | + ApiClientApiException apiException = (ApiClientApiException) cause; |
| 405 | + Map<String, Object> responseBody = (Map<String, Object>) apiException.body(); |
| 406 | + int indexNumber = batchNumber * batchSize; |
| 407 | + if (responseBody != null) { |
| 408 | + if (responseBody.containsKey("response")) { |
| 409 | + Object responseList = responseBody.get("response"); |
| 410 | + if (responseList instanceof List) { |
| 411 | + List<?> recordsList = (List<?>) responseList; |
| 412 | + for (Object record : recordsList) { |
| 413 | + if (record instanceof Map) { |
| 414 | + Map<String, Object> recordMap = (Map<String, Object>) record; |
| 415 | + ErrorRecord err = Utils.createErrorRecord(recordMap, indexNumber); |
| 416 | + errorRecords.add(err); |
| 417 | + indexNumber++; |
| 418 | + } |
| 419 | + } |
| 420 | + } |
| 421 | + } else if (responseBody.containsKey("error")) { |
| 422 | + Map<String, Object> recordMap = (Map<String, Object>) responseBody.get("error"); |
| 423 | + int batchDataSize = batch.getData().isPresent() ? batch.getData().get().size() : 0; |
| 424 | + for (int j = 0; j < batchDataSize; j++) { |
| 425 | + ErrorRecord err = Utils.createErrorRecord(recordMap, indexNumber); |
| 426 | + errorRecords.add(err); |
| 427 | + indexNumber++; |
| 428 | + } |
| 429 | + } |
| 430 | + } |
| 431 | + } else { |
| 432 | + int indexNumber = batchNumber * batchSize; |
| 433 | + int batchDataSize = batch.getData().isPresent() ? batch.getData().get().size() : 0; |
| 434 | + for (int j = 0; j < batchDataSize; j++) { |
| 435 | + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); |
| 436 | + errorRecords.add(err); |
| 437 | + indexNumber++; |
| 438 | + } |
| 439 | + } |
| 440 | + return errorRecords; |
| 441 | + } |
| 442 | + |
| 443 | + public static TokenizeResponse formatTokenizeResponse( |
| 444 | + com.skyflow.generated.rest.types.V1FlowTokenizeResponse response, |
| 445 | + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batchRequest, |
| 446 | + int batchNumber, int batchSize) { |
| 447 | + if (response != null && response.getResponse().isPresent()) { |
| 448 | + // The API returns a flat list — one entry per (value x tokenGroupName). |
| 449 | + // We group them by input record position using the request's tokenGroupNames count |
| 450 | + // so that records with identical values are still treated as separate entries. |
| 451 | + List<com.skyflow.generated.rest.types.V1FlowTokenizeResponseObject> flatList = |
| 452 | + response.getResponse().get(); |
| 453 | + List<com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject> requestData = |
| 454 | + batchRequest.getData().isPresent() ? batchRequest.getData().get() : new ArrayList<>(); |
| 455 | + |
| 456 | + List<TokenizeSuccess> successRecords = new ArrayList<>(); |
| 457 | + List<ErrorRecord> errorRecords = new ArrayList<>(); |
| 458 | + |
| 459 | + int flatIndex = 0; |
| 460 | + for (int i = 0; i < requestData.size(); i++) { |
| 461 | + int inputRecordIndex = batchNumber * batchSize + i; |
| 462 | + com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject reqObj = requestData.get(i); |
| 463 | + List<String> groupNames = reqObj.getTokenGroupNames().isPresent() |
| 464 | + ? reqObj.getTokenGroupNames().get() : new ArrayList<>(); |
| 465 | + int groupCount = groupNames.size(); |
| 466 | + |
| 467 | + // Consume exactly groupCount entries from the flat response for this record |
| 468 | + TokenizeSuccess successEntry = null; |
| 469 | + for (int g = 0; g < groupCount && flatIndex < flatList.size(); g++, flatIndex++) { |
| 470 | + com.skyflow.generated.rest.types.V1FlowTokenizeResponseObject obj = flatList.get(flatIndex); |
| 471 | + Map<String, Object> props = obj.getAdditionalProperties(); |
| 472 | + |
| 473 | + Object value = obj.getValue().isPresent() ? obj.getValue().get() |
| 474 | + : (props != null ? props.get("value") : null); |
| 475 | + String tokenGroupName = props != null ? (String) props.get("tokenGroupName") : null; |
| 476 | + String token = props != null ? (String) props.get("token") : null; |
| 477 | + String errorMsg = (props != null && props.containsKey("error") && props.get("error") != null) |
| 478 | + ? String.valueOf(props.get("error")) : null; |
| 479 | + int httpCode = (props != null && props.containsKey("httpCode") && props.get("httpCode") instanceof Number) |
| 480 | + ? ((Number) props.get("httpCode")).intValue() : 200; |
| 481 | + |
| 482 | + if (errorMsg != null) { |
| 483 | + errorRecords.add(new ErrorRecord(inputRecordIndex, errorMsg, httpCode)); |
| 484 | + } else { |
| 485 | + if (successEntry == null) { |
| 486 | + successEntry = new TokenizeSuccess(inputRecordIndex, value); |
| 487 | + } |
| 488 | + successEntry.addToken(tokenGroupName, token); |
| 489 | + } |
| 490 | + } |
| 491 | + if (successEntry != null) { |
| 492 | + successRecords.add(successEntry); |
| 493 | + } |
| 494 | + } |
| 495 | + |
| 496 | + return new TokenizeResponse(successRecords, errorRecords); |
| 497 | + } |
| 498 | + return null; |
| 499 | + } |
285 | 500 | } |
0 commit comments