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
23 changes: 11 additions & 12 deletions src/main/java/com/retrip/crew/application/in/CrewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,17 @@
import com.retrip.crew.application.in.request.IntroductionCreateRequest;
import com.retrip.crew.application.in.request.IntroductionDeleteRequest;
import com.retrip.crew.application.in.request.IntroductionUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewCreateRequest;
import com.retrip.crew.application.in.request.crew.CrewOrder;
import com.retrip.crew.application.in.request.crew.CrewUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewWithdrawalRequest;
import com.retrip.crew.application.in.request.crew.*;
import com.retrip.crew.application.in.response.IntroductionCreateResponse;
import com.retrip.crew.application.in.response.IntroductionDetailResponse;
import com.retrip.crew.application.in.response.IntroductionListResponse;
import com.retrip.crew.application.in.response.IntroductionUpdateResponse;
import com.retrip.crew.application.in.response.crew.CrewCreateResponse;
import com.retrip.crew.application.in.response.crew.CrewDetailResponse;
import com.retrip.crew.application.in.response.crew.CrewListResponse;
import com.retrip.crew.application.in.response.crew.CrewUpdateResponse;
import com.retrip.crew.application.in.response.crew.*;
import com.retrip.crew.application.in.usecase.GetCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageIntroductionUseCase;
import com.retrip.crew.application.out.repository.*;
import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.CrewMembers;
import com.retrip.crew.domain.entity.Introduction;
import com.retrip.crew.domain.entity.Recruitment;
import com.retrip.crew.domain.entity.*;
import com.retrip.crew.domain.exception.CrewNotFoundException;
import com.retrip.crew.domain.exception.IntroductionNotFoundException;
import com.retrip.crew.domain.vo.CrewDescription;
Expand Down Expand Up @@ -145,4 +136,12 @@ public void withdrawCrew(UUID crewId, CrewWithdrawalRequest request) {
CrewMembers crewMembers = crew.getCrewMembers();
crewMembers.withdraw(request.memberId(), request.participatingCrewTrips());
}

@Override
public CrewLeaderDelegateResponse delegateCrewLeader(UUID crewId, CrewLeaderDelegateRequest request) {
Crew crew = findCrewById(crewId);
CrewMembers crewMembers = crew.getCrewMembers();
CrewMember newLeader = crewMembers.delegateLeader(request.leaderId(), request.newLeaderId());
return CrewLeaderDelegateResponse.of(newLeader);
Comment on lines +144 to +145
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

응답에 리더로 된 사용자만 내려주는데, 일반 참가자가 된 리더에 대한 정보는 필요없을까요?

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.retrip.crew.application.in.request.crew;

import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

@Schema(description = "크루 리더 위임 Request")
public record CrewLeaderDelegateRequest(
@Schema(description = "리더 ID")
UUID leaderId,

@Schema(description = "위임 리더 ID")
UUID newLeaderId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.retrip.crew.application.in.response.crew;

import com.retrip.crew.domain.entity.CrewMember;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

@Schema(description = "크루 리더 위임 Response")
public record CrewLeaderDelegateResponse(
@Schema(description = "리더 ID")
UUID leaderId,

@Schema(description = "크루원 역할 코드")
String roleCode,

@Schema(description = "크루원 역할명")
String roleName
) {
public static CrewLeaderDelegateResponse of(CrewMember newLeader) {
return new CrewLeaderDelegateResponse(
newLeader.getMemberId(),
newLeader.getCrewMemberRole().getCode(),
newLeader.getCrewMemberRole().getViewName()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.retrip.crew.application.in.usecase;

import com.retrip.crew.application.in.request.crew.CrewCreateRequest;
import com.retrip.crew.application.in.request.crew.CrewLeaderDelegateRequest;
import com.retrip.crew.application.in.request.crew.CrewUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewWithdrawalRequest;
import com.retrip.crew.application.in.response.crew.CrewCreateResponse;
import com.retrip.crew.application.in.response.crew.CrewLeaderDelegateResponse;
import com.retrip.crew.application.in.response.crew.CrewUpdateResponse;

import java.util.UUID;
Expand All @@ -14,4 +16,6 @@ public interface ManageCrewUseCase {
CrewUpdateResponse updateCrew(UUID crewId, CrewUpdateRequest request);

void withdrawCrew(UUID crewId, CrewWithdrawalRequest request);

CrewLeaderDelegateResponse delegateCrewLeader(UUID crewId, CrewLeaderDelegateRequest request);
}
4 changes: 4 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/CrewMember.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ public CrewMember(Crew crew, UUID memberId, CrewMemberRole crewMemberRole) {
public boolean isLeader() {
return CrewMemberRole.isLeaderRole(this.crewMemberRole);
}

public void changeRole(CrewMemberRole role) {
this.crewMemberRole = role;
}
}
21 changes: 19 additions & 2 deletions src/main/java/com/retrip/crew/domain/entity/CrewMembers.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.retrip.crew.domain.CrewTrip;
import com.retrip.crew.domain.exception.ImpossibleWithdrawCrewException;
import com.retrip.crew.domain.exception.NotCrewLeaderException;
import com.retrip.crew.domain.exception.common.IllegalStateException;
import com.retrip.crew.domain.exception.common.InvalidValueException;
import jakarta.persistence.CascadeType;
Expand Down Expand Up @@ -33,9 +34,9 @@ private CrewMember createLeader(Crew crew, UUID memberId) {

public CrewMember getLeader() {
return this.values.stream()
.filter(it -> it.getCrewMemberRole() == CrewMemberRole.LEADER)
.filter(CrewMember::isLeader)
.findFirst()
.orElse(null);
.orElseThrow(() -> new InvalidValueException("크루 리더를 찾을 수 없습니다."));
}

public int getSize() {
Expand Down Expand Up @@ -90,4 +91,20 @@ private CrewMember findMember(UUID memberId) {
.findFirst()
.orElseThrow(() -> new InvalidValueException("크루 멤버가 아닙니다."));
}

public CrewMember delegateLeader(UUID leaderId, UUID newLeaderId) {
CrewMember leader = findMember(leaderId);
CrewMember newLeader = findMember(newLeaderId);
validatePossibleDelegate(leader);

leader.changeRole(CrewMemberRole.PARTICIPANT);
newLeader.changeRole(CrewMemberRole.LEADER);
return newLeader;
}

private void validatePossibleDelegate(CrewMember leader) {
if (!leader.isLeader()) {
throw new NotCrewLeaderException();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,12 @@
import com.retrip.crew.application.in.request.IntroductionCreateRequest;
import com.retrip.crew.application.in.request.IntroductionDeleteRequest;
import com.retrip.crew.application.in.request.IntroductionUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewCreateRequest;
import com.retrip.crew.application.in.request.crew.CrewOrder;
import com.retrip.crew.application.in.request.crew.CrewUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewWithdrawalRequest;
import com.retrip.crew.application.in.request.crew.*;
import com.retrip.crew.application.in.response.IntroductionCreateResponse;
import com.retrip.crew.application.in.response.IntroductionDetailResponse;
import com.retrip.crew.application.in.response.IntroductionListResponse;
import com.retrip.crew.application.in.response.IntroductionUpdateResponse;
import com.retrip.crew.application.in.response.crew.CrewCreateResponse;
import com.retrip.crew.application.in.response.crew.CrewDetailResponse;
import com.retrip.crew.application.in.response.crew.CrewListResponse;
import com.retrip.crew.application.in.response.crew.CrewUpdateResponse;
import com.retrip.crew.application.in.response.crew.*;
import com.retrip.crew.application.in.usecase.GetCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageIntroductionUseCase;
Expand Down Expand Up @@ -96,12 +90,12 @@ public ApiResponse<IntroductionUpdateResponse> updateIntroduction(

@Schema(description = "크루 자기소개 삭제")
@DeleteMapping("/{crewId}/introductions/{introductionId}")
public ApiResponse<IntroductionCreateResponse> deleteIntroduction(
public ApiResponse<Void> deleteIntroduction(
@PathVariable("crewId") final UUID crewId,
@PathVariable("introductionId") final UUID introductionId,
@RequestBody IntroductionDeleteRequest request) {
manageIntroductionUseCase.deleteIntroduction(crewId, introductionId, request);
return ApiResponse.created(null);
return ApiResponse.noContent();
}

@Schema(description = "크루 자기소개 상세 조회")
Expand Down Expand Up @@ -132,4 +126,13 @@ public ApiResponse<Void> withdrawCrew(
manageCrewUseCase.withdrawCrew(crewId, request);
return ApiResponse.noContent();
}

@Schema(description = "크루 리더 위임")
@PutMapping("/{crewId}/members/delegate")
public ApiResponse<CrewLeaderDelegateResponse> delegateCrewLeader(
@PathVariable final UUID crewId,
@RequestBody CrewLeaderDelegateRequest request) {
CrewLeaderDelegateResponse response = manageCrewUseCase.delegateCrewLeader(crewId, request);
return ApiResponse.ok(response);
}
}
15 changes: 15 additions & 0 deletions src/test/java/com/retrip/crew/domain/entity/CrewMembersTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,19 @@ class CrewMembersTest {
// then
assertThat(crewMembers.getValues().contains(member)).isFalse();
}

@Test
void 크루_리더를_위임한다() {
// given
Crew crew = createCrewWithMembers(LEADER_ID);
CrewMember leader = crew.getCrewMembers().getLeader();

// when
CrewMember newLeader = crew.getCrewMembers().delegateLeader(LEADER_ID, 홍석_ID);

// then
assertThat(newLeader.getMemberId()).isEqualTo(홍석_ID);
assertThat(newLeader.getCrewMemberRole()).isEqualTo(CrewMemberRole.LEADER);
assertThat(leader.getCrewMemberRole()).isEqualTo(CrewMemberRole.PARTICIPANT);
}
}