diff --git a/src/main/java/org/mskcc/limsrest/service/PromoteBanked.java b/src/main/java/org/mskcc/limsrest/service/PromoteBanked.java index 663d6819..8e077284 100644 --- a/src/main/java/org/mskcc/limsrest/service/PromoteBanked.java +++ b/src/main/java/org/mskcc/limsrest/service/PromoteBanked.java @@ -759,8 +759,30 @@ boolean createAirtableCard(String requestId) { org.springframework.http.HttpEntity entity = new org.springframework.http.HttpEntity<>(jsonBody, headers); - ResponseEntity response = restTemplateAirtable.postForEntity( - airtableUrl, entity, String.class); + ResponseEntity response; + try { + response = restTemplateAirtable.postForEntity(airtableUrl, entity, String.class); + } catch (org.springframework.web.client.HttpClientErrorException e) { + if (e.getStatusCode().value() == 422 + && e.getResponseBodyAsString().contains("INVALID_MULTIPLE_CHOICE_OPTIONS")) { + log.warn("Airtable: invalid select option (Application/Material dropped, values were: Application=" + + this.recipe + ", Material=" + materials + "): " + e.getMessage()); + fields.remove("Application"); + fields.remove("Material"); + ObjectNode retryRecord = mapper.createObjectNode(); + retryRecord.set("fields", fields); + ArrayNode retryRecords = mapper.createArrayNode(); + retryRecords.add(retryRecord); + ObjectNode retryBody = mapper.createObjectNode(); + retryBody.set("records", retryRecords); + String retryJsonBody = mapper.writeValueAsString(retryBody); + org.springframework.http.HttpEntity retryEntity = + new org.springframework.http.HttpEntity<>(retryJsonBody, headers); + response = restTemplateAirtable.postForEntity(airtableUrl, retryEntity, String.class); + } else { + throw e; + } + } log.info("Airtable card created successfully: " + response.getBody()); return true;