1
1
package eu .solven .kumite .app ;
2
2
3
+ import java .util .Map ;
3
4
import java .util .UUID ;
4
5
5
6
import org .springframework .core .env .Environment ;
6
7
import org .springframework .http .HttpHeaders ;
7
8
import org .springframework .web .reactive .function .client .WebClient ;
9
+ import org .springframework .web .reactive .function .client .WebClient .RequestBodySpec ;
8
10
import org .springframework .web .reactive .function .client .WebClient .RequestHeadersSpec ;
9
11
10
12
import eu .solven .kumite .contest .ContestMetadataRaw ;
11
13
import eu .solven .kumite .contest .ContestSearchParameters ;
12
14
import eu .solven .kumite .contest .ContestView ;
13
15
import eu .solven .kumite .game .GameMetadata ;
14
16
import eu .solven .kumite .game .GameSearchParameters ;
17
+ import eu .solven .kumite .player .PlayerRawMovesHolder ;
18
+ import eu .solven .kumite .player .PlayingPlayer ;
19
+ import lombok .extern .slf4j .Slf4j ;
15
20
import reactor .core .publisher .Flux ;
16
21
import reactor .core .publisher .Mono ;
17
22
22
27
*
23
28
*/
24
29
// https://www.baeldung.com/spring-5-webclient
30
+ @ Slf4j
25
31
public class KumiteWebclientServer implements IKumiteServer {
26
32
WebClient webClient ;
27
33
28
34
public KumiteWebclientServer (Environment env ) {
29
-
30
35
String serverUrl = env .getRequiredProperty ("kumite.server.base-url" );
31
36
String accessToken = env .getRequiredProperty ("kumite.server.access_token" );
32
37
@@ -36,6 +41,18 @@ public KumiteWebclientServer(Environment env) {
36
41
.build ();
37
42
}
38
43
44
+ // https://github.com/spring-projects/spring-boot/issues/5077
45
+ public KumiteWebclientServer (Environment env , int randomServerPort ) {
46
+ String serverUrl = env .getRequiredProperty ("kumite.server.base-url" )
47
+ .replaceFirst ("LocalServerPort" , Integer .toString (randomServerPort ));
48
+ String accessToken = env .getRequiredProperty ("kumite.server.access_token" );
49
+
50
+ webClient = WebClient .builder ()
51
+ .baseUrl (serverUrl )
52
+ .defaultHeader (HttpHeaders .AUTHORIZATION , "Bearer " + accessToken )
53
+ .build ();
54
+ }
55
+
39
56
@ Override
40
57
public Flux <GameMetadata > searchGames (GameSearchParameters search ) {
41
58
RequestHeadersSpec <?> spec = webClient .get ()
@@ -45,27 +62,92 @@ public Flux<GameMetadata> searchGames(GameSearchParameters search) {
45
62
.build ());
46
63
47
64
return spec .exchangeToFlux (r -> {
65
+ if (!r .statusCode ().is2xxSuccessful ()) {
66
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
67
+ }
68
+ log .info ("Search for games: {}" , r .statusCode ());
48
69
return r .bodyToFlux (GameMetadata .class );
49
70
});
50
71
}
51
72
52
73
@ Override
53
- public Flux <ContestMetadataRaw > searchContests (ContestSearchParameters contestSearchParameters ) {
54
- return webClient .get ().uri ("/api/contests" ).exchangeToFlux (r -> {
74
+ public Flux <ContestMetadataRaw > searchContests (ContestSearchParameters search ) {
75
+ RequestHeadersSpec <?> spec = webClient .get ()
76
+ .uri (uriBuilder -> uriBuilder .path ("/api/contests" )
77
+ .queryParamIfPresent ("game_id" , search .getGameId ())
78
+ .queryParamIfPresent ("contest_id" , search .getContestId ())
79
+ .build ());
80
+
81
+ return spec .exchangeToFlux (r -> {
82
+ if (!r .statusCode ().is2xxSuccessful ()) {
83
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
84
+ }
85
+ log .info ("Search for contests: {}" , r .statusCode ());
55
86
return r .bodyToFlux (ContestMetadataRaw .class );
56
87
});
57
88
}
58
89
59
90
@ Override
60
- public Mono <ContestView > loadBoard (UUID contestId , UUID playerId ) {
61
- return webClient .get ().uri ("/api/board" ).exchangeToMono (r -> {
91
+ public Mono <ContestView > loadBoard (UUID playerId , UUID contestId ) {
92
+ RequestHeadersSpec <?> spec = webClient .get ()
93
+ .uri (uriBuilder -> uriBuilder .path ("/api/board" )
94
+ .queryParam ("player_id" , playerId )
95
+ .queryParam ("contest_id" , contestId )
96
+ .build ());
97
+
98
+ return spec .exchangeToMono (r -> {
99
+ if (!r .statusCode ().is2xxSuccessful ()) {
100
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
101
+ }
62
102
return r .bodyToMono (ContestView .class );
63
103
});
64
104
}
65
105
66
106
@ Override
67
- public Mono <ContestView > joinContest (UUID playerId , UUID contestId ) {
68
- return webClient .post ().uri ("/api/board/player" ).bodyValue (contestId ).exchangeToMono (r -> {
107
+ public Mono <PlayingPlayer > joinContest (UUID playerId , UUID contestId ) {
108
+ RequestBodySpec spec = webClient .post ()
109
+ .uri (uriBuilder -> uriBuilder .path ("/api/board/player" )
110
+ .queryParam ("player_id" , playerId )
111
+ .queryParam ("contest_id" , contestId )
112
+ .build ());
113
+
114
+ return spec .bodyValue (contestId ).exchangeToMono (r -> {
115
+ if (!r .statusCode ().is2xxSuccessful ()) {
116
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
117
+ }
118
+ return r .bodyToMono (PlayingPlayer .class );
119
+ });
120
+ }
121
+
122
+ @ Override
123
+ public Mono <PlayerRawMovesHolder > getExampleMoves (UUID playerId , UUID contestId ) {
124
+ RequestHeadersSpec <?> spec = webClient .get ()
125
+ .uri (uriBuilder -> uriBuilder .path ("/api/board/moves" )
126
+ .queryParam ("player_id" , playerId )
127
+ .queryParam ("contest_id" , contestId )
128
+ .build ());
129
+
130
+ return spec .exchangeToMono (r -> {
131
+ if (!r .statusCode ().is2xxSuccessful ()) {
132
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
133
+ }
134
+ log .info ("Search for moves: {}" , r .statusCode ());
135
+ return r .bodyToMono (PlayerRawMovesHolder .class );
136
+ });
137
+ }
138
+
139
+ @ Override
140
+ public Mono <ContestView > playMove (UUID playerId , UUID contestId , Map <String , ?> move ) {
141
+ RequestBodySpec spec = webClient .post ()
142
+ .uri (uriBuilder -> uriBuilder .path ("/api/board/move" )
143
+ .queryParam ("player_id" , playerId )
144
+ .queryParam ("contest_id" , contestId )
145
+ .build ());
146
+
147
+ return spec .bodyValue (move ).exchangeToMono (r -> {
148
+ if (!r .statusCode ().is2xxSuccessful ()) {
149
+ throw new IllegalArgumentException ("Request rejected: " + r .statusCode ());
150
+ }
69
151
return r .bodyToMono (ContestView .class );
70
152
});
71
153
}
0 commit comments