Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ void clearScheduledTasks() {
}

@Test
void catchUpAndReschedule는_due_room을_즉시_정산한다() {
void 재시작_보정은_지난_경매_마감을_즉시_정산한다() {
UUID template =
templateFixture.createAuctionTemplateId(
"경매전",
Expand Down Expand Up @@ -213,7 +213,7 @@ void clearScheduledTasks() {
}

@Test
void start_rollback되면_deadline_task는_등록되지_않는다() {
void 방_시작_트랜잭션이_롤백되면_마감_예약도_남지_않는다() {
UUID template =
templateFixture.createAuctionTemplateId(
"경매전",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void clearPublishedEvents() {
}

@Test
void join이_커밋되면_room_updated를_정확히_하나_publish한다() {
void 방_참가가_커밋되면_로비_스냅샷을_하나만_발행한다() {
UUID template =
templateFixture.createAuctionTemplateId(
"실시간 방",
Expand Down Expand Up @@ -119,7 +119,7 @@ void clearPublishedEvents() {
}

@Test
void 바깥_트랜잭션이_롤백되면_room_snapshot을_publish하지_않는다() {
void 바깥_트랜잭션이_롤백되면_로비_스냅샷을_발행하지_않는다() {
UUID template =
templateFixture.createAuctionTemplateId(
"실시간 롤백",
Expand Down Expand Up @@ -153,7 +153,7 @@ void clearPublishedEvents() {
}

@Test
void 경매_입찰과_정산_publish는_game_updated를_사용한다() {
void 경매_입찰과_정산은_게임_스냅샷으로_발행된다() {
UUID template =
templateFixture.createAuctionTemplateId(
"실시간 경매",
Expand Down Expand Up @@ -200,7 +200,7 @@ void clearPublishedEvents() {
}

@Test
void 드래프트_start_publish는_room_updated와_game_updated를_사용한다() {
void 드래프트_시작은_로비와_게임_스냅샷으로_발행된다() {
UUID template =
templateFixture.createDraftTemplateId(
"실시간 드래프트 시작",
Expand Down Expand Up @@ -238,7 +238,7 @@ void clearPublishedEvents() {
}

@Test
void 드래프트_픽_publish는_game_updated를_반영한다() {
void 드래프트_픽은_게임_스냅샷으로_발행된다() {
UUID template =
templateFixture.createDraftTemplateId(
"실시간 드래프트 픽",
Expand Down Expand Up @@ -275,7 +275,7 @@ void clearPublishedEvents() {
}

@Test
void 시작_스냅샷_이후_드래프트_live_update의_snapshot_version은_단조증가한다() {
void 시작_스냅샷_이후_드래프트_진행_스냅샷_버전은_단조증가한다() {
UUID template =
templateFixture.createDraftTemplateId(
"실시간 드래프트 버전",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class RoomApiIntegrationTest {
private final PlatformTransactionManager transactionManager;

@Test
void list는_joinable_waiting_room만_응답하고_정렬과_JSON_필드를_보장한다() {
void 방_목록_API는_참여_가능한_대기방만_정렬해_반환한다() {
rooms.save(joinableAuctionRoom("ROOM99", Instant.parse("2026-04-09T00:03:00Z")));
rooms.save(fullWaitingAuctionRoom("ROOM08", Instant.parse("2026-04-09T00:02:00Z")));
rooms.save(inProgressAuctionRoom("ROOM07", Instant.parse("2026-04-09T00:01:00Z")));
Expand All @@ -86,7 +86,7 @@ class RoomApiIntegrationTest {
}

@Test
void start는_game_id만_포함한_최소_응답을_반환한다() throws Exception {
void 방_시작_API는_게임_ID만_포함한_최소_응답을_반환한다() throws Exception {
rooms.save(fullWaitingAuctionRoom("ROOM10", CREATED_AT));

ResponseEntity<String> response = restTemplate.exchange(
Expand All @@ -107,7 +107,7 @@ class RoomApiIntegrationTest {
}

@Test
void get_room은_startedGameId만_반환하고_live_game_progress는_포함하지_않는다() throws Exception {
void 방_조회_API는_시작된_게임_ID만_반환하고_진행_상태는_포함하지_않는다() throws Exception {
Room room = startedAuctionRoom("ROOM11", CREATED_AT);

ResponseEntity<String> response = restTemplate.getForEntity("/api/v1/rooms/ROOM11", String.class);
Expand All @@ -125,7 +125,7 @@ class RoomApiIntegrationTest {
}

@Test
void get_game은_경매의_deadline_projection을_반환한다() throws Exception {
void 게임_조회_API는_경매_마감_진행상태를_반환한다() throws Exception {
Room room = startedAuctionRoom("ROOM12", CREATED_AT);

restTemplate.exchange(
Expand Down Expand Up @@ -163,7 +163,7 @@ class RoomApiIntegrationTest {
}

@Test
void get_game은_시작된_드래프트의_live_progress와_멤버와_선수상태를_반환한다() throws Exception {
void 게임_조회_API는_드래프트_진행상태와_선수상태를_반환한다() throws Exception {
Room room = startedDraftRoom("ROOM14", CREATED_AT);
restTemplate.exchange(
"/api/v1/games/" + room.getStartedGameId().gameId() + "/draft-picks",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ class TemplateApiIntegrationTest {
assertThat(success.get("name")).isEqualTo("경매전");
assertThat(success.get("gameType")).isEqualTo("LEAGUE_OF_LEGENDS");
assertThat(success.get("mode")).isEqualTo("AUCTION");
assertThat(success.containsKey("positionLimit")).isFalse();
assertThat(((List<?>) success.get("players"))).hasSize(2);
}

Expand Down Expand Up @@ -101,7 +100,6 @@ class TemplateApiIntegrationTest {
Map<?, ?> success = (Map<?, ?>) response.getBody().get("success");
String templateId = (String) success.get("id");
assertThat(success.get("gameType")).isEqualTo("custom-fe-game");
assertThat(success.containsKey("positionLimit")).isFalse();
List<Map<String, Object>> players = (List<Map<String, Object>>) success.get("players");
assertThat(players).hasSize(2);
assertThat(players.get(0)).containsEntry("name", "선수1").containsEntry("position", "").containsEntry("displayOrder", 0);
Expand All @@ -112,7 +110,6 @@ class TemplateApiIntegrationTest {
Map<?, ?> detailSuccess = (Map<?, ?>) detailResponse.getBody().get("success");
List<Map<String, Object>> detailPlayers = (List<Map<String, Object>>) detailSuccess.get("players");
assertThat(detailSuccess.get("gameType")).isEqualTo("custom-fe-game");
assertThat(detailSuccess.containsKey("positionLimit")).isFalse();
assertThat(detailPlayers.get(0).get("position")).isEqualTo("");
assertThat(detailPlayers.get(1).get("position")).isNull();

Expand All @@ -123,7 +120,6 @@ class TemplateApiIntegrationTest {
return;
}
assertThat(template.get("gameType")).isEqualTo("custom-fe-game");
assertThat(template).doesNotContainKey("positionLimit");
List<Map<String, Object>> listPlayers = (List<Map<String, Object>>) template.get("players");
assertThat(listPlayers.get(0).get("position")).isEqualTo("");
assertThat(listPlayers.get(1).get("position")).isNull();
Expand Down Expand Up @@ -165,7 +161,6 @@ class TemplateApiIntegrationTest {
Map<?, ?> success = (Map<?, ?>) response.getBody().get("success");
assertThat(success.get("id")).isEqualTo(templateId);
assertThat(success.get("name")).isEqualTo("상세조회용 경매전");
assertThat(success.containsKey("positionLimit")).isFalse();
List<Map<String, Object>> players = (List<Map<String, Object>>) success.get("players");
assertThat(players)
.containsExactly(
Expand Down Expand Up @@ -363,7 +358,6 @@ class TemplateApiIntegrationTest {
assertThat(template.get("teamCount")).isEqualTo(2);
assertThat(template.get("pickBanTime")).isEqualTo(45);
assertThat(template.get("minBidUnit")).isEqualTo(10);
assertThat(template).doesNotContainKey("positionLimit");
List<Map<String, Object>> players = (List<Map<String, Object>>) template.get("players");
assertThat(players).hasSize(2);
assertThat(players.get(0)).containsEntry("name", "선수1").containsEntry("position", "TOP").containsEntry("displayOrder", 0);
Expand Down
11 changes: 3 additions & 8 deletions src/main/java/com/naminhyeok/fantazzk/CoreException.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.naminhyeok.fantazzk;

import lombok.Getter;

@Getter
public class CoreException extends RuntimeException {
private final ErrorDescriptor error;
private final Object data;
Expand All @@ -21,12 +24,4 @@ public CoreException(ErrorDescriptor error, Object data) {
this.error = error;
this.data = data;
}

public ErrorDescriptor getError() {
return error;
}

public Object getData() {
return data;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.naminhyeok.fantazzk;

import lombok.Getter;

@Getter
public abstract class InvalidDomainStateException extends RuntimeException {
private final ErrorDescriptor error;

protected InvalidDomainStateException(String message, ErrorDescriptor error) {
super(message);
this.error = error;
}

public ErrorDescriptor getError() {
return error;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,16 @@
import com.naminhyeok.fantazzk.room.domain.Room;
import com.naminhyeok.fantazzk.room.domain.RoomErrorType;
import com.naminhyeok.fantazzk.room.repository.Rooms;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class SettleAuction {
private final SettleAuctionAttempt settleAuctionAttempt;
private final Rooms rooms;

public SettleAuction(SettleAuctionAttempt settleAuctionAttempt, Rooms rooms) {
this.settleAuctionAttempt = settleAuctionAttempt;
this.rooms = rooms;
}

public Room settleIfDue(String code) {
try {
return settleAuctionAttempt.settleIfDue(code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import jakarta.persistence.Convert;
import jakarta.persistence.Embeddable;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.jmolecules.ddd.types.ValueObject;

@Access(AccessType.FIELD)
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor
public class AuctionBid implements ValueObject {
@Column(name = "round")
private int round;
Expand All @@ -23,9 +25,6 @@ public class AuctionBid implements ValueObject {
@Column(name = "amount")
private int amount;

public AuctionBid() {
}

public AuctionBid(int round, BidSequence sequence, TeamLeaderId teamLeaderId, int amount) {
this.round = round;
this.sequence = sequence;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import jakarta.persistence.Convert;
import jakarta.persistence.Embeddable;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.jmolecules.ddd.types.ValueObject;

@Access(AccessType.FIELD)
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor
public final class AuctionParticipant implements GameParticipant, ValueObject {
@Column(name = "team_leader_id")
@Convert(converter = TeamLeaderId.JpaConverter.class)
Expand All @@ -20,9 +22,6 @@ public final class AuctionParticipant implements GameParticipant, ValueObject {
@Column(name = "remaining_budget")
private Integer remainingBudget;

public AuctionParticipant() {
}

public AuctionParticipant(TeamLeaderId teamLeaderId, String nickname, int remainingBudget) {
this.teamLeaderId = java.util.Objects.requireNonNull(teamLeaderId, "teamLeaderId must not be null");
this.nickname = java.util.Objects.requireNonNull(nickname, "nickname must not be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import jakarta.persistence.Convert;
import jakarta.persistence.Embeddable;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.jmolecules.ddd.types.ValueObject;

@Access(AccessType.FIELD)
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor
public final class DraftParticipant implements GameParticipant, ValueObject {
@Column(name = "team_leader_id")
@Convert(converter = TeamLeaderId.JpaConverter.class)
Expand All @@ -20,9 +22,6 @@ public final class DraftParticipant implements GameParticipant, ValueObject {
@Column(name = "draft_position")
private Integer draftPosition;

public DraftParticipant() {
}

public DraftParticipant(TeamLeaderId teamLeaderId, String nickname, int draftPosition) {
this.teamLeaderId = java.util.Objects.requireNonNull(teamLeaderId, "teamLeaderId must not be null");
this.nickname = java.util.Objects.requireNonNull(nickname, "nickname must not be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import jakarta.persistence.Convert;
import jakarta.persistence.Embeddable;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.jmolecules.ddd.types.ValueObject;

@Access(AccessType.FIELD)
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor
public class GamePlayer implements ValueObject {
@Column(name = "player_id")
@Convert(converter = RoomPlayerId.JpaConverter.class)
Expand All @@ -22,9 +24,6 @@ public class GamePlayer implements ValueObject {
@Column(name = "display_order")
private int displayOrder;

public GamePlayer() {
}

public GamePlayer(RoomPlayerId playerId, String name, String position, int displayOrder) {
this.playerId = java.util.Objects.requireNonNull(playerId, "playerId must not be null");
this.name = java.util.Objects.requireNonNull(name, "name must not be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Access(AccessType.FIELD)
@Embeddable
public class RoomPlayer {
Expand All @@ -26,18 +28,11 @@ public class RoomPlayer {
@Enumerated(EnumType.STRING)
private PlayerStatus status;

public RoomPlayer() {
}

public RoomPlayer(RoomPlayerId id, String name, String position, int displayOrder) {
this.id = id;
this.name = name;
this.position = position;
this.displayOrder = displayOrder;
this.status = PlayerStatus.AVAILABLE;
}

public RoomPlayerId getId() {
return id;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import jakarta.persistence.Convert;
import jakarta.persistence.Embeddable;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Access(AccessType.FIELD)
@Embeddable
public class RoomTeamLeader {
Expand All @@ -23,9 +25,6 @@ public class RoomTeamLeader {
@Column(name = "remaining_budget")
private Integer remainingBudget;

public RoomTeamLeader() {
}

public RoomTeamLeader(TeamLeaderId id, String nickname, String actionToken, Integer remainingBudget) {
this.id = id;
this.nickname = nickname;
Expand All @@ -34,10 +33,6 @@ public RoomTeamLeader(TeamLeaderId id, String nickname, String actionToken, Inte
this.remainingBudget = remainingBudget;
}

public TeamLeaderId getId() {
return id;
}

public void assignDraftPosition(int draftPosition) {
this.draftPosition = draftPosition;
}
Expand Down
Loading
Loading