Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions backend/src/main/java/io/f1/backend/domain/game/Player.java

This file was deleted.

27 changes: 0 additions & 27 deletions backend/src/main/java/io/f1/backend/domain/game/Room.java

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.f1.backend.domain.game.api;

import io.f1.backend.domain.game.app.RoomService;
import io.f1.backend.domain.game.dto.request.RoomCreateRequest;

import jakarta.validation.Valid;

import lombok.RequiredArgsConstructor;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/rooms")
@RequiredArgsConstructor
public class RoomController {

private final RoomService roomService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public RoomCreateResponse saveRoom(@RequestBody @Valid RoomCreateRequest request) {

Map<String, Object> loginUser = new HashMap<>();
loginUser.put("id", 1L);
loginUser.put("nickname", "빵야빵야");

return roomService.saveRoom(request, loginUser);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.f1.backend.domain.game.app;

import static io.f1.backend.domain.game.mapper.RoomMapper.toRoomSetting;

import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
import io.f1.backend.domain.game.dto.response.RoomCreateResponse;
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 lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

@Service
@RequiredArgsConstructor
public class RoomService {

private final RoomRepository roomRepository;
private final AtomicLong roomIdGenerator = new AtomicLong(0);

public RoomCreateResponse saveRoom(RoomCreateRequest request, Map<String, Object> loginUser) {

// todo 제일 작은 index quizId 가져와서 gameSetting(round 설정)
GameSetting gameSetting = new GameSetting(1L, 10, 60);
// todo security에서 가져오는걸로 변경
Player host = new Player((Long) loginUser.get("id"), loginUser.get("nickname").toString());
RoomSetting roomSetting = toRoomSetting(request);

Long newId = roomIdGenerator.incrementAndGet();

roomRepository.saveRoom(new Room(newId, roomSetting, gameSetting, host));

return new RoomCreateResponse(newId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.f1.backend.domain.game.dto.request;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

public record RoomCreateRequest(
@NotBlank(message = "방 제목은 필수입니다.") String roomName,
@NotNull(message = "인원 수 입력은 필수입니다.")
@Min(value = 2, message = "방 인원 수는 최소 2명입니다.")
@Max(value = 8, message = "방 인원 수는 최대 8명 입니다.")
Integer maxUserCount,
@NotNull String password,
@NotNull boolean locked) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.f1.backend.domain.game.dto.response;

public record RoomCreateResponse(Long roomId) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.f1.backend.domain.game.mapper;

import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
import io.f1.backend.domain.game.model.RoomSetting;

public class RoomMapper {

public static RoomSetting toRoomSetting(RoomCreateRequest request) {
return new RoomSetting(
request.roomName(), request.maxUserCount(), request.locked(), request.password());
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.f1.backend.domain.game;
package io.f1.backend.domain.game.model;

public enum ConnectionState {
DISCONNECTED,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.f1.backend.domain.game;
package io.f1.backend.domain.game.model;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class GameSetting {

private Long quizId;
Expand Down
22 changes: 22 additions & 0 deletions backend/src/main/java/io/f1/backend/domain/game/model/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.f1.backend.domain.game.model;

import lombok.Getter;

@Getter
public class Player {

public final Long id;

public final String nickname;

private boolean isReady = false;

private ConnectionState state = ConnectionState.CONNECTED;

private int correctCount = 0;

public Player(Long id, String nickname) {
this.id = id;
this.nickname = nickname;
}
}
38 changes: 38 additions & 0 deletions backend/src/main/java/io/f1/backend/domain/game/model/Room.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.f1.backend.domain.game.model;

import io.f1.backend.domain.question.entity.Question;

import lombok.Getter;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Getter
public class Room {

private final Long id;

private final RoomSetting roomSetting;

private GameSetting gameSetting;

private RoomState state = RoomState.WAITING;

private Player host;

private List<Question> questions = new ArrayList<>();

private Map<String, Player> playerSessionMap = new ConcurrentHashMap<>();

private final LocalDateTime createdAt = LocalDateTime.now();

public Room(Long id, RoomSetting roomSetting, GameSetting gameSetting, Player host) {
this.id = id;
this.roomSetting = roomSetting;
this.gameSetting = gameSetting;
this.host = host;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.f1.backend.domain.game.model;

public record RoomSetting(String roomName, int maxUserCount, boolean locked, String password) {}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.f1.backend.domain.game;
package io.f1.backend.domain.game.model;

public enum RoomState {
WAITING,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.f1.backend.domain.game.store;

import io.f1.backend.domain.game.model.Room;

public interface RoomRepository {
void saveRoom(Room room);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.f1.backend.domain.game.store;

import io.f1.backend.domain.game.model.Room;

import org.springframework.stereotype.Repository;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Repository
public class RoomRepositoryImpl implements RoomRepository {

private final Map<Long, Room> roomMap = new ConcurrentHashMap<>();

@Override
public void saveRoom(Room room) {
roomMap.put(room.getId(), room);
}

// 테스트 전용 메소드
public Room getRoomForTest(Long roomId) {
return roomMap.get(roomId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.f1.backend.domain.game.store;

import static org.assertj.core.api.Assertions.assertThat;

import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
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 org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

class RoomRepositoryTests {

RoomRepositoryImpl roomRepository;

@BeforeEach
void setUp() {
roomRepository = new RoomRepositoryImpl();
}

@Test
@DisplayName("게임 방 생성 테스트")
void saveRoom_test() {

RoomCreateRequest request = new RoomCreateRequest("방제", 3, "password1", true);
Map<String, Object> loginUser = new HashMap<>();

loginUser.put("id", 1L);
loginUser.put("nickname", "빵야빵야");

GameSetting gameSetting = new GameSetting(1L, 10, 60);

Player host = new Player((Long) loginUser.get("id"), loginUser.get("nickname").toString());

RoomSetting roomSetting =
new RoomSetting(
request.roomName(),
request.maxUserCount(),
request.locked(),
request.password());

Long newId = 1L;

Room newRoom = new Room(newId, roomSetting, gameSetting, host);

roomRepository.saveRoom(newRoom);

Room savedRoom = roomRepository.getRoomForTest(newId);

assertThat(savedRoom.getHost().getId()).isEqualTo(loginUser.get("id"));
assertThat(savedRoom.getHost().getNickname()).isEqualTo(loginUser.get("nickname"));

assertThat(savedRoom.getRoomSetting().roomName()).isEqualTo(request.roomName());
assertThat(savedRoom.getRoomSetting().maxUserCount()).isEqualTo(request.maxUserCount());
assertThat(savedRoom.getRoomSetting().locked()).isEqualTo(request.locked());
assertThat(savedRoom.getRoomSetting().password()).isEqualTo(request.password());
}
}