Skip to content

Commit

Permalink
Merge pull request #48 from Central-MakeUs/dev
Browse files Browse the repository at this point in the history
feat: 실DB 연동, expect 구매인증 에러 수정
  • Loading branch information
KarmaPol authored Feb 13, 2024
2 parents 3f9b9c8 + a2cf19d commit 7aa05ff
Show file tree
Hide file tree
Showing 9 changed files with 320 additions and 172 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ out/
.vscode/
/core/core-security/src/main/resources/key/AuthKey_X93DK84396.p8
/key/AuthKey_X93DK84396.p8
/data/
230 changes: 123 additions & 107 deletions api/src/main/java/com/mm/api/domain/point/service/PointService.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package com.mm.api.domain.point.service;

import java.time.LocalDateTime;
import java.util.List;

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

import com.mm.api.domain.buy.dto.response.BuyResponse;
import com.mm.api.domain.point.dto.response.PointsResponse;
import com.mm.api.exception.CustomException;
Expand All @@ -16,111 +10,133 @@
import com.mm.coredomain.repository.BuyRepository;
import com.mm.coredomain.repository.MemberRepository;
import com.mm.coresecurity.oauth.OAuth2UserDetails;

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

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Service
@Transactional
@RequiredArgsConstructor
public class PointService {
private final MemberRepository memberRepository;
private final BuyRepository buyRepository;

@Transactional(readOnly = true)
public Integer getMyPoint(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
return getMember(memberId).getPoint();
}

// TODO 쿼리로 가져오게 개선
@Transactional(readOnly = true)
public PointsResponse getCumulativeHistory(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
Member member = getMember(memberId);

List<Buy> buys = buyRepository.findAllByMember(member);
List<BuyResponse> buyResponses = buys
.stream()
.filter(this::isRefundCumulative)
.map(buy -> BuyResponse.of(buy, buy.getMember()))
.toList();
Integer totalPoint = buys.stream()
.filter(this::isRefundCumulativeTotalPoint)
.map(Buy::getRefund)
.reduce(0, Integer::sum);

return new PointsResponse(totalPoint, buyResponses);
}

@Transactional(readOnly = true)
public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
Member member = getMember(memberId);

List<Buy> buys = buyRepository.findAllByMember(member);
List<BuyResponse> buyResponses = buyRepository.findAllByMember(member)
.stream()
.filter(this::isRefundExpected)
.map(buy -> BuyResponse.of(buy, buy.getMember()))
.toList();
Integer totalPoint = buys.stream()
.filter(this::isRefundExpectedTotalPoint)
.map(Buy::getRefund)
.reduce(0, Integer::sum);

return new PointsResponse(totalPoint, buyResponses);
}

public BuyResponse postPointsWithdraw(OAuth2UserDetails userDetails, Integer refund) {
Member member = getMember(userDetails.getId());

isPointsEnoughForRefund(refund, member);

Buy buy = Buy.builder()
.member(member)
.refund(refund)
.uploadTime(LocalDateTime.now())
.refundStatus(RefundStatus.WITHDRAWN_IN_PROGRESS)
.build();

Buy savedBuy = buyRepository.save(buy);
return BuyResponse.of(savedBuy, savedBuy.getMember());
}

private void isPointsEnoughForRefund(Integer refund, Member member) {
if (refund < 1000) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_MIN);
}
if (refund > 5000) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_MAX);
}
if (refund > member.getPoint()) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_NOT_ENOUGH);
}
}

private boolean isRefundCumulativeTotalPoint(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.COMPLETED);
}

private boolean isRefundExpectedTotalPoint(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.IN_PROGRESS);
}

private boolean isRefundCumulative(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.COMPLETED) ||
buy.getRefundStatus().equals(RefundStatus.REJECTED) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_COMPLETED) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_REJECTED);
}

private boolean isRefundExpected(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.IN_PROGRESS) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_IN_PROGRESS);
}

private Member getMember(Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
}
private final MemberRepository memberRepository;
private final BuyRepository buyRepository;

@Transactional(readOnly = true)
public Integer getMyPoint(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
return getMember(memberId).getPoint();
}

// TODO 쿼리로 가져오게 개선
@Transactional(readOnly = true)
public PointsResponse getCumulativeHistory(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
Member member = getMember(memberId);

List<Buy> buys = buyRepository.findAllByMember(member);
List<BuyResponse> buyResponses = buys
.stream()
.filter(this::isRefundCumulative)
.map(buy -> BuyResponse.of(buy, buy.getMember()))
.toList();
List<BuyResponse> reveredBuyResponses = new ArrayList<>(buyResponses);
Collections.reverse(reveredBuyResponses);

Integer totalPoint = buys.stream()
.filter(this::isRefundCumulativeTotalPoint)
.map(buy -> {
if (buy.getRefund() == null) {
return 0;
}
return buy.getRefund();
})
.reduce(0, Integer::sum);

return new PointsResponse(totalPoint, reveredBuyResponses);
}

@Transactional(readOnly = true)
public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) {
Long memberId = userDetails.getId();
Member member = getMember(memberId);

List<Buy> buys = buyRepository.findAllByMember(member);
List<BuyResponse> buyResponses = buyRepository.findAllByMember(member)
.stream()
.filter(this::isRefundExpected)
.map(buy -> BuyResponse.of(buy, buy.getMember()))
.toList();
List<BuyResponse> reveredBuyResponses = new ArrayList<>(buyResponses);
Collections.reverse(reveredBuyResponses);

Integer totalPoint = buys.stream()
.filter(this::isRefundExpectedTotalPoint)
.map(buy -> {
if (buy.getRefund() == null) {
return 0;
}
return buy.getRefund();
})
.reduce(0, Integer::sum);

return new PointsResponse(totalPoint, reveredBuyResponses);
}

public BuyResponse postPointsWithdraw(OAuth2UserDetails userDetails, Integer refund) {
Member member = getMember(userDetails.getId());

isPointsEnoughForRefund(refund, member);

Buy buy = Buy.builder()
.member(member)
.refund(refund)
.uploadTime(LocalDateTime.now())
.refundStatus(RefundStatus.WITHDRAWN_IN_PROGRESS)
.build();

Buy savedBuy = buyRepository.save(buy);
return BuyResponse.of(savedBuy, savedBuy.getMember());
}

private void isPointsEnoughForRefund(Integer refund, Member member) {
if (refund < 1000) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_MIN);
}
if (refund > 5000) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_MAX);
}
if (refund > member.getPoint()) {
throw new CustomException(ErrorCode.POINTS_WITHDRAW_NOT_ENOUGH);
}
}

private boolean isRefundCumulativeTotalPoint(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.COMPLETED);
}

private boolean isRefundExpectedTotalPoint(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.IN_PROGRESS);
}

private boolean isRefundCumulative(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.COMPLETED) ||
buy.getRefundStatus().equals(RefundStatus.REJECTED) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_COMPLETED) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_REJECTED);
}

private boolean isRefundExpected(Buy buy) {
return buy.getRefundStatus().equals(RefundStatus.IN_PROGRESS) ||
buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_IN_PROGRESS);
}

private Member getMember(Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
}
}
23 changes: 10 additions & 13 deletions core/core-domain/src/main/java/com/mm/coredomain/domain/Groups.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
package com.mm.coredomain.domain;

import java.util.List;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.*;
import lombok.Getter;

import java.util.List;

@Getter
@Entity
@Table(name = "member_groups")
public class Groups extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private String name;

@OneToMany(mappedBy = "groups")
private List<GroupPermission> groupPermissions;
@OneToMany(mappedBy = "groups")
private List<GroupPermission> groupPermissions;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;

@Getter
@Entity
public class Permission extends BaseEntity {
@Id
@GeneratedValue
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private String name;
}
Original file line number Diff line number Diff line change
@@ -1,43 +1,42 @@
package com.mm.coreinfraqdsl.repository;

import static com.mm.coredomain.domain.QBuy.*;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.mm.coredomain.domain.Buy;
import com.mm.coredomain.domain.Member;
import com.querydsl.jpa.impl.JPAQueryFactory;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.mm.coredomain.domain.QBuy.buy;

@Repository
@RequiredArgsConstructor
public class BuyCustomRepositoryImpl implements BuyCustomRepository {
private final JPAQueryFactory jpaQueryFactory;

private static final Long PAGE_OFFSET = 10L;
private static final Long PAGE_OFFSET_ME = 9L;

@Override
public List<Buy> getBuysMeByMember(Integer page, Member member) {
return jpaQueryFactory.selectFrom(buy)
.where(buy.member.eq(member))
.offset((page - 1) * PAGE_OFFSET_ME)
.limit(PAGE_OFFSET_ME)
.fetch();
}

@Override
public Long getBuysMePageNum(Member member) {
Long count = jpaQueryFactory.select(buy.count())
.from(buy)
.where(buy.member.eq(member))
.fetchOne();
if (count % PAGE_OFFSET_ME != 0) {
return count / PAGE_OFFSET_ME + 1;
}
return count / PAGE_OFFSET_ME;
}
private final JPAQueryFactory jpaQueryFactory;

private static final Long PAGE_OFFSET = 10L;
private static final Long PAGE_OFFSET_ME = 9L;

@Override
public List<Buy> getBuysMeByMember(Integer page, Member member) {
return jpaQueryFactory.selectFrom(buy)
.where(buy.member.eq(member))
.orderBy(buy.id.desc())
.offset((page - 1) * PAGE_OFFSET_ME)
.limit(PAGE_OFFSET_ME)
.fetch();
}

@Override
public Long getBuysMePageNum(Member member) {
Long count = jpaQueryFactory.select(buy.count())
.from(buy)
.where(buy.member.eq(member))
.fetchOne();
if (count % PAGE_OFFSET_ME != 0) {
return count / PAGE_OFFSET_ME + 1;
}
return count / PAGE_OFFSET_ME;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private RequestMatcher[] permitAllRequests() {

private RequestMatcher[] oauthRequests() {
List<RequestMatcher> requestMatchers = List.of(
antMatcher("/oauth2/authorization/kakao"),
antMatcher("/oauth2/authorization/*"),
antMatcher("/oauth/**"),
antMatcher("/api/*/auth/refresh-access-token"),
antMatcher("/super-token")
Expand Down
Loading

0 comments on commit 7aa05ff

Please sign in to comment.