Draft: RankingFlow +Test
This commit is contained in:
parent
74176ecf45
commit
fe1708ad32
@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import djmil.cordacheckers.cordaclient.dao.GameState;
|
import djmil.cordacheckers.cordaclient.dao.GameState;
|
||||||
import djmil.cordacheckers.cordaclient.dao.HoldingIdentity;
|
import djmil.cordacheckers.cordaclient.dao.HoldingIdentity;
|
||||||
import djmil.cordacheckers.cordaclient.dao.Piece;
|
import djmil.cordacheckers.cordaclient.dao.Piece;
|
||||||
|
import djmil.cordacheckers.cordaclient.dao.Rank;
|
||||||
import djmil.cordacheckers.cordaclient.dao.VirtualNode;
|
import djmil.cordacheckers.cordaclient.dao.VirtualNode;
|
||||||
import djmil.cordacheckers.cordaclient.dao.VirtualNodeList;
|
import djmil.cordacheckers.cordaclient.dao.VirtualNodeList;
|
||||||
import djmil.cordacheckers.cordaclient.dao.flow.RequestBody;
|
import djmil.cordacheckers.cordaclient.dao.flow.RequestBody;
|
||||||
@ -29,6 +30,7 @@ import djmil.cordacheckers.cordaclient.dao.flow.arguments.ReqGameBoardMove;
|
|||||||
import djmil.cordacheckers.cordaclient.dao.flow.arguments.ReqGameProposalCreate;
|
import djmil.cordacheckers.cordaclient.dao.flow.arguments.ReqGameProposalCreate;
|
||||||
import djmil.cordacheckers.cordaclient.dao.flow.arguments.RspGameState;
|
import djmil.cordacheckers.cordaclient.dao.flow.arguments.RspGameState;
|
||||||
import djmil.cordacheckers.cordaclient.dao.flow.arguments.RspGameStateList;
|
import djmil.cordacheckers.cordaclient.dao.flow.arguments.RspGameStateList;
|
||||||
|
import djmil.cordacheckers.cordaclient.dao.flow.arguments.RspRankList;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CordaClient {
|
public class CordaClient {
|
||||||
@ -58,6 +60,17 @@ public class CordaClient {
|
|||||||
).virtualNodes();
|
).virtualNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// use custodian holding identity to get ranking table of all players
|
||||||
|
public List<Rank> fetchRanking(HoldingIdentity holdingIdentity) {
|
||||||
|
final RequestBody requestBody = new RequestBody(
|
||||||
|
"ranking-" +UUID.randomUUID(),
|
||||||
|
"djmil.cordacheckers.gameresult.RankingFlow",
|
||||||
|
new Req());
|
||||||
|
|
||||||
|
return cordaFlowExecute(holdingIdentity, requestBody, RspRankList.class)
|
||||||
|
.getResponce(requestBody);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param holdingIdentity
|
* @param holdingIdentity
|
||||||
* @return list of unconsumed (active) GameStateViews
|
* @return list of unconsumed (active) GameStateViews
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package djmil.cordacheckers.cordaclient.dao;
|
||||||
|
|
||||||
|
public record Rank(
|
||||||
|
String name,
|
||||||
|
Integer gamesPlayed,
|
||||||
|
Integer gamesWon
|
||||||
|
) {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package djmil.cordacheckers.cordaclient.dao.flow.arguments;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import djmil.cordacheckers.cordaclient.dao.Rank;
|
||||||
|
|
||||||
|
public record RspRankList(
|
||||||
|
List<Rank> successStatus,
|
||||||
|
String failureStatus) implements Rsp<List<Rank>> {
|
||||||
|
|
||||||
|
}
|
@ -48,7 +48,7 @@ public class HoldingIdentityResolverTests {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testCheckUsers() {
|
void testPlayer() {
|
||||||
assertDoesNotThrow( () -> {
|
assertDoesNotThrow( () -> {
|
||||||
holdingIdentityResolver.getByUsername("alice");
|
holdingIdentityResolver.getByUsername("alice");
|
||||||
holdingIdentityResolver.getByUsername("BOB");
|
holdingIdentityResolver.getByUsername("BOB");
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package djmil.cordacheckers.gameresult;
|
||||||
|
|
||||||
|
public class Rank {
|
||||||
|
public final String name;
|
||||||
|
public final Integer gamesPlayed;
|
||||||
|
public final Integer gamesWon;
|
||||||
|
|
||||||
|
// Serialisation service requires a default constructor
|
||||||
|
Rank() {
|
||||||
|
name = null;
|
||||||
|
gamesPlayed = null;
|
||||||
|
gamesWon = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rank(String name, Integer gamesPlayed, Integer gamesWon) {
|
||||||
|
this.name = name;
|
||||||
|
this.gamesPlayed = gamesPlayed;
|
||||||
|
this.gamesWon = gamesWon;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package djmil.cordacheckers.gameresult;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import djmil.cordacheckers.states.GameResultState;
|
||||||
|
import net.corda.v5.application.flows.ClientRequestBody;
|
||||||
|
import net.corda.v5.application.flows.ClientStartableFlow;
|
||||||
|
import net.corda.v5.application.flows.CordaInject;
|
||||||
|
import net.corda.v5.application.flows.FlowEngine;
|
||||||
|
import net.corda.v5.application.marshalling.JsonMarshallingService;
|
||||||
|
import net.corda.v5.base.annotations.Suspendable;
|
||||||
|
import net.corda.v5.ledger.utxo.UtxoLedgerService;
|
||||||
|
|
||||||
|
public class RankingFlow implements ClientStartableFlow {
|
||||||
|
|
||||||
|
private final static Logger log = LoggerFactory.getLogger(RankingFlow.class);
|
||||||
|
|
||||||
|
@CordaInject
|
||||||
|
public UtxoLedgerService utxoLedgerService;
|
||||||
|
|
||||||
|
@CordaInject
|
||||||
|
public JsonMarshallingService jsonMarshallingService;
|
||||||
|
|
||||||
|
@CordaInject
|
||||||
|
public FlowEngine flowEngine;
|
||||||
|
|
||||||
|
@Suspendable
|
||||||
|
@Override
|
||||||
|
public String call(ClientRequestBody requestBody) {
|
||||||
|
try {
|
||||||
|
final List<GameResultState> gameStateResutList = getGameResultsList();
|
||||||
|
|
||||||
|
final List<Rank> board = new LinkedList<Rank>(List.of(
|
||||||
|
new Rank("alice", 42, 1),
|
||||||
|
new Rank("bobik", 25, 78)
|
||||||
|
));
|
||||||
|
|
||||||
|
return new RankingFlowResponce(board)
|
||||||
|
.toJsonEncodedString(jsonMarshallingService);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("Exception during processing " + requestBody + " request: " + e.getMessage());
|
||||||
|
return new RankingFlowResponce(e)
|
||||||
|
.toJsonEncodedString(jsonMarshallingService);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suspendable
|
||||||
|
List<GameResultState> getGameResultsList() {
|
||||||
|
return utxoLedgerService
|
||||||
|
.findUnconsumedStatesByType(GameResultState.class)
|
||||||
|
.stream()
|
||||||
|
.map( stateAndRef -> stateAndRef.getState().getContractState() )
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package djmil.cordacheckers.gameresult;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.corda.v5.application.marshalling.JsonMarshallingService;
|
||||||
|
|
||||||
|
public class RankingFlowResponce {
|
||||||
|
public final List<Rank> successStatus;
|
||||||
|
public final String failureStatus;
|
||||||
|
|
||||||
|
public RankingFlowResponce(List<Rank> success) {
|
||||||
|
this.successStatus = success;
|
||||||
|
this.failureStatus = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RankingFlowResponce(Exception exception) {
|
||||||
|
this.successStatus = null;
|
||||||
|
this.failureStatus = exception.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toJsonEncodedString(JsonMarshallingService jsonMarshallingService) {
|
||||||
|
return jsonMarshallingService.format(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user