Skip to content

Commit

Permalink
Merge pull request #53 from SWEET-DEVELOPERS/feature/#49-gift
Browse files Browse the repository at this point in the history
[feat] 토너먼트 랭킹 조회
  • Loading branch information
hysong4u authored Jan 12, 2024
2 parents e32ce29 + 7d499fe commit 8a97062
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 6 deletions.
38 changes: 38 additions & 0 deletions src/main/java/org/sopt/sweet/domain/gift/controller/GiftApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@
import org.sopt.sweet.domain.gift.dto.request.CreateGiftRequestDto;
import org.sopt.sweet.domain.gift.dto.request.MyGiftsRequestDto;
import org.sopt.sweet.domain.gift.dto.request.TournamentScoreRequestDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentRankingResponseDto;
import org.sopt.sweet.global.common.SuccessResponse;
import org.sopt.sweet.global.config.auth.UserId;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;

@Tag(name = "선물", description = "선물 관련 API")
public interface GiftApi {
@Operation(
Expand Down Expand Up @@ -181,4 +185,38 @@ ResponseEntity<SuccessResponse<?>> getTournamentInfo(
example = "2"
) @PathVariable Long roomId
);

@Operation(
summary = "토너먼트 랭킹 조회 API",
responses = {
@ApiResponse(
responseCode = "200",
description = "토너먼트 랭킹 조회 성공",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = SuccessResponse.class)
)
),
@ApiResponse(
responseCode = "404",
description = "토너먼트나 사용자가 존재하지 않음",
content = @Content
),
@ApiResponse(
responseCode = "403",
description = "토너먼트 시작일이 지났거나 사용자가 방에 속해있지 않음",
content = @Content
)
},
security = @SecurityRequirement(name = "token")
)
@GetMapping("ranking/{roomId}")
ResponseEntity<SuccessResponse<?>> getRanking(
@Parameter(
description = "authorization token에서 얻은 userId, 임의입력하면 대체됩니다.",
required = true,
example = "12345"
) @UserId Long userId,
@PathVariable Long roomId
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.sopt.sweet.domain.gift.dto.response.MyGiftsResponseDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentListsResponseDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentInfoDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentRankingResponseDto;
import org.sopt.sweet.domain.gift.service.GiftService;
import org.sopt.sweet.global.common.SuccessResponse;
import org.sopt.sweet.global.config.auth.UserId;
Expand Down Expand Up @@ -58,6 +59,16 @@ public ResponseEntity<SuccessResponse<?>> getTournamentInfo(@UserId Long userId,
return SuccessResponse.ok(tournamentInfo);
}

@GetMapping("ranking/{roomId}")
public ResponseEntity<SuccessResponse<?>> getRanking(@UserId Long userId, @PathVariable Long roomId) {
final List<TournamentRankingResponseDto> ranking = giftService.getTournamentRanking(roomId);
return SuccessResponse.ok(ranking);
}








Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.sopt.sweet.domain.gift.dto.response;

import lombok.Builder;

@Builder
public record TournamentRankingResponseDto(
Long ranking,
Long giftId,
String imageUrl,
String name,
int cost,
String url

) {

public static TournamentRankingResponseDto of( Long ranking,Long giftId, String imageUrl, String name, int cost, String url) {
return TournamentRankingResponseDto.builder()
.ranking(ranking)
.giftId(giftId)
.imageUrl(imageUrl)
.name(name)
.cost(cost)
.url(url)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ public interface GiftRepository extends JpaRepository<Gift, Long> {
List<Gift> findLatestGiftsByRoomAndNotMember(@Param("room") Room room, @Param("member") Member member, Pageable pageable);

List<Gift> findByRoom(Room room);

List<Gift> findByRoomOrderByScoreDesc(Room room);
}
41 changes: 36 additions & 5 deletions src/main/java/org/sopt/sweet/domain/gift/service/GiftService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@
import org.sopt.sweet.domain.gift.dto.request.CreateGiftRequestDto;
import org.sopt.sweet.domain.gift.dto.request.MyGiftsRequestDto;
import org.sopt.sweet.domain.gift.dto.request.TournamentScoreRequestDto;
import org.sopt.sweet.domain.gift.dto.response.MyGiftDto;
import org.sopt.sweet.domain.gift.dto.response.MyGiftsResponseDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentListsResponseDto;
import org.sopt.sweet.domain.gift.dto.response.TournamentInfoDto;
import org.sopt.sweet.domain.gift.dto.response.*;
import org.sopt.sweet.domain.gift.entity.Gift;
import org.sopt.sweet.domain.gift.repository.GiftRepository;
import org.sopt.sweet.domain.member.entity.Member;
Expand All @@ -24,6 +21,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
Expand All @@ -40,7 +38,7 @@ public class GiftService {
private final RoomMemberRepository roomMemberRepository;
private static final int MAX_GIFT_COUNT = 2;
private static final int FIRST_PLACE_SCORE = 10;
private static final int SECOND_PLACE_SCORE= 5;
private static final int SECOND_PLACE_SCORE = 5;

public void createNewGift(Long memberId, CreateGiftRequestDto createGiftRequestDto) {
Member member = findMemberByIdOrThrow(memberId);
Expand Down Expand Up @@ -191,6 +189,39 @@ public void updateTournamentParticipation(Long memberId, Long roomId) {
}


public List<TournamentRankingResponseDto> getTournamentRanking(Long roomId) {
Room room = findRoomByIdOrThrow(roomId);

List<Gift> gifts = giftRepository.findByRoomOrderByScoreDesc(room);
List<TournamentRankingResponseDto> rankingResponse = mapGiftsToTournamentRanking(gifts);
return rankingResponse;
}

private List<TournamentRankingResponseDto> mapGiftsToTournamentRanking(List<Gift> gifts) {
List<TournamentRankingResponseDto> rankingResponse = new ArrayList<>();
int rank = 0;
int currentScore = Integer.MAX_VALUE;

for (Gift gift : gifts) {
int giftScore = gift.getScore();
if (giftScore < currentScore) {
rank++;
}

rankingResponse.add(TournamentRankingResponseDto.of(
(long) rank,
gift.getId(),
gift.getImageUrl(),
gift.getName(),
gift.getCost(),
gift.getUrl()
));

currentScore = giftScore;
}

return rankingResponse;
}


}

0 comments on commit 8a97062

Please sign in to comment.