
driven-adapter.dynamo-db.helper.adapter-operations.mustache Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scaffold-clean-architecture Show documentation
Show all versions of scaffold-clean-architecture Show documentation
Gradle plugin to create a clean application in Java that already works, It follows our best practices!
package {{package}}.dynamodb.helper;
import org.reactivecommons.utils.ObjectMapper;
import software.amazon.awssdk.core.pagination.sync.SdkIterable;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbIndex;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.Page;
import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.function.Function;
public abstract class TemplateAdapterOperations {
private final Class dataClass;
private final Function toEntityFn;
protected ObjectMapper mapper;
private final DynamoDbTable table;
private final DynamoDbIndex tableByIndex;
@SuppressWarnings("unchecked")
protected TemplateAdapterOperations(DynamoDbEnhancedClient dynamoDbEnhancedClient,
ObjectMapper mapper,
Function toEntityFn,
String tableName,
String... index) {
this.toEntityFn = toEntityFn;
this.mapper = mapper;
ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
this.dataClass = (Class) genericSuperclass.getActualTypeArguments()[2];
table = dynamoDbEnhancedClient.table(tableName, TableSchema.fromBean(dataClass));
tableByIndex = index.length > 0 ? table.index(index[0]) : null;
}
public E save(E model) {
V entity = toEntity(model);
table.putItem(entity);
return toModel(entity);
}
public E getById(K id) {
return toModel(table.getItem(Key.builder()
.partitionValue(AttributeValue.builder().s((String) id).build())
.build())
);
}
public void delete(E model) {
table.deleteItem(toEntity(model));
}
public List query(QueryEnhancedRequest queryExpression) {
PageIterable pageIterable = table.query(queryExpression);
return listOfModel(pageIterable);
}
public List queryByIndex(QueryEnhancedRequest queryExpression, String... index) {
DynamoDbIndex queryIndex = index.length > 0 ? table.index(index[0]) : tableByIndex;
SdkIterable> sdkIterable = queryIndex.query(queryExpression);
return listOfModel(sdkIterable);
}
/**
* @return Mono>
* @implNote Bancolombia does not suggest the Scan function for DynamoDB tables due to the low performance resulting
* from the design of the database engine (Key value). Optimize the query using Query, GetItem or BatchGetItem
* functions, and if necessary, consider the Single-Table Design pattern for DynamoDB.
* @deprecated
*/
@Deprecated(forRemoval = true)
public List scan() {
return listOfModel(table.scan());
}
private List listOfModel(PageIterable pageIterable) {
return pageIterable.items().stream().map(this::toModel).toList();
}
private List listOfModel(SdkIterable> pageIterable) {
return pageIterable.stream().flatMap(p -> p.items().stream().map(this::toModel)).toList();
}
protected V toEntity(E model) {
return mapper.map(model, dataClass);
}
protected E toModel(V data) {
return data != null ? toEntityFn.apply(data) : null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy