Skip to content

Commit 83b42b2

Browse files
authored
V1.16.1 (#329)
* Update to build 1.16.1 * #299 - Allowed Values for Attributes not being validated on optional attributes whenever request doesn't also include changes to required attributes * #308 - PUT /document/:documentId/attributes fail on required attribute * Added checksum, checksumType, contentType to GET /documents/:id/fulltext * #310 - Adding document that fails SiteSchema required attribute validation creates folder * #306 - Add limit and next token for pagination to GET /webhooks * #307 - Add limit and next token for pagination to GET /sites/:siteId/apiKeys * #313 - Add configurable RetentionInDays to AWS::Logs::LogGroup * #312 - Add INFO / DEBUG / WARN log levels at the CloudFormation level * #314 - Sns Event Application/Json exceeds SNS allowed message size * #304 - Enable folders and subfolders in staging documents bucket * #315 - Header value cannot be represented using ISO-8859-1 * #303 - Attempted rename of a document when path already exists * #318 - Add OCR configuration to /sites/{siteId}/configuration * Added TABLES to OutputType GET /documents/{id}/ocr * #321 - Enable Mapping Attributes withoutSource * #323 - GET /documents/{documentId}/content return error if content type mismatch file type * Upload Console to v3.7.3
1 parent dece8ea commit 83b42b2

File tree

221 files changed

+7114
-4704
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

221 files changed

+7114
-4704
lines changed

actions/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencies {
1717
testImplementation project(':fkq-test-utils')
1818
testImplementation project(':fkq-plugins')
1919
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.11.0'
20-
testImplementation group: 'org.testcontainers', name: 'testcontainers', version: '1.20.1'
20+
testImplementation group: 'org.testcontainers', name: 'testcontainers', version: '1.20.4'
2121
}
2222

2323
test {

actions/src/main/java/com/formkiq/module/actions/services/ActionsValidator.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
import java.util.Collection;
2727
import java.util.List;
28-
import com.formkiq.aws.dynamodb.DynamicObject;
28+
2929
import com.formkiq.module.actions.Action;
3030
import com.formkiq.validation.ValidationError;
3131

@@ -41,19 +41,22 @@ public interface ActionsValidator {
4141
*
4242
* @param siteId {@link String}
4343
* @param action {@link Action}
44-
* @param configs {@link DynamicObject}
44+
* @param chatGptApiKey {@link String}
45+
* @param notificationsEmail {@link String}
4546
* @return {@link Collection} {@link ValidationError}
4647
*/
47-
Collection<ValidationError> validation(String siteId, Action action, DynamicObject configs);
48+
Collection<ValidationError> validation(String siteId, Action action, String chatGptApiKey,
49+
String notificationsEmail);
4850

4951
/**
5052
* Validates {@link List} {@link Action}.
5153
*
5254
* @param siteId {@link String}
5355
* @param action {@link Action}
54-
* @param configs {@link DynamicObject}
56+
* @param chatGptApiKey {@link String}
57+
* @param notificationsEmail {@link String}
5558
* @return {@link List} {@link Collection} {@link ValidationError}
5659
*/
5760
List<Collection<ValidationError>> validation(String siteId, List<Action> action,
58-
DynamicObject configs);
61+
String chatGptApiKey, String notificationsEmail);
5962
}

actions/src/main/java/com/formkiq/module/actions/services/ActionsValidatorImpl.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import java.util.Collections;
3737
import java.util.List;
3838
import java.util.Map;
39-
import com.formkiq.aws.dynamodb.DynamicObject;
39+
4040
import com.formkiq.aws.dynamodb.DynamoDbService;
4141
import com.formkiq.aws.dynamodb.model.MappingRecord;
4242
import com.formkiq.aws.dynamodb.objects.Strings;
@@ -53,10 +53,6 @@
5353
*/
5454
public class ActionsValidatorImpl implements ActionsValidator {
5555

56-
/** ChatGpt Api Key. */
57-
private static final String CHATGPT_API_KEY = "ChatGptApiKey";
58-
/** Notification Email. */
59-
private static final String NOTIFICATION_EMAIL = "NotificationEmail";
6056
/** {@link DynamoDbService}. */
6157
private final DynamoDbService db;
6258

@@ -81,14 +77,13 @@ private boolean hasValue(final Map<String, String> parameters, final String key)
8177
/**
8278
* Validate Document Tagging.
8379
*
84-
* @param configs {@link DynamicObject}
80+
* @param chatGptApiKey {@link String}
8581
* @param parameters {@link Map}
8682
* @param errors {@link Collections} {@link ValidationError}
8783
*/
88-
private void validateDocumentTagging(final DynamicObject configs,
84+
private void validateDocumentTagging(final String chatGptApiKey,
8985
final Map<String, String> parameters, final Collection<ValidationError> errors) {
9086

91-
String chatGptApiKey = configs.getString(CHATGPT_API_KEY);
9287
if (!parameters.containsKey("tags")) {
9388
errors.add(new ValidationErrorImpl().key("parameters.tags")
9489
.error("action 'tags' parameter is required"));
@@ -108,15 +103,13 @@ private void validateDocumentTagging(final DynamicObject configs,
108103
/**
109104
* Validate Notification Email.
110105
*
111-
* @param configs {@link DynamicObject}
106+
* @param notificationEmail {@link String}
112107
* @param action {@link Action}
113108
* @param errors {@link Collection} {@link ValidationError}
114109
*/
115-
private void validateNotificationEmail(final DynamicObject configs, final Action action,
110+
private void validateNotificationEmail(final String notificationEmail, final Action action,
116111
final Collection<ValidationError> errors) {
117112

118-
String notificationEmail = configs.getString(NOTIFICATION_EMAIL);
119-
120113
if (isEmpty(notificationEmail)) {
121114
errors.add(new ValidationErrorImpl().key("parameters.notificationEmail")
122115
.error("notificationEmail is not configured"));
@@ -191,7 +184,7 @@ private void validateEventBridge(final Action action, final Collection<Validatio
191184

192185
@Override
193186
public Collection<ValidationError> validation(final String siteId, final Action action,
194-
final DynamicObject configs) {
187+
final String chatGptApiKey, final String notificationsEmail) {
195188
Collection<ValidationError> errors = new ArrayList<>();
196189

197190
if (action == null) {
@@ -210,7 +203,7 @@ public Collection<ValidationError> validation(final String siteId, final Action
210203

211204
} else {
212205

213-
validateActionParameters(siteId, action, configs, errors);
206+
validateActionParameters(siteId, action, chatGptApiKey, notificationsEmail, errors);
214207
}
215208
}
216209

@@ -219,23 +212,25 @@ public Collection<ValidationError> validation(final String siteId, final Action
219212

220213
@Override
221214
public List<Collection<ValidationError>> validation(final String siteId,
222-
final List<Action> actions, final DynamicObject configs) {
215+
final List<Action> actions, final String chatGptApiKey, final String notificationsEmail) {
216+
223217
List<Collection<ValidationError>> errors = new ArrayList<>();
224-
actions.forEach(a -> errors.add(validation(siteId, a, configs)));
218+
actions.forEach(a -> errors.add(validation(siteId, a, chatGptApiKey, notificationsEmail)));
225219
return errors;
226220
}
227221

228222
private void validateActionParameters(final String siteId, final Action action,
229-
final DynamicObject configs, final Collection<ValidationError> errors) {
223+
final String chatGptApiKey, final String notificationsEmail,
224+
final Collection<ValidationError> errors) {
230225

231226
Map<String, String> parameters = getParameters(action);
232227
if (ActionType.WEBHOOK.equals(action.type()) && !parameters.containsKey("url")) {
233228
errors.add(new ValidationErrorImpl().key("parameters.url")
234229
.error("action 'url' parameter is required"));
235230
} else if (ActionType.DOCUMENTTAGGING.equals(action.type())) {
236-
validateDocumentTagging(configs, parameters, errors);
231+
validateDocumentTagging(chatGptApiKey, parameters, errors);
237232
} else if (ActionType.NOTIFICATION.equals(action.type())) {
238-
validateNotificationEmail(configs, action, errors);
233+
validateNotificationEmail(notificationsEmail, action, errors);
239234
} else if (ActionType.QUEUE.equals(action.type())) {
240235
validateQueue(siteId, action, errors);
241236
} else if (ActionType.IDP.equals(action.type())) {

actions/src/test/java/com/formkiq/module/actions/services/ActionsValidatorTest.java

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,13 @@
2626
import static com.formkiq.testutils.aws.DynamoDbExtension.DOCUMENTS_TABLE;
2727
import static org.junit.jupiter.api.Assertions.assertEquals;
2828
import static org.junit.jupiter.api.Assertions.assertNull;
29-
import java.util.Arrays;
29+
3030
import java.util.Collection;
3131
import java.util.List;
32-
import java.util.Map;
32+
3333
import org.junit.jupiter.api.BeforeAll;
3434
import org.junit.jupiter.api.Test;
3535
import org.junit.jupiter.api.extension.ExtendWith;
36-
import com.formkiq.aws.dynamodb.DynamicObject;
3736
import com.formkiq.aws.dynamodb.DynamoDbConnectionBuilder;
3837
import com.formkiq.aws.dynamodb.DynamoDbService;
3938
import com.formkiq.aws.dynamodb.DynamoDbServiceImpl;
@@ -46,8 +45,6 @@
4645
@ExtendWith(DynamoDbExtension.class)
4746
class ActionsValidatorTest {
4847

49-
/** {@link DynamoDbService}. */
50-
private static DynamoDbService db;
5148
/** {@link ActionsValidator}. */
5249
private static ActionsValidator validator;
5350

@@ -59,19 +56,16 @@ class ActionsValidatorTest {
5956
@BeforeAll
6057
public static void beforeAll() throws Exception {
6158
DynamoDbConnectionBuilder dynamoDbConnection = DynamoDbTestServices.getDynamoDbConnection();
62-
db = new DynamoDbServiceImpl(dynamoDbConnection, DOCUMENTS_TABLE);
59+
DynamoDbService db = new DynamoDbServiceImpl(dynamoDbConnection, DOCUMENTS_TABLE);
6360
validator = new ActionsValidatorImpl(db);
6461
}
6562

6663
@Test
6764
void testValidation01() {
6865
// given
69-
String siteId = null;
70-
Action action = null;
71-
DynamicObject obj = new DynamicObject(Map.of());
7266

7367
// when
74-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
68+
Collection<ValidationError> errors = validator.validation(null, (Action) null, null, null);
7569

7670
// then
7771
assertEquals(1, errors.size());
@@ -83,12 +77,10 @@ void testValidation01() {
8377
@Test
8478
void testValidation02() {
8579
// given
86-
String siteId = null;
8780
Action action = new Action();
88-
DynamicObject obj = new DynamicObject(Map.of());
8981

9082
// when
91-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
83+
Collection<ValidationError> errors = validator.validation(null, action, null, null);
9284

9385
// then
9486
assertEquals(1, errors.size());
@@ -100,12 +92,10 @@ void testValidation02() {
10092
@Test
10193
void testValidation03() {
10294
// given
103-
String siteId = null;
10495
Action action = new Action().type(ActionType.WEBHOOK).userId("joe");
105-
DynamicObject obj = new DynamicObject(Map.of());
10696

10797
// when
108-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
98+
Collection<ValidationError> errors = validator.validation(null, action, null, null);
10999

110100
// then
111101
assertEquals(1, errors.size());
@@ -117,13 +107,11 @@ void testValidation03() {
117107
@Test
118108
void testValidation04() {
119109
// given
120-
String siteId = null;
121110
Action action = new Action();
122-
DynamicObject obj = new DynamicObject(Map.of());
123-
List<Action> actions = Arrays.asList(action);
111+
List<Action> actions = List.of(action);
124112

125113
// when
126-
List<Collection<ValidationError>> errorList = validator.validation(siteId, actions, obj);
114+
List<Collection<ValidationError>> errorList = validator.validation(null, actions, null, null);
127115

128116
// then
129117
assertEquals(1, errorList.size());
@@ -137,12 +125,10 @@ void testValidation04() {
137125
@Test
138126
void testValidation05() {
139127
// given
140-
String siteId = null;
141128
Action action = new Action().type(ActionType.OCR).userId("joe");
142-
DynamicObject obj = new DynamicObject(Map.of());
143129

144130
// when
145-
Collection<ValidationError> errorList = validator.validation(siteId, action, obj);
131+
Collection<ValidationError> errorList = validator.validation(null, action, null, null);
146132

147133
// then
148134
assertEquals(0, errorList.size());
@@ -151,12 +137,10 @@ void testValidation05() {
151137
@Test
152138
void testValidation06() {
153139
// given
154-
String siteId = null;
155140
Action action = new Action().type(ActionType.QUEUE).userId("joe");
156-
DynamicObject obj = new DynamicObject(Map.of());
157141

158142
// when
159-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
143+
Collection<ValidationError> errors = validator.validation(null, action, null, null);
160144

161145
// then
162146
assertEquals(1, errors.size());
@@ -169,12 +153,10 @@ void testValidation06() {
169153
@Test
170154
void testValidation07() {
171155
// given
172-
String siteId = null;
173156
Action action = new Action().type(ActionType.QUEUE).queueId("Testqueue").userId("joe");
174-
DynamicObject obj = new DynamicObject(Map.of());
175157

176158
// when
177-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
159+
Collection<ValidationError> errors = validator.validation(null, action, null, null);
178160

179161
// then
180162
assertEquals(1, errors.size());
@@ -190,12 +172,10 @@ void testValidation07() {
190172
@Test
191173
void testValidation08() {
192174
// given
193-
String siteId = null;
194175
Action action = new Action().type(ActionType.EVENTBRIDGE).userId("joe");
195-
DynamicObject obj = new DynamicObject(Map.of());
196176

197177
// when
198-
Collection<ValidationError> errors = validator.validation(siteId, action, obj);
178+
Collection<ValidationError> errors = validator.validation(null, action, null, null);
199179

200180
// then
201181
assertEquals(1, errors.size());

aws-dynamodb/src/main/java/com/formkiq/aws/dynamodb/AttributeValueToMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ private Object convert(final AttributeValue val) {
6060

6161
switch (val.type()) {
6262
case S -> obj = val.s();
63-
case N -> obj = val.n();
64-
case BOOL -> obj = val.b();
63+
case N -> obj = Double.valueOf(val.n());
64+
case BOOL -> obj = val.bool();
6565
case L -> obj = val.l().stream().map(this::convert).toList();
6666
default -> throw new IllegalArgumentException(
6767
"Unsupported attribute value map conversion " + val.type());

aws-dynamodb/src/main/java/com/formkiq/aws/dynamodb/DbKeys.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import java.util.Map;
3232
import java.util.Optional;
3333
import java.util.stream.Collectors;
34+
35+
import com.formkiq.aws.dynamodb.objects.Strings;
3436
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
3537

3638
/**
@@ -154,7 +156,7 @@ default void addM(final Map<String, AttributeValue> map, final String key,
154156
* @param value {@link String}
155157
*/
156158
default void addN(final Map<String, AttributeValue> map, final String key, final String value) {
157-
if (value != null) {
159+
if (!Strings.isEmpty(value)) {
158160
map.put(key, AttributeValue.builder().n(value).build());
159161
}
160162
}

aws-dynamodb/src/main/java/com/formkiq/aws/dynamodb/DynamoDbService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,11 @@ List<Map<String, AttributeValue>> getBatch(BatchGetConfig config,
136136

137137
/**
138138
* Get Next Number.
139-
*
139+
*
140140
* @param keys {@link Map}
141-
*
142141
* @return {@link String}
143142
*/
144-
String getNextNumber(Map<String, AttributeValue> keys);
143+
Long getNextNumber(Map<String, AttributeValue> keys);
145144

146145
/**
147146
* Get Table Name.

aws-dynamodb/src/main/java/com/formkiq/aws/dynamodb/DynamoDbServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ private String getKey(final Map<String, AttributeValue> attr) {
276276
}
277277

278278
@Override
279-
public String getNextNumber(final Map<String, AttributeValue> keys) {
279+
public Long getNextNumber(final Map<String, AttributeValue> keys) {
280280

281281
UpdateItemRequest updateItemRequest = UpdateItemRequest.builder().tableName(this.tableName)
282282
.key(keys).updateExpression("ADD #autoIncrement :val")
@@ -287,7 +287,7 @@ public String getNextNumber(final Map<String, AttributeValue> keys) {
287287
UpdateItemResponse response = updateItem(updateItemRequest);
288288

289289
AttributeValue val = response.attributes().get("Number");
290-
return val.n();
290+
return Long.valueOf(val.n());
291291
}
292292

293293
@Override

aws-dynamodb/src/main/java/com/formkiq/aws/dynamodb/MapToAttributeValue.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ public class MapToAttributeValue
4040
@Override
4141
public Map<String, AttributeValue> apply(final Map<String, Object> map) {
4242

43-
Map<String, AttributeValue> result = new HashMap<>();
43+
Map<String, AttributeValue> result = null;
4444

45-
for (Map.Entry<String, Object> e : map.entrySet()) {
46-
AttributeValue a = convert(e.getValue());
47-
result.put(e.getKey(), a);
45+
if (map != null) {
46+
result = new HashMap<>();
47+
for (Map.Entry<String, Object> e : map.entrySet()) {
48+
AttributeValue a = convert(e.getValue());
49+
result.put(e.getKey(), a);
50+
}
4851
}
4952

5053
return result;
@@ -54,6 +57,8 @@ private AttributeValue convert(final Object obj) {
5457
AttributeValue o = null;
5558
if (obj instanceof Double d) {
5659
o = AttributeValue.fromN(String.valueOf(d));
60+
} else if (obj instanceof Long l) {
61+
o = AttributeValue.fromN(String.valueOf(l));
5762
} else if (obj instanceof String s) {
5863
o = AttributeValue.fromS(s);
5964
} else if (obj instanceof Collection<?> c) {

0 commit comments

Comments
 (0)