Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 44 additions & 11 deletions src/main/java/org/folio/rest/impl/PetsImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.folio.rest.persist.interfaces.Results;
import org.folio.rest.utils.PgQuery;
import org.folio.rest.utils.PgTransaction;
import org.folio.rest.utils.TransactionExecutor;

import javax.ws.rs.core.Response;
import java.util.List;
Expand Down Expand Up @@ -176,20 +177,52 @@ public void getPetsAdoptById(String id, Map<String, String> okapiHeaders, Handle
}
}

// @Override
// public void postPetsAdoptById(String id, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
// try {
// vertxContext.runOnContext(v -> {
// Pet entity = new Pet();
// entity.setId(id);
// PgTransaction<Pet> pgTransaction = new PgTransaction<>(entity);
// pgTransaction.pgClient = pgClient;
// Future.succeededFuture(pgTransaction)
// .compose(this::startTx)
// .compose(this::findPet)
// .compose(this::vacateShelterPlace)
// .compose(this::adoptPet)
// .compose(this::endTx)
// .setHandler(res -> {
// if (res.failed()) {
// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase())));
// } else if (res.result().entity == null) {
// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond404WithTextPlain(Response.Status.NOT_FOUND.getReasonPhrase())));
// } else {
// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond201WithApplicationJson(res.result().entity)));
// }
// });
// });
// } catch (Exception e) {
// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase())));
// }
// }

@Override
public void postPetsAdoptById(String id, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
try {
vertxContext.runOnContext(v -> {
Pet entity = new Pet();
entity.setId(id);
PgTransaction<Pet> pgTransaction = new PgTransaction<>(entity);
Future.succeededFuture(pgTransaction)
.compose(this::startTx)
.compose(this::findPet)
.compose(this::vacateShelterPlace)
.compose(this::adoptPet)
.compose(this::endTx)
.setHandler(res -> {
pgTransaction.pgClient = pgClient;
new TransactionExecutor<Pet>() {
@Override
public Future<PgTransaction<Pet>> runInTransaction(PgTransaction<Pet> tx) {
return Future.succeededFuture(tx)
.compose(PetsImpl.this::findPet)
.compose(PetsImpl.this::vacateShelterPlace)
.compose(PetsImpl.this::adoptPet);
}
}.executeTransaction(pgTransaction).setHandler(res -> {
if (res.failed()) {
asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase())));
} else if (res.result().entity == null) {
Expand Down Expand Up @@ -245,14 +278,14 @@ private Future<PgTransaction<Pet>> vacateShelterPlace(PgTransaction<Pet> tx) {
if (reply.succeeded()) {
future.complete(tx);
} else {
pgClient.rollbackTx(tx.sqlConnection, res -> future.fail(reply.cause()));
future.fail(reply.cause());
}
});
} else {
future.complete(tx);
}
} catch (Exception e) {
pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(e));
future.fail(e);
}
return future;
}
Expand All @@ -270,14 +303,14 @@ private Future<PgTransaction<Pet>> adoptPet(PgTransaction<Pet> tx) {
tx.entity = entity;
future.complete(tx);
} else {
pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(postReply.cause()));
future.fail(postReply.cause());
}
});
} else {
future.complete(tx);
}
} catch (Exception e) {
pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(e));
future.fail(e);
}
return future;
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/folio/rest/utils/PgTransaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import io.vertx.core.AsyncResult;
import io.vertx.ext.sql.SQLConnection;
import org.folio.rest.persist.PostgresClient;
import org.folio.rest.tools.utils.OutStream;

public class PgTransaction<T> {
public T entity;
public PostgresClient pgClient;
public AsyncResult<SQLConnection> sqlConnection;
public OutStream stream;
public AsyncResult<String> location;
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/org/folio/rest/utils/TransactionExecutor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.folio.rest.utils;

import io.vertx.core.Future;

public abstract class TransactionExecutor<T> {

public Future<PgTransaction<T>> executeTransaction(PgTransaction<T> tx) {
Future<PgTransaction<T>> future = Future.future();
Future.succeededFuture(tx)
.compose(this::startTx)
.compose(this::runInTransaction)
.compose(this::endTx)
.setHandler(res -> {
if (res.failed()) {
tx.pgClient.rollbackTx(tx.sqlConnection, done -> future.fail(res.cause()));
} else {
future.complete(tx);
}
});
return future;
}

public abstract Future<PgTransaction<T>> runInTransaction(PgTransaction<T> tx);

private Future<PgTransaction<T>> startTx(PgTransaction<T> tx) {
Future<PgTransaction<T>> future = Future.future();
tx.pgClient.startTx(sqlConnection -> {
tx.sqlConnection = sqlConnection;
future.complete(tx);
});
return future;
}

private Future<PgTransaction<T>> endTx(PgTransaction<T> tx) {
Future<PgTransaction<T>> future = Future.future();
tx.pgClient.endTx(tx.sqlConnection, v -> {
future.complete(tx);
});
return future;
}

}