From 3587cc0676be235bbdb6b58c20e275ae7ff52b3b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 27 Sep 2022 13:28:13 -0500 Subject: [PATCH] Updated the update action, to set a null value for fields that came in the request as empty string --- .../backend/javalin/QJavalinImplementation.java | 16 ++++++++++++++-- .../javalin/QJavalinImplementationTest.java | 13 +++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 619822ce..41655288 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -403,9 +403,21 @@ public class QJavalinImplementation Map map = context.bodyAsClass(Map.class); for(Map.Entry entry : map.entrySet()) { - if(StringUtils.hasContent(String.valueOf(entry.getValue()))) + String fieldName = ValueUtils.getValueAsString(entry.getKey()); + Object value = entry.getValue(); + + if(StringUtils.hasContent(String.valueOf(value))) { - record.setValue(String.valueOf(entry.getKey()), (Serializable) entry.getValue()); + record.setValue(fieldName, (Serializable) value); + } + else if("".equals(value)) + { + /////////////////////////////////////////////////////////////////////////////////////////////////// + // if frontend sent us an empty string - put a null in the record's value map. // + // this could potentially be changed to be type-specific (e.g., store an empty-string for STRING // + // fields, but null for INTEGER, etc) - but, who really wants empty-string in database anyway? // + /////////////////////////////////////////////////////////////////////////////////////////////////// + record.setValue(fieldName, null); } } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java index fc0918b0..ce47bb37 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java @@ -338,7 +338,7 @@ class QJavalinImplementationTest extends QJavalinTestBase { Map body = new HashMap<>(); body.put("firstName", "Free"); - //? body.put("id", 4); + body.put("birthDate", ""); HttpResponse response = Unirest.patch(BASE_URL + "/data/person/4") .header("Content-Type", "application/json") @@ -356,7 +356,16 @@ class QJavalinImplementationTest extends QJavalinTestBase JSONObject values0 = record0.getJSONObject("values"); assertEquals(4, values0.getInt("id")); assertEquals("Free", values0.getString("firstName")); - // mmm, whole record isn't loaded. should it be? assertEquals("Samples", values0.getString("lastName")); + + /////////////////////////////////////////////////////////////////// + // re-GET the record, and validate that birthDate was nulled out // + /////////////////////////////////////////////////////////////////// + response = Unirest.get(BASE_URL + "/data/person/4").asString(); + assertEquals(200, response.getStatus()); + jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertTrue(jsonObject.has("values")); + JSONObject values = jsonObject.getJSONObject("values"); + assertFalse(values.has("birthDate")); }