
driven-adapter.dynamo-db-reactive.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 reactor.core.publisher.Mono;
import software.amazon.awssdk.core.async.SdkPublisher;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncIndex;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient;
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.PagePublisher;
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 DynamoDbAsyncTable table;
private final DynamoDbAsyncIndex tableByIndex;
@SuppressWarnings("unchecked")
protected TemplateAdapterOperations(DynamoDbEnhancedAsyncClient dynamoDbEnhancedAsyncClient,
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 = dynamoDbEnhancedAsyncClient.table(tableName, TableSchema.fromBean(dataClass));
tableByIndex = index.length > 0 ? table.index(index[0]) : null;
}
public Mono save(E model) {
return Mono.fromFuture(table.putItem(toEntity(model))).thenReturn(model);
}
public Mono getById(K id) {
return Mono.fromFuture(table.getItem(Key.builder()
.partitionValue(AttributeValue.builder().s((String) id).build())
.build()))
.map(this::toModel);
}
public Mono delete(E model) {
return Mono.fromFuture(table.deleteItem(toEntity(model))).map(this::toModel);
}
public Mono> query(QueryEnhancedRequest queryExpression) {
PagePublisher pagePublisher = table.query(queryExpression);
return listOfModel(pagePublisher);
}
public Mono> queryByIndex(QueryEnhancedRequest queryExpression, String... index) {
DynamoDbAsyncIndex queryIndex = index.length > 0 ? table.index(index[0]) : tableByIndex;
SdkPublisher> pagePublisher = queryIndex.query(queryExpression);
return listOfModel(pagePublisher);
}
/**
* @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 Mono> scan() {
PagePublisher pagePublisher = table.scan();
return listOfModel(pagePublisher);
}
private Mono> listOfModel(PagePublisher pagePublisher) {
return Mono.from(pagePublisher).map(page -> page.items().stream().map(this::toModel).toList());
}
private Mono> listOfModel(SdkPublisher> pagePublisher) {
return Mono.from(pagePublisher).map(page -> page.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