use of org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder in project spring-cloud-gcp by spring-cloud.
the class FirestoreTemplate method deleteDocumentsByName.
private Flux<String> deleteDocumentsByName(Flux<String> documentNames) {
return Mono.subscriberContext().flatMapMany(ctx -> {
Optional<TransactionContext> transactionContext = ctx.getOrEmpty(TransactionContext.class);
if (transactionContext.isPresent()) {
ReactiveFirestoreResourceHolder holder = (ReactiveFirestoreResourceHolder) transactionContext.get().getResources().get(this.firestore);
List<Write> writes = holder.getWrites();
// In a transaction, all write operations should be sent in the commit request, so we just collect them
return Flux.from(documentNames).doOnNext(t -> writes.add(createDeleteWrite(t)));
}
return commitWrites(documentNames, this::createDeleteWrite);
});
}
use of org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder in project spring-cloud-gcp by spring-cloud.
the class FirestoreTemplate method saveAll.
/**
* {@inheritDoc}
*
* <p>The buffer size and buffer timeout settings for {@link #saveAll} can be modified by calling
* {@link #setWriteBufferSize} and {@link #setWriteBufferTimeout}.
*/
@Override
public <T> Flux<T> saveAll(Publisher<T> instances) {
return Mono.subscriberContext().flatMapMany(ctx -> {
Optional<TransactionContext> transactionContext = ctx.getOrEmpty(TransactionContext.class);
if (transactionContext.isPresent()) {
ReactiveFirestoreResourceHolder holder = (ReactiveFirestoreResourceHolder) transactionContext.get().getResources().get(this.firestore);
List<Write> writes = holder.getWrites();
// In a transaction, all write operations should be sent in the commit request, so we just collect them
return Flux.from(instances).doOnNext(t -> writes.add(createUpdateWrite(t)));
}
return commitWrites(instances, this::createUpdateWrite);
});
}
use of org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder in project spring-cloud-gcp by spring-cloud.
the class FirestoreTemplate method doIfTransaction.
private void doIfTransaction(Context ctx, Consumer<ReactiveFirestoreResourceHolder> holderConsumer) {
Optional<TransactionContext> transactionContext = ctx.getOrEmpty(TransactionContext.class);
transactionContext.ifPresent(transactionCtx -> {
ReactiveFirestoreResourceHolder holder = (ReactiveFirestoreResourceHolder) transactionCtx.getResources().get(this.firestore);
if (!holder.getWrites().isEmpty()) {
throw new FirestoreDataException("Read operations are only allowed before write operations in a transaction");
}
holderConsumer.accept(holder);
});
}
Aggregations