diff --git a/backend/src/main/java/io/f1/backend/domain/game/api/RoomController.java b/backend/src/main/java/io/f1/backend/domain/game/api/RoomController.java index a276b9d1..7005f220 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/api/RoomController.java +++ b/backend/src/main/java/io/f1/backend/domain/game/api/RoomController.java @@ -3,12 +3,14 @@ import io.f1.backend.domain.game.app.RoomService; import io.f1.backend.domain.game.dto.request.RoomCreateRequest; import io.f1.backend.domain.game.dto.response.RoomCreateResponse; +import io.f1.backend.domain.game.dto.response.RoomListResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -35,4 +37,9 @@ public RoomCreateResponse saveRoom(@RequestBody @Valid RoomCreateRequest request return roomService.saveRoom(request, loginUser); } + + @GetMapping + public RoomListResponse getAllRooms() { + return roomService.getAllRooms(); + } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java index 14c44f85..ef817fc9 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java +++ b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java @@ -1,19 +1,24 @@ package io.f1.backend.domain.game.app; -import static io.f1.backend.domain.game.mapper.RoomMapper.toRoomSetting; +import static io.f1.backend.domain.game.mapper.RoomMapper.*; import io.f1.backend.domain.game.dto.request.RoomCreateRequest; import io.f1.backend.domain.game.dto.response.RoomCreateResponse; +import io.f1.backend.domain.game.dto.response.RoomListResponse; +import io.f1.backend.domain.game.dto.response.RoomResponse; import io.f1.backend.domain.game.model.GameSetting; import io.f1.backend.domain.game.model.Player; import io.f1.backend.domain.game.model.Room; import io.f1.backend.domain.game.model.RoomSetting; import io.f1.backend.domain.game.store.RoomRepository; +import io.f1.backend.domain.quiz.entity.Quiz; +import io.f1.backend.domain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -38,4 +43,27 @@ public RoomCreateResponse saveRoom(RoomCreateRequest request, Map rooms = roomRepository.findAll(); + List roomResponses = + rooms.stream() + .map( + room -> { + User user = new User(); // 임시 유저 객체 + user.setNickname("임시 유저 닉네임"); + + Quiz quiz = new Quiz(); // 임시 퀴즈 객체 + quiz.setTitle("임시 퀴즈 제목"); + quiz.setDescription("임시 퀴즈 설명"); + quiz.setThumbnailUrl("임시 이미지"); + quiz.setQuestions(List.of()); + quiz.setCreator(user); + + return toRoomResponse(room, quiz); + }) + .toList(); + return new RoomListResponse(roomResponses); + } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomListResponse.java b/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomListResponse.java new file mode 100644 index 00000000..cb83b4ab --- /dev/null +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomListResponse.java @@ -0,0 +1,5 @@ +package io.f1.backend.domain.game.dto.response; + +import java.util.List; + +public record RoomListResponse(List rooms) {} diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomResponse.java b/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomResponse.java new file mode 100644 index 00000000..0b2bb74c --- /dev/null +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/response/RoomResponse.java @@ -0,0 +1,14 @@ +package io.f1.backend.domain.game.dto.response; + +public record RoomResponse( + Long roomId, + String roomName, + int maxUserCount, + int currentUserCount, + boolean locked, + String roomState, + String quizTitle, + String description, + String creator, + int numberOfQuestions, + String thumbnailUrl) {} diff --git a/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java b/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java index 648bb25d..f517f642 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java +++ b/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java @@ -1,7 +1,10 @@ package io.f1.backend.domain.game.mapper; import io.f1.backend.domain.game.dto.request.RoomCreateRequest; +import io.f1.backend.domain.game.dto.response.RoomResponse; +import io.f1.backend.domain.game.model.Room; import io.f1.backend.domain.game.model.RoomSetting; +import io.f1.backend.domain.quiz.entity.Quiz; public class RoomMapper { @@ -9,4 +12,19 @@ public static RoomSetting toRoomSetting(RoomCreateRequest request) { return new RoomSetting( request.roomName(), request.maxUserCount(), request.locked(), request.password()); } + + public static RoomResponse toRoomResponse(Room room, Quiz quiz) { + return new RoomResponse( + room.getId(), + room.getRoomSetting().roomName(), + room.getRoomSetting().maxUserCount(), + room.getPlayerSessionMap().size(), + room.getRoomSetting().locked(), + room.getState().name(), + quiz.getTitle(), + quiz.getDescription(), + quiz.getCreator().getNickname(), + quiz.getQuestions().size(), + quiz.getThumbnailUrl()); + } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java index d03aab93..b20a7fcd 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java +++ b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java @@ -2,6 +2,11 @@ import io.f1.backend.domain.game.model.Room; +import java.util.List; + public interface RoomRepository { + void saveRoom(Room room); + + List findAll(); } diff --git a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java index 132e0d9e..80a2e442 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java +++ b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java @@ -4,6 +4,8 @@ import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -17,6 +19,11 @@ public void saveRoom(Room room) { roomMap.put(room.getId(), room); } + @Override + public List findAll() { + return new ArrayList<>(roomMap.values()); + } + // 테스트 전용 메소드 public Room getRoomForTest(Long roomId) { return roomMap.get(roomId); diff --git a/backend/src/main/java/io/f1/backend/domain/quiz/entity/Quiz.java b/backend/src/main/java/io/f1/backend/domain/quiz/entity/Quiz.java index 5ca9b550..befca13c 100644 --- a/backend/src/main/java/io/f1/backend/domain/quiz/entity/Quiz.java +++ b/backend/src/main/java/io/f1/backend/domain/quiz/entity/Quiz.java @@ -16,9 +16,14 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; +import lombok.Getter; +import lombok.Setter; + import java.util.ArrayList; import java.util.List; +@Getter +@Setter // quizService의 퀴즈 조회 메서드 구현 시까지 임시 사용 @Entity public class Quiz extends BaseEntity { diff --git a/backend/src/main/java/io/f1/backend/domain/user/entity/User.java b/backend/src/main/java/io/f1/backend/domain/user/entity/User.java index ec19a33d..e989134c 100644 --- a/backend/src/main/java/io/f1/backend/domain/user/entity/User.java +++ b/backend/src/main/java/io/f1/backend/domain/user/entity/User.java @@ -12,8 +12,13 @@ import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + import java.time.LocalDateTime; +@Getter +@Setter // quizService의 퀴즈 조회 메서드 구현 시까지 임시 사용 @Entity @Table(name = "`user`") public class User extends BaseEntity { diff --git a/backend/src/test/java/io/f1/backend/domain/game/store/RoomRepositoryTests.java b/backend/src/test/java/io/f1/backend/domain/game/store/RoomRepositoryTests.java index 81067624..e3c5f3d7 100644 --- a/backend/src/test/java/io/f1/backend/domain/game/store/RoomRepositoryTests.java +++ b/backend/src/test/java/io/f1/backend/domain/game/store/RoomRepositoryTests.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.Test; import java.util.HashMap; +import java.util.List; import java.util.Map; class RoomRepositoryTests { @@ -61,4 +62,47 @@ void saveRoom_test() { assertThat(savedRoom.getRoomSetting().locked()).isEqualTo(request.locked()); assertThat(savedRoom.getRoomSetting().password()).isEqualTo(request.password()); } + + @Test + @DisplayName("게임 방 전체 조회 테스트") + void findAll_test() throws Exception { + + // given: 테스트를 위한 방 2개 생성 및 저장 + RoomCreateRequest request1 = new RoomCreateRequest("방이름_1", 3, "password1", true); + RoomCreateRequest request2 = new RoomCreateRequest("방이름_2", 5, "", false); + + Player host1 = new Player(1L, "방장 1"); + Player host2 = new Player(2L, "호스트2"); + + GameSetting gameSetting = new GameSetting(1L, 10, 60); + + RoomSetting roomSetting1 = + new RoomSetting( + request1.roomName(), + request1.maxUserCount(), + request1.locked(), + request1.password()); + RoomSetting roomSetting2 = + new RoomSetting( + request2.roomName(), + request2.maxUserCount(), + request2.locked(), + request2.password()); + + Room room1 = new Room(1L, roomSetting1, gameSetting, host1); + Room room2 = new Room(2L, roomSetting2, gameSetting, host2); + + roomRepository.saveRoom(room1); + roomRepository.saveRoom(room2); + + // when: 방 전체 조회 메서드로 전체 방 리스트 조회 + List allRooms = roomRepository.findAll(); + + // then: 저장한 방 2개가 모두 조회되어야하고 + assertThat(allRooms).hasSize(2); + assertThat(allRooms).extracting("id").containsExactlyInAnyOrder(1L, 2L); + assertThat(allRooms) + .extracting(room -> room.getRoomSetting().roomName()) + .containsExactlyInAnyOrder("방이름_1", "방이름_2"); + } }