Skip to content

Commit 4079fb3

Browse files
feat(javalinWidgets): listen for POST requests to /widget/{name} endpoints to support larger param sets than query string / URI length (#243)
1 parent f9891d3 commit 4079fb3

File tree

3 files changed

+79
-11
lines changed

3 files changed

+79
-11
lines changed

qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -436,21 +436,14 @@ public EndpointGroup getRoutes()
436436
post("/possibleValues/{possibleValueSourceName}", QJavalinImplementation::possibleValuesStandalone);
437437

438438
get("/widget/{name}", QJavalinImplementation::widget); // todo - can we just do a slow log here?
439+
post("/widget/{name}", QJavalinImplementation::widget);
439440

440441
get("/serverInfo", QJavalinImplementation::serverInfo);
441442

442443
////////////////////
443444
// process routes //
444445
////////////////////
445446
path("", QJavalinProcessHandler.getRoutes());
446-
447-
// todo... ? ////////////////
448-
// todo... ? // api routes //
449-
// todo... ? ////////////////
450-
// todo... ? if(qInstance.getApiMetaData() != null)
451-
// todo... ? {
452-
// todo... ? path("", QJavalinApiHandler.getRoutes());
453-
// todo... ? }
454447
});
455448
}
456449

@@ -1580,6 +1573,19 @@ private static void widget(Context context)
15801573
}
15811574
}
15821575

1576+
////////////////////////////
1577+
// process form/post body //
1578+
////////////////////////////
1579+
for(Map.Entry<String, List<String>> formParam : context.formParamMap().entrySet())
1580+
{
1581+
String fieldName = formParam.getKey();
1582+
List<String> values = formParam.getValue();
1583+
if(CollectionUtils.nullSafeHasContents(values))
1584+
{
1585+
input.addQueryParam(fieldName, values.get(0));
1586+
}
1587+
}
1588+
15831589
RenderWidgetOutput output = new RenderWidgetAction().execute(input);
15841590
QJavalinAccessLogger.logEndSuccessIfSlow(SLOW_LOG_THRESHOLD_MS, logPair("widgetName", widgetName), logPair("inputParams", input.getQueryParams()));
15851591
context.result(JsonUtils.toJson(output.getWidgetData()));

qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ public void test_dataQueryWithFilterAndQueryJoin()
512512
""";
513513

514514
HttpResponse<String> response = Unirest.get(BASE_URL + "/data/person?filter=" + URLEncoder.encode(filterJson, StandardCharsets.UTF_8)
515-
+ "&queryJoins=" + URLEncoder.encode(queryJoinsJson, StandardCharsets.UTF_8)).asString();
515+
+ "&queryJoins=" + URLEncoder.encode(queryJoinsJson, StandardCharsets.UTF_8)).asString();
516516

517517
assertEquals(200, response.getStatus());
518518
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
@@ -1056,6 +1056,7 @@ void testExportSupportedFormat()
10561056
}
10571057

10581058

1059+
10591060
/*******************************************************************************
10601061
**
10611062
*******************************************************************************/
@@ -1089,6 +1090,42 @@ void testWidget()
10891090

10901091

10911092

1093+
/*******************************************************************************
1094+
* verify that query string params form a GET are processed
1095+
*******************************************************************************/
1096+
@Test
1097+
void testWidgetQueryStringParam()
1098+
{
1099+
HttpResponse<String> response = Unirest.get(BASE_URL + "/widget/" + TestUtils.EchoWidgetRenderer.class.getSimpleName() + "?input=helloThere").asString();
1100+
assertEquals(200, response.getStatus());
1101+
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
1102+
assertNotNull(jsonObject);
1103+
assertEquals(WidgetType.HTML.getType(), jsonObject.getString("type"));
1104+
assertNotNull(jsonObject.getString("title"));
1105+
assertEquals("helloThere", jsonObject.getString("html"));
1106+
}
1107+
1108+
1109+
1110+
/*******************************************************************************
1111+
* verify the widget POST endpoint and that it accepts posted values (multipart form)
1112+
*******************************************************************************/
1113+
@Test
1114+
void testWidgetPost()
1115+
{
1116+
HttpResponse<String> response = Unirest.post(BASE_URL + "/widget/" + TestUtils.EchoWidgetRenderer.class.getSimpleName())
1117+
.field("input", "foobar")
1118+
.asString();
1119+
assertEquals(200, response.getStatus());
1120+
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
1121+
assertNotNull(jsonObject);
1122+
assertEquals(WidgetType.HTML.getType(), jsonObject.getString("type"));
1123+
assertNotNull(jsonObject.getString("title"));
1124+
assertEquals("foobar", jsonObject.getString("html"));
1125+
}
1126+
1127+
1128+
10921129
/*******************************************************************************
10931130
**
10941131
*******************************************************************************/

qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ public static QInstance defineInstance()
241241
// similarly tests use apiName & apiVersion, but those fields aren't in the table because //
242242
// the api module isn't available, so, add them to make tests work. //
243243
////////////////////////////////////////////////////////////////////////////////////////////
244-
QTableMetaData table = qInstance.getTable("scriptRevision");
244+
QTableMetaData table = qInstance.getTable("scriptRevision");
245245
table.addField(new QFieldMetaData("content", QFieldType.STRING));
246246
table.addField(new QFieldMetaData("apiName", QFieldType.STRING));
247247
table.addField(new QFieldMetaData("apiVersion", QFieldType.STRING));
@@ -347,6 +347,10 @@ private static void defineWidgets(QInstance qInstance)
347347
.withType(WidgetType.HTML.getType())
348348
.withCodeReference(new QCodeReference(TimezoneWidgetRenderer.class)));
349349

350+
qInstance.addWidget(new QWidgetMetaData()
351+
.withName(EchoWidgetRenderer.class.getSimpleName())
352+
.withType(WidgetType.HTML.getType())
353+
.withCodeReference(new QCodeReference(EchoWidgetRenderer.class)));
350354
}
351355

352356

@@ -844,6 +848,27 @@ public static void insertRecords(QInstance qInstance, QTableMetaData table, List
844848

845849

846850

851+
/***************************************************************************
852+
* simple test widget, that echos back html (really just text) equal to the
853+
* "input" param that it receives
854+
***************************************************************************/
855+
public static class EchoWidgetRenderer extends AbstractWidgetRenderer
856+
{
857+
858+
/***************************************************************************
859+
**
860+
***************************************************************************/
861+
@Override
862+
public RenderWidgetOutput render(RenderWidgetInput input) throws QException
863+
{
864+
return (new RenderWidgetOutput(new RawHTML("title",
865+
input.getQueryParams().get("input")
866+
)));
867+
}
868+
}
869+
870+
871+
847872
/***************************************************************************
848873
**
849874
***************************************************************************/
@@ -858,7 +883,7 @@ public RenderWidgetOutput render(RenderWidgetInput input) throws QException
858883
{
859884
return (new RenderWidgetOutput(new RawHTML("title",
860885
QContext.getQSession().getValue(QSession.VALUE_KEY_USER_TIMEZONE_OFFSET_MINUTES)
861-
+ "|" + QContext.getQSession().getValue(QSession.VALUE_KEY_USER_TIMEZONE)
886+
+ "|" + QContext.getQSession().getValue(QSession.VALUE_KEY_USER_TIMEZONE)
862887
)));
863888
}
864889
}

0 commit comments

Comments
 (0)