Skip to content

Commit

Permalink
Merge pull request #15 from urdego/refactor/#14
Browse files Browse the repository at this point in the history
Refactor/#14 : 로깅, 예외처리, 소켓 to API
  • Loading branch information
oo-ni authored Jan 31, 2025
2 parents 9a6de9f + 27d3d17 commit 8f89b24
Show file tree
Hide file tree
Showing 25 changed files with 315 additions and 182 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencyManagement {
dependencies {
// Spring Boot
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
// implementation 'org.springframework.boot:spring-boot-starter-websocket'
developmentOnly 'org.springframework.boot:spring-boot-devtools'

// Spring Cloud
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package io.urdego.urdego_game_service.common.client;
package io.urdego.urdego_game_service.common.client.content;

import io.urdego.urdego_game_service.common.client.dto.ContentRes;
import io.urdego.urdego_game_service.common.client.content.dto.ContentRes;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(name = "content-service", url = "${feign.client.config.content-service.url}")
@FeignClient(name = "content-service", url = "${feign.client.config.service.url}")
public interface ContentServiceClient {
@GetMapping("/api/content-service/content")
ContentRes getContent(@RequestParam Long contentId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.urdego.urdego_game_service.common.client.dto;
package io.urdego.urdego_game_service.common.client.content.dto;

public record ContentRes(
Long contentId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.urdego.urdego_game_service.common.client.user;

import org.springframework.cloud.openfeign.FeignClient;

@FeignClient(name = "user-service", url = "${feign.client.config.service.url}")
public interface UserServiceClient {
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
package io.urdego.urdego_game_service.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/game-service/sub");
registry.setApplicationDestinationPrefixes("/game-service/pub");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/game-service/connect")
.setAllowedOrigins("*");
}
}
//@Configuration
//@EnableWebSocketMessageBroker
//public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
//
// @Override
// public void configureMessageBroker(MessageBrokerRegistry registry) {
// registry.enableSimpleBroker("/game-service/sub");
// registry.setApplicationDestinationPrefixes("/game-service/pub");
// }
//
// @Override
// public void registerStompEndpoints(StompEndpointRegistry registry) {
// registry.addEndpoint("/game-service/connect")
// .setAllowedOrigins("*");
// }
//}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.urdego.urdego_game_service.controller.game.dto.request.GameCreateReq;
import io.urdego.urdego_game_service.controller.game.dto.request.ScoreReq;
import io.urdego.urdego_game_service.controller.game.dto.response.GameCreateRes;
import io.urdego.urdego_game_service.controller.game.dto.response.GameEndRes;
import io.urdego.urdego_game_service.controller.game.dto.response.ScoreRes;
import io.urdego.urdego_game_service.domain.game.service.GameService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
Expand All @@ -15,18 +18,33 @@

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/game-service")
@RequestMapping("/api/game-service/game")
public class GameController {

private final GameService gameService;

// 게임 생성
@Tag(name = "게임 API")
@Operation(summary = "게임 생성", description = "roomId로 게임 생성")
@PostMapping("/game/start")
@PostMapping("/start")
public ResponseEntity<GameCreateRes> startGame(@RequestBody GameCreateReq request) {
GameCreateRes response = gameService.createGame(request);
return new ResponseEntity<>(response, HttpStatus.CREATED);
}

@Tag(name = "게임 Socket")
@Operation(summary = "게임 점수", description = "게임 점수 조회")
@PostMapping("/score")
public ResponseEntity<ScoreRes> giveScores(@RequestBody ScoreReq request) {
ScoreRes response = gameService.giveScores(request);
return new ResponseEntity<>(response, HttpStatus.OK);
}

@Tag(name = "게임 Socket")
@Operation(summary = "게임 종료", description = "게임 종료")
@PostMapping("/end")
public ResponseEntity<GameEndRes> endGame(@RequestBody String gameId) {
GameEndRes response = gameService.finishGame(gameId);
return new ResponseEntity<>(response, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,25 @@
import io.urdego.urdego_game_service.controller.game.dto.response.ScoreRes;
import io.urdego.urdego_game_service.domain.game.service.GameService;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

@Controller
@RequiredArgsConstructor
public class GameSocketController {

private final GameService gameService;
private final SimpMessagingTemplate messagingTemplate;

// 점수 요청
@MessageMapping("/game/score")
public void giveScores(ScoreReq request) {
ScoreRes response = gameService.giveScores(request);
messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
}
// @MessageMapping("/game/score")
// public void giveScores(ScoreReq request) {
// ScoreRes response = gameService.giveScores(request);
// messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
// }

// 게임 종료
@MessageMapping("/game/end")
public void endGame(String gameId) {
GameEndRes response = gameService.finishGame(gameId);
messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
}
// @MessageMapping("/game/end")
// public void endGame(String gameId) {
// GameEndRes response = gameService.finishGame(gameId);
// messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@ public record GameEndRes(
String gameId,
String roomId,
Status status,
Map<String, Integer> totalScores
Map<String, Integer> totalScores,
Map<String, Integer> exp
) {
public static GameEndRes from(Game game) {
public static GameEndRes of(Game game, Map<String, Integer> exp) {
return new GameEndRes(
game.getGameId(),
game.getRoomId(),
game.getStatus(),
game.getTotalScores()
game.getTotalScores(),
exp
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.urdego.urdego_game_service.controller.room.dto.request.ContentSelectReq;
import io.urdego.urdego_game_service.controller.room.dto.request.PlayerReq;
import io.urdego.urdego_game_service.controller.room.dto.request.RoomCreateReq;
import io.urdego.urdego_game_service.controller.room.dto.response.RoomPlayersRes;
import io.urdego.urdego_game_service.controller.room.dto.response.RoomCreateRes;
import io.urdego.urdego_game_service.controller.room.dto.response.RoomInfoRes;
import io.urdego.urdego_game_service.domain.room.service.RoomService;
Expand All @@ -15,27 +18,49 @@

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/game-service")
@RequestMapping("/api/game-service/room")
public class RoomController {

private final RoomService roomService;

// 대기방 생성
@Tag(name = "대기방 API")
@Operation(summary = "대기방 생성", description = "방장이 입력한 정보로 대기방 생성")
@PostMapping("/room/create")
@PostMapping("/create")
public ResponseEntity<RoomCreateRes> createRoom(@RequestBody RoomCreateReq request) {
RoomCreateRes response = roomService.createRoom(request);
return new ResponseEntity<>(response, HttpStatus.CREATED);
}

// 대기방 목록 조회
@Tag(name = "대기방 API")
@Operation(summary = "대기방 목록 조회", description = "현재 생성되어 있는 대기방 목록 전체 조회")
@GetMapping("/room/list")
@GetMapping("/list")
public ResponseEntity<List<RoomInfoRes>> viewRooms() {
List<RoomInfoRes> response = roomService.getRoomList();
return new ResponseEntity<>(response, HttpStatus.OK);
}

@Tag(name = "대기방 Socket")
@Operation(summary = "플레이어 초대", description = "대기방에 플레이어 참여")
@PostMapping("/player/invite")
public ResponseEntity<RoomPlayersRes> invitePlayer(@RequestBody PlayerReq request) {
RoomPlayersRes response = roomService.joinRoom(request);
return new ResponseEntity<>(response, HttpStatus.OK);
}

@Tag(name = "대기방 Socket")
@Operation(summary = "플레이어 삭제", description = "대기방에 플레이어 삭제")
@PostMapping("/player/remove")
public ResponseEntity<RoomPlayersRes> removePlayer(@RequestBody PlayerReq request) {
RoomPlayersRes response = roomService.removePlayer(request);
return new ResponseEntity<>(response, HttpStatus.OK);
}

@Tag(name = "대기방 Socket")
@Operation(summary = "게임 컨텐츠 선택", description = "게임 문제 출제를 위한 컨텐츠 선택")
@PostMapping("/select-content")
public ResponseEntity<Void> selectContent(@RequestBody ContentSelectReq request) {
roomService.registerContents(request);
return new ResponseEntity<>(HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -1,38 +1,32 @@
package io.urdego.urdego_game_service.controller.room;

import io.urdego.urdego_game_service.controller.room.dto.request.ContentSelectReq;
import io.urdego.urdego_game_service.controller.room.dto.request.PlayerReq;
import io.urdego.urdego_game_service.controller.room.dto.response.PlayerRes;
import io.urdego.urdego_game_service.domain.room.service.RoomService;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

@Controller
@RequiredArgsConstructor
public class RoomSocketController {

private final RoomService roomService;
private final SimpMessagingTemplate messagingTemplate;

// 친구 초대
@MessageMapping("/room/player/invite")
public void invitePlayer(PlayerReq request) {
PlayerRes response = roomService.joinRoom(request);
messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
}

// 컨텐츠 선택 (최대 5개, 0개일 경우 자체 컨텐츠 제공)
@MessageMapping("/room/select-content")
public void selectContent(ContentSelectReq request) {
roomService.registerContents(request);
}

// 플레이어 삭제
@MessageMapping("/room/player/remove")
public void removePlayer(PlayerReq request) {
PlayerRes response = roomService.removePlayer(request);
messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
}
// // 친구 초대
// @MessageMapping("/room/player/invite")
// public void invitePlayer(PlayerReq request) {
// PlayerRes response = roomService.joinRoom(request);
// messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
// }
//
// // 컨텐츠 선택 (최대 5개, 0개일 경우 자체 컨텐츠 제공)
// @MessageMapping("/room/select-content")
// public void selectContent(ContentSelectReq request) {
// roomService.registerContents(request);
// }
//
// // 플레이어 삭제
// @MessageMapping("/room/player/remove")
// public void removePlayer(PlayerReq request) {
// PlayerRes response = roomService.removePlayer(request);
// messagingTemplate.convertAndSend("/game-service/sub/" + response.roomId(), response);
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

public record PlayerReq(
String roomId,
Long userId
Long userId,
Boolean isReady
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ public record RoomCreateReq(
String userId,
String roomName,
int maxPlayers,
int totalRounds,
int timer
int totalRounds
) {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.urdego.urdego_game_service.controller.room.dto.response;

import io.urdego.urdego_game_service.common.enums.Status;
import io.urdego.urdego_game_service.domain.room.entity.Room;

import java.util.List;
import java.util.Map;

public record RoomPlayersRes(
String roomId,
Status status,
List<String> currentPlayers,
String isHost,
Map<String, Boolean> readyStatus,
Boolean allReady
) {
public static RoomPlayersRes from(Room room) {
String hostId = room.getCurrentPlayers().isEmpty() ? null : room.getCurrentPlayers().get(0);
boolean allReady = room.getReadyStatus().size() == room.getCurrentPlayers().size()
&& room.getReadyStatus().values().stream().allMatch(ready -> ready);

return new RoomPlayersRes(
room.getRoomId(),
room.getStatus(),
room.getCurrentPlayers(),
hostId,
room.getReadyStatus(),
allReady
);
}
}
Loading

0 comments on commit 8f89b24

Please sign in to comment.