Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion metaform-api-spec
Submodule metaform-api-spec updated 1 files
+23 −0 swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

import fi.metatavu.metaform.api.spec.model.Metaform;
import fi.metatavu.metaform.api.spec.model.MetaformField;
import fi.metatavu.metaform.api.spec.model.MetaformFieldType;
import fi.metatavu.metaform.api.spec.model.MetaformSection;
import fi.metatavu.metaform.api.spec.model.*;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
Expand Down Expand Up @@ -127,12 +124,17 @@ public Object getFieldValue(Metaform metaformEntity, Reply reply, String fieldNa
if (isMetafield(metaformEntity, fieldName)) {
return resolveMetaField(fieldName, reply);
}

else if (isValueSourceField(metaformEntity, fieldName)) {
MetaformField metaformField = getField(metaformEntity, fieldName);
MetaformFieldValueSource valueSource = metaformField.getValueSource();
return resolveValueSourceField(valueSource, reply);
}

ReplyField field = replyFieldMap.get(fieldName);
if (field == null) {
return null;
}

if (field instanceof NumberReplyField) {
return ((NumberReplyField) field).getValue();
} else if (field instanceof BooleanReplyField) {
Expand All @@ -153,6 +155,40 @@ public Object getFieldValue(Metaform metaformEntity, Reply reply, String fieldNa
return null;
}

/**
* Returns the value based on the value source
*
* @param valueSource value source
* @param reply reply
* @return generated value
*/
private Object resolveValueSourceField(MetaformFieldValueSource valueSource, Reply reply) {
switch (valueSource) {
case REPLYLASTMODIFIERID:
return reply.getUserId();
case REPLYCREATORID:
return reply.getUserId();
case REPLYCREATEDAT:
return formatDateTime(reply.getCreatedAt());
case REPLYMODIFIEDAT:
return formatDateTime(reply.getModifiedAt());
}

return null;
}

/**
* Checks if the value should be auto filled based on its value Source type. Does not apply to MetaformFieldValueSource.REPLYVALUE
*
* @param metaformEntity metaform
* @param name field name
* @return if the value should be generated
*/
private boolean isValueSourceField(Metaform metaformEntity, String name) {
MetaformField field = getField(metaformEntity, name);
return field != null && field.getValueSource() != null && field.getValueSource() != MetaformFieldValueSource.REPLYVALUE;
}

/**
* Returns table field row as map
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
Expand Down Expand Up @@ -488,6 +489,68 @@ public void testMetafields() throws Exception {
}
}

/*
* Tests creating metaform with auto filled fields defined by value source properties
*/
@Test
public void testMetafieldsFieldValueSource() throws Exception {
try (TestBuilder testBuilder = new TestBuilder()) {
Metaform parsedMetaform = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta-value-sources");
Metaform metaform = testBuilder.metaformAdmin().metaforms().create(parsedMetaform);

Map<String, Object> replyData = new HashMap<>();
replyData.put("text", "test 1");
replyData.put("customTextValue", "custom test value 1");

Reply replyWithData = testBuilder.test1().replies().createReplyWithData(replyData);
Reply createdReply = testBuilder.test1().replies().create(metaform.getId(), ReplyMode.REVISION.toString(), replyWithData);

Assertions.assertNotNull(createdReply.getCreatedAt());
Assertions.assertNotNull(createdReply.getModifiedAt());

OffsetDateTime parsedCreated = OffsetDateTime.parse(createdReply.getCreatedAt());
OffsetDateTime parsedModified = OffsetDateTime.parse(createdReply.getModifiedAt());

Reply reply = testBuilder.test1().replies().findReply(metaform.getId(), createdReply.getId(), null);

Assertions.assertNotNull(reply.getData());

Assertions.assertEquals(parsedCreated.truncatedTo(ChronoUnit.MINUTES).toInstant(), parseOffsetDateTime((String) reply.getData().get("customNamedCreate")).truncatedTo(ChronoUnit.MINUTES).toInstant());
Assertions.assertEquals(parsedModified.truncatedTo(ChronoUnit.MINUTES).toInstant(), parseOffsetDateTime((String) reply.getData().get("customNamedModify")).truncatedTo(ChronoUnit.MINUTES).toInstant());
Assertions.assertEquals(REALM1_USER_1_ID.toString(), reply.getData().get("customLastEditor"));
Assertions.assertEquals(REALM1_USER_1_ID.toString(), reply.getData().get("customCreator"));
Assertions.assertEquals("custom test value 1", reply.getData().get("customTextValue"));
}
}

/*
Compares the metaform replies created using metafields and value sources
*/
@Test
public void testMetafieldsFieldValueSourceCompare() throws Exception {
try (TestBuilder testBuilder = new TestBuilder()) {
Metaform parsedSimple = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta");
Metaform simpleMeta = testBuilder.metaformAdmin().metaforms().create(parsedSimple);

Metaform parsedValueSrc = testBuilder.metaformAdmin().metaforms().readMetaform("simple-meta-value-sources");
Metaform valueSrcMeta = testBuilder.metaformAdmin().metaforms().create(parsedValueSrc);

Reply simpleReply = testBuilder.test1().replies().createSimpleReply(simpleMeta, "test 1", ReplyMode.CUMULATIVE);
Reply valueSrcReply = testBuilder.test1().replies().createSimpleReply(valueSrcMeta, "test 1", ReplyMode.CUMULATIVE);

Instant parsedCreated1 = parseOffsetDateTime((String) simpleReply.getData().get("created")).truncatedTo(ChronoUnit.MINUTES).toInstant();
Instant parsedCreated2 = parseOffsetDateTime((String) valueSrcReply.getData().get("customNamedCreate")).truncatedTo(ChronoUnit.MINUTES).toInstant();

Assertions.assertEquals(parsedCreated1, parsedCreated2);

Instant parsedModified1 = parseOffsetDateTime((String) simpleReply.getData().get("modified")).truncatedTo(ChronoUnit.MINUTES).toInstant();
Instant parsedModified2 = parseOffsetDateTime((String) valueSrcReply.getData().get("customNamedModify")).truncatedTo(ChronoUnit.MINUTES).toInstant();

Assertions.assertEquals(parsedModified1, parsedModified2);
Assertions.assertEquals(simpleReply.getData().get("lastEditor"), valueSrcReply.getData().get("customLastEditor"));
}
}

@Test
public void testFindReplyOwnerKeys() throws Exception {
try (TestBuilder testBuilder = new TestBuilder()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"sections": [
{
"title": "Simple form with value source fields",
"fields": [
{
"name": "text",
"type": "text",
"title": "Text field"
},
{
"name": "customTextValue",
"type": "text",
"title": "reply value fields",
"valueSource": "replyValue"
},
{
"name": "customNamedCreate",
"type": "date-time",
"title": "Created field",
"valueSource": "replyCreatedAt"
},
{
"name": "customNamedModify",
"type": "date-time",
"title": "modified field",
"valueSource": "replyModifiedAt"
},
{
"name": "customLastEditor",
"type": "text",
"title": "lastEditor field",
"valueSource": "replyLastModifierId"
},
{
"name": "customCreator",
"type": "text",
"title": "creator field",
"valueSource": "replyCreatorId"
}
]
}
]
}