-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add api of reading a workspace result
- add method to drawing a winner and a loser of workspace
- Loading branch information
Showing
12 changed files
with
337 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
src/main/java/gymmi/workspace/domain/WorkspaceDrawManger.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package gymmi.workspace.domain; | ||
|
||
import gymmi.exceptionhandler.exception.InvalidStateException; | ||
import gymmi.exceptionhandler.message.ErrorCode; | ||
import gymmi.workspace.domain.entity.Worker; | ||
import gymmi.workspace.domain.entity.Workspace; | ||
import gymmi.workspace.domain.entity.WorkspaceResult; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.Comparator; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
public class WorkspaceDrawManger { | ||
|
||
private final List<Worker> workers; | ||
private final Workspace workspace; | ||
|
||
public WorkspaceDrawManger(Workspace workspace, List<Worker> workers) { | ||
if (!workspace.isCompleted()) { | ||
throw new InvalidStateException(ErrorCode.NOT_COMPLETED_WORKSPACE); | ||
} | ||
this.workers = new ArrayList<>(workers); | ||
this.workspace = workspace; | ||
workers.sort(Comparator.comparing(Worker::getContributedScore).reversed()); | ||
} | ||
|
||
public WorkspaceResult draw() { | ||
Worker first = workers.get(0); | ||
Worker last = workers.get(workers.size() - 1); | ||
Worker winner = pickOneInTie(first); | ||
Worker loser = pickOneInTie(last); | ||
WorkspaceResult workspaceResult = new WorkspaceResult(workspace, winner, loser); | ||
workspace.changeStatusTo(WorkspaceStatus.FULLY_COMPLETED); | ||
return workspaceResult; | ||
} | ||
|
||
private Worker pickOneInTie(Worker worker) { | ||
List<Worker> tieWorkers = workers.stream() | ||
.filter(w -> w.isTie(worker)) | ||
.collect(Collectors.toList()); | ||
Collections.shuffle(tieWorkers); | ||
return tieWorkers.get(0); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
src/main/java/gymmi/workspace/domain/entity/WorkspaceResult.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
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 jakarta.persistence.*; | ||
import lombok.*; | ||
|
||
@Entity | ||
@Getter | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
@EqualsAndHashCode(of = {"id"}) | ||
public class WorkspaceResult { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@JoinColumn(name = "workspace_id", nullable = false) | ||
@ManyToOne(fetch = FetchType.LAZY) | ||
private Workspace workspace; | ||
|
||
@JoinColumn(name = "winner_id", nullable = false) | ||
@ManyToOne(fetch = FetchType.EAGER) | ||
private Worker winner; | ||
|
||
@JoinColumn(name = "loser_id", nullable = false) | ||
@ManyToOne(fetch = FetchType.EAGER) | ||
private Worker loser; | ||
|
||
public WorkspaceResult(Workspace workspace, Worker winner, Worker loser) { | ||
this.workspace = workspace; | ||
this.winner = winner; | ||
this.loser = loser; | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
src/main/java/gymmi/workspace/repository/WorkspaceResultRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package gymmi.workspace.repository; | ||
|
||
import gymmi.exceptionhandler.legacy.NotFoundResourcesException; | ||
import gymmi.workspace.domain.entity.WorkspaceResult; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.data.jpa.repository.Query; | ||
|
||
import java.util.Optional; | ||
|
||
public interface WorkspaceResultRepository extends JpaRepository<WorkspaceResult, Long> { | ||
|
||
default WorkspaceResult getByWorkspaceId(Long workspaceId) { | ||
WorkspaceResult workspaceResult = findByWorkspaceId(workspaceId) | ||
.orElseThrow(() -> new NotFoundResourcesException("해당 결과가 존재하지 않아요.")); | ||
return workspaceResult; | ||
} | ||
|
||
@Query("select w from WorkspaceResult w where w.workspace.id =:workspaceId") | ||
Optional<WorkspaceResult> findByWorkspaceId(Long workspaceId); | ||
} |
21 changes: 21 additions & 0 deletions
21
src/main/java/gymmi/workspace/response/WorkerResultResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package gymmi.workspace.response; | ||
|
||
import gymmi.workspace.domain.entity.Worker; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
public class WorkerResultResponse { | ||
|
||
private final String name; | ||
private final Integer contributeScore; | ||
private final Integer rank; | ||
|
||
@Builder | ||
public WorkerResultResponse(Worker worker, Integer rank) { | ||
this.name = worker.getNickname(); | ||
this.contributeScore = worker.getContributedScore(); | ||
this.rank = rank; | ||
} | ||
|
||
} |
27 changes: 27 additions & 0 deletions
27
src/main/java/gymmi/workspace/response/WorkspaceResultResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package gymmi.workspace.response; | ||
|
||
import gymmi.workspace.domain.entity.Worker; | ||
import lombok.Getter; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
@Getter | ||
public class WorkspaceResultResponse { | ||
|
||
private final String task; | ||
private final List<WorkerResultResponse> workers; | ||
|
||
public WorkspaceResultResponse(String task, List<Worker> workers) { | ||
this.task = task; | ||
this.workers = getWorkerResultResponse(workers); | ||
} | ||
|
||
private List<WorkerResultResponse> getWorkerResultResponse(List<Worker> workers) { | ||
List<WorkerResultResponse> workerResultResponse = new ArrayList<>(); | ||
for (int i = 0; i < workers.size(); i++) { | ||
workerResultResponse.add(new WorkerResultResponse(workers.get(i), i + 1)); | ||
} | ||
return workerResultResponse; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 0 additions & 10 deletions
10
src/main/resources/db/migration/V250104__vote_worker_task_workspace.sql
This file was deleted.
Oops, something went wrong.
23 changes: 23 additions & 0 deletions
23
src/main/resources/db/migration/V250104__vote_worker_task_workspace_workspacerResult.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
alter table vote | ||
add column automatic boolean not null; | ||
|
||
alter table worker drop foreign key worker_ibfk_1; | ||
alter table worker drop column task_id; | ||
|
||
drop table task; | ||
|
||
alter table workspace | ||
add column task varchar(255) not null; | ||
|
||
create table workspace_task | ||
( | ||
id bigint not null auto_increment primary key, | ||
workspace_id bigint not null, | ||
winner_id bigint not null, | ||
loser_id bigint not null, | ||
created_at timestamp(3) not null, | ||
last_modified_at timestamp(3) not null, | ||
foreign key (workspace_id) references worker (id), | ||
foreign key (winner_id) references worker (id), | ||
foreign key (loser_id) references worker (id) | ||
); |
Oops, something went wrong.