Skip to content

Commit

Permalink
feat/#108/이벤트 경품 UI에 필요한 경품 정보 추가 (#109)
Browse files Browse the repository at this point in the history
* [FEAT] 응모 정보 응답 객체 필드 추가

* [FEAT] 캐싱을 적용한 경품 확률 조회메서드 추가

* [FIX] 경품 정보 반환 메서드 수정

* [FEAT] 경품 정보 에러코드 추가

* [FIX] 경품 정보 컨트롤러 수정
  • Loading branch information
devchlee12 authored Aug 19, 2024
1 parent 40c2709 commit 9d1188a
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import softeer.team_pineapple_be.domain.draw.request.SendPrizeRequest;
import softeer.team_pineapple_be.domain.draw.response.DrawDailyMessageResponse;
import softeer.team_pineapple_be.domain.draw.response.DrawResponse;
import softeer.team_pineapple_be.domain.draw.response.DrawRewardImageResponse;
import softeer.team_pineapple_be.domain.draw.response.DrawRewardInfoResponse;
import softeer.team_pineapple_be.domain.draw.response.SendPrizeResponse;
import softeer.team_pineapple_be.domain.draw.service.DrawPrizeService;
import softeer.team_pineapple_be.domain.draw.service.DrawService;
Expand All @@ -40,10 +40,16 @@ public ResponseEntity<DrawResponse> enterDraw() {
return ResponseEntity.ok(drawService.enterDraw());
}

@Operation(summary = "메인 페이지에서 사용할 경품 이미지 받기")
@GetMapping("/prize-images")
public ResponseEntity<List<DrawRewardImageResponse>> getDrawPrizeImages() {
List<DrawRewardImageResponse> drawRewardImages = drawPrizeService.getDrawRewardImages();
@Operation(summary = "해당 날짜와 응모 시나리오 조회")
@GetMapping("/scenario")
public ResponseEntity<DrawDailyMessageResponse.DrawDailyScenario> getDrawDailyScenario() {
return ResponseEntity.ok(drawService.getDrawDailyScenario());
}

@Operation(summary = "메인 페이지에서 사용할 경품 정보 받기")
@GetMapping("/prize-infos")
public ResponseEntity<List<DrawRewardInfoResponse>> getDrawPrizeImages() {
List<DrawRewardInfoResponse> drawRewardImages = drawPrizeService.getDrawRewardImages();
return ResponseEntity.ok(drawRewardImages);
}

Expand All @@ -54,10 +60,4 @@ public ResponseEntity<SendPrizeResponse> sendPrize(@Valid @RequestBody SendPrize
SendPrizeResponse sendPrizeResponse = drawPrizeService.sendPrizeMessage(request.getPrizeId());
return ResponseEntity.ok(sendPrizeResponse);
}

@Operation(summary = "해당 날짜와 응모 시나리오 조회")
@GetMapping("/scenario")
public ResponseEntity<DrawDailyMessageResponse.DrawDailyScenario> getDrawDailyScenario(){
return ResponseEntity.ok(drawService.getDrawDailyScenario());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ public enum DrawErrorCode implements ErrorCode {
NOT_VALID_DATE(HttpStatus.BAD_REQUEST, "상품 추첨이 가능하지 않은 날짜입니다."),
NO_DAILY_INFO(HttpStatus.BAD_REQUEST, "일자별 응모 정보가 존재하지 않습니다"),
DAILY_INFO_WIN_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 성공 이미지 업로드에 실패했습니다."),
DAILY_INFO_LOSE_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 실패 이미지 업로드에 실패했습니다.");
DAILY_INFO_LOSE_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 실패 이미지 업로드에 실패했습니다."),
NO_PRIZE_PROBABILITY(HttpStatus.BAD_REQUEST, "확률 정보가 존재하지 않습니다.");

private final HttpStatus httpStatus;
private final String message;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package softeer.team_pineapple_be.domain.draw.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import softeer.team_pineapple_be.domain.draw.domain.DrawRewardInfo;
import softeer.team_pineapple_be.domain.draw.service.DrawProbabilityService;

/**
* 경품 이미지 응답
*/
@Getter
@Setter
@AllArgsConstructor
public class DrawRewardInfoResponse {
private Byte rank;
private String rewardName;
private Integer rewardCount;
private String imageUrl;

public static DrawRewardInfoResponse of(DrawRewardInfo drawRewardInfo,
DrawProbabilityService drawProbabilityService) {
return new DrawRewardInfoResponse(drawRewardInfo.getRanking(), drawRewardInfo.getName(),
drawProbabilityService.getDrawProbabilityByRanking(drawRewardInfo.getRanking()), drawRewardInfo.getImage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import softeer.team_pineapple_be.domain.draw.exception.DrawErrorCode;
import softeer.team_pineapple_be.domain.draw.repository.DrawPrizeRepository;
import softeer.team_pineapple_be.domain.draw.repository.DrawRewardInfoRepository;
import softeer.team_pineapple_be.domain.draw.response.DrawRewardImageResponse;
import softeer.team_pineapple_be.domain.draw.response.DrawRewardInfoResponse;
import softeer.team_pineapple_be.domain.draw.response.SendPrizeResponse;
import softeer.team_pineapple_be.global.auth.service.AuthMemberService;
import softeer.team_pineapple_be.global.cloud.service.S3DeleteService;
Expand All @@ -33,14 +33,15 @@ public class DrawPrizeService {
private final S3UploadService s3UploadService;
private final S3DeleteService s3DeleteService;
private final DrawRewardInfoRepository drawRewardInfoRepository;
private final DrawProbabilityService drawProbabilityService;

/**
* 응모 경품 이미지를 반환하는 메서드
*/
@Transactional(readOnly = true)
public List<DrawRewardImageResponse> getDrawRewardImages() {
public List<DrawRewardInfoResponse> getDrawRewardImages() {
List<DrawRewardInfo> all = drawRewardInfoRepository.findAll();
return all.stream().map(DrawRewardImageResponse::of).toList();
return all.stream().map(info -> DrawRewardInfoResponse.of(info, drawProbabilityService)).toList();
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,51 +1,74 @@
package softeer.team_pineapple_be.domain.draw.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import softeer.team_pineapple_be.domain.draw.domain.DrawProbability;
import softeer.team_pineapple_be.domain.draw.repository.DrawProbabilityRepository;
import softeer.team_pineapple_be.domain.draw.request.DrawProbabilityRequest;
import softeer.team_pineapple_be.domain.draw.response.DrawProbabilityResponse;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

import lombok.RequiredArgsConstructor;
import softeer.team_pineapple_be.domain.draw.domain.DrawProbability;
import softeer.team_pineapple_be.domain.draw.exception.DrawErrorCode;
import softeer.team_pineapple_be.domain.draw.repository.DrawProbabilityRepository;
import softeer.team_pineapple_be.domain.draw.request.DrawProbabilityRequest;
import softeer.team_pineapple_be.domain.draw.response.DrawProbabilityResponse;
import softeer.team_pineapple_be.global.exception.RestApiException;

/**
* 경품 확률 서비스
*/
@Service
@RequiredArgsConstructor
public class DrawProbabilityService {

private final DrawProbabilityRepository drawProbabilityRepository;
private static final ConcurrentHashMap<Byte, Integer> probabilityCache = new ConcurrentHashMap<>();
private final DrawProbabilityRepository drawProbabilityRepository;

/**
* 경품 확률을 조회하는 메서드
* @return 경품 확률 리스트
*/
@Transactional(readOnly = true)
public DrawProbabilityResponse getDrawProbability(){
List<DrawProbability> probabilities = drawProbabilityRepository.findAll();
Map<Byte, Integer> probabilitiesMap = probabilities.stream()
.collect(Collectors.toMap(DrawProbability::getRanking, DrawProbability::getProbability));
/**
* 경품 확률을 조회하는 메서드
*
* @return 경품 확률 리스트
*/
@Transactional(readOnly = true)
public DrawProbabilityResponse getDrawProbability() {
List<DrawProbability> probabilities = drawProbabilityRepository.findAll();
Map<Byte, Integer> probabilitiesMap =
probabilities.stream().collect(Collectors.toMap(DrawProbability::getRanking, DrawProbability::getProbability));

return new DrawProbabilityResponse(probabilitiesMap);
return new DrawProbabilityResponse(probabilitiesMap);
}

@Transactional(readOnly = true)
public Integer getDrawProbabilityByRanking(Byte ranking) {
if (probabilityCache.containsKey(ranking)) {
return probabilityCache.get(ranking);
}

/**
* 경품 확률을 수정하는 메서드
* @param request 수정하고자 하는 경품 확률
*/
@Transactional
public void setDrawProbability(DrawProbabilityRequest request) {
Map<Byte, Integer> probabilities = request.getProbabilities();
Integer probability = drawProbabilityRepository.findById(ranking)
.orElseThrow(
() -> new RestApiException(DrawErrorCode.NO_PRIZE_PROBABILITY))
.getProbability();
probabilityCache.put(ranking, probability);
return probability;
}

List<DrawProbability> drawProbabilities = probabilities.entrySet().stream()
.map(entry -> new DrawProbability(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
/**
* 경품 확률을 수정하는 메서드
*
* @param request 수정하고자 하는 경품 확률
*/
@Transactional
public void setDrawProbability(DrawProbabilityRequest request) {
Map<Byte, Integer> probabilities = request.getProbabilities();

drawProbabilityRepository.saveAll(drawProbabilities);
}
List<DrawProbability> drawProbabilities = probabilities.entrySet()
.stream()
.map(entry -> new DrawProbability(entry.getKey(),
entry.getValue()))
.collect(Collectors.toList());

drawProbabilityRepository.saveAll(drawProbabilities);
}
}

0 comments on commit 9d1188a

Please sign in to comment.