Skip to content

Commit 2ab3c00

Browse files
committed
Print refresh_token for randomPlay at startup
1 parent 3b33e05 commit 2ab3c00

File tree

21 files changed

+97
-54
lines changed

21 files changed

+97
-54
lines changed

contest-core/src/main/java/eu/solven/kumite/app/persistence/InMemoryKumiteConfiguration.java

+1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@
2121
})
2222
@Profile(IKumiteSpringProfiles.P_INMEMORY)
2323
public class InMemoryKumiteConfiguration {
24+
2425
}

contest-core/src/main/java/eu/solven/kumite/contest/Contest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void checkValidMove(PlayerMoveRaw playerMove) {
8686
UUID playerId = playerMove.getPlayerId();
8787
IKumiteMove move = playerMove.getMove();
8888

89-
if (getPlayers().stream().noneMatch(p -> p.getPlayerId().equals(playerId))) {
89+
if (!hasPlayerId(playerId)) {
9090
throw new IllegalArgumentException("playerId=" + playerId + " is not registered");
9191
} else if (!game.isValidMove(move)) {
9292
throw new IllegalArgumentException("move=" + move + " is invalid");

contest-core/src/main/java/eu/solven/kumite/contest/ContestsRegistry.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44
import java.util.Map;
5+
import java.util.Objects;
56
import java.util.Optional;
67
import java.util.UUID;
78
import java.util.stream.Collectors;
@@ -28,9 +29,6 @@ public class ContestsRegistry {
2829
@NonNull
2930
final GamesRegistry gamesRegistry;
3031

31-
// @NonNull
32-
// final LiveContestsRegistry liveContestsManager;
33-
3432
@NonNull
3533
final ContestPlayersRegistry contestPlayersRegistry;
3634

@@ -66,9 +64,6 @@ public Contest registerContest(IGame game, ContestCreationMetadata constantMetad
6664
// (e.g. if the game has a very small timeout)
6765
throw new IllegalArgumentException("When registered, a contest has not to be over");
6866
}
69-
// else {
70-
// liveContestsManager.registerContestLive(contestId);
71-
// }
7267

7368
return contest;
7469
}
@@ -107,7 +102,18 @@ public List<Contest> searchContests(ContestSearchParameters search) {
107102
contestStream = contestsRepository.stream();
108103
}
109104

110-
Stream<Contest> metaStream = contestStream.map(c -> getContest(c.getKey()));
105+
Stream<Contest> metaStream = contestStream.map(c -> {
106+
UUID contestId = c.getKey();
107+
try {
108+
return getContest(contestId);
109+
} catch (RuntimeException e) {
110+
// This may happen if the board expired a bit before the contest metadata
111+
log.warn("Issue loading contestId={}", contestId, e);
112+
return null;
113+
}
114+
})
115+
// Filer the contest having failed to load
116+
.filter(Objects::nonNull);
111117

112118
if (search.getGameId().isPresent()) {
113119
metaStream = metaStream.filter(c -> c.getGameMetadata().getGameId().equals(search.getGameId().get()));

contest-core/src/main/java/eu/solven/kumite/game/IGame.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ default boolean isValidMove(IKumiteMove move) {
4040
default boolean canAcceptPlayer(Contest contest, KumitePlayer player) {
4141
if (!contest.isAcceptingPlayers()) {
4242
return false;
43-
} else if (contest.getPlayers()
44-
.stream()
45-
.map(p -> p.getPlayerId())
46-
.anyMatch(p -> p.equals(player.getPlayerId()))) {
43+
} else if (contest.hasPlayerId(player.getPlayerId())) {
4744
// This player is already registered in given contest: most game accept each player at most once
4845
return false;
4946
}

contest-core/src/main/java/eu/solven/kumite/player/ContestPlayersRegistry.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ private void registerContender(Contest contest, UUID playerId) {
5959
if (!contest.isAcceptingPlayers()) {
6060
// If `isAcceptPlayer` is false, currentAccount should not even consider this game.
6161
throw new IllegalStateException("contestId=" + contestId + " does not accept player");
62-
} else if (contest.getPlayers().stream().anyMatch(p -> p.getPlayerId().equals(playerId))) {
62+
} else if (contest.hasPlayerId(playerId)) {
6363
// This search-API may consider contest with a player from current account as ineligible
6464
throw new IllegalStateException("contestId=" + contestId + " already includes playerId=" + playerId);
6565
}

contest-core/src/main/java/eu/solven/kumite/player/IHasPlayers.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package eu.solven.kumite.player;
22

33
import java.util.List;
4+
import java.util.Set;
45
import java.util.UUID;
6+
import java.util.stream.Collectors;
57

68
/**
79
* Generally provided by {@link ContestPlayersRegistry} (or {@link AccountPlayersRegistry}).
@@ -20,4 +22,8 @@ public interface IHasPlayers {
2022
default boolean hasPlayerId(UUID playerId) {
2123
return getPlayers().stream().anyMatch(p -> p.getPlayerId().equals(playerId));
2224
}
25+
26+
default Set<UUID> getPlayerIds() {
27+
return getPlayers().stream().map(p -> p.getPlayerId()).collect(Collectors.toSet());
28+
}
2329
}

contest-core/src/main/java/eu/solven/kumite/player/persistence/BijectiveAccountPlayersRegistry.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public void registerPlayer(KumitePlayer player) {
2727
UUID accountId = player.getAccountId();
2828
UUID playerId = player.getPlayerId();
2929
if (FakePlayer.ACCOUNT_ID.equals(accountId) && FakePlayer.isFakePlayer(playerId)) {
30-
log.info("Registering the fakeUser");
30+
log.info("Registering a fakePlayer={}", playerId);
3131
} else if (RandomPlayer.ACCOUNT_ID.equals(accountId) && RandomPlayer.isRandomPlayer(playerId)) {
32-
log.info("Registering the randomuser");
32+
log.info("Registering a randomPlayer={}", playerId);
3333
} else if (playerId.equals(generateMainPlayerId(accountId))) {
3434
log.info("Registering accountId={} playerId={}", accountId, playerId);
3535
} else {
@@ -51,10 +51,10 @@ public UUID getAccountId(UUID playerId) {
5151
@Override
5252
public IHasPlayers makeDynamicHasPlayers(UUID accountId) {
5353
if (FakePlayer.ACCOUNT_ID.equals(accountId)) {
54-
List<KumitePlayer> players = Arrays.asList(FakePlayer.fakePlayer(0), FakePlayer.fakePlayer(1));
54+
List<KumitePlayer> players = Arrays.asList(FakePlayer.player(0), FakePlayer.player(1));
5555
return () -> players;
5656
} else if (RandomPlayer.ACCOUNT_ID.equals(accountId)) {
57-
List<KumitePlayer> players = Arrays.asList(RandomPlayer.randomPlayer(0), RandomPlayer.randomPlayer(1));
57+
List<KumitePlayer> players = Arrays.asList(RandomPlayer.player(0), RandomPlayer.player(1));
5858
return () -> players;
5959
}
6060

contest-core/src/test/java/eu/solven/kumite/player/TestInMemoryAccountPlayersRegistry.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class TestInMemoryAccountPlayersRegistry {
1414

1515
private void registerFakePlayers() {
1616
playersRegistry.registerPlayer(FakePlayer.fakePlayer());
17-
playersRegistry.registerPlayer(FakePlayer.fakePlayer(1));
17+
playersRegistry.registerPlayer(FakePlayer.player(1));
1818
}
1919

2020
@Test

monolith/src/test/java/eu/solven/kumite/app/it/TestRandomGamingLogic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void test1v1TurnBased() throws InterruptedException {
9393
IGamingLogic kumitePlayer = new RandomGamingLogic(env, kumiteServer);
9494

9595
for (int iPlayer = 0; iPlayer < nbPlayers; iPlayer++) {
96-
UUID playerId = RandomPlayer.randomPlayerId(iPlayer);
96+
UUID playerId = RandomPlayer.playerId(iPlayer);
9797

9898
executorService.execute(() -> {
9999
try {

monolith/src/test/java/eu/solven/kumite/app/it/TestRandomGamingLogicRedis.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void test1v1TurnBased() throws InterruptedException {
9696
IGamingLogic kumitePlayer = new RandomGamingLogic(env, kumiteServer);
9797

9898
for (int iPlayer = 0; iPlayer < nbPlayers; iPlayer++) {
99-
UUID playerId = RandomPlayer.randomPlayerId(iPlayer);
99+
UUID playerId = RandomPlayer.playerId(iPlayer);
100100

101101
executorService.execute(() -> {
102102
try {

player/src/main/java/eu/solven/kumite/app/KumitePlayerComponentsConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public Void playGames(IGamingLogic kumitePlayer, KumiteWebclientServerProperties
6767

6868
ses.scheduleWithFixedDelay(() -> {
6969
try {
70-
log.info("Playing contests as {}", playerId);
70+
log.info("Playing `playOptimizationGames` as {}", playerId);
7171
kumitePlayer.playOptimizationGames(playerId);
7272
} catch (Throwable t) {
7373
log.warn("Issue while playing games", t);
@@ -77,7 +77,7 @@ public Void playGames(IGamingLogic kumitePlayer, KumiteWebclientServerProperties
7777

7878
ses.scheduleWithFixedDelay(() -> {
7979
try {
80-
log.info("Playing contests as {}", playerId);
80+
log.info("Playing `play1v1TurnBasedGames` as {}", playerId);
8181
kumitePlayer.play1v1TurnBasedGames(playerId);
8282
} catch (Throwable t) {
8383
log.warn("Issue while playing games", t);

player/src/main/java/eu/solven/kumite/app/KumiteWebclientServerProperties.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static String loadRefreshToken(Environment env, IUuidGenerator uuidGenera
4747
}
4848
KumiteTokenService kumiteTokenService = new KumiteTokenService(env, uuidGenerator);
4949
RefreshTokenWrapper wrappedRefreshToken =
50-
kumiteTokenService.wrapInJwtRefreshToken(RandomPlayer.user(), RandomPlayer.randomPlayers());
50+
kumiteTokenService.wrapInJwtRefreshToken(RandomPlayer.user(), RandomPlayer.playerIds());
5151
refreshToken = wrappedRefreshToken.getRefreshToken();
5252
}
5353
return refreshToken;

player/src/test/java/eu/solven/kumite/app/TestParseFakePlayer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public void testPlayerIdFromAccessToken() {
4444
Set<UUID> playerIds = conf.playerIdFromRefreshToken(kumiteWebclientServerProperties);
4545

4646
Assertions.assertThat(playerIds)
47-
.contains(RandomPlayer.randomPlayer(0).getPlayerId())
48-
.contains(RandomPlayer.randomPlayer(1).getPlayerId())
47+
.contains(RandomPlayer.player(0).getPlayerId())
48+
.contains(RandomPlayer.player(1).getPlayerId())
4949
.hasSize(2);
5050
}
5151
}

public/src/main/java/eu/solven/kumite/account/fake_player/FakePlayer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static KumitePlayer fakePlayer() {
5757
return KumitePlayer.builder().playerId(PLAYER_ID1).accountId(ACCOUNT_ID).build();
5858
}
5959

60-
public static KumitePlayer fakePlayer(int i) {
60+
public static KumitePlayer player(int i) {
6161
return KumitePlayer.builder().playerId(fakePlayerId(i)).accountId(ACCOUNT_ID).build();
6262
}
6363

public/src/main/java/eu/solven/kumite/account/fake_player/RandomPlayer.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class RandomPlayer {
2323
public static final UUID PLAYERID_1 = UUID.fromString("FFFFFFFF-FFFF-FFFF-FFFF-111111111111");
2424
public static final UUID RANDOM_PLAYERID2 = UUID.fromString("FFFFFFFF-FFFF-FFFF-FFFF-222222222222");
2525

26-
public static UUID randomPlayerId(int playerIndex) {
26+
public static UUID playerId(int playerIndex) {
2727
if (playerIndex == 0) {
2828
return PLAYERID_1;
2929
} else if (playerIndex == 1) {
@@ -52,15 +52,15 @@ public static KumiteUser user() {
5252
return KumiteUser.builder().accountId(ACCOUNT_ID).playerId(PLAYERID_1).raw(raw).build();
5353
}
5454

55-
public static KumitePlayer randomPlayer() {
55+
public static KumitePlayer player() {
5656
return KumitePlayer.builder().playerId(PLAYERID_1).accountId(ACCOUNT_ID).build();
5757
}
5858

59-
public static KumitePlayer randomPlayer(int i) {
60-
return KumitePlayer.builder().playerId(randomPlayerId(i)).accountId(ACCOUNT_ID).build();
59+
public static KumitePlayer player(int i) {
60+
return KumitePlayer.builder().playerId(playerId(i)).accountId(ACCOUNT_ID).build();
6161
}
6262

63-
public static Set<UUID> randomPlayers() {
63+
public static Set<UUID> playerIds() {
6464
return Set.of(RandomPlayer.PLAYERID_1, RandomPlayer.RANDOM_PLAYERID2);
6565
}
6666

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package eu.solven.kumite.app;
22

3+
import org.springframework.beans.factory.annotation.Qualifier;
34
import org.springframework.context.annotation.Bean;
45
import org.springframework.context.annotation.Configuration;
56
import org.springframework.context.annotation.Profile;
67

8+
import eu.solven.kumite.account.KumiteUser;
79
import eu.solven.kumite.account.KumiteUsersRegistry;
810
import eu.solven.kumite.account.fake_player.FakePlayer;
911
import eu.solven.kumite.account.fake_player.RandomPlayer;
@@ -15,23 +17,29 @@
1517
public class InjectKumiteAccountsConfig {
1618

1719
@Profile(IKumiteSpringProfiles.P_FAKEUSER)
20+
@Qualifier(IKumiteSpringProfiles.P_FAKEUSER)
1821
@Bean
19-
public Void initFakePlayer(KumiteUsersRegistry usersRegistry, IAccountPlayersRegistry accountPlayersRegistry) {
22+
public KumiteUser initFakePlayer(KumiteUsersRegistry usersRegistry,
23+
IAccountPlayersRegistry accountPlayersRegistry) {
2024
log.info("Registering the {} account and players", IKumiteSpringProfiles.P_FAKEUSER);
2125

22-
usersRegistry.registerOrUpdate(FakePlayer.user().getRaw());
23-
accountPlayersRegistry.registerPlayer(FakePlayer.fakePlayer(1));
26+
KumiteUser user = usersRegistry.registerOrUpdate(FakePlayer.user().getRaw());
27+
// Register an additional player
28+
accountPlayersRegistry.registerPlayer(FakePlayer.player(1));
2429

25-
return null;
30+
return user;
2631
}
2732

33+
@Qualifier("random")
2834
@Bean
29-
public Void initRandomPlayer(KumiteUsersRegistry usersRegistry, IAccountPlayersRegistry accountPlayersRegistry) {
35+
public KumiteUser initRandomPlayer(KumiteUsersRegistry usersRegistry,
36+
IAccountPlayersRegistry accountPlayersRegistry) {
3037
log.info("Registering the random account and players");
3138

32-
usersRegistry.registerOrUpdate(RandomPlayer.user().getRaw());
33-
accountPlayersRegistry.registerPlayer(RandomPlayer.randomPlayer(1));
39+
KumiteUser user = usersRegistry.registerOrUpdate(RandomPlayer.user().getRaw());
40+
// Register an additional player
41+
accountPlayersRegistry.registerPlayer(RandomPlayer.player(1));
3442

35-
return null;
43+
return user;
3644
}
3745
}

server/src/main/java/eu/solven/kumite/app/KumiteContestServerApplication.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,10 @@ public static void main(String[] args) {
3131

3232
// https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#spring-session-store-type
3333
@Bean
34+
// This will override any auto-configured SessionRepository like Redis one
3435
@Profile({ IKumiteSpringProfiles.P_INMEMORY })
3536
public ReactiveSessionRepository<?> inmemorySessionRepository() {
3637
return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
3738
}
3839

39-
// https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#spring-session-store-type
40-
@Bean
41-
public ReactiveSessionRepository<?> redisSessionRepository() {
42-
return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
43-
}
44-
4540
}

server/src/main/java/eu/solven/kumite/app/webflux/api/KumiteLoginController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public Mono<?> token(@RequestParam(name = "player_id", required = false) String
210210
void checkValidPlayerId(KumiteUser user, UUID playerId) {
211211
UUID accountId = user.getAccountId();
212212
if (!playersRegistry.makeDynamicHasPlayers(accountId).hasPlayerId(playerId)) {
213-
throw new IllegalArgumentException("player_id=" + playerId + " is not managed by accountId=" + accountId);
213+
throw new IllegalArgumentException("playerId=" + playerId + " is not managed by accountId=" + accountId);
214214
}
215215
}
216216

server/src/main/java/eu/solven/kumite/security/KumiteSecurity.java

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
package eu.solven.kumite.security;
22

3+
import java.util.Set;
4+
import java.util.UUID;
5+
6+
import org.springframework.beans.factory.annotation.Qualifier;
37
import org.springframework.context.annotation.Bean;
48
import org.springframework.context.annotation.Import;
59
import org.springframework.context.annotation.Profile;
610
import org.springframework.core.env.Environment;
711
import org.springframework.core.env.Profiles;
812
import org.springframework.web.bind.annotation.RestController;
9-
import org.springframework.web.server.WebExceptionHandler;
1013

1114
import eu.solven.kumite.account.JwtUserContextHolder;
15+
import eu.solven.kumite.account.KumiteUser;
1216
import eu.solven.kumite.app.IKumiteSpringProfiles;
1317
import eu.solven.kumite.app.webflux.KumiteWebExceptionHandler;
1418
import eu.solven.kumite.app.webflux.api.KumiteLoginController;
1519
import eu.solven.kumite.app.webflux.api.KumitePublicController;
1620
import eu.solven.kumite.app.webflux.api.MetadataController;
21+
import eu.solven.kumite.login.RefreshTokenWrapper;
1722
import eu.solven.kumite.oauth2.authorizationserver.KumiteTokenService;
1823
import eu.solven.kumite.oauth2.resourceserver.KumiteResourceServerConfiguration;
24+
import eu.solven.kumite.player.IAccountPlayersRegistry;
1925
import lombok.extern.slf4j.Slf4j;
2026

2127
// https://docs.spring.io/spring-security/reference/reactive/oauth2/login/advanced.html#webflux-oauth2-login-advanced-userinfo-endpoint
@@ -33,6 +39,8 @@
3339

3440
JwtUserContextHolder.class,
3541

42+
KumiteWebExceptionHandler.class,
43+
3644
})
3745
@Slf4j
3846
public class KumiteSecurity {
@@ -71,13 +79,18 @@ public Void checkSpringProfilesConsistency(Environment env) {
7179
return null;
7280
}
7381

74-
// @Bean
75-
// WebFilter kumiteExceptionRoutingWebFilter() {
76-
// return new KumiteExceptionRoutingWebFilter();
77-
// }
78-
82+
// We print a refreshToken at startup, as it makes it easier to configure a player
7983
@Bean
80-
WebExceptionHandler kumiteWebExceptionHandler() {
81-
return new KumiteWebExceptionHandler();
84+
public Void printRandomPlayerRefreshToken(@Qualifier("random") KumiteUser user,
85+
KumiteTokenService tokenService,
86+
IAccountPlayersRegistry accountPlayersRegistry) {
87+
UUID accountId = user.getAccountId();
88+
89+
Set<UUID> playerIds = accountPlayersRegistry.makeDynamicHasPlayers(accountId).getPlayerIds();
90+
RefreshTokenWrapper refreshToken = tokenService.wrapInJwtRefreshToken(user, playerIds);
91+
92+
log.info("refresh_token for accountId={}: {}", user.getAccountId(), refreshToken);
93+
94+
return null;
8295
}
8396
}

server/src/test/java/eu/solven/kumite/app/TestSpringAutonomyDefault.java

+9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package eu.solven.kumite.app;
22

3+
import org.assertj.core.api.Assertions;
34
import org.junit.jupiter.api.Test;
45
import org.junit.jupiter.api.extension.ExtendWith;
56
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.boot.test.context.SpringBootTest;
78
import org.springframework.context.ApplicationContext;
9+
import org.springframework.session.ReactiveMapSessionRepository;
10+
import org.springframework.session.ReactiveSessionRepository;
811
import org.springframework.test.context.junit.jupiter.SpringExtension;
912

1013
import lombok.extern.slf4j.Slf4j;
@@ -21,4 +24,10 @@ public class TestSpringAutonomyDefault implements IKumiteSpringProfiles {
2124
public void testSpringProfiles() {
2225
log.info("startupDate: {}", appContest.getStartupDate());
2326
}
27+
28+
@Test
29+
public void testSession() {
30+
Assertions.assertThat(appContest.getBean(ReactiveSessionRepository.class))
31+
.isInstanceOf(ReactiveMapSessionRepository.class);
32+
}
2433
}

0 commit comments

Comments
 (0)