Skip to content

Commit db550fc

Browse files
authored
feat : 랜덤 인카운터 추가, jwt 를 이용한 일시적인 이벤트 생성, 하루에 인카운터, 배틀 횟수 제한 토큰 생성 (#85)
* feat : 랜덤 인카운터 추가, jwt 를 이용한 일시적인 이벤트 생성, 하루에 인카운터, 배틀 횟수 제한 토큰 생성 * chore : 오타수정
1 parent 58d8a20 commit db550fc

34 files changed

+378
-100
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.ezcode.codetest.application.game.dto.request.encounter;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
6+
@Schema(description = "배틀 요청")
7+
public record BattleRequest(
8+
9+
@Schema(description = "배틀 토큰")
10+
@NotBlank(message = "배틀 토큰은 반드시 입력해야합니다.")
11+
String battleToken
12+
13+
) {
14+
}
15+

src/main/java/org/ezcode/codetest/application/game/dto/request/encounter/EncounterChoiceRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package org.ezcode.codetest.application.game.dto.request.encounter;
22

33
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
45
import jakarta.validation.constraints.NotNull;
56

67
@Schema(description = "인카운터 선택지 결정 요청")
78
public record EncounterChoiceRequest(
89

10+
@Schema(description = "인카운터 토큰")
11+
@NotBlank(message = "인카운터 토큰은 반드시 입력해야합니다.")
12+
String encounterToken,
13+
914
@NotNull(message = "인카운터를 선택지를 선택해주세요.(true, false)")
1015
@Schema(description = "인카운터 선택지 결정(true:yes, false:no)")
1116
Boolean playerDecision

src/main/java/org/ezcode/codetest/application/game/dto/request/encounter/RandomEncounterSaveRequest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ public record RandomEncounterSaveRequest(
2424

2525
@NotBlank(message = "설명란은 필수입니다.")
2626
@Schema(description = "저장할 인카운터의 설명 및 묘사")
27-
String encounterText
27+
String encounterText,
28+
29+
@NotBlank(message = "인카운터 선택지 1 입력은 필수입니다.")
30+
@Schema(description = "인카운터 선택지 1 메시지")
31+
String choice1Text,
32+
33+
@NotBlank(message = "인카운터 선택지 2 입력은 필수입니다.")
34+
@Schema(description = "인카운터 선택지 2 메시지")
35+
String choice2Text
2836

2937
) {
3038
public RandomEncounter toRandomEncounter() {
@@ -33,6 +41,8 @@ public RandomEncounter toRandomEncounter() {
3341
.activated(true)
3442
.name(name)
3543
.encounterText(encounterText)
44+
.choice1Text(choice1Text)
45+
.choice2Text(choice2Text)
3646
.build();
3747
}
3848
}

src/main/java/org/ezcode/codetest/application/game/dto/response/encounter/EncounterResponse.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ public record EncounterResponse(
1919
@Schema(description = "인카운터 설명 및 묘사")
2020
String encounterText,
2121

22+
@Schema(description = "인카운터 선택지 1")
23+
String choice1Text,
24+
25+
@Schema(description = "인카운터 선택지 2")
26+
String choice2Text,
27+
2228
@Schema(description = "현재 인카운터 활성 여부")
2329
boolean activated
2430

src/main/java/org/ezcode/codetest/application/game/dto/response/encounter/MatchingBattleResponse.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ public record MatchingBattleResponse(
1111
@Schema(description = "두 플레이어 간 조우했을 시 상황묘사")
1212
String message,
1313

14-
@Schema(description = "적 플레이어의 캐릭터 ID")
15-
Long enemyId
14+
@Schema(description = "적 플레이어의 캐릭터(jwtToken) ID")
15+
String enemyIdToken
1616

1717
) {
18-
public static MatchingBattleResponse of(boolean isEnemyStrongThanMe, String message, Long enemyId) {
18+
public static MatchingBattleResponse of(boolean isEnemyStrongThanMe, String message, String enemyIdToken) {
1919

20-
return new MatchingBattleResponse(isEnemyStrongThanMe, message, enemyId);
20+
return new MatchingBattleResponse(isEnemyStrongThanMe, message, enemyIdToken);
2121
}
2222
}

src/main/java/org/ezcode/codetest/application/game/dto/response/encounter/MatchingEncounterResponse.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,34 @@
1010
@Schema(description = "인카운터 매칭 요청에 대한 응답")
1111
public record MatchingEncounterResponse(
1212

13-
@Schema(description = "인카운터 ID")
14-
Long id,
13+
@Schema(description = "인카운터 ID(jwt 토큰)")
14+
String id,
1515

1616
@Schema(description = "인카운터 카테고리")
1717
EncounterCategory encounterCategory,
1818

1919
@Schema(description = "인카운터 이름")
2020
String name,
2121

22+
@Schema(description = "인카운터 선택지 1")
23+
String choice1Text,
24+
25+
@Schema(description = "인카운터 선택지 2")
26+
String choice2Text,
27+
2228
@Schema(description = "인카운터 설명/묘사")
2329
String encounterText
2430

2531
) {
26-
public static MatchingEncounterResponse from(RandomEncounter encounter) {
32+
public static MatchingEncounterResponse from(RandomEncounter encounter, String encounterIdToken) {
2733

2834
return MatchingEncounterResponse.builder()
2935
.encounterCategory(encounter.getEncounterCategory())
30-
.id(encounter.getId())
36+
.id(encounterIdToken)
3137
.name(encounter.getName())
3238
.encounterText(encounter.getEncounterText())
39+
.choice1Text(encounter.getChoice1Text())
40+
.choice2Text(encounter.getChoice2Text())
3341
.build();
3442
}
3543
}

src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44

55
import org.ezcode.codetest.application.game.dto.mapper.GameMapper;
6+
import org.ezcode.codetest.application.game.dto.request.encounter.BattleRequest;
67
import org.ezcode.codetest.application.game.dto.request.encounter.EncounterChoiceRequest;
78
import org.ezcode.codetest.application.game.dto.request.skill.SkillEquipRequest;
89
import org.ezcode.codetest.application.game.dto.request.skill.SkillUnEquipRequest;
@@ -15,6 +16,7 @@
1516
import org.ezcode.codetest.application.game.dto.response.item.ItemResponse;
1617
import org.ezcode.codetest.application.game.dto.response.skill.SkillGamblingResponse;
1718
import org.ezcode.codetest.application.game.dto.response.skill.SkillResponse;
19+
import org.ezcode.codetest.common.security.util.JwtUtil;
1820
import org.ezcode.codetest.domain.game.model.character.GameCharacter;
1921
import org.ezcode.codetest.domain.game.model.encounter.EncounterHistory;
2022
import org.ezcode.codetest.domain.game.model.encounter.EncounterLog;
@@ -33,6 +35,7 @@
3335
import org.springframework.stereotype.Service;
3436
import org.springframework.transaction.annotation.Transactional;
3537

38+
import io.jsonwebtoken.Claims;
3639
import lombok.RequiredArgsConstructor;
3740

3841
@Service
@@ -44,6 +47,7 @@ public class GamePlayUseCase {
4447
private final UserDomainService userDomainService;
4548
private final GameEncounterDomainService encounterDomainService;
4649
private final GameMapper gameMapper;
50+
private final JwtUtil jwtUtil;
4751

4852
@Transactional
4953
public void createCharacter(String email) {
@@ -134,9 +138,14 @@ public SkillGamblingResponse gamblingForSkill(Long userId) {
134138
}
135139

136140
@Transactional
137-
public BattleHistoryResponse battle(Long playerId, Long enemyId) {
141+
public BattleHistoryResponse battle(Long playerId, BattleRequest request) {
142+
143+
Claims claims = jwtUtil.extractClaims(request.battleToken());
144+
145+
Long enemyId = Long.valueOf(claims.getSubject());
138146

139147
GameCharacter playerCharacter = characterService.getGameCharacter(playerId);
148+
140149
GameCharacter enemyCharacter = characterService.getGameCharacter(enemyId);
141150

142151
BattleLog log = encounterDomainService.battle(playerCharacter, enemyCharacter);
@@ -152,50 +161,56 @@ public BattleHistoryResponse battle(Long playerId, Long enemyId) {
152161
}
153162

154163
@Transactional
155-
public BattleHistoryResponse randomBattle(Long playerId) {
164+
public BattleHistoryResponse randomBattle(Long userId) {
156165

157-
GameCharacter playerCharacter = characterService.getGameCharacter(playerId);
166+
GameCharacter player = characterService.getGameCharacter(userId);
158167

159-
GameCharacter enemyCharacter = encounterDomainService.getRandomEnemyCharacter(playerId);
168+
GameCharacter enemy = encounterDomainService.getRandomEnemyCharacter(userId, player.getId());
160169

161-
BattleLog log = encounterDomainService.battle(playerCharacter, enemyCharacter);
170+
BattleLog log = encounterDomainService.battle(player, enemy);
162171

163-
encounterDomainService.createBattleHistory(playerCharacter, enemyCharacter, log);
172+
encounterDomainService.createBattleHistory(player, enemy, log);
164173

165174
return BattleHistoryResponse.of(
166-
playerCharacter.getName(),
167-
enemyCharacter.getName(),
175+
player.getName(),
176+
enemy.getName(),
168177
log.getMessages(),
169178
log.getPlayerWin()
170179
);
171180
}
172181

173182
@Transactional
174-
public MatchingBattleResponse randomBattleMatching(Long playerId) {
183+
public MatchingBattleResponse randomBattleMatching(Long userId) {
175184

176-
GameCharacter playerCharacter = characterService.getGameCharacter(playerId);
185+
GameCharacter player = characterService.getGameCharacter(userId);
177186

178-
GameCharacter enemyCharacter = encounterDomainService.getRandomEnemyCharacter(playerId);
187+
GameCharacter enemy = encounterDomainService.getRandomEnemyCharacter(userId, player.getId());
179188

180-
boolean checkStrength = encounterDomainService.compareStrength(playerCharacter, enemyCharacter);
189+
boolean checkStrength = encounterDomainService.compareStrength(player, enemy);
181190

182-
String matchMessage = MatchMessageTemplate.random(playerCharacter.getName(), enemyCharacter.getName());
191+
String matchMessage = MatchMessageTemplate.random(player.getName(), enemy.getName());
183192

184-
Long enemyUserId = enemyCharacter.getUser().getId();
193+
Long enemyUserId = enemy.getUser().getId();
185194

186-
return MatchingBattleResponse.of(checkStrength, matchMessage, enemyUserId);
195+
return MatchingBattleResponse.of(checkStrength, matchMessage, jwtUtil.createGameToken(enemyUserId));
187196
}
188197

189198
@Transactional
190-
public MatchingEncounterResponse randomEncounterMatching() {
199+
public MatchingEncounterResponse randomEncounterMatching(Long userId) {
191200

192-
RandomEncounter encounter = encounterDomainService.getRandomEncounter();
201+
GameCharacter playerCharacter = characterService.getGameCharacter(userId);
193202

194-
return MatchingEncounterResponse.from(encounter);
203+
RandomEncounter encounter = encounterDomainService.getRandomEncounter(playerCharacter.getId());
204+
205+
return MatchingEncounterResponse.from(encounter, jwtUtil.createGameToken(encounter.getId()));
195206
}
196207

197208
@Transactional
198-
public EncounterResultResponse encounterChoice(Long userId, Long encounterId, EncounterChoiceRequest request) {
209+
public EncounterResultResponse encounterChoice(Long userId, EncounterChoiceRequest request) {
210+
211+
Claims claims = jwtUtil.extractClaims(request.encounterToken());
212+
213+
Long encounterId = Long.valueOf(claims.getSubject());
199214

200215
GameCharacter player = characterService.getGameCharacter(userId);
201216

src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public SignupResponse signup(SignupRequest signupRequest) {
6868
userDomainService.createUser(newUser);
6969
userDomainService.createUserAuthType(userAuthType);
7070

71-
bearToken = jwtUtil.createToken(
71+
bearToken = jwtUtil.createAccessToken(
7272
newUser.getId(),
7373
newUser.getEmail(),
7474
newUser.getRole(),
@@ -83,7 +83,7 @@ public SignupResponse signup(SignupRequest signupRequest) {
8383
existUser.modifyPassword(encodedPassword);
8484
log.info("유저 타입 저장 완료 {}", userAuthType);
8585

86-
bearToken = jwtUtil.createToken(
86+
bearToken = jwtUtil.createAccessToken(
8787
existUser.getId(),
8888
existUser.getEmail(),
8989
existUser.getRole(),
@@ -120,7 +120,7 @@ public SigninResponse signin(@Valid SigninRequest signinRequest) {
120120

121121
log.info("비밀번호 체크 완료");
122122

123-
String bearToken = jwtUtil.createToken(
123+
String bearToken = jwtUtil.createAccessToken(
124124
loginUser.getId(),
125125
loginUser.getEmail(),
126126
loginUser.getRole(),
@@ -182,7 +182,7 @@ public RefreshTokenResponse refreshToken(String token) {
182182

183183
User user = userDomainService.getUserById(userId);
184184
log.info("유저 도메인서비스에서 유저 아이디로 유저 찾아옴");
185-
String newAccessToken = jwtUtil.createToken(
185+
String newAccessToken = jwtUtil.createAccessToken(
186186
user.getId(),
187187
user.getEmail(),
188188
user.getRole(),

src/main/java/org/ezcode/codetest/common/security/hander/CustomSuccessHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
4646
User loginUser = userDomainService.getUserByEmail(customUserDetails.getEmail());
4747
log.info("loginUser: {}", loginUser);
4848

49-
String accessToken = jwtUtil.createToken(
49+
String accessToken = jwtUtil.createAccessToken(
5050
loginUser.getId(),
5151
loginUser.getEmail(),
5252
loginUser.getRole(),

src/main/java/org/ezcode/codetest/common/security/util/JwtUtil.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public class JwtUtil {
2424
private static final String BEARER_PREFIX = "Bearer ";
2525
private static final long TOKEN_EXPIRATION_TIME = 60 * 60 * 24 * 7;
26+
private static final long GAME_TOKEN_EXPIRATION_TIME = 60;
2627

2728
@Value("${jwt.secret}")
2829
private String secretKey;
@@ -39,7 +40,7 @@ public void init() {
3940
/*
4041
토큰 발급
4142
*/
42-
public String createToken(Long userId, String email, UserRole userRole, String username, String nickname, Tier tier) {
43+
public String createAccessToken(Long userId, String email, UserRole userRole, String username, String nickname, Tier tier) {
4344
if (userId == null || email == null || username == null || nickname == null) {
4445
throw new IllegalArgumentException("토큰에 필요한 필수 매개변수가 null입니다.");
4546
}
@@ -60,6 +61,22 @@ public String createToken(Long userId, String email, UserRole userRole, String u
6061
.compact();
6162
}
6263

64+
public String createGameToken(Long eventId) {
65+
66+
if (eventId == null) {
67+
throw new IllegalArgumentException("토큰에 필요한 필수 매개변수가 null입니다.");
68+
}
69+
70+
Date date = new Date();
71+
72+
return Jwts.builder()
73+
.setSubject(String.valueOf(eventId))
74+
.setExpiration(new Date(date.getTime() + GAME_TOKEN_EXPIRATION_TIME * 1000L))
75+
.setIssuedAt(date)
76+
.signWith(key, signatureAlgorithm)
77+
.compact();
78+
}
79+
6380
/*
6481
토큰 추출
6582
*/

0 commit comments

Comments
 (0)