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 @@ -8,9 +8,11 @@
import org.springframework.web.multipart.MultipartFile;
import run.backend.domain.crew.dto.common.CrewInviteCodeDto;
import run.backend.domain.crew.dto.request.CrewInfoRequest;
import run.backend.domain.crew.dto.request.MemberRoleChangeRequest;
import run.backend.domain.crew.dto.response.*;
import run.backend.domain.crew.entity.Crew;
import run.backend.domain.crew.service.CrewEventService;
import run.backend.domain.crew.service.CrewMemberService;
import run.backend.domain.crew.service.CrewRankingService;
import run.backend.domain.crew.service.CrewService;
import run.backend.domain.member.entity.Member;
Expand All @@ -27,6 +29,7 @@ public class CrewController {

private final CrewService crewService;
private final CrewEventService crewEventService;
private final CrewMemberService crewMemberService;
private final CrewRankingService crewRankingService;

@PostMapping
Expand Down Expand Up @@ -132,4 +135,34 @@ public CommonResponse<CrewRankingStatusResponse> getCrewRankingsStatus(@MemberCr
CrewRankingStatusResponse response = crewRankingService.getCrewRankingStatus(crew);
return new CommonResponse<>("크루 땅따먹기 현황 조회 성공", response);
}

@GetMapping("/members")
@Operation(summary = "크루원 조회", description = "전체 크루원 조회하는 API 입니다.")
public CommonResponse<CrewMemberResponse> getCrewMembers(@MemberCrew Crew crew) {

CrewMemberResponse response = crewMemberService.getCrewMembers(crew);
return new CommonResponse<>("크루원 조회 성공", response);
}

@PostMapping("/members/{memberId}/role")
@PreAuthorize("hasRole('MANAGER') or hasRole('LEADER')")
@Operation(summary = "크루원 역할 변경", description = "크루원 역할 변경하는 API 입니다.")
public CommonResponse<Void> updateCrewMemberRole(
@PathVariable Long memberId,
@RequestBody MemberRoleChangeRequest request
) {
crewMemberService.updateCrewMemberRole(memberId, request);
return new CommonResponse<>("크루원 역할 변경 성공");
}

@GetMapping("/search")
@Operation(summary = "크루 검색", description = "크루 이름으로 검색 API 입니다.")
public CommonResponse<PageResponse<CrewSearchResponse>> searchCrew(
@RequestParam String crewName,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
PageResponse<CrewSearchResponse> response = crewService.searchCrewsByName(crewName, page, size);
return new CommonResponse<>("크루 검색 성공", response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package run.backend.domain.crew.dto.query;

import run.backend.domain.member.enums.Role;

public record CrewMemberProfileDto(
String image,
String nickname,
Role role
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package run.backend.domain.crew.dto.query;

public record CrewProfileDto(
String image,
String name,
String description
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package run.backend.domain.crew.dto.request;

import run.backend.domain.member.enums.Role;

public record MemberRoleChangeRequest(
Role role
) {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package run.backend.domain.crew.dto.response;

import run.backend.domain.member.enums.Role;

public record CrewMemberProfileResponse(
String image,
String nickname,
Role role
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

public record CrewMemberResponse(
List<CrewMemberProfile> crewMembers
List<CrewMemberProfileResponse> managers,
List<CrewMemberProfileResponse> members
) {
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package run.backend.domain.crew.dto.response;

import java.util.List;

public record CrewSearchResponse(
List<CrewProfileResponse> crewProfiles
String image,
String name,
String description
) {
}
2 changes: 2 additions & 0 deletions src/main/java/run/backend/domain/crew/entity/Crew.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.SQLDelete;
import run.backend.global.common.BaseEntity;

import java.math.BigDecimal;
Expand All @@ -12,6 +13,7 @@
@Table(name = "crews")
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@SQLDelete(sql = "UPDATE crews SET deleted_at = NOW() WHERE id = ?")
public class Crew extends BaseEntity {

@Id
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/run/backend/domain/crew/entity/JoinCrew.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
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;
Expand All @@ -17,6 +18,7 @@
@Getter
@Table(name = "join_crews")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@SQLDelete(sql = "UPDATE join_crews SET deleted_at = NOW() WHERE id = ?")
public class JoinCrew extends BaseEntity {

@Id
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/run/backend/domain/crew/mapper/CrewMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
import run.backend.domain.crew.dto.response.CrewBaseInfoResponse;
import run.backend.domain.crew.dto.response.CrewProfileResponse;
import run.backend.domain.crew.dto.response.CrewRankingResponse;
import run.backend.domain.crew.dto.response.CrewRankingStatusResponse;
import run.backend.domain.crew.dto.query.CrewMemberProfileDto;
import run.backend.domain.crew.dto.query.CrewProfileDto;
import run.backend.domain.crew.dto.response.*;
import run.backend.domain.crew.entity.Crew;
import run.backend.domain.member.entity.Member;

Expand All @@ -26,6 +25,14 @@ public interface CrewMapper {

List<CrewRankingResponse> toCrewRankingResponseList(List<Crew> crews);

CrewMemberProfileResponse toCrewMemberProfileResponse(CrewMemberProfileDto dto);

List<CrewMemberProfileResponse> toCrewMemberProfileResponseList(List<CrewMemberProfileDto> dtos);

CrewSearchResponse toCrewSearchResponse(CrewProfileDto dto);

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

default Crew toEntity(String imageName, String name, String description) {
return Crew.builder()
.image(imageName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,27 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import run.backend.domain.crew.dto.query.CrewProfileDto;
import run.backend.domain.crew.entity.Crew;

import java.util.Optional;

public interface CrewRepository extends JpaRepository<Crew, Long> {

Optional<Crew> findByInviteCode(String inviteCode);
Optional<Crew> findByInviteCodeAndDeletedAtIsNull(String inviteCode);

Page<Crew> findAllByDeletedAtIsNullOrderByMonthlyScoreTotalDesc(Pageable pageable);

Page<Crew> findAllByOrderByMonthlyScoreTotalDesc(Pageable pageable);
@Query("""
SELECT new run.backend.domain.crew.dto.query.CrewProfileDto(
Copy link
Contributor

Choose a reason for hiding this comment

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

잘한다..

Copy link
Contributor Author

@choiseoji choiseoji Aug 4, 2025

Choose a reason for hiding this comment

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

엇..동현님 따라했어요 ㅎㅎ.ㅎ

c.image,
c.name,
c.description
)
FROM Crew c
WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :name, '%'))
AND c.deletedAt IS NULL
""")
Page<CrewProfileDto> findByNameContainingIgnoreCase(String name, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import run.backend.domain.crew.dto.query.CrewMemberProfileDto;
import run.backend.domain.crew.entity.Crew;
import run.backend.domain.crew.entity.JoinCrew;
import run.backend.domain.crew.enums.JoinStatus;
import run.backend.domain.member.entity.Member;
import run.backend.domain.member.enums.Role;

import java.util.List;
import java.util.Optional;
import run.backend.domain.event.dto.response.EventCreationValidationDto;

Expand Down Expand Up @@ -60,4 +63,17 @@ Optional<Member> findCrewMemberById(
@Param("crewId") Long crewId,
@Param("status") JoinStatus status
);

@Query("""
SELECT new run.backend.domain.crew.dto.query.CrewMemberProfileDto(
m.profileImage,
m.nickname,
m.role
)
FROM JoinCrew jc
JOIN jc.member m
WHERE jc.crew.id = :crewId
AND jc.joinStatus = :status
""")
List<CrewMemberProfileDto> findAllCrewMemberByCrewId(@Param("crewId") Long crewId, @Param("status") JoinStatus status);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package run.backend.domain.crew.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import run.backend.domain.crew.dto.query.CrewMemberProfileDto;
import run.backend.domain.crew.dto.request.MemberRoleChangeRequest;
import run.backend.domain.crew.dto.response.CrewMemberProfileResponse;
import run.backend.domain.crew.dto.response.CrewMemberResponse;
import run.backend.domain.crew.entity.Crew;
import run.backend.domain.crew.enums.JoinStatus;
import run.backend.domain.crew.mapper.CrewMapper;
import run.backend.domain.crew.repository.JoinCrewRepository;
import run.backend.domain.member.entity.Member;
import run.backend.domain.member.enums.Role;
import run.backend.domain.member.exception.MemberException;
import run.backend.domain.member.repository.MemberRepository;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CrewMemberService {

private final CrewMapper crewMapper;
private final MemberRepository memberRepository;
private final JoinCrewRepository joinCrewRepository;

public CrewMemberResponse getCrewMembers(Crew crew) {

List<CrewMemberProfileDto> dtos = joinCrewRepository.findAllCrewMemberByCrewId(crew.getId(), JoinStatus.APPROVED);

List<CrewMemberProfileResponse> all = crewMapper.toCrewMemberProfileResponseList(dtos);

List<CrewMemberProfileResponse> managers = new ArrayList<>();
List<CrewMemberProfileResponse> members = new ArrayList<>();

for (CrewMemberProfileResponse profile : all) {

if (profile.role() == Role.MEMBER)
members.add(profile);
else
managers.add(profile);
}
return new CrewMemberResponse(managers, members);
}

@Transactional
public void updateCrewMemberRole(Long memberId, MemberRoleChangeRequest request) {

Member member = memberRepository.findById(memberId)
.orElseThrow(MemberException.MemberNotFound::new);

member.updateRole(request.role());
memberRepository.save(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class CrewRankingService {

public PageResponse<CrewRankingResponse> getCrewRanking(int page, int size) {

Page<Crew> pageResult = crewRepository.findAllByOrderByMonthlyScoreTotalDesc(PageRequest.of(page, size));
Page<Crew> pageResult = crewRepository.findAllByDeletedAtIsNullOrderByMonthlyScoreTotalDesc(PageRequest.of(page, size));
List<CrewRankingResponse> content = crewMapper.toCrewRankingResponseList(pageResult.getContent());

return PageResponse.toPageResponse(pageResult, content);
Expand Down
16 changes: 15 additions & 1 deletion src/main/java/run/backend/domain/crew/service/CrewService.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package run.backend.domain.crew.service;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import run.backend.domain.crew.dto.common.CrewInviteCodeDto;
import run.backend.domain.crew.dto.query.CrewProfileDto;
import run.backend.domain.crew.dto.request.CrewInfoRequest;
import run.backend.domain.crew.dto.response.*;
import run.backend.domain.crew.entity.Crew;
Expand All @@ -18,6 +21,9 @@
import run.backend.domain.member.entity.Member;
import run.backend.domain.member.enums.Role;
import run.backend.domain.member.repository.MemberRepository;
import run.backend.global.common.response.PageResponse;

import java.util.List;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -68,7 +74,7 @@ public CrewInviteCodeDto getCrewInviteCode(Crew crew) {

public CrewProfileResponse getCrewByInviteCode(String inviteCode) {

Crew crew = crewRepository.findByInviteCode(inviteCode)
Crew crew = crewRepository.findByInviteCodeAndDeletedAtIsNull(inviteCode)
.orElseThrow(CrewException.NotFoundCrew::new);
Member leader = joinCrewRepository.findCrewLeader(Role.LEADER, crew);

Expand All @@ -93,4 +99,12 @@ public CrewBaseInfoResponse getCrewBaseInfo(Crew crew) {

return crewMapper.toCrewBaseInfo(rank, crew);
}

public PageResponse<CrewSearchResponse> searchCrewsByName(String crewName, int page, int size) {

Page<CrewProfileDto> crewPage = crewRepository.findByNameContainingIgnoreCase(crewName, PageRequest.of(page, size));
List<CrewSearchResponse> content = crewMapper.toCrewSearchResponseList(crewPage.getContent());

return PageResponse.toPageResponse(crewPage, content);
}
}
Loading