Skip to content

Commit

Permalink
Merge pull request #23 from KNU-HAEDAL/issue/#22
Browse files Browse the repository at this point in the history
[Feat] 챌린지 그룹 상세조회 api 개발
  • Loading branch information
bayy1216 authored Jun 1, 2024
2 parents 6d247bd + eceb6a9 commit c5816d9
Show file tree
Hide file tree
Showing 11 changed files with 200 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import org.haedal.zzansuni.controller.user.UserRes;
import org.haedal.zzansuni.core.api.ApiResponse;
import org.haedal.zzansuni.domain.challengegroup.ChallengeCategory;
import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupModel;
import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupQueryService;
import org.haedal.zzansuni.domain.challengegroup.DayType;
import org.haedal.zzansuni.global.jwt.JwtUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand All @@ -24,6 +26,7 @@
@RequiredArgsConstructor
@RestController
public class ChallengeGroupController {
private final ChallengeGroupQueryService challengeGroupQueryService;

@Operation(summary = "챌린지 그룹 목록 페이징", description = "챌린지 그룹 페이징 조회.")
@GetMapping("/api/challengeGroups")
Expand All @@ -47,20 +50,9 @@ public ApiResponse<PagingResponse<ChallengeGroupRes.ChallengeGroupDto>> getChall
public ApiResponse<ChallengeGroupRes.ChallengeGroupDetailDto> getChallengeDetail(
@PathVariable Long challengeGroupId
) {
return ApiResponse.success(
new ChallengeGroupRes.ChallengeGroupDetailDto(
1L, "title", "thumbnailUrl", 12,
LocalDate.now(), LocalDate.now(), ChallengeCategory.VOLUNTEER,
"가이드",
12,
List.of("https://picsum.photos/200/300"),
List.of(
new ChallengeGroupRes.ChallengeDto(
1L, 12,1,1,1, DayType.DAY, 12
)
)
)
);
ChallengeGroupModel.Detail challengeGroupDetail = challengeGroupQueryService.getChallengeGroupDetail(challengeGroupId);
var response = ChallengeGroupRes.ChallengeGroupDetailDto.from(challengeGroupDetail);
return ApiResponse.success(response);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import lombok.Builder;
import org.haedal.zzansuni.controller.user.UserRes;
import org.haedal.zzansuni.domain.challengegroup.ChallengeCategory;
import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupModel;
import org.haedal.zzansuni.domain.challengegroup.DayType;
import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeModel;

import java.time.LocalDate;
import java.util.List;
Expand Down Expand Up @@ -40,6 +42,34 @@ public record ChallengeGroupDetailDto(
List<String> imageUrls,
List<ChallengeDto> challenges
) {
public static ChallengeGroupDetailDto from(
ChallengeGroupModel.Detail challengeGroupDetail
){
List<ChallengeModel> challenges = challengeGroupDetail
.getChallenges();

Integer maxDifficulty = challenges.stream()
.map(ChallengeModel::getDifficulty)
.max(Integer::compareTo)
.orElse(0);


return ChallengeGroupDetailDto.builder()
.id(challengeGroupDetail.getId())
.title(challengeGroupDetail.getTitle())
.content(challengeGroupDetail.getContent())
.participantCount(challengeGroupDetail.getCumulativeCount())
.startDate(challengeGroupDetail.getMinStartDate())
.endDate(challengeGroupDetail.getMaxEndDate())
.category(challengeGroupDetail.getCategory())
.guide(challengeGroupDetail.getGuide())
.maxDifficulty(maxDifficulty)
.imageUrls(challengeGroupDetail.getImageUrls())
.challenges(challenges.stream()
.map(ChallengeDto::from)
.toList())
.build();
}

}

Expand All @@ -54,6 +84,19 @@ public record ChallengeDto(
DayType dayType,
Integer dayCount
) {
public static ChallengeDto from(
ChallengeModel challenge
){
return ChallengeDto.builder()
.id(challenge.getId())
.participantCount(challenge.getRequiredCount())
.difficulty(challenge.getDifficulty())
.onceExp(challenge.getOnceExp())
.successExp(challenge.getSuccessExp())
.dayType(challenge.getDayType())
.dayCount(challenge.getRequiredCount())
.build();
}

}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.haedal.zzansuni.domain.challengegroup;

import java.util.List;

public interface ChallengeGroupImageReader {
List<ChallengeGroupImage> getByChallengeGroupId(Long challengeGroupId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package org.haedal.zzansuni.domain.challengegroup;

import lombok.Builder;
import lombok.Getter;
import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeModel;

import java.time.LocalDate;
import java.util.List;

public class ChallengeGroupModel {
@Builder
@Getter
public static class Main {
private Long id;
private ChallengeCategory category;
private String title;
private String content;
private Integer cumulativeCount;

public static Main from(ChallengeGroup challengeGroup) {
return Main.builder()
.id(challengeGroup.getId())
.category(challengeGroup.getCategory())
.title(challengeGroup.getTitle())
.content(challengeGroup.getContent())
.cumulativeCount(challengeGroup.getCumulativeCount())
.build();
}
}

@Getter
@Builder
public static class Detail {
private Long id;
private ChallengeCategory category;
private String title;
private String content;
private String guide;
private Integer cumulativeCount;
private List<String> imageUrls;
private List<ChallengeModel> challenges;

public LocalDate getMinStartDate() {
return challenges.stream()
.map(ChallengeModel::getStartDate)
.min(LocalDate::compareTo)
.orElse(LocalDate.now());
}

public LocalDate getMaxEndDate() {
return challenges.stream()
.map(ChallengeModel::getEndDate)
.max(LocalDate::compareTo)
.orElse(LocalDate.now());
}

public static Detail from(ChallengeGroup challengeGroup, List<ChallengeGroupImage> challengeGroupImages) {
var challenges = challengeGroup.getChallenges().stream()
.map(ChallengeModel::from)
.toList();
var imageUrls = challengeGroupImages.stream()
.map(ChallengeGroupImage::getImageUrl)
.toList();
return Detail.builder()
.id(challengeGroup.getId())
.category(challengeGroup.getCategory())
.title(challengeGroup.getTitle())
.content(challengeGroup.getContent())
.guide(challengeGroup.getGuide())
.cumulativeCount(challengeGroup.getCumulativeCount())
.imageUrls(imageUrls)
.challenges(challenges)
.build();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.haedal.zzansuni.domain.challengegroup;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class ChallengeGroupQueryService {
private final ChallengeGroupReader challengeGroupReader;
private final ChallengeGroupImageReader challengeGroupImageReader;

@Transactional(readOnly = true)
public ChallengeGroupModel.Detail getChallengeGroupDetail(Long challengeGroupId) {
ChallengeGroup challengeGroup = challengeGroupReader.getById(challengeGroupId);
List<ChallengeGroupImage> challengeGroupImages = challengeGroupImageReader.getByChallengeGroupId(challengeGroupId);
return ChallengeGroupModel.Detail.from(challengeGroup, challengeGroupImages);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@

public interface ChallengeGroupReader {
ChallengeGroup getById(Long challengeGroupId);

ChallengeGroup getByIdWithChallenges(Long challengeGroupId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public class ChallengeModel {
private Integer onceExp;
private Integer successExp;
private Integer difficulty;
private LocalDate startDate;
private LocalDate endDate;

public static ChallengeModel from(Challenge challenge) {
return ChallengeModel.builder()
Expand All @@ -33,6 +35,8 @@ public static ChallengeModel from(Challenge challenge) {
.onceExp(challenge.getOnceExp())
.successExp(challenge.getSuccessExp())
.difficulty(challenge.getDifficulty())
.startDate(challenge.getStartDate())
.endDate(challenge.getEndDate())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.haedal.zzansuni.infrastructure.challengegroup;

import lombok.RequiredArgsConstructor;
import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupImage;
import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupImageReader;
import org.springframework.stereotype.Component;

import java.util.List;

@RequiredArgsConstructor
@Component
public class ChallengeGroupImageReaderImpl implements ChallengeGroupImageReader {
private final ChallengeGroupImageRepository challengeGroupImageRepository;
@Override
public List<ChallengeGroupImage> getByChallengeGroupId(Long challengeGroupId) {
return challengeGroupImageRepository.findByChallengeGroupId(challengeGroupId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.haedal.zzansuni.infrastructure.challengegroup;

import org.haedal.zzansuni.domain.challengegroup.ChallengeGroupImage;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ChallengeGroupImageRepository extends JpaRepository<ChallengeGroupImage, Long> {
List<ChallengeGroupImage> findByChallengeGroupId(Long challengeGroupId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,11 @@ public ChallengeGroup getById(Long challengeGroupId) {
.findById(challengeGroupId)
.orElseThrow(NoSuchElementException::new);
}

@Override
public ChallengeGroup getByIdWithChallenges(Long challengeGroupId) {
return challengeGroupRepository
.findByIdWithChallenges(challengeGroupId)
.orElseThrow(NoSuchElementException::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

import org.haedal.zzansuni.domain.challengegroup.ChallengeGroup;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.Optional;

public interface ChallengeGroupRepository extends JpaRepository<ChallengeGroup, Long> {
@Query("select cg from ChallengeGroup cg join fetch cg.challenges where cg.id = :challengeGroupId")
Optional<ChallengeGroup> findByIdWithChallenges(Long challengeGroupId);
}

0 comments on commit c5816d9

Please sign in to comment.