diff --git a/src/main/java/gymmi/workspace/domain/ObjectionManager.java b/src/main/java/gymmi/workspace/domain/ObjectionManager.java index c5cb250..15b6254 100644 --- a/src/main/java/gymmi/workspace/domain/ObjectionManager.java +++ b/src/main/java/gymmi/workspace/domain/ObjectionManager.java @@ -30,6 +30,16 @@ public Vote createVote(Worker worker, boolean isApproved) { return new Vote(worker, objection, isApproved); } + public void apply(Vote vote) { + objection.add(vote); + } + + public void applyAll(List votes) { + for (Vote vote : votes) { + apply(vote); + } + } + public boolean closeIfOnMajorityOrDone(int workerCount) { int majority = getMajority(workerCount); if (objection.getApprovalCount() >= majority) { diff --git a/src/main/java/gymmi/workspace/domain/WorkspaceDrawManger.java b/src/main/java/gymmi/workspace/domain/WorkspaceDrawManger.java index 55336d3..006c80e 100644 --- a/src/main/java/gymmi/workspace/domain/WorkspaceDrawManger.java +++ b/src/main/java/gymmi/workspace/domain/WorkspaceDrawManger.java @@ -32,7 +32,6 @@ public WorkspaceResult draw() { Worker winner = pickOneInTie(first); Worker loser = pickOneInTie(last); WorkspaceResult workspaceResult = new WorkspaceResult(workspace, winner, loser); - workspace.changeStatusTo(WorkspaceStatus.FULLY_COMPLETED); return workspaceResult; } diff --git a/src/main/java/gymmi/workspace/domain/entity/WorkspaceResult.java b/src/main/java/gymmi/workspace/domain/entity/WorkspaceResult.java index 49414e4..e34c4e9 100644 --- a/src/main/java/gymmi/workspace/domain/entity/WorkspaceResult.java +++ b/src/main/java/gymmi/workspace/domain/entity/WorkspaceResult.java @@ -1,10 +1,6 @@ package gymmi.workspace.domain.entity; -import gymmi.exceptionhandler.exception.InvalidRangeException; -import gymmi.exceptionhandler.exception.NotHavePermissionException; -import gymmi.exceptionhandler.message.ErrorCode; -import gymmi.workspace.domain.entity.Worker; -import gymmi.workspace.domain.entity.Workspace; +import gymmi.workspace.domain.WorkspaceStatus; import jakarta.persistence.*; import lombok.*; @@ -35,4 +31,8 @@ public WorkspaceResult(Workspace workspace, Worker winner, Worker loser) { this.winner = winner; this.loser = loser; } + + public void apply() { + workspace.changeStatusTo(WorkspaceStatus.FULLY_COMPLETED); + } } diff --git a/src/main/java/gymmi/workspace/service/WorkspaceCommandService.java b/src/main/java/gymmi/workspace/service/WorkspaceCommandService.java index 6ef578d..7525067 100644 --- a/src/main/java/gymmi/workspace/service/WorkspaceCommandService.java +++ b/src/main/java/gymmi/workspace/service/WorkspaceCommandService.java @@ -230,7 +230,9 @@ public void voteToObjection(User loginedUser, Long workspaceId, Long objectionId ObjectionManager objectionManager = new ObjectionManager(objection); Vote vote = objectionManager.createVote(worker, request.getWillApprove()); + voteRepository.save(vote); + objectionManager.apply(vote); List workers = workerRepository.getAllByWorkspaceId(workspaceId); @@ -256,6 +258,7 @@ public void terminateExpiredObjection(User loginedUser, Long workspaceId) { ObjectionManager objectionManager = new ObjectionManager(expiredObjection); List votes = objectionManager.createAutoVote(workers); voteRepository.saveAll(votes); + objectionManager.applyAll(votes); if (objectionManager.closeIfOnMajorityOrDone(workers.size())) { WorkoutHistory workoutHistory = workoutHistoryRepository.getByWorkoutConfirmationId(expiredObjection.getWorkoutConfirmation().getId()); rejectWorkoutHistory(objectionManager, workoutHistory); @@ -278,6 +281,7 @@ public WorkspaceResultResponse getWorkspaceResult(User loginedUser, Long workspa WorkspaceDrawManger workspaceDrawManger = new WorkspaceDrawManger(workspace, workers); WorkspaceResult workspaceResult = workspaceDrawManger.draw(); + workspaceResult.apply(); workspaceResultRepository.save(workspaceResult); return getWorkspaceResultResponse(workspace, workers, workspaceResult); diff --git a/src/main/resources/db/migration/V250119__workspaceResult.sql b/src/main/resources/db/migration/V250119__workspaceResult.sql new file mode 100644 index 0000000..f59045f --- /dev/null +++ b/src/main/resources/db/migration/V250119__workspaceResult.sql @@ -0,0 +1 @@ +rename table workspace_task to workspace_result diff --git a/src/test/java/gymmi/workspace/domain/ObjectionManagerTest.java b/src/test/java/gymmi/workspace/domain/ObjectionManagerTest.java index f8c6bb9..3f416ed 100644 --- a/src/test/java/gymmi/workspace/domain/ObjectionManagerTest.java +++ b/src/test/java/gymmi/workspace/domain/ObjectionManagerTest.java @@ -76,7 +76,7 @@ class 투표_참여 { "5,2,2,false, false", "4,2,2,true, false", }) - void 투표에_따라_투표가_종료된다(int workerCount, int agreeCount, int disagreeCount, boolean isClosed, boolean isApproved) { + void 투표에_따라_이의신청이_종료된다(int workerCount, int agreeCount, int disagreeCount, boolean isClosed, boolean isApproved) { // given Objection objection = getObjection(true); List agreeVotes = getVotes(agreeCount, objection, true); @@ -84,15 +84,15 @@ class 투표_참여 { agreeVotes.addAll(disagreeVotes); addVoteToObjection(objection, agreeVotes); - ObjectionManager tackleManager = new ObjectionManager(objection); + ObjectionManager objectionManager = new ObjectionManager(objection); // when - boolean result = tackleManager.closeIfOnMajorityOrDone(workerCount); + boolean result = objectionManager.closeIfOnMajorityOrDone(workerCount); // then - assertThat(!tackleManager.getObjection().isInProgress()).isEqualTo(isClosed); + assertThat(!objectionManager.getObjection().isInProgress()).isEqualTo(isClosed); assertThat(result).isEqualTo(isClosed); - assertThat(tackleManager.isApproved()).isEqualTo(isApproved); + assertThat(objectionManager.isApproved()).isEqualTo(isApproved); } private List getVotes(int size, Objection objection, boolean isApproved) { diff --git a/src/test/java/gymmi/workspace/domain/WorkspaceDrawMangerTest.java b/src/test/java/gymmi/workspace/domain/WorkspaceDrawMangerTest.java index e5a67f0..968c64a 100644 --- a/src/test/java/gymmi/workspace/domain/WorkspaceDrawMangerTest.java +++ b/src/test/java/gymmi/workspace/domain/WorkspaceDrawMangerTest.java @@ -36,7 +36,7 @@ class WorkspaceDrawMangerTest { @Nested class 뽑기 { @Test - void 일등과_꼴등을_뽑은후_워크스페이스는_완전히_종료된다() { + void 일등과_꼴등을_뽑은후_결과를_적용한다면_워크스페이스는_완전히_종료된다() { // given Workspace workspace = Instancio.of(Workspace.class) .set(Select.field(Workspace::getStatus), WorkspaceStatus.COMPLETED) @@ -50,9 +50,11 @@ class 뽑기 { workers.add(worker); } WorkspaceDrawManger workspaceDrawManger = new WorkspaceDrawManger(workspace, workers); + WorkspaceResult result = workspaceDrawManger.draw(); + assertThat(workspace.isFullyCompleted()).isFalse(); // when - WorkspaceResult result = workspaceDrawManger.draw(); + result.apply(); // then assertThat(workspace.isFullyCompleted()).isTrue(); @@ -94,7 +96,6 @@ class 뽑기 { System.out.println("losers = " + losers); // then - assertThat(workspace.isFullyCompleted()).isTrue(); assertThat(winners).containsAnyOf(workers.get(4), workers.get(9)); assertThat(losers).containsAnyOf(workers.get(0), workers.get(5)); } diff --git a/src/test/java/gymmi/workspace/service/WorkspaceCommandServiceTest.java b/src/test/java/gymmi/workspace/service/WorkspaceCommandServiceTest.java index 14f6029..92fc45f 100644 --- a/src/test/java/gymmi/workspace/service/WorkspaceCommandServiceTest.java +++ b/src/test/java/gymmi/workspace/service/WorkspaceCommandServiceTest.java @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; @@ -256,7 +255,6 @@ class 워크스페이스_운동 { } @Test - @Transactional void 투표가_안되었지만_시간이_지난_이의신청은_찬성표를_통해_자동으로_종료시킨다() { // given User creator = persister.persistUser(); @@ -280,9 +278,12 @@ class 워크스페이스_운동 { workspaceCommandService.terminateExpiredObjection(creator, workspace.getId()); // then - assertThat(objection.isInProgress()).isFalse(); - assertThat(objection.getVoteCount()).isEqualTo(4); - assertThat(objection.getApprovalCount()).isEqualTo(3); + entityManager.flush(); + entityManager.clear(); + Objection refreshObjection = objectionRepository.getByObjectionId(objection.getId()); + assertThat(refreshObjection.isInProgress()).isFalse(); + assertThat(refreshObjection.getVoteCount()).isEqualTo(4); + assertThat(refreshObjection.getApprovalCount()).isEqualTo(3); }