Skip to content

Commit

Permalink
feat: 보드칸 조회 시 인증 이미지 URL 응답 필드 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
songyi00 committed Jan 28, 2025
1 parent dd1b1d6 commit 1a45a34
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@
import com.nexters.goalpanzi.domain.mission.repository.MissionRepository;
import com.nexters.goalpanzi.domain.mission.repository.MissionVerificationRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.swing.text.html.Option;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

Expand All @@ -38,18 +41,34 @@ public MissionBoardsResponse getBoard(final MissionBoardQuery query) {
MissionMembers missionMembers = getMissionMembers(query.missionId(), query.sortType(), query.direction());
missionMembers.verifyMissionMember(member);

// key: 보드칸 번호 value: 참여 멤버 목록
Map<Integer, List<Member>> boardMap = groupByVerificationCount(mission, missionMembers);
List<MissionBoardResponse> boards = new ArrayList<>();
for (Map.Entry<Integer, List<Member>> entry : boardMap.entrySet()) {
boards.add(MissionBoardResponse.of(query.memberId(), entry.getKey(), entry.getValue()));
}

// key: 보드칸 번호 value: 미션 인증 정보
Map<Integer, MissionVerification> boardCountMap = missionVerificationRepository.findByMemberIdAndMissionId(
member.getId(), mission.getId(), Pageable.unpaged())
.stream()
.collect(Collectors.toMap(MissionVerification::getBoardNumber, verification -> verification));

var boards = boardMap.entrySet().stream()
.map(board -> generateBoardInfo(query.memberId(), board, boardCountMap.getOrDefault(board.getKey(), null)))
.toList();

return new MissionBoardsResponse(
getProgressCount(query.missionId()),
MemberRanks.from(missionMembers.getMissionMembers()).getRankByMember(member).rank(),
boards);
}

private MissionBoardResponse generateBoardInfo(final Long memberId, final Map.Entry<Integer, List<Member>> board,
final MissionVerification missionVerification) {
var imageUrl = Optional.ofNullable(missionVerification)
.map(MissionVerification::getImageUrl)
.orElse(null);

return MissionBoardResponse.of(memberId, board.getKey(), board.getValue(), imageUrl);
}

private MissionMembers getMissionMembers(final Long missionId, final MissionBoardQuery.SortType sortType, final Sort.Direction direction) {
if (sortType.equals(MissionBoardQuery.SortType.RANDOM)) {
return shuffleMissionMembers(missionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@ public record MissionBoardResponse(
Reward reward,
@Schema(description = "내 장기말 존재 여부", requiredMode = Schema.RequiredMode.REQUIRED)
Boolean isMyPosition,
@Schema(description = "인증 이미지 URL (없으면 NULL)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
String verificationImageUrl,
@Schema(description = "해당 보드칸에 존재하는 장기말", requiredMode = Schema.RequiredMode.REQUIRED)
List<MissionBoardMemberResponse> missionBoardMembers
) {

public static MissionBoardResponse of(final Long memberId, final Integer number, final List<Member> members) {
public static MissionBoardResponse of(
final Long memberId, final Integer number,
final List<Member> members, final String verificationImageUrl
) {
return new MissionBoardResponse(
number,
Reward.of(number),
isMyPosition(memberId, members),
verificationImageUrl,
members.stream()
.map(MissionBoardMemberResponse::from)
.collect(Collectors.toList())
Expand Down

0 comments on commit 1a45a34

Please sign in to comment.