Skip to content

Commit

Permalink
feat: 월별 혜택 조회 api 구현 (#36)
Browse files Browse the repository at this point in the history
jiminnee committed Feb 8, 2024
1 parent 9694b12 commit a3a4b33
Showing 3 changed files with 99 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -41,4 +41,15 @@ public CommonResponse<?> cardPerformance(@AuthenticationPrincipal UserAccount us
return new CommonResponse<>(e.getStatus());
}
}

// [Get] 월별 혜택 조회
@GetMapping("/benefit")
@ResponseBody
public CommonResponse<?> montlyBenefitInfo(@AuthenticationPrincipal UserAccount user, @RequestParam int month) {
try {
return new CommonResponse<>(ResponseCode.SUCCESS, cardService.getMontlyBenefitInfo(user.getUsers(), month));
} catch (CustomException e) {
return new CommonResponse<>(e.getStatus());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ewha.lux.once.domain.card.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

public class MontlyBenefitResponseDto {

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class MontlyBenefitProfileDto {
private int month;
private int receivedSum;
private int benefitGoal;
private int remainBenefit;
List<MontlyBenefitResponseDto.BenefitListDto> benefitList;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class BenefitListDto {
private String category;
private int discountPriceSum;
private int priceSum;
}

}
54 changes: 54 additions & 0 deletions src/main/java/ewha/lux/once/domain/card/service/CardService.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
package ewha.lux.once.domain.card.service;

import ewha.lux.once.domain.card.dto.CardPerformanceRequestDto;
import ewha.lux.once.domain.card.dto.MontlyBenefitResponseDto;
import ewha.lux.once.domain.card.dto.MyWalletResponseDto;
import ewha.lux.once.domain.card.entity.Card;
import ewha.lux.once.domain.card.entity.OwnedCard;
import ewha.lux.once.domain.home.entity.ChatHistory;
import ewha.lux.once.domain.user.entity.Users;
import ewha.lux.once.global.common.CustomException;
import ewha.lux.once.global.common.ResponseCode;
import ewha.lux.once.global.repository.CardRepository;
import ewha.lux.once.global.repository.ChatHistoryRepository;
import ewha.lux.once.global.repository.OwnedCardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class CardService {

private final OwnedCardRepository ownedCardRepository;
private final ChatHistoryRepository chatHistoryRepository;

public MyWalletResponseDto.MyWalletProfileDto getMyWalletInfo(Users nowUser) throws CustomException {
List<OwnedCard> ownedCards = ownedCardRepository.findOwnedCardByUsers(nowUser);
@@ -60,6 +69,51 @@ public void postCardPerformance(Users nowUser, CardPerformanceRequestDto cardPer
return;
}

public MontlyBenefitResponseDto.MontlyBenefitProfileDto getMontlyBenefitInfo(Users nowUser, int month) throws CustomException {
List<ChatHistory> chatHistories = chatHistoryRepository.findByUsers(nowUser);
if(chatHistories.isEmpty()){
new CustomException(ResponseCode.CHAT_HISTORY_NOT_FOUND);
}

int receivedSum = chatHistories.stream()
.filter(chatHistory -> chatHistory.isHasPaid())
.mapToInt(ChatHistory::getPaymentAmount)
.sum();

List<String> categories = chatHistories.stream()
.filter(chatHistory -> chatHistory.isHasPaid() && chatHistory.getCreatedAt().getMonthValue() == month)
.map(ChatHistory::getCategory)
.distinct()
.collect(Collectors.toList());

Map<String, Integer> categoryGetDiscount = chatHistories.stream()
.filter(chatHistory -> chatHistory.isHasPaid() && chatHistory.getCreatedAt().getMonthValue() == month)
.collect(Collectors.groupingBy(ChatHistory::getCategory, Collectors.summingInt(ChatHistory::getDiscount)));

Map<String, Integer> categoryGetPaymentAmount = chatHistories.stream()
.filter(chatHistory -> chatHistory.isHasPaid() && chatHistory.getCreatedAt().getMonthValue() == month)
.collect(Collectors.groupingBy(
ChatHistory::getCategory,
Collectors.summingInt(chatHistory -> chatHistory.getPaymentAmount() - chatHistory.getDiscount())
));

List<MontlyBenefitResponseDto.BenefitListDto> benefitList = categories.stream()
.map(category -> new MontlyBenefitResponseDto.BenefitListDto(
category,
categoryGetDiscount.getOrDefault(category,0),
categoryGetPaymentAmount.getOrDefault(category,0)
))
.collect(Collectors.toList());

return MontlyBenefitResponseDto.MontlyBenefitProfileDto.builder()
.month(month)
.receivedSum(receivedSum)
.benefitGoal(nowUser.getBenefitGoal())
.remainBenefit(nowUser.getBenefitGoal() - receivedSum)
.benefitList(benefitList)
.build();
}

private List<MyWalletResponseDto.CardBenefitListDto> splitCardSummary(String cardSummary) {
List<MyWalletResponseDto.CardBenefitListDto> cardBenefitList = new ArrayList<>();
String[] sections = cardSummary.split("###");

0 comments on commit a3a4b33

Please sign in to comment.