Search in sources :

Example 1 with ReactiveFirestoreResourceHolder

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);
    });
}
Also used : Write(com.google.firestore.v1.Write) ReactiveFirestoreResourceHolder(org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder) TransactionContext(org.springframework.transaction.reactive.TransactionContext)

Example 2 with ReactiveFirestoreResourceHolder

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);
    });
}
Also used : Write(com.google.firestore.v1.Write) ReactiveFirestoreResourceHolder(org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder) TransactionContext(org.springframework.transaction.reactive.TransactionContext)

Example 3 with ReactiveFirestoreResourceHolder

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);
    });
}
Also used : ReactiveFirestoreResourceHolder(org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder) TransactionContext(org.springframework.transaction.reactive.TransactionContext)

Aggregations

ReactiveFirestoreResourceHolder (org.springframework.cloud.gcp.data.firestore.transaction.ReactiveFirestoreResourceHolder)3 TransactionContext (org.springframework.transaction.reactive.TransactionContext)3 Write (com.google.firestore.v1.Write)2