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 @@ -76,13 +76,13 @@ public CommonResponse<CrewProfileResponse> getCrewByInviteCode(@PathVariable Str
}

@PostMapping("/{crewId}/join")
@Operation(summary = "크루 가입", description = "크루 가입하는 API 입니다.")
@Operation(summary = "크루 가입 요청", description = "크루 가입 요청하는 API 입니다.")
public CommonResponse<Void> joinCrew(
@Login Member member,
@PathVariable Long crewId) {

crewService.joinCrew(member, crewId);
return new CommonResponse<>("크루 가입 성공");
return new CommonResponse<>("크루 가입 요청 성공");
}

@GetMapping
Expand Down
10 changes: 0 additions & 10 deletions src/main/java/run/backend/domain/crew/entity/JoinCrew.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.hibernate.annotations.SQLDelete;
import run.backend.domain.crew.enums.JoinStatus;
import run.backend.domain.member.entity.Member;
import run.backend.domain.member.enums.Role;
import run.backend.global.common.BaseEntity;

import java.time.LocalDate;
Expand All @@ -29,10 +28,6 @@ public class JoinCrew extends BaseEntity {
@Column(name = "join_status")
private JoinStatus joinStatus;

@Enumerated(EnumType.STRING)
@Column(name = "crew_role")
private Role role;

@Column(name = "joined_date")
private LocalDate joinedDate;

Expand All @@ -45,7 +40,6 @@ public class JoinCrew extends BaseEntity {
private Crew crew;

public void approveJoin() {
this.role = Role.MEMBER;
this.joinedDate = LocalDate.now();
this.joinStatus = JoinStatus.APPROVED;
}
Expand All @@ -54,7 +48,6 @@ public static JoinCrew createLeaderJoin(Member member, Crew crew) {
return JoinCrew.builder()
.crew(crew)
.member(member)
.role(Role.LEADER)
.joinStatus(JoinStatus.APPROVED)
.joinedDate(LocalDate.now())
.build();
Expand All @@ -64,7 +57,6 @@ public static JoinCrew createAppliedJoin(Member member, Crew crew) {
return JoinCrew.builder()
.crew(crew)
.member(member)
.role(Role.MEMBER)
.joinStatus(JoinStatus.APPLIED)
.build();
}
Expand All @@ -73,14 +65,12 @@ public static JoinCrew createAppliedJoin(Member member, Crew crew) {
private JoinCrew(
Member member,
Crew crew,
Role role,
JoinStatus joinStatus,
LocalDate joinedDate

) {
this.crew = crew;
this.member = member;
this.role = role;
this.joinStatus = joinStatus;
this.joinedDate = joinedDate;
}
Expand Down
47 changes: 18 additions & 29 deletions src/main/java/run/backend/domain/crew/mapper/CrewMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public interface CrewMapper {
@Mapping(target = "rank", source = "rank")
CrewBaseInfoResponse toCrewBaseInfo(int rank, Crew crew);

@Mapping(target = "crewId", source = "crew.id")
@Mapping(target = "monthlyScoreTotal", expression = "java(crew.getMonthlyScoreTotal().intValue())")
CrewRankingResponse toCrewRankingResponse(Crew crew);

Expand All @@ -33,33 +34,21 @@ public interface CrewMapper {

List<CrewSearchResponse> toCrewSearchResponseList(List<CrewProfileDto> dtos);

default Crew toEntity(String imageName, String name, String description) {
return Crew.builder()
.image(imageName)
.name(name)
.description(description)
.build();
}

default CrewProfileResponse toCrewProfile(Crew crew, Member leader) {
return CrewProfileResponse.builder()
.crewImage(crew.getImage())
.crewName(crew.getName())
.crewDescription(crew.getDescription())
.memberCount(crew.getMemberCount())
.leaderImage(leader.getProfileImage())
.leaderName(leader.getNickname())
.build();
}

default CrewRankingStatusResponse toCrewRankingStatusResponse(
int rank,
Crew crew
) {
return new CrewRankingStatusResponse(
rank,
crew.getMonthlyDistanceTotal().intValue(),
crew.getCapturedDistanceTotal().intValue()
);
}
@Mapping(target = "image", source = "imageName")
@Mapping(target = "name", source = "name")
@Mapping(target = "description", source = "description")
Crew toCrewEntity(String imageName, String name, String description);

@Mapping(target = "crewImage", source = "crew.image")
@Mapping(target = "crewName", source = "crew.name")
@Mapping(target = "crewDescription", source = "crew.description")
@Mapping(target = "memberCount", source = "crew.memberCount")
@Mapping(target = "leaderImage", source = "leader.profileImage")
@Mapping(target = "leaderName", source = "leader.nickname")
CrewProfileResponse toCrewProfile(Crew crew, Member leader);

@Mapping(target = "ranking", source = "rank")
@Mapping(target = "totalDistanceKm", expression = "java(crew.getMonthlyDistanceTotal().intValue())")
@Mapping(target = "capturedDistanceKm", expression = "java(crew.getCapturedDistanceTotal().intValue())")
CrewRankingStatusResponse toCrewRankingStatusResponse(int rank, Crew crew);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import run.backend.domain.crew.dto.query.CrewProfileDto;
import run.backend.domain.crew.entity.Crew;

import java.util.List;
import java.util.Optional;

public interface CrewRepository extends JpaRepository<Crew, Long> {
Expand All @@ -15,6 +16,15 @@ public interface CrewRepository extends JpaRepository<Crew, Long> {

Page<Crew> findAllByDeletedAtIsNullOrderByMonthlyScoreTotalDesc(Pageable pageable);


@Query("""
SELECT c.id
FROM Crew c
WHERE c.deletedAt IS NULL
ORDER BY c.monthlyScoreTotal DESC
""")
List<Long> findAllActiveCrewIdsOrderByScoreDesc();

@Query("""
SELECT new run.backend.domain.crew.dto.query.CrewProfileDto(
c.image,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@ public interface JoinCrewRepository extends JpaRepository<JoinCrew, Long> {
@Query("""
SELECT jc.member
FROM JoinCrew jc
JOIN Crew c ON jc.crew = c
WHERE jc.role = :role
WHERE jc.crew = :crew AND jc.member.role = :role
""")
Member findCrewLeader(@Param("role") Role role, Crew crew);
Member findCrewLeader(@Param("role") Role role, @Param("crew") Crew crew);

@Query("SELECT jc FROM JoinCrew jc WHERE jc.member.id = :memberId AND jc.joinStatus = :status")
Optional<JoinCrew> findByMemberIdAndJoinStatus(@Param("memberId") Long memberId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
import run.backend.domain.crew.dto.response.CrewRankingResponse;
import run.backend.domain.crew.dto.response.CrewRankingStatusResponse;
import run.backend.domain.crew.entity.Crew;
import run.backend.domain.crew.exception.CrewException;
import run.backend.domain.crew.mapper.CrewMapper;
import run.backend.domain.crew.repository.CrewRepository;
import run.backend.global.common.response.PageResponse;

import java.util.List;
import java.util.stream.IntStream;

@Service
@RequiredArgsConstructor
Expand All @@ -32,8 +34,19 @@ public PageResponse<CrewRankingResponse> getCrewRanking(int page, int size) {

public CrewRankingStatusResponse getCrewRankingStatus(Crew crew) {

int rank = 0; // [TODO] : 스케줄링 rank 계산 구현 수정 예정
int rank = getSingleCrewRanking(crew.getId());

return crewMapper.toCrewRankingStatusResponse(rank, crew);
}

public int getSingleCrewRanking(Long crewId) {

List<Long> crewIds = crewRepository.findAllActiveCrewIdsOrderByScoreDesc();

return IntStream.range(0, crewIds.size())
.filter(i -> crewIds.get(i).equals(crewId))
.findFirst()
.orElseThrow(CrewException.NotFoundCrew::new)
+ 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class CrewService {
private final CrewRepository crewRepository;
private final MemberRepository memberRepository;
private final JoinCrewRepository joinCrewRepository;
private final CrewRankingService crewRankingService;

@Transactional
public CrewInviteCodeDto createCrew(Member member, String imageStatus, MultipartFile image, CrewInfoRequest data) {
Expand All @@ -43,7 +44,7 @@ public CrewInviteCodeDto createCrew(Member member, String imageStatus, Multipart
throw new CrewException.AlreadyJoinedCrew();

String imageName = fileService.handleImageUpdate(imageStatus, "default-profile-image.png", image);
Crew crew = crewMapper.toEntity(imageName, data.name(), data.description());
Crew crew = crewMapper.toCrewEntity(imageName, data.name(), data.description());
crewRepository.save(crew);

JoinCrew joinCrew = JoinCrew.createLeaderJoin(member, crew);
Expand Down Expand Up @@ -95,7 +96,7 @@ public void joinCrew(Member member, Long crewId) {

public CrewBaseInfoResponse getCrewBaseInfo(Crew crew) {

int rank = 0; // [TODO] : 스케줄링 rank 계산 구현 수정 예정
int rank = crewRankingService.getSingleCrewRanking(crew.getId());

return crewMapper.toCrewBaseInfo(rank, crew);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ void createLeaderJoin_setsCorrectValues() {
// then
assertThat(joinCrew.getMember()).isEqualTo(member);
assertThat(joinCrew.getCrew()).isEqualTo(crew);
assertThat(joinCrew.getRole()).isEqualTo(Role.LEADER);
assertThat(joinCrew.getJoinStatus()).isEqualTo(JoinStatus.APPROVED);
assertThat(joinCrew.getJoinedDate()).isEqualTo(LocalDate.now());
}
Expand All @@ -42,7 +41,6 @@ void createAppliedJoin_setsCorrectValues() {
// then
assertThat(joinCrew.getMember()).isEqualTo(member);
assertThat(joinCrew.getCrew()).isEqualTo(crew);
assertThat(joinCrew.getRole()).isEqualTo(Role.MEMBER);
assertThat(joinCrew.getJoinStatus()).isEqualTo(JoinStatus.APPLIED);
assertThat(joinCrew.getJoinedDate()).isNull();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ void toCrewEntity_mapsCorrectly() {
String description = "crew_description";

// when
Crew result = crewMapper.toEntity(imageName, name, description);
Crew result = crewMapper.toCrewEntity(imageName, name, description);

// then
assertThat(result.getImage()).isEqualTo(imageName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
Expand All @@ -21,12 +22,14 @@
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;

@DisplayName("Crew Ranking 서비스 테스트")
@ExtendWith(MockitoExtension.class)
public class CrewRankingServiceTest {

@Spy
@InjectMocks
private CrewRankingService crewRankingService;

Expand Down Expand Up @@ -110,9 +113,10 @@ class getCrewRankingStatusTest {
void getCrewRankingStatus_whenValidCrewGiven_thenReturnsStatusResponse() {

// given
int rank = 0;
int rank = 1;
CrewRankingStatusResponse expectedResponse = new CrewRankingStatusResponse(rank, 0, 0);

doReturn(rank).when(crewRankingService).getSingleCrewRanking(crew1.getId());
when(crewMapper.toCrewRankingStatusResponse(rank, crew1))
.thenReturn(expectedResponse);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ void respondsWithInviteCode_whenCreatingCrew() {
.thenReturn(false);
when(fileService.handleImageUpdate(eq("unchanged"), eq("default-profile-image.png"), isNull()))
.thenReturn("default-profile-image.png");
when(crewMapper.toEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
when(crewMapper.toCrewEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
.thenReturn(crew);
when(crewRepository.save(any(Crew.class))).thenAnswer(invocation -> invocation.getArgument(0));
when(joinCrewRepository.save(any(JoinCrew.class))).thenReturn(null);
Expand All @@ -116,7 +116,7 @@ void saveJoinCrew_whenCreatingCrew() {
when(joinCrewRepository.existsByMemberAndJoinStatus(member, JoinStatus.APPROVED)).thenReturn(false);
when(fileService.handleImageUpdate(eq("unchanged"), eq("default-profile-image.png"), isNull()))
.thenReturn("default-profile-image.png");
when(crewMapper.toEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
when(crewMapper.toCrewEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
.thenReturn(crew);
when(crewRepository.save(any(Crew.class))).thenAnswer(invocation -> invocation.getArgument(0));
when(joinCrewRepository.save(any(JoinCrew.class))).thenReturn(null);
Expand All @@ -137,7 +137,7 @@ void updatesMemberRoleToLeader_whenCreatingCrew() {
when(joinCrewRepository.existsByMemberAndJoinStatus(member, JoinStatus.APPROVED)).thenReturn(false);
when(fileService.handleImageUpdate(eq("unchanged"), eq("default-profile-image.png"), isNull()))
.thenReturn("default-profile-image.png");
when(crewMapper.toEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
when(crewMapper.toCrewEntity(eq("default-profile-image.png"), eq(request.name()), eq(request.description())))
.thenReturn(crew);
when(crewRepository.save(any(Crew.class))).thenAnswer(invocation -> invocation.getArgument(0));
when(joinCrewRepository.save(any(JoinCrew.class))).thenReturn(null);
Expand Down