From 949c85fe67566a7374e70c37f2694a446c4d2846 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Thu, 8 Feb 2024 03:30:08 +0900 Subject: [PATCH 01/12] =?UTF-8?q?fix:=20=EC=A7=80=EA=B7=B8=EC=9E=AC?= =?UTF-8?q?=EA=B7=B8=20=EC=83=81=ED=92=88=EB=B6=84=EB=A5=98=20=ED=8C=AC?= =?UTF-8?q?=EC=B8=A0=20->=20=EB=B0=94=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mm/coredomain/domain/ItemCategoryType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java index e3d0b8f..88d29bd 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java @@ -21,7 +21,7 @@ public enum ItemCategoryType { "니트/카디건", "투피스/세트"); private static final List BottomsList = List.of( - "팬츠", + "바지", "스커트"); From 2dd60460c1abcb23db3a105108a4592b5000da99 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Thu, 8 Feb 2024 22:03:13 +0900 Subject: [PATCH 02/12] =?UTF-8?q?fix:=20member=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84,=20=EA=B3=84=EC=A2=8C=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=95=84=EC=9D=B4=EB=94=94=20=EC=95=88=20?= =?UTF-8?q?=EB=B0=9B=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 20 ++-- .../domain/member/service/MemberService.java | 10 +- .../coredomain/domain/ItemCategoryType.java | 103 +++++++++--------- 3 files changed, 67 insertions(+), 66 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java index b715f8f..c067a2b 100644 --- a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java +++ b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java @@ -1,5 +1,6 @@ package com.mm.api.domain.member.controller; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +14,7 @@ import com.mm.api.domain.member.dto.request.UpdateMemberAccountRequest; import com.mm.api.domain.member.dto.response.MemberInfoResponse; import com.mm.api.domain.member.service.MemberService; +import com.mm.coresecurity.oauth.OAuth2UserDetails; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,28 +28,28 @@ public class MemberController { private final MemberService memberService; - // 관리자 권한 + 자신만 - - @Operation(summary = "사용자 계좌 정보를 업데이트합니다.", description = """ + // 유저 + @Operation(summary = "내 계좌 정보를 업데이트합니다.", description = """ depositorName - 입금자명 account - 계좌번호 accountBank - 은행 """) - @PatchMapping("/members/{memberId}/account") - public CommonResponse updateMemberAccount(@PathVariable Long memberId, - @RequestBody UpdateMemberAccountRequest request) { - memberService.updateMemberAccount(memberId, request); + @PatchMapping("/members/me/account") + public CommonResponse updateMemberAccount(@RequestBody UpdateMemberAccountRequest request, + @AuthenticationPrincipal OAuth2UserDetails userDetails) { + memberService.updateMemberAccount(userDetails, request); return CommonResponse.noContent(); } @Operation(summary = "사용자 닉네임을 변경합니다.") @PatchMapping("/members/{memberId}/name") - public CommonResponse updateMemberName(@PathVariable Long memberId, + public CommonResponse updateMemberName(@AuthenticationPrincipal OAuth2UserDetails userDetails, @RequestParam(value = "name") String name) { - memberService.updateMemberName(memberId, name); + memberService.updateMemberName(userDetails, name); return CommonResponse.noContent(); } + // 관리자 권한 + 자신만 @Operation(summary = "특정 사용자의 정보를 가져옵니다.") @GetMapping("/members/{memberId}") public CommonResponse getMemberInfo(@PathVariable Long memberId) { diff --git a/api/src/main/java/com/mm/api/domain/member/service/MemberService.java b/api/src/main/java/com/mm/api/domain/member/service/MemberService.java index 0c7291f..8c393d8 100644 --- a/api/src/main/java/com/mm/api/domain/member/service/MemberService.java +++ b/api/src/main/java/com/mm/api/domain/member/service/MemberService.java @@ -9,6 +9,7 @@ import com.mm.api.exception.ErrorCode; import com.mm.coredomain.domain.Member; import com.mm.coredomain.repository.MemberRepository; +import com.mm.coresecurity.oauth.OAuth2UserDetails; import lombok.RequiredArgsConstructor; @@ -18,14 +19,13 @@ public class MemberService { private final MemberRepository memberRepository; - // 관리자 + 회원 권한(자신만) - public void updateMemberAccount(Long memberId, UpdateMemberAccountRequest request) { - Member member = getMember(memberId); + public void updateMemberAccount(OAuth2UserDetails userDetails, UpdateMemberAccountRequest request) { + Member member = getMember(userDetails.getId()); member.updateMemberAccount(request.depositorName(), request.account(), request.accountBank()); } - public void updateMemberName(Long memberId, String name) { - Member member = getMember(memberId); + public void updateMemberName(OAuth2UserDetails userDetails, String name) { + Member member = getMember(userDetails.getId()); member.updateMemberName(name); } diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java index 88d29bd..d50cebd 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/ItemCategoryType.java @@ -1,59 +1,58 @@ package com.mm.coredomain.domain; -import lombok.Getter; - import java.util.List; +import lombok.Getter; + @Getter public enum ItemCategoryType { - TOPS("상의", 3), - BOTTOMS("하의", 3), - FASHION("패션잡화", 3), - BEAUTY("뷰티", 3), - ETC("기타", 3); - - private final String value; - private final Integer refundPercent; - private static final List TopsList = List.of( - "상의", - "아우터", - "원피스", - "니트/카디건", - "투피스/세트"); - private static final List BottomsList = List.of( - "바지", - "스커트"); - - - ItemCategoryType(String value, Integer refundPercent) { - this.value = value; - this.refundPercent = refundPercent; - } - - public static ItemCategoryType fromValueForClothes(String input) { - if (TopsList.contains(input)) { - return ItemCategoryType.TOPS; - } - if (BottomsList.contains(input)) { - return ItemCategoryType.BOTTOMS; - } - return ItemCategoryType.FASHION; - } - - public static ItemCategoryType fromValue(String input) { - for (ItemCategoryType categoryType : ItemCategoryType.values()) { - if (categoryType.value.equals(input)) { - return categoryType; - } - } - return ItemCategoryType.ETC; - } - - public static ItemCategoryType of(String input) { - try { - return ItemCategoryType.valueOf(input.toUpperCase()); - } catch (Exception e) { - throw new IllegalArgumentException("존재하지 않는 아이템 카테고리 타입입니다. : " + input); - } - } + TOPS("상의", 3), + BOTTOMS("하의", 3), + FASHION("패션잡화", 3), + BEAUTY("뷰티", 3), + ETC("기타", 3); + + private final String value; + private final Integer refundPercent; + private static final List TopsList = List.of( + "상의", + "아우터", + "원피스", + "니트/카디건", + "투피스/세트"); + private static final List BottomsList = List.of( + "바지", + "스커트"); + + ItemCategoryType(String value, Integer refundPercent) { + this.value = value; + this.refundPercent = refundPercent; + } + + public static ItemCategoryType fromValueForClothes(String input) { + if (TopsList.contains(input)) { + return ItemCategoryType.TOPS; + } + if (BottomsList.contains(input)) { + return ItemCategoryType.BOTTOMS; + } + return ItemCategoryType.FASHION; + } + + public static ItemCategoryType fromValue(String input) { + for (ItemCategoryType categoryType : ItemCategoryType.values()) { + if (categoryType.value.equals(input)) { + return categoryType; + } + } + return ItemCategoryType.ETC; + } + + public static ItemCategoryType of(String input) { + try { + return ItemCategoryType.valueOf(input.toUpperCase()); + } catch (Exception e) { + throw new IllegalArgumentException("존재하지 않는 아이템 카테고리 타입입니다. : " + input); + } + } } From 078daa95fcbf06e6645b39cd671c68de29141e51 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Thu, 8 Feb 2024 22:44:40 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=EB=82=B4=20=EA=B3=84=EC=A2=8C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/buy/controller/BuyController.java | 136 ++++++----- .../mm/api/domain/buy/service/BuyService.java | 221 +++++++++--------- .../member/controller/MemberController.java | 10 +- .../dto/response/MemberAccountResponse.java | 7 + .../domain/member/service/MemberService.java | 12 + 5 files changed, 213 insertions(+), 173 deletions(-) create mode 100644 api/src/main/java/com/mm/api/domain/member/dto/response/MemberAccountResponse.java diff --git a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java index 6620591..3c80e3b 100644 --- a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java +++ b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java @@ -1,5 +1,19 @@ package com.mm.api.domain.buy.controller; +import org.springframework.http.MediaType; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + import com.mm.api.common.response.CommonResponse; import com.mm.api.common.swaggerAnnotation.SwaggerResponseBuy; import com.mm.api.domain.buy.dto.request.RejectBuyRefundStatusRequest; @@ -8,13 +22,10 @@ import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.buy.service.BuyService; import com.mm.coresecurity.oauth.OAuth2UserDetails; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; @Tag(name = "구매 인증", description = "구매 인증 관련 API 입니다.") @SwaggerResponseBuy @@ -22,70 +33,71 @@ @RequestMapping("/api/v1") @RequiredArgsConstructor public class BuyController { - private final BuyService buyService; + private final BuyService buyService; - // 관리자만 - @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") - @GetMapping("/buys") - public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { - BuyListResponse responses = buyService.getBuys(page); - return CommonResponse.ok(responses); - } + // 관리자만 + @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") + @GetMapping("/buys") + public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { + BuyListResponse responses = buyService.getBuys(page); + return CommonResponse.ok(responses); + } - @Operation(summary = "구매 인증 상태를 변경합니다.", description = "refundStatus = [IN_PROGRESS, COMPLETED, REJECTED]") - @PatchMapping("/buys/{buyId}/refund-status") - public CommonResponse updateBuyRefundStatus(@PathVariable Long buyId, - @RequestParam String refundStatus) { - BuyResponse response = buyService.updateBuyRefundStatus(buyId, refundStatus); - return CommonResponse.ok(response); - } + @Operation(summary = "구매 인증 상태를 변경합니다.", description = "refundStatus = [IN_PROGRESS, COMPLETED, REJECTED]") + @PatchMapping("/buys/{buyId}/refund-status") + public CommonResponse updateBuyRefundStatus(@PathVariable Long buyId, + @RequestParam String refundStatus) { + BuyResponse response = buyService.updateBuyRefundStatus(buyId, refundStatus); + return CommonResponse.ok(response); + } - @Operation(summary = "구매 인증을 승인 처리합니다.") - @PatchMapping("/buys/{buyId}/approve") - public CommonResponse approveBuyRefundStatus(@PathVariable Long buyId) { - BuyResponse response = buyService.approveBuyRefundStatus(buyId); - return CommonResponse.ok(response); - } + @Operation(summary = "구매 인증을 승인 처리합니다.") + @PatchMapping("/buys/{buyId}/approve") + public CommonResponse approveBuyRefundStatus(@PathVariable Long buyId) { + BuyResponse response = buyService.approveBuyRefundStatus(buyId); + return CommonResponse.ok(response); + } - @Operation(summary = "구매 인증을 미승인 처리합니다.", description = "미승인 사유를 입력해주세요.") - @PatchMapping("/buys/{buyId}/reject") - public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyId, - @RequestBody RejectBuyRefundStatusRequest request) { - BuyResponse response = buyService.rejectBuyRefundStatus(buyId, request); - return CommonResponse.ok(response); - } + @Operation(summary = "구매 인증을 미승인 처리합니다.", description = "미승인 사유를 입력해주세요.") + @PatchMapping("/buys/{buyId}/reject") + public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyId, + @RequestBody RejectBuyRefundStatusRequest request) { + BuyResponse response = buyService.rejectBuyRefundStatus(buyId, request); + return CommonResponse.ok(response); + } - // 관리자 + 회원(자신만) - @Operation(summary = "구매 인증을 삭제합니다.") - @DeleteMapping("/buys/{buyId}") - public CommonResponse deleteBuy(@PathVariable Long buyId, - @AuthenticationPrincipal OAuth2UserDetails userDetails) { - buyService.deleteBuy(buyId); - return CommonResponse.noContent(); - } + // 관리자 + 회원(자신만) + @Operation(summary = "구매 인증을 삭제합니다.") + @DeleteMapping("/buys/{buyId}") + public CommonResponse deleteBuy(@PathVariable Long buyId, + @AuthenticationPrincipal OAuth2UserDetails userDetails) { + buyService.deleteBuy(buyId); + return CommonResponse.noContent(); + } - @Operation(summary = "구매 인증 단건을 조회합니다.") - @GetMapping("/buys/{buyId}") - public CommonResponse getBuy(@PathVariable Long buyId, - @AuthenticationPrincipal OAuth2UserDetails userDetails) { - BuyResponse response = buyService.getBuyResponse(buyId); - return CommonResponse.ok(response); - } + @Operation(summary = "구매 인증 단건을 조회합니다.") + @GetMapping("/buys/{buyId}") + public CommonResponse getBuy(@PathVariable Long buyId, + @AuthenticationPrincipal OAuth2UserDetails userDetails) { + BuyResponse response = buyService.getBuyResponse(buyId); + return CommonResponse.ok(response); + } - // 회원만 - @Operation(summary = "구매 인증을 작성합니다.", description = "form으로 input type을 file로 지정해서 이미지를 첨부합니다.") - @PostMapping(value = "/buys/{memberId}/{itemId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public CommonResponse postBuy(@PathVariable Long memberId, @PathVariable Long itemId, - @RequestPart(value = "file", required = true) MultipartFile file) { - BuyResponse buyResponse = buyService.postBuy(memberId, itemId, file); - return CommonResponse.ok(buyResponse); - } + // 회원만 + @Operation(summary = "구매 인증을 작성합니다.", description = "form으로 input type을 file로 지정해서 이미지를 첨부합니다.") + @PostMapping(value = "/buys/items/{itemId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public CommonResponse postBuy(@AuthenticationPrincipal OAuth2UserDetails userDetails, + @PathVariable Long itemId, + @RequestPart(value = "file", required = true) MultipartFile file) { + BuyResponse buyResponse = buyService.postBuy(userDetails, itemId, file); + return CommonResponse.ok(buyResponse); + } - @Operation(summary = "내 구매 인증을 페이지 단위로 가져옵니다.") - @GetMapping("/buys/me") - public CommonResponse getBuysMe(@RequestParam(required = false, defaultValue = "1") Integer page, - @AuthenticationPrincipal OAuth2UserDetails userDetails) { - BuyMeListResponse responses = buyService.getBuysMe(page, userDetails); - return CommonResponse.ok(responses); - } + @Operation(summary = "내 구매 인증을 페이지 단위로 가져옵니다.") + @GetMapping("/buys/me") + public CommonResponse getBuysMe(@RequestParam(required = false, defaultValue = "1") Integer page, + @AuthenticationPrincipal OAuth2UserDetails userDetails) { + BuyMeListResponse responses = buyService.getBuysMe(page, userDetails); + return CommonResponse.ok(responses); + } } diff --git a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java index 9504ed5..23be107 100644 --- a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java +++ b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java @@ -1,5 +1,14 @@ package com.mm.api.domain.buy.service; +import static com.mm.api.exception.ErrorCode.*; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + import com.mm.api.domain.buy.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyMeListResponse; @@ -16,120 +25,112 @@ import com.mm.coreinfraqdsl.repository.BuyCustomRepository; import com.mm.coreinfras3.util.S3Service; import com.mm.coresecurity.oauth.OAuth2UserDetails; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; -import java.time.LocalDateTime; -import java.util.List; - -import static com.mm.api.exception.ErrorCode.BUY_NOT_FOUND; -import static com.mm.api.exception.ErrorCode.ITEM_NOT_FOUND; +import lombok.RequiredArgsConstructor; @Service @Transactional @RequiredArgsConstructor public class BuyService { - private final BuyRepository buyRepository; - private final MemberRepository memberRepository; - private final ItemRepository itemRepository; - private final S3Service s3Service; - private final BuyCustomRepository buyCustomRepository; - - public BuyResponse postBuy(Long memberId, Long itemId, MultipartFile file) { - Member member = getMember(memberId); - Item item = getItem(itemId); - - String url = s3Service.uploadFileToS3(file, memberId, itemId); - - Buy buy = Buy.builder() - .member(member) - .item(item) - .redirectUrl(item.getRedirectUrl()) - .refund(item.getRefund()) - .refundStatus(RefundStatus.IN_PROGRESS) - .uploadTime(LocalDateTime.now()) - .certImageUrl(url) - .build(); - - return BuyResponse.of(buyRepository.save(buy)); - } - - public BuyResponse updateBuyRefundStatus(Long buyId, String refundStatus) { - RefundStatus convertedRefundStatus = RefundStatus.of(refundStatus); - Buy buy = getBuy(buyId); - buy.updateRefundStatus(convertedRefundStatus); - - return BuyResponse.of(buy); - } - - public void deleteBuy(Long buyId) { - Buy buy = getBuy(buyId); - buyRepository.delete(buy); - } - - @Transactional(readOnly = true) - public BuyListResponse getBuys(Integer page) { - List buys = buyCustomRepository.getBuysByPage(page); - List buyResponses = buys.stream() - .map(BuyResponse::of) - .toList(); - - Long pageNum = buyCustomRepository.getPageNum(); - return new BuyListResponse(pageNum, buyResponses); - } - - public BuyResponse approveBuyRefundStatus(Long buyId) { - Buy buy = getBuy(buyId); - buy.approveRefundStatus(); - - buy.setApprovedTimeNow(); - - Member member = buy.getMember(); - member.plusMemberPoint(buy.getRefund()); - return BuyResponse.of(buy); - } - - public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusRequest request) { - Buy buy = getBuy(buyId); - buy.rejectRefundStatus(request.rejectReason()); - - buy.setApprovedTimeNow(); - - return BuyResponse.of(buy); - } - - public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) { - Member member = getMember(userDetails.getId()); - - List buyResponses = buyCustomRepository.getBuysMeByPage(page, member) - .stream() - .map(BuyResponse::of) - .toList(); - - Long pageNum = buyCustomRepository.getBuysMePageNum(member); - Boolean isLastPage = pageNum.equals(page.longValue()); - - return new BuyMeListResponse(isLastPage, buyResponses); - } - - public BuyResponse getBuyResponse(Long buyId) { - return BuyResponse.of(getBuy(buyId)); - } - - private Buy getBuy(Long buyId) { - return buyRepository.findById(buyId) - .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); - } - - private Item getItem(Long id) { - return itemRepository.findById(id) - .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); - } - - private Member getMember(Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); - } + private final BuyRepository buyRepository; + private final MemberRepository memberRepository; + private final ItemRepository itemRepository; + private final S3Service s3Service; + private final BuyCustomRepository buyCustomRepository; + + public BuyResponse postBuy(OAuth2UserDetails userDetails, Long itemId, MultipartFile file) { + Member member = getMember(userDetails.getId()); + Item item = getItem(itemId); + + String url = s3Service.uploadFileToS3(file, member.getId(), itemId); + + Buy buy = Buy.builder() + .member(member) + .item(item) + .redirectUrl(item.getRedirectUrl()) + .refund(item.getRefund()) + .refundStatus(RefundStatus.IN_PROGRESS) + .uploadTime(LocalDateTime.now()) + .certImageUrl(url) + .build(); + + return BuyResponse.of(buyRepository.save(buy)); + } + + public BuyResponse updateBuyRefundStatus(Long buyId, String refundStatus) { + RefundStatus convertedRefundStatus = RefundStatus.of(refundStatus); + Buy buy = getBuy(buyId); + buy.updateRefundStatus(convertedRefundStatus); + + return BuyResponse.of(buy); + } + + public void deleteBuy(Long buyId) { + Buy buy = getBuy(buyId); + buyRepository.delete(buy); + } + + @Transactional(readOnly = true) + public BuyListResponse getBuys(Integer page) { + List buys = buyCustomRepository.getBuysByPage(page); + List buyResponses = buys.stream() + .map(BuyResponse::of) + .toList(); + + Long pageNum = buyCustomRepository.getPageNum(); + return new BuyListResponse(pageNum, buyResponses); + } + + public BuyResponse approveBuyRefundStatus(Long buyId) { + Buy buy = getBuy(buyId); + buy.approveRefundStatus(); + + buy.setApprovedTimeNow(); + + Member member = buy.getMember(); + member.plusMemberPoint(buy.getRefund()); + return BuyResponse.of(buy); + } + + public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusRequest request) { + Buy buy = getBuy(buyId); + buy.rejectRefundStatus(request.rejectReason()); + + buy.setApprovedTimeNow(); + + return BuyResponse.of(buy); + } + + public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) { + Member member = getMember(userDetails.getId()); + + List buyResponses = buyCustomRepository.getBuysMeByPage(page, member) + .stream() + .map(BuyResponse::of) + .toList(); + + Long pageNum = buyCustomRepository.getBuysMePageNum(member); + Boolean isLastPage = pageNum.equals(page.longValue()); + + return new BuyMeListResponse(isLastPage, buyResponses); + } + + public BuyResponse getBuyResponse(Long buyId) { + return BuyResponse.of(getBuy(buyId)); + } + + private Buy getBuy(Long buyId) { + return buyRepository.findById(buyId) + .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); + } + + private Item getItem(Long id) { + return itemRepository.findById(id) + .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); + } + + private Member getMember(Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + } } diff --git a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java index c067a2b..81be7eb 100644 --- a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java +++ b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java @@ -12,6 +12,7 @@ import com.mm.api.common.response.CommonResponse; import com.mm.api.common.swaggerAnnotation.SwaggerResponseMember; import com.mm.api.domain.member.dto.request.UpdateMemberAccountRequest; +import com.mm.api.domain.member.dto.response.MemberAccountResponse; import com.mm.api.domain.member.dto.response.MemberInfoResponse; import com.mm.api.domain.member.service.MemberService; import com.mm.coresecurity.oauth.OAuth2UserDetails; @@ -29,13 +30,20 @@ public class MemberController { private final MemberService memberService; // 유저 + @Operation(summary = "내 계좌 정보를 가져옵니다.") + @GetMapping("/members/me/account") + public CommonResponse getMyAccount(@AuthenticationPrincipal OAuth2UserDetails userDetails) { + MemberAccountResponse response = memberService.getMyAccount(userDetails); + return CommonResponse.ok(response); + } + @Operation(summary = "내 계좌 정보를 업데이트합니다.", description = """ depositorName - 입금자명 account - 계좌번호 accountBank - 은행 """) @PatchMapping("/members/me/account") - public CommonResponse updateMemberAccount(@RequestBody UpdateMemberAccountRequest request, + public CommonResponse updateMyAccount(@RequestBody UpdateMemberAccountRequest request, @AuthenticationPrincipal OAuth2UserDetails userDetails) { memberService.updateMemberAccount(userDetails, request); return CommonResponse.noContent(); diff --git a/api/src/main/java/com/mm/api/domain/member/dto/response/MemberAccountResponse.java b/api/src/main/java/com/mm/api/domain/member/dto/response/MemberAccountResponse.java new file mode 100644 index 0000000..2930cee --- /dev/null +++ b/api/src/main/java/com/mm/api/domain/member/dto/response/MemberAccountResponse.java @@ -0,0 +1,7 @@ +package com.mm.api.domain.member.dto.response; + +import lombok.Builder; + +@Builder +public record MemberAccountResponse(String depositorName, String account, String accountBank) { +} diff --git a/api/src/main/java/com/mm/api/domain/member/service/MemberService.java b/api/src/main/java/com/mm/api/domain/member/service/MemberService.java index 8c393d8..be5966e 100644 --- a/api/src/main/java/com/mm/api/domain/member/service/MemberService.java +++ b/api/src/main/java/com/mm/api/domain/member/service/MemberService.java @@ -4,6 +4,7 @@ import org.springframework.transaction.annotation.Transactional; import com.mm.api.domain.member.dto.request.UpdateMemberAccountRequest; +import com.mm.api.domain.member.dto.response.MemberAccountResponse; import com.mm.api.domain.member.dto.response.MemberInfoResponse; import com.mm.api.exception.CustomException; import com.mm.api.exception.ErrorCode; @@ -29,11 +30,22 @@ public void updateMemberName(OAuth2UserDetails userDetails, String name) { member.updateMemberName(name); } + @Transactional(readOnly = true) public MemberInfoResponse getMemberInfo(Long memberId) { Member member = getMember(memberId); return MemberInfoResponse.of(member); } + @Transactional(readOnly = true) + public MemberAccountResponse getMyAccount(OAuth2UserDetails userDetails) { + Member member = getMember(userDetails.getId()); + return MemberAccountResponse.builder() + .account(member.getAccount()) + .accountBank(member.getAccountBank()) + .depositorName(member.getDepositorName()) + .build(); + } + private Member getMember(Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); From dc01eb3a6593bb9dce92611a88ede26c76ebaf6f Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Thu, 8 Feb 2024 23:03:06 +0900 Subject: [PATCH 04/12] =?UTF-8?q?fix:=20access=20token=20=EC=9E=AC?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RedisRefreshTokenRepository.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/core/core-infra-redis/src/main/java/com/mm/coreinfraredis/repository/RedisRefreshTokenRepository.java b/core/core-infra-redis/src/main/java/com/mm/coreinfraredis/repository/RedisRefreshTokenRepository.java index 1b89de9..af930b2 100644 --- a/core/core-infra-redis/src/main/java/com/mm/coreinfraredis/repository/RedisRefreshTokenRepository.java +++ b/core/core-infra-redis/src/main/java/com/mm/coreinfraredis/repository/RedisRefreshTokenRepository.java @@ -1,32 +1,33 @@ package com.mm.coreinfraredis.repository; -import lombok.RequiredArgsConstructor; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Repository; -import java.util.Optional; -import java.util.concurrent.TimeUnit; +import lombok.RequiredArgsConstructor; @Repository @RequiredArgsConstructor public class RedisRefreshTokenRepository { - private final RedisTemplate redisTemplate; - private static final long REFRESH_TOKEN_EXPIRE_LONG = 259200L; + private final RedisTemplate redisTemplate; + private static final long REFRESH_TOKEN_EXPIRE_LONG = 259200L; - public void save(String refreshToken, Long memberId) { - ValueOperations valueOperations = redisTemplate.opsForValue(); - valueOperations.set(refreshToken, memberId); - redisTemplate.expire(refreshToken, REFRESH_TOKEN_EXPIRE_LONG, TimeUnit.SECONDS); - } + public void save(String refreshToken, Long memberId) { + ValueOperations valueOperations = redisTemplate.opsForValue(); + valueOperations.set(refreshToken, memberId); + redisTemplate.expire(refreshToken, REFRESH_TOKEN_EXPIRE_LONG, TimeUnit.SECONDS); + } - public void delete(String refreshToken) { - redisTemplate.delete(refreshToken); - } + public void delete(String refreshToken) { + redisTemplate.delete(refreshToken); + } - public Optional findByRefreshToken(String refreshToken) { - ValueOperations valueOperations = redisTemplate.opsForValue(); - Long memberId = valueOperations.get(refreshToken); - return Optional.ofNullable(memberId); - } + public Optional findByRefreshToken(String refreshToken) { + ValueOperations valueOperations = redisTemplate.opsForValue(); + Long memberId = valueOperations.get(refreshToken).longValue(); + return Optional.ofNullable(memberId); + } } From adf63c2c5156c780c3ecb2d1cd9efc2a9403cfb5 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Thu, 8 Feb 2024 23:07:28 +0900 Subject: [PATCH 05/12] =?UTF-8?q?fix:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=9C=A0=EB=AC=B4=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mm/api/domain/admin/dto/response/AdminItemListResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/com/mm/api/domain/admin/dto/response/AdminItemListResponse.java b/api/src/main/java/com/mm/api/domain/admin/dto/response/AdminItemListResponse.java index d391d5c..c1aa69c 100644 --- a/api/src/main/java/com/mm/api/domain/admin/dto/response/AdminItemListResponse.java +++ b/api/src/main/java/com/mm/api/domain/admin/dto/response/AdminItemListResponse.java @@ -13,6 +13,7 @@ public static record AdminItemResponse(Long id, Integer price, Integer refund, String thumbnailUrl, + Boolean isSuggested, List imageUrls, List videoUrls) { public static AdminItemResponse of(Item item, List imageUrls, List videoUrls) { @@ -24,6 +25,7 @@ public static AdminItemResponse of(Item item, List imageUrls, List Date: Fri, 9 Feb 2024 02:35:09 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20=EC=B6=9C=EA=B8=88=20=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD=20post=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/controller/PointController.java | 12 ++- .../domain/point/service/PointService.java | 39 +++++++- .../java/com/mm/api/exception/ErrorCode.java | 40 +++++---- .../java/com/mm/coredomain/domain/Buy.java | 90 +++++++++++-------- 4 files changed, 121 insertions(+), 60 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/point/controller/PointController.java b/api/src/main/java/com/mm/api/domain/point/controller/PointController.java index ab133a2..e1b2e9a 100644 --- a/api/src/main/java/com/mm/api/domain/point/controller/PointController.java +++ b/api/src/main/java/com/mm/api/domain/point/controller/PointController.java @@ -2,7 +2,9 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.mm.api.common.response.CommonResponse; @@ -23,6 +25,7 @@ public class PointController { private final PointService pointService; + // 유저 @Operation(summary = "현재 사용자의 포인트를 가져옵니다.") @GetMapping("/points/me") public CommonResponse getMyPoint(@AuthenticationPrincipal OAuth2UserDetails userDetails) { @@ -38,11 +41,18 @@ public CommonResponse getCumulativeHistory( return CommonResponse.ok(response); } - @Operation(summary = "현재 사용자의 예상 포인트 내역을 가져옵니다..") + @Operation(summary = "현재 사용자의 예상 포인트 내역을 가져옵니다.") @GetMapping("/points/history/expect") public CommonResponse getExpectedHistory( @AuthenticationPrincipal OAuth2UserDetails userDetails) { PointsResponse response = pointService.getExpectedHistory(userDetails); return CommonResponse.ok(response); } + + @Operation(summary = "포인트 출금을 신청합니다.") + @PostMapping("/points/withdraw") + public CommonResponse postPointsWithdraw(@RequestParam Integer refund, + @AuthenticationPrincipal OAuth2UserDetails userDetails) { + pointService.postPointsWithdraw(userDetails, refund); + } } diff --git a/api/src/main/java/com/mm/api/domain/point/service/PointService.java b/api/src/main/java/com/mm/api/domain/point/service/PointService.java index f38a3cb..68180fe 100644 --- a/api/src/main/java/com/mm/api/domain/point/service/PointService.java +++ b/api/src/main/java/com/mm/api/domain/point/service/PointService.java @@ -1,5 +1,6 @@ package com.mm.api.domain.point.service; +import java.time.LocalDateTime; import java.util.List; import org.springframework.stereotype.Service; @@ -25,11 +26,14 @@ 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); @@ -48,6 +52,7 @@ public PointsResponse getCumulativeHistory(OAuth2UserDetails userDetails) { return new PointsResponse(totalPoint, buyResponses); } + @Transactional(readOnly = true) public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) { Long memberId = userDetails.getId(); Member member = getMember(memberId); @@ -66,6 +71,33 @@ public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) { return new PointsResponse(totalPoint, buyResponses); } + public void 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(); + + buyRepository.save(buy); + } + + 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); } @@ -76,11 +108,14 @@ private boolean isRefundExpectedTotalPoint(Buy buy) { private boolean isRefundCumulative(Buy buy) { return buy.getRefundStatus().equals(RefundStatus.COMPLETED) || - buy.getRefundStatus().equals(RefundStatus.REJECTED); + 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); + return buy.getRefundStatus().equals(RefundStatus.IN_PROGRESS) || + buy.getRefundStatus().equals(RefundStatus.WITHDRAWN_IN_PROGRESS); } private Member getMember(Long memberId) { diff --git a/api/src/main/java/com/mm/api/exception/ErrorCode.java b/api/src/main/java/com/mm/api/exception/ErrorCode.java index cbabbca..36c6ad8 100644 --- a/api/src/main/java/com/mm/api/exception/ErrorCode.java +++ b/api/src/main/java/com/mm/api/exception/ErrorCode.java @@ -1,28 +1,32 @@ package com.mm.api.exception; -import lombok.Getter; import org.springframework.http.HttpStatus; +import lombok.Getter; + @Getter public enum ErrorCode { - VALIDATION_FAILED("400/0001", HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), - DIB_ALREADY_EXIST("400/0002", HttpStatus.BAD_REQUEST, "이미 찜하기를 했습니다."), - ITEM_NOT_FOUND("404/0001", HttpStatus.NOT_FOUND, "존재하지 않는 상품입니다"), - MEMBER_NOT_FOUND("404/0002", HttpStatus.NOT_FOUND, "존재하지 않는 회원입니다"), - BUY_NOT_FOUND("404/0003", HttpStatus.NOT_FOUND, "존재하지 않는 구매인증입니다"), - DIB_NOT_FOUND("404/0004", HttpStatus.NOT_FOUND, "존재하지 않는 찜하기입니다"), - REFRESH_TOKEN_EXPIRED("401/0001", HttpStatus.UNAUTHORIZED, "리퀘스트 토큰이 만료되었으니 다시 로그인 해주세요"), - ACCESS_TOKEN_EXPIRED("401/0002", HttpStatus.UNAUTHORIZED, "어세스 토큰이 만료되었으니 재발급 해주세요"), - ACCESS_TOKEN_MALFORMED("401/0003", HttpStatus.UNAUTHORIZED, "올바르지 않은 토큰입니다."); + VALIDATION_FAILED("400/0001", HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), + DIB_ALREADY_EXIST("400/0002", HttpStatus.BAD_REQUEST, "이미 찜하기를 했습니다."), + POINTS_WITHDRAW_MIN("400/0003", HttpStatus.BAD_REQUEST, "출금 최소 금액은 1000 P 입니다"), + POINTS_WITHDRAW_MAX("400/0004", HttpStatus.BAD_REQUEST, "출금 최소 금액은 5000 P 입니다"), + POINTS_WITHDRAW_NOT_ENOUGH("400/0005", HttpStatus.BAD_REQUEST, "출금 포인트보다 보유 포인트가 더 적습니다"), + ITEM_NOT_FOUND("404/0001", HttpStatus.NOT_FOUND, "존재하지 않는 상품입니다"), + MEMBER_NOT_FOUND("404/0002", HttpStatus.NOT_FOUND, "존재하지 않는 회원입니다"), + BUY_NOT_FOUND("404/0003", HttpStatus.NOT_FOUND, "존재하지 않는 구매인증입니다"), + DIB_NOT_FOUND("404/0004", HttpStatus.NOT_FOUND, "존재하지 않는 찜하기입니다"), + REFRESH_TOKEN_EXPIRED("401/0001", HttpStatus.UNAUTHORIZED, "리퀘스트 토큰이 만료되었으니 다시 로그인 해주세요"), + ACCESS_TOKEN_EXPIRED("401/0002", HttpStatus.UNAUTHORIZED, "어세스 토큰이 만료되었으니 재발급 해주세요"), + ACCESS_TOKEN_MALFORMED("401/0003", HttpStatus.UNAUTHORIZED, "올바르지 않은 토큰입니다."); - private final String errorCode; - private final HttpStatus status; - private final String message; + private final String errorCode; + private final HttpStatus status; + private final String message; - ErrorCode(String errorCode, HttpStatus httpStatus, String message) { - this.errorCode = errorCode; - this.status = httpStatus; - this.message = message; - } + ErrorCode(String errorCode, HttpStatus httpStatus, String message) { + this.errorCode = errorCode; + this.status = httpStatus; + this.message = message; + } } diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java index 6189c0f..128511f 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java @@ -1,65 +1,77 @@ package com.mm.coredomain.domain; -import jakarta.persistence.*; -import lombok.*; - import java.time.LocalDateTime; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder public class Buy extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Lob + private String redirectUrl; - @Lob - private String redirectUrl; + private LocalDateTime uploadTime; - private LocalDateTime uploadTime; + private LocalDateTime approvedTime; - private LocalDateTime approvedTime; + private Integer pointsBeforeRefund; - private Integer refund; + private Integer refund; - private RefundStatus refundStatus; + private RefundStatus refundStatus; - private String rejectReason; + private String rejectReason; - @Lob - private String certImageUrl; + @Lob + private String certImageUrl; - @ManyToOne(fetch = FetchType.LAZY) - private Member member; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; - @ManyToOne(fetch = FetchType.LAZY) - private Item item; + @ManyToOne(fetch = FetchType.LAZY) + private Item item; - public void updateRefundStatus(RefundStatus refundStatus) { - this.refundStatus = refundStatus; - } + public void updateRefundStatus(RefundStatus refundStatus) { + this.refundStatus = refundStatus; + } - public void setApprovedTimeNow() { - this.approvedTime = LocalDateTime.now(); - } + public void setApprovedTimeNow() { + this.approvedTime = LocalDateTime.now(); + } - public void approveRefundStatus() { - this.refundStatus = RefundStatus.COMPLETED; - } + public void approveRefundStatus() { + this.refundStatus = RefundStatus.COMPLETED; + } - public void rejectRefundStatus(String rejectReason) { - this.refundStatus = RefundStatus.REJECTED; - this.rejectReason = rejectReason; - } + public void rejectRefundStatus(String rejectReason) { + this.refundStatus = RefundStatus.REJECTED; + this.rejectReason = rejectReason; + } - public void approveWithdrawnStatus() { - this.refundStatus = RefundStatus.WITHDRAWN_COMPLETED; - } + public void approveWithdrawnStatus() { + this.refundStatus = RefundStatus.WITHDRAWN_COMPLETED; + } - public void rejectWithdrawnStatus(String rejectReason) { - this.refundStatus = RefundStatus.WITHDRAWN_REJECTED; - this.rejectReason = rejectReason; - } + public void rejectWithdrawnStatus(String rejectReason) { + this.refundStatus = RefundStatus.WITHDRAWN_REJECTED; + this.rejectReason = rejectReason; + } } From d37892c90ce7a10863735e77a35a92f76ae2095b Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 02:37:43 +0900 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=EC=B6=9C=EA=B8=88=20=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mm/api/domain/point/controller/PointController.java | 6 ++++-- .../java/com/mm/api/domain/point/service/PointService.java | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/point/controller/PointController.java b/api/src/main/java/com/mm/api/domain/point/controller/PointController.java index e1b2e9a..b42077e 100644 --- a/api/src/main/java/com/mm/api/domain/point/controller/PointController.java +++ b/api/src/main/java/com/mm/api/domain/point/controller/PointController.java @@ -9,6 +9,7 @@ import com.mm.api.common.response.CommonResponse; import com.mm.api.common.swaggerAnnotation.SwaggerResponsePoint; +import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.point.dto.response.PointsResponse; import com.mm.api.domain.point.service.PointService; import com.mm.coresecurity.oauth.OAuth2UserDetails; @@ -51,8 +52,9 @@ public CommonResponse getExpectedHistory( @Operation(summary = "포인트 출금을 신청합니다.") @PostMapping("/points/withdraw") - public CommonResponse postPointsWithdraw(@RequestParam Integer refund, + public CommonResponse postPointsWithdraw(@RequestParam Integer refund, @AuthenticationPrincipal OAuth2UserDetails userDetails) { - pointService.postPointsWithdraw(userDetails, refund); + BuyResponse response = pointService.postPointsWithdraw(userDetails, refund); + return CommonResponse.created(response); } } diff --git a/api/src/main/java/com/mm/api/domain/point/service/PointService.java b/api/src/main/java/com/mm/api/domain/point/service/PointService.java index 68180fe..933f1b5 100644 --- a/api/src/main/java/com/mm/api/domain/point/service/PointService.java +++ b/api/src/main/java/com/mm/api/domain/point/service/PointService.java @@ -71,7 +71,7 @@ public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) { return new PointsResponse(totalPoint, buyResponses); } - public void postPointsWithdraw(OAuth2UserDetails userDetails, Integer refund) { + public BuyResponse postPointsWithdraw(OAuth2UserDetails userDetails, Integer refund) { Member member = getMember(userDetails.getId()); isPointsEnoughForRefund(refund, member); @@ -83,7 +83,8 @@ public void postPointsWithdraw(OAuth2UserDetails userDetails, Integer refund) { .refundStatus(RefundStatus.WITHDRAWN_IN_PROGRESS) .build(); - buyRepository.save(buy); + Buy savedBuy = buyRepository.save(buy); + return BuyResponse.of(savedBuy); } private void isPointsEnoughForRefund(Integer refund, Member member) { From 77227d7b08b48261aad2f623874ab9824334c6df Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 03:00:07 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=8A=B9=EC=9D=B8,=20=EB=AF=B8=EC=8A=B9=EC=9D=B8,?= =?UTF-8?q?=20=EC=B6=9C=EA=B8=88=20=EC=8B=A0=EC=B2=AD=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?,=20=EB=AF=B8=EC=8A=B9=EC=9D=B8=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminController.java | 119 +++++++--- .../request/RejectBuyRefundStatusRequest.java | 2 +- .../domain/admin/service/AdminService.java | 224 +++++++++++------- .../domain/buy/controller/BuyController.java | 17 -- .../domain/buy/dto/response/BuyResponse.java | 6 + .../mm/api/domain/buy/service/BuyService.java | 21 -- .../java/com/mm/coredomain/domain/Buy.java | 10 + 7 files changed, 236 insertions(+), 163 deletions(-) rename api/src/main/java/com/mm/api/domain/{buy => admin}/dto/request/RejectBuyRefundStatusRequest.java (60%) diff --git a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java index 20de634..e5e7a5a 100644 --- a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java +++ b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java @@ -1,55 +1,96 @@ package com.mm.api.domain.admin.controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import com.mm.api.common.response.CommonResponse; +import com.mm.api.domain.admin.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.admin.dto.response.AdminItemListResponse; import com.mm.api.domain.admin.service.AdminService; +import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.item.dto.response.ItemDetailResponse; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; @Tag(name = "어드민", description = "어드민 관련 API 입니다.") @RestController @RequestMapping("/api/v1/admin") @RequiredArgsConstructor public class AdminController { - private final AdminService adminService; - - @Operation(summary = "url을 입력해 상품글을 크롤링합니다.", description = "zigzag url만 가능, ex) https://s.zigzag.kr/dV7jnGouAl?af=1") - @PostMapping("/items/crawl") - public CommonResponse crawlItem(@RequestParam String url) { - ItemDetailResponse response = adminService.crawlItem(url); - return CommonResponse.created(response); - } - - @Operation(summary = "크롤링으로 생성된 상품글에 video url을 추가합니다") - @PatchMapping("/items/{itemId}/video-url") - public CommonResponse updateVideoUrl(@PathVariable Long itemId, - @RequestParam String url) { - adminService.updateVideoUrl(itemId, url); - return CommonResponse.noContent(); - } - - @Operation(summary = "관리자 페이지 표시용 상품 데이터를 가져옵니다") - @GetMapping("/items") - public CommonResponse getItemsForAdmin( - @RequestParam(required = false, defaultValue = "1") Integer page) { - AdminItemListResponse response = adminService.getItems(page); - return CommonResponse.ok(response); - } - - @Operation(summary = "특정 상품을 추천 상품으로 등록합니다") - @PatchMapping("/items/{itemId}/suggest") - public CommonResponse updateItemSuggest(@PathVariable Long itemId) { - adminService.updateItemSuggest(itemId); - return CommonResponse.noContent(); - } - - @Operation(summary = "특정 상품을 추천 상품에서 해제합니다") - @PatchMapping("/items/{itemId}/not-suggest") - public CommonResponse updateItemNotSuggest(@PathVariable Long itemId) { - adminService.updateItemNotSuggest(itemId); - return CommonResponse.noContent(); - } + private final AdminService adminService; + + @Operation(summary = "url을 입력해 상품글을 크롤링합니다.", description = "zigzag url만 가능, ex) https://s.zigzag.kr/dV7jnGouAl?af=1") + @PostMapping("/items/crawl") + public CommonResponse crawlItem(@RequestParam String url) { + ItemDetailResponse response = adminService.crawlItem(url); + return CommonResponse.created(response); + } + + @Operation(summary = "크롤링으로 생성된 상품글에 video url을 추가합니다") + @PatchMapping("/items/{itemId}/video-url") + public CommonResponse updateVideoUrl(@PathVariable Long itemId, + @RequestParam String url) { + adminService.updateVideoUrl(itemId, url); + return CommonResponse.noContent(); + } + + @Operation(summary = "관리자 페이지 표시용 상품 데이터를 가져옵니다") + @GetMapping("/items") + public CommonResponse getItemsForAdmin( + @RequestParam(required = false, defaultValue = "1") Integer page) { + AdminItemListResponse response = adminService.getItems(page); + return CommonResponse.ok(response); + } + + @Operation(summary = "특정 상품을 추천 상품으로 등록합니다") + @PatchMapping("/items/{itemId}/suggest") + public CommonResponse updateItemSuggest(@PathVariable Long itemId) { + adminService.updateItemSuggest(itemId); + return CommonResponse.noContent(); + } + + @Operation(summary = "특정 상품을 추천 상품에서 해제합니다") + @PatchMapping("/items/{itemId}/not-suggest") + public CommonResponse updateItemNotSuggest(@PathVariable Long itemId) { + adminService.updateItemNotSuggest(itemId); + return CommonResponse.noContent(); + } + + @Operation(summary = "구매 인증을 승인 처리합니다") + @PatchMapping("/buys/{buyId}/approve") + public CommonResponse approveBuyRefundStatus(@PathVariable Long buyId) { + BuyResponse response = adminService.approveBuyRefundStatus(buyId); + return CommonResponse.ok(response); + } + + @Operation(summary = "구매 인증을 미승인 처리합니다", description = "미승인 사유를 입력해주세요.") + @PatchMapping("/buys/{buyId}/reject") + public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyId, + @RequestBody RejectBuyRefundStatusRequest request) { + BuyResponse response = adminService.rejectBuyRefundStatus(buyId, request); + return CommonResponse.ok(response); + } + + @Operation(summary = "출금 신청을 승인 처리합니다") + @PatchMapping("/points/{buyId}/withdraw/approve") + public CommonResponse approvePointsWithdraw(@PathVariable Long buyId) { + BuyResponse response = adminService.approvePointsWithdraw(buyId); + return CommonResponse.ok(response); + } + + @Operation(summary = "출금 신청을 미승인 처리합니다") + @PatchMapping("/points/{buyId}/withdraw/reject") + public CommonResponse rejectPointsWithdraw(@PathVariable Long buyId, + @RequestBody RejectBuyRefundStatusRequest request) { + BuyResponse response = adminService.rejectPointsWithdraw(buyId, request); + return CommonResponse.ok(response); + } } diff --git a/api/src/main/java/com/mm/api/domain/buy/dto/request/RejectBuyRefundStatusRequest.java b/api/src/main/java/com/mm/api/domain/admin/dto/request/RejectBuyRefundStatusRequest.java similarity index 60% rename from api/src/main/java/com/mm/api/domain/buy/dto/request/RejectBuyRefundStatusRequest.java rename to api/src/main/java/com/mm/api/domain/admin/dto/request/RejectBuyRefundStatusRequest.java index 59ef882..65e0cac 100644 --- a/api/src/main/java/com/mm/api/domain/buy/dto/request/RejectBuyRefundStatusRequest.java +++ b/api/src/main/java/com/mm/api/domain/admin/dto/request/RejectBuyRefundStatusRequest.java @@ -1,4 +1,4 @@ -package com.mm.api.domain.buy.dto.request; +package com.mm.api.domain.admin.dto.request; public record RejectBuyRefundStatusRequest(String rejectReason) { } diff --git a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java index d8ff4f7..fb6f817 100644 --- a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java +++ b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java @@ -1,103 +1,157 @@ package com.mm.api.domain.admin.service; +import static com.mm.api.exception.ErrorCode.*; + +import java.util.List; +import java.util.stream.IntStream; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.mm.api.domain.admin.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.admin.dto.response.AdminItemListResponse; +import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.item.dto.response.ItemDetailResponse; import com.mm.api.exception.CustomException; +import com.mm.coredomain.domain.Buy; import com.mm.coredomain.domain.Item; import com.mm.coredomain.domain.ItemImage; import com.mm.coredomain.domain.ItemVideo; +import com.mm.coredomain.domain.Member; +import com.mm.coredomain.repository.BuyRepository; import com.mm.coredomain.repository.ItemRepository; import com.mm.coreinfrafeign.crawler.service.CrawlerService; import com.mm.coreinfraqdsl.repository.AdminCustomRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.stream.IntStream; - -import static com.mm.api.exception.ErrorCode.ITEM_NOT_FOUND; +import lombok.RequiredArgsConstructor; @Service @Transactional @RequiredArgsConstructor public class AdminService { - private final ItemRepository itemRepository; - private final CrawlerService crawlerService; - private final AdminCustomRepository adminCustomRepository; - - public void updateVideoUrl(Long itemId, String url) { - Item item = getItem(itemId); - ItemVideo itemVideo = ItemVideo.builder() - .url(url) - .item(item) - .build(); - item.setItemVideos(List.of(itemVideo)); - } - - public ItemDetailResponse crawlItem(String url) { - Item item = crawlerService.getZigZagItemByCrawler(url); - Item savedItem = itemRepository.save(item); - return getItemDetailResponseByItem(savedItem); - } - - public AdminItemListResponse getItems(Integer page) { - List items = adminCustomRepository.getItemsByPage(page); - - List> itemImageLists = items.stream() - .map(item -> - item.getItemImages() - .stream() - .map(ItemImage::getUrl) - .toList()) - .toList(); - - List> itemVideoLists = items.stream() - .map(item -> - item.getItemVideos() - .stream() - .map(ItemVideo::getUrl) - .toList()) - .toList(); - - List adminItemResponses = IntStream.range(0, items.size()) - .mapToObj(i -> - AdminItemListResponse.AdminItemResponse.of(items.get(i), itemImageLists.get(i), itemVideoLists.get(i))) - .toList(); - - Long pageNum = adminCustomRepository.getPageNum(); - - return new AdminItemListResponse(pageNum, adminItemResponses); - } - - public void updateItemSuggest(Long itemId) { - Item item = getItem(itemId); - item.setItemSuggested(); - } - - public void updateItemNotSuggest(Long itemId) { - Item item = getItem(itemId); - item.setItemNotSuggested(); - } - - private Item getItem(Long id) { - return itemRepository.findById(id) - .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); - } - - private ItemDetailResponse getItemDetailResponseByItem(Item savedItem) { - List images = null; - if (savedItem.getItemImages() != null) { - images = savedItem.getItemImages().stream() - .map(ItemImage::getUrl) - .toList(); - } - List videos = null; - if (savedItem.getItemVideos() != null) { - videos = savedItem.getItemVideos().stream() - .map(ItemVideo::getUrl) - .toList(); - } - return ItemDetailResponse.of(savedItem, images, videos, false); - } + private final ItemRepository itemRepository; + private final BuyRepository buyRepository; + private final CrawlerService crawlerService; + private final AdminCustomRepository adminCustomRepository; + + public void updateVideoUrl(Long itemId, String url) { + Item item = getItem(itemId); + ItemVideo itemVideo = ItemVideo.builder() + .url(url) + .item(item) + .build(); + item.setItemVideos(List.of(itemVideo)); + } + + public ItemDetailResponse crawlItem(String url) { + Item item = crawlerService.getZigZagItemByCrawler(url); + Item savedItem = itemRepository.save(item); + return getItemDetailResponseByItem(savedItem); + } + + @Transactional(readOnly = true) + public AdminItemListResponse getItems(Integer page) { + List items = adminCustomRepository.getItemsByPage(page); + + List> itemImageLists = items.stream() + .map(item -> + item.getItemImages() + .stream() + .map(ItemImage::getUrl) + .toList()) + .toList(); + + List> itemVideoLists = items.stream() + .map(item -> + item.getItemVideos() + .stream() + .map(ItemVideo::getUrl) + .toList()) + .toList(); + + List adminItemResponses = IntStream.range(0, items.size()) + .mapToObj(i -> + AdminItemListResponse.AdminItemResponse.of(items.get(i), itemImageLists.get(i), itemVideoLists.get(i))) + .toList(); + + Long pageNum = adminCustomRepository.getPageNum(); + + return new AdminItemListResponse(pageNum, adminItemResponses); + } + + public void updateItemSuggest(Long itemId) { + Item item = getItem(itemId); + item.setItemSuggested(); + } + + public void updateItemNotSuggest(Long itemId) { + Item item = getItem(itemId); + item.setItemNotSuggested(); + } + + public BuyResponse approvePointsWithdraw(Long buyId) { + Buy buy = getBuy(buyId); + buy.approveWithdrawnStatus(); + buy.setApprovedTimeNow(); + + Member member = buy.getMember(); + buy.updatePointsBeforeRefund(member.getPoint()); + member.minusMemberPoint(buy.getRefund()); + buy.updatePointsAfterRefund(member.getPoint()); + return BuyResponse.of(buy); + } + + public BuyResponse rejectPointsWithdraw(Long buyId, RejectBuyRefundStatusRequest request) { + Buy buy = getBuy(buyId); + buy.rejectWithdrawnStatus(request.rejectReason()); + buy.setApprovedTimeNow(); + + return BuyResponse.of(buy); + } + + public BuyResponse approveBuyRefundStatus(Long buyId) { + Buy buy = getBuy(buyId); + buy.approveRefundStatus(); + buy.setApprovedTimeNow(); + + Member member = buy.getMember(); + buy.updatePointsBeforeRefund(member.getPoint()); + member.plusMemberPoint(buy.getRefund()); + buy.updatePointsAfterRefund(member.getPoint()); + return BuyResponse.of(buy); + } + + public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusRequest request) { + Buy buy = getBuy(buyId); + buy.rejectRefundStatus(request.rejectReason()); + buy.setApprovedTimeNow(); + + return BuyResponse.of(buy); + } + + private Buy getBuy(Long id) { + return buyRepository.findById(id) + .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); + } + + private Item getItem(Long id) { + return itemRepository.findById(id) + .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); + } + + private ItemDetailResponse getItemDetailResponseByItem(Item savedItem) { + List images = null; + if (savedItem.getItemImages() != null) { + images = savedItem.getItemImages().stream() + .map(ItemImage::getUrl) + .toList(); + } + List videos = null; + if (savedItem.getItemVideos() != null) { + videos = savedItem.getItemVideos().stream() + .map(ItemVideo::getUrl) + .toList(); + } + return ItemDetailResponse.of(savedItem, images, videos, false); + } } diff --git a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java index 3c80e3b..aa8d01b 100644 --- a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java +++ b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java @@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; @@ -16,7 +15,6 @@ import com.mm.api.common.response.CommonResponse; import com.mm.api.common.swaggerAnnotation.SwaggerResponseBuy; -import com.mm.api.domain.buy.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyMeListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; @@ -51,21 +49,6 @@ public CommonResponse updateBuyRefundStatus(@PathVariable Long buyI return CommonResponse.ok(response); } - @Operation(summary = "구매 인증을 승인 처리합니다.") - @PatchMapping("/buys/{buyId}/approve") - public CommonResponse approveBuyRefundStatus(@PathVariable Long buyId) { - BuyResponse response = buyService.approveBuyRefundStatus(buyId); - return CommonResponse.ok(response); - } - - @Operation(summary = "구매 인증을 미승인 처리합니다.", description = "미승인 사유를 입력해주세요.") - @PatchMapping("/buys/{buyId}/reject") - public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyId, - @RequestBody RejectBuyRefundStatusRequest request) { - BuyResponse response = buyService.rejectBuyRefundStatus(buyId, request); - return CommonResponse.ok(response); - } - // 관리자 + 회원(자신만) @Operation(summary = "구매 인증을 삭제합니다.") @DeleteMapping("/buys/{buyId}") diff --git a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java index 12f87ff..bc5f785 100644 --- a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java +++ b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java @@ -11,6 +11,9 @@ public record BuyResponse(Long id, String redirectUrl, LocalDateTime uploadTime, + LocalDateTime approvedTime, + Integer pointsBeforeRefund, + Integer pointsAfterRefund, Integer refund, RefundStatus refundStatus, String rejectReason, @@ -20,6 +23,9 @@ public static BuyResponse of(Buy buy) { .id(buy.getId()) .redirectUrl(buy.getRedirectUrl()) .uploadTime(buy.getUploadTime()) + .approvedTime(buy.getApprovedTime()) + .pointsBeforeRefund(buy.getPointsBeforeRefund()) + .pointsAfterRefund(buy.getPointsAfterRefund()) .refund(buy.getRefund()) .refundStatus(buy.getRefundStatus()) .rejectReason(buy.getRejectReason()) diff --git a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java index 23be107..613211d 100644 --- a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java +++ b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java @@ -9,7 +9,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import com.mm.api.domain.buy.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyMeListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; @@ -81,26 +80,6 @@ public BuyListResponse getBuys(Integer page) { return new BuyListResponse(pageNum, buyResponses); } - public BuyResponse approveBuyRefundStatus(Long buyId) { - Buy buy = getBuy(buyId); - buy.approveRefundStatus(); - - buy.setApprovedTimeNow(); - - Member member = buy.getMember(); - member.plusMemberPoint(buy.getRefund()); - return BuyResponse.of(buy); - } - - public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusRequest request) { - Buy buy = getBuy(buyId); - buy.rejectRefundStatus(request.rejectReason()); - - buy.setApprovedTimeNow(); - - return BuyResponse.of(buy); - } - public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) { Member member = getMember(userDetails.getId()); diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java index 128511f..82a213c 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java @@ -34,6 +34,8 @@ public class Buy extends BaseEntity { private Integer pointsBeforeRefund; + private Integer pointsAfterRefund; + private Integer refund; private RefundStatus refundStatus; @@ -49,6 +51,14 @@ public class Buy extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private Item item; + public void updatePointsBeforeRefund(Integer point) { + pointsBeforeRefund = point; + } + + public void updatePointsAfterRefund(Integer point) { + pointsBeforeRefund = point; + } + public void updateRefundStatus(RefundStatus refundStatus) { this.refundStatus = refundStatus; } From 611c382bf8fdbd19b0696278437cfdce5765fbdd Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 03:24:00 +0900 Subject: [PATCH 09/12] =?UTF-8?q?fix:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EC=9D=B8=EC=A6=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/admin/controller/AdminController.java | 14 ++++++++++++-- .../api/domain/buy/controller/BuyController.java | 9 --------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java index e5e7a5a..ee87842 100644 --- a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java +++ b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java @@ -13,7 +13,9 @@ import com.mm.api.domain.admin.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.admin.dto.response.AdminItemListResponse; import com.mm.api.domain.admin.service.AdminService; +import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; +import com.mm.api.domain.buy.service.BuyService; import com.mm.api.domain.item.dto.response.ItemDetailResponse; import io.swagger.v3.oas.annotations.Operation; @@ -26,6 +28,7 @@ @RequiredArgsConstructor public class AdminController { private final AdminService adminService; + private final BuyService buyService; @Operation(summary = "url을 입력해 상품글을 크롤링합니다.", description = "zigzag url만 가능, ex) https://s.zigzag.kr/dV7jnGouAl?af=1") @PostMapping("/items/crawl") @@ -64,6 +67,13 @@ public CommonResponse updateItemNotSuggest(@PathVariable Long itemId) { return CommonResponse.noContent(); } + @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") + @GetMapping("/buys") + public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { + BuyListResponse responses = buyService.getBuys(page); + return CommonResponse.ok(responses); + } + @Operation(summary = "구매 인증을 승인 처리합니다") @PatchMapping("/buys/{buyId}/approve") public CommonResponse approveBuyRefundStatus(@PathVariable Long buyId) { @@ -80,14 +90,14 @@ public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyI } @Operation(summary = "출금 신청을 승인 처리합니다") - @PatchMapping("/points/{buyId}/withdraw/approve") + @PatchMapping("/buys/{buyId}/withdraw/approve") public CommonResponse approvePointsWithdraw(@PathVariable Long buyId) { BuyResponse response = adminService.approvePointsWithdraw(buyId); return CommonResponse.ok(response); } @Operation(summary = "출금 신청을 미승인 처리합니다") - @PatchMapping("/points/{buyId}/withdraw/reject") + @PatchMapping("/buys/{buyId}/withdraw/reject") public CommonResponse rejectPointsWithdraw(@PathVariable Long buyId, @RequestBody RejectBuyRefundStatusRequest request) { BuyResponse response = adminService.rejectPointsWithdraw(buyId, request); diff --git a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java index aa8d01b..bc17fbe 100644 --- a/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java +++ b/api/src/main/java/com/mm/api/domain/buy/controller/BuyController.java @@ -15,7 +15,6 @@ import com.mm.api.common.response.CommonResponse; import com.mm.api.common.swaggerAnnotation.SwaggerResponseBuy; -import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyMeListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.buy.service.BuyService; @@ -34,13 +33,6 @@ public class BuyController { private final BuyService buyService; // 관리자만 - @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") - @GetMapping("/buys") - public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { - BuyListResponse responses = buyService.getBuys(page); - return CommonResponse.ok(responses); - } - @Operation(summary = "구매 인증 상태를 변경합니다.", description = "refundStatus = [IN_PROGRESS, COMPLETED, REJECTED]") @PatchMapping("/buys/{buyId}/refund-status") public CommonResponse updateBuyRefundStatus(@PathVariable Long buyId, @@ -49,7 +41,6 @@ public CommonResponse updateBuyRefundStatus(@PathVariable Long buyI return CommonResponse.ok(response); } - // 관리자 + 회원(자신만) @Operation(summary = "구매 인증을 삭제합니다.") @DeleteMapping("/buys/{buyId}") public CommonResponse deleteBuy(@PathVariable Long buyId, From 6259da686a40fe0b18116325618b5d5e7a06b340 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 03:48:33 +0900 Subject: [PATCH 10/12] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EC=9D=B8=EC=A6=9D=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=A9=A4=EB=B2=84=20=ED=95=84=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminController.java | 5 +-- .../domain/buy/dto/response/BuyResponse.java | 2 ++ .../mm/api/domain/buy/service/BuyService.java | 36 ++++++++++++++----- .../java/com/mm/coredomain/domain/Buy.java | 2 ++ .../repository/BuyCustomRepository.java | 2 +- .../repository/BuyCustomRepositoryImpl.java | 2 +- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java index ee87842..a0c54d3 100644 --- a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java +++ b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java @@ -69,8 +69,9 @@ public CommonResponse updateItemNotSuggest(@PathVariable Long itemId) { @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") @GetMapping("/buys") - public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { - BuyListResponse responses = buyService.getBuys(page); + public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page, + @RequestParam(required = false) Long memberId) { + BuyListResponse responses = buyService.getBuys(page, memberId); return CommonResponse.ok(responses); } diff --git a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java index bc5f785..7115408 100644 --- a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java +++ b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java @@ -14,6 +14,7 @@ public record BuyResponse(Long id, LocalDateTime approvedTime, Integer pointsBeforeRefund, Integer pointsAfterRefund, + Integer purchase, Integer refund, RefundStatus refundStatus, String rejectReason, @@ -26,6 +27,7 @@ public static BuyResponse of(Buy buy) { .approvedTime(buy.getApprovedTime()) .pointsBeforeRefund(buy.getPointsBeforeRefund()) .pointsAfterRefund(buy.getPointsAfterRefund()) + .purchase(buy.getPurchase()) .refund(buy.getRefund()) .refundStatus(buy.getRefundStatus()) .rejectReason(buy.getRejectReason()) diff --git a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java index 613211d..e6472f8 100644 --- a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java +++ b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java @@ -47,6 +47,7 @@ public BuyResponse postBuy(OAuth2UserDetails userDetails, Long itemId, Multipart .member(member) .item(item) .redirectUrl(item.getRedirectUrl()) + .purchase(item.getPrice()) .refund(item.getRefund()) .refundStatus(RefundStatus.IN_PROGRESS) .uploadTime(LocalDateTime.now()) @@ -70,20 +71,17 @@ public void deleteBuy(Long buyId) { } @Transactional(readOnly = true) - public BuyListResponse getBuys(Integer page) { - List buys = buyCustomRepository.getBuysByPage(page); - List buyResponses = buys.stream() - .map(BuyResponse::of) - .toList(); - - Long pageNum = buyCustomRepository.getPageNum(); - return new BuyListResponse(pageNum, buyResponses); + public BuyListResponse getBuys(Integer page, Long memberId) { + if (memberId == null) { + return getBuyListResponseByMember(page, memberId); + } + return getBuyListResponseWhole(page); } public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) { Member member = getMember(userDetails.getId()); - List buyResponses = buyCustomRepository.getBuysMeByPage(page, member) + List buyResponses = buyCustomRepository.getBuysMeByMember(page, member) .stream() .map(BuyResponse::of) .toList(); @@ -103,6 +101,26 @@ private Buy getBuy(Long buyId) { .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); } + private BuyListResponse getBuyListResponseWhole(Integer page) { + List buys = buyCustomRepository.getBuysByPage(page); + List buyResponses = buys.stream() + .map(BuyResponse::of) + .toList(); + + Long pageNum = buyCustomRepository.getPageNum(); + return new BuyListResponse(pageNum, buyResponses); + } + + private BuyListResponse getBuyListResponseByMember(Integer page, Long memberId) { + Member member = getMember(memberId); + List buyResponses = buyCustomRepository.getBuysMeByMember(page, member) + .stream() + .map(BuyResponse::of) + .toList(); + Long pageNum = buyCustomRepository.getBuysMePageNum(member); + return new BuyListResponse(pageNum, buyResponses); + } + private Item getItem(Long id) { return itemRepository.findById(id) .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java index 82a213c..5e89af5 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java @@ -36,6 +36,8 @@ public class Buy extends BaseEntity { private Integer pointsAfterRefund; + private Integer purchase; + private Integer refund; private RefundStatus refundStatus; diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java index 52dbde1..e7aeb0c 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java @@ -8,7 +8,7 @@ public interface BuyCustomRepository { List getBuysByPage(Integer page); - List getBuysMeByPage(Integer page, Member member); + List getBuysMeByMember(Integer page, Member member); Long getPageNum(); diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java index 948a453..2b6e0e5 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java @@ -29,7 +29,7 @@ public List getBuysByPage(Integer page) { } @Override - public List getBuysMeByPage(Integer page, Member member) { + public List getBuysMeByMember(Integer page, Member member) { return jpaQueryFactory.selectFrom(buy) .where(buy.member.eq(member)) .offset((page - 1) * PAGE_OFFSET_ME) From 4e9a0cd7ad4bfe015ae477bc66d24b23f168cbdd Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 05:03:42 +0900 Subject: [PATCH 11/12] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=9C=EA=B8=88=20=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminController.java | 27 +++++-- .../admin/dto/response/BuyListResponse.java | 8 ++ .../dto/response/WithdrawListResponse.java | 6 ++ .../admin/dto/response/WithdrawResponse.java | 45 +++++++++++ .../domain/admin/service/AdminService.java | 53 +++++++++++-- .../buy/dto/response/BuyListResponse.java | 6 -- .../domain/buy/dto/response/BuyResponse.java | 5 +- .../mm/api/domain/buy/service/BuyService.java | 38 ++------- .../dto/response/MemberInfoResponse.java | 2 + .../repository/AdminCustomRepository.java | 16 +++- .../repository/AdminCustomRepositoryImpl.java | 79 ++++++++++++++++++- .../repository/BuyCustomRepository.java | 3 - .../repository/BuyCustomRepositoryImpl.java | 19 ----- 13 files changed, 233 insertions(+), 74 deletions(-) create mode 100644 api/src/main/java/com/mm/api/domain/admin/dto/response/BuyListResponse.java create mode 100644 api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawListResponse.java create mode 100644 api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawResponse.java delete mode 100644 api/src/main/java/com/mm/api/domain/buy/dto/response/BuyListResponse.java diff --git a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java index a0c54d3..ba1e705 100644 --- a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java +++ b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java @@ -12,8 +12,9 @@ import com.mm.api.common.response.CommonResponse; import com.mm.api.domain.admin.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.admin.dto.response.AdminItemListResponse; +import com.mm.api.domain.admin.dto.response.BuyListResponse; +import com.mm.api.domain.admin.dto.response.WithdrawListResponse; import com.mm.api.domain.admin.service.AdminService; -import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.buy.service.BuyService; import com.mm.api.domain.item.dto.response.ItemDetailResponse; @@ -67,11 +68,10 @@ public CommonResponse updateItemNotSuggest(@PathVariable Long itemId) { return CommonResponse.noContent(); } - @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다.") + @Operation(summary = "전체 구매 인증을 페이지 단위로 가져옵니다") @GetMapping("/buys") - public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page, - @RequestParam(required = false) Long memberId) { - BuyListResponse responses = buyService.getBuys(page, memberId); + public CommonResponse getBuys(@RequestParam(required = false, defaultValue = "1") Integer page) { + BuyListResponse responses = adminService.getBuys(page); return CommonResponse.ok(responses); } @@ -90,6 +90,23 @@ public CommonResponse rejectBuyRefundStatus(@PathVariable Long buyI return CommonResponse.ok(response); } + @Operation(summary = "전체 출금 신청을 페이지 단위로 가져옵니다") + @GetMapping("/buys/{buyId}/withdraw") + public CommonResponse getWithdraws( + @RequestParam(required = false, defaultValue = "1") Integer page) { + WithdrawListResponse response = adminService.getWithdraws(page); + return CommonResponse.ok(response); + } + + @Operation(summary = "특정 유저 출금 신청을 페이지 단위로 가져옵니다") + @GetMapping("/buys/{buyId}/withdraw") + public CommonResponse getWithdraws( + @RequestParam(required = false, defaultValue = "1") Integer page, + @RequestParam(required = true) Long memberId) { + WithdrawListResponse response = adminService.getWithdrawsByMember(page, memberId); + return CommonResponse.ok(response); + } + @Operation(summary = "출금 신청을 승인 처리합니다") @PatchMapping("/buys/{buyId}/withdraw/approve") public CommonResponse approvePointsWithdraw(@PathVariable Long buyId) { diff --git a/api/src/main/java/com/mm/api/domain/admin/dto/response/BuyListResponse.java b/api/src/main/java/com/mm/api/domain/admin/dto/response/BuyListResponse.java new file mode 100644 index 0000000..1cede47 --- /dev/null +++ b/api/src/main/java/com/mm/api/domain/admin/dto/response/BuyListResponse.java @@ -0,0 +1,8 @@ +package com.mm.api.domain.admin.dto.response; + +import java.util.List; + +import com.mm.api.domain.buy.dto.response.BuyResponse; + +public record BuyListResponse(Long pageNum, List buys) { +} diff --git a/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawListResponse.java b/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawListResponse.java new file mode 100644 index 0000000..1fac1fd --- /dev/null +++ b/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawListResponse.java @@ -0,0 +1,6 @@ +package com.mm.api.domain.admin.dto.response; + +import java.util.List; + +public record WithdrawListResponse(Long pageNum, List withdrawResponses) { +} diff --git a/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawResponse.java b/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawResponse.java new file mode 100644 index 0000000..7d7504e --- /dev/null +++ b/api/src/main/java/com/mm/api/domain/admin/dto/response/WithdrawResponse.java @@ -0,0 +1,45 @@ +package com.mm.api.domain.admin.dto.response; + +import java.time.LocalDateTime; + +import com.mm.coredomain.domain.Buy; +import com.mm.coredomain.domain.Member; +import com.mm.coredomain.domain.RefundStatus; + +import lombok.Builder; + +@Builder +public record WithdrawResponse(Long id, + Long memberId, + String redirectUrl, + LocalDateTime uploadTime, + LocalDateTime approvedTime, + Integer pointsBeforeRefund, + Integer pointsAfterRefund, + Integer purchase, + Integer refund, + RefundStatus refundStatus, + String rejectReason, + String depositor, + String account, + String accountBank +) { + public static WithdrawResponse of(Buy buy, Member member) { + return WithdrawResponse.builder() + .id(buy.getId()) + .memberId(member.getId()) + .redirectUrl(buy.getRedirectUrl()) + .uploadTime(buy.getUploadTime()) + .approvedTime(buy.getApprovedTime()) + .pointsBeforeRefund(buy.getPointsBeforeRefund()) + .pointsAfterRefund(buy.getPointsAfterRefund()) + .purchase(buy.getPurchase()) + .refund(buy.getRefund()) + .refundStatus(buy.getRefundStatus()) + .rejectReason(buy.getRejectReason()) + .depositor(member.getDepositorName()) + .account(member.getAccount()) + .accountBank(member.getAccountBank()) + .build(); + } +} diff --git a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java index fb6f817..4154ae1 100644 --- a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java +++ b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java @@ -10,9 +10,13 @@ import com.mm.api.domain.admin.dto.request.RejectBuyRefundStatusRequest; import com.mm.api.domain.admin.dto.response.AdminItemListResponse; +import com.mm.api.domain.admin.dto.response.BuyListResponse; +import com.mm.api.domain.admin.dto.response.WithdrawListResponse; +import com.mm.api.domain.admin.dto.response.WithdrawResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.domain.item.dto.response.ItemDetailResponse; import com.mm.api.exception.CustomException; +import com.mm.api.exception.ErrorCode; import com.mm.coredomain.domain.Buy; import com.mm.coredomain.domain.Item; import com.mm.coredomain.domain.ItemImage; @@ -20,6 +24,7 @@ import com.mm.coredomain.domain.Member; import com.mm.coredomain.repository.BuyRepository; import com.mm.coredomain.repository.ItemRepository; +import com.mm.coredomain.repository.MemberRepository; import com.mm.coreinfrafeign.crawler.service.CrawlerService; import com.mm.coreinfraqdsl.repository.AdminCustomRepository; @@ -31,6 +36,7 @@ public class AdminService { private final ItemRepository itemRepository; private final BuyRepository buyRepository; + private final MemberRepository memberRepository; private final CrawlerService crawlerService; private final AdminCustomRepository adminCustomRepository; @@ -74,7 +80,7 @@ public AdminItemListResponse getItems(Integer page) { AdminItemListResponse.AdminItemResponse.of(items.get(i), itemImageLists.get(i), itemVideoLists.get(i))) .toList(); - Long pageNum = adminCustomRepository.getPageNum(); + Long pageNum = adminCustomRepository.getItemsPageNum(); return new AdminItemListResponse(pageNum, adminItemResponses); } @@ -89,6 +95,27 @@ public void updateItemNotSuggest(Long itemId) { item.setItemNotSuggested(); } + public WithdrawListResponse getWithdraws(Integer page) { + List buys = adminCustomRepository.getWithdrawsAdminByPage(page); + List withdrawResponses = buys.stream() + .map(buy -> WithdrawResponse.of(buy, buy.getMember())) + .toList(); + Long pageNum = adminCustomRepository.getWithdrawsAdminPageNum(); + + return new WithdrawListResponse(pageNum, withdrawResponses); + } + + public WithdrawListResponse getWithdrawsByMember(Integer page, Long memberId) { + Member member = getMember(memberId); + List buys = adminCustomRepository.getWithdrawsAdminByPageByMember(page, member); + List withdrawResponses = buys.stream() + .map(buy -> WithdrawResponse.of(buy, buy.getMember())) + .toList(); + Long pageNum = adminCustomRepository.getWithdrawsAdminPageNumByMember(member); + + return new WithdrawListResponse(pageNum, withdrawResponses); + } + public BuyResponse approvePointsWithdraw(Long buyId) { Buy buy = getBuy(buyId); buy.approveWithdrawnStatus(); @@ -98,7 +125,7 @@ public BuyResponse approvePointsWithdraw(Long buyId) { buy.updatePointsBeforeRefund(member.getPoint()); member.minusMemberPoint(buy.getRefund()); buy.updatePointsAfterRefund(member.getPoint()); - return BuyResponse.of(buy); + return BuyResponse.of(buy, member); } public BuyResponse rejectPointsWithdraw(Long buyId, RejectBuyRefundStatusRequest request) { @@ -106,7 +133,18 @@ public BuyResponse rejectPointsWithdraw(Long buyId, RejectBuyRefundStatusRequest buy.rejectWithdrawnStatus(request.rejectReason()); buy.setApprovedTimeNow(); - return BuyResponse.of(buy); + return BuyResponse.of(buy, buy.getMember()); + } + + @Transactional(readOnly = true) + public BuyListResponse getBuys(Integer page) { + List buys = adminCustomRepository.getBuysAdminByPage(page); + List buyResponses = buys.stream() + .map(buy -> BuyResponse.of(buy, buy.getMember())) + .toList(); + + Long pageNum = adminCustomRepository.getBuysAdminPageNum(); + return new BuyListResponse(pageNum, buyResponses); } public BuyResponse approveBuyRefundStatus(Long buyId) { @@ -118,7 +156,7 @@ public BuyResponse approveBuyRefundStatus(Long buyId) { buy.updatePointsBeforeRefund(member.getPoint()); member.plusMemberPoint(buy.getRefund()); buy.updatePointsAfterRefund(member.getPoint()); - return BuyResponse.of(buy); + return BuyResponse.of(buy, buy.getMember()); } public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusRequest request) { @@ -126,7 +164,7 @@ public BuyResponse rejectBuyRefundStatus(Long buyId, RejectBuyRefundStatusReques buy.rejectRefundStatus(request.rejectReason()); buy.setApprovedTimeNow(); - return BuyResponse.of(buy); + return BuyResponse.of(buy, buy.getMember()); } private Buy getBuy(Long id) { @@ -134,6 +172,11 @@ private Buy getBuy(Long id) { .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); } + private Member getMember(Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + } + private Item getItem(Long id) { return itemRepository.findById(id) .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); diff --git a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyListResponse.java b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyListResponse.java deleted file mode 100644 index 24cf07a..0000000 --- a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyListResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.mm.api.domain.buy.dto.response; - -import java.util.List; - -public record BuyListResponse(Long pageNum, List buys) { -} diff --git a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java index 7115408..c734b57 100644 --- a/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java +++ b/api/src/main/java/com/mm/api/domain/buy/dto/response/BuyResponse.java @@ -3,12 +3,14 @@ import java.time.LocalDateTime; import com.mm.coredomain.domain.Buy; +import com.mm.coredomain.domain.Member; import com.mm.coredomain.domain.RefundStatus; import lombok.Builder; @Builder public record BuyResponse(Long id, + Long memberId, String redirectUrl, LocalDateTime uploadTime, LocalDateTime approvedTime, @@ -19,9 +21,10 @@ public record BuyResponse(Long id, RefundStatus refundStatus, String rejectReason, String certImageUrl) { - public static BuyResponse of(Buy buy) { + public static BuyResponse of(Buy buy, Member member) { return BuyResponse.builder() .id(buy.getId()) + .memberId(member.getId()) .redirectUrl(buy.getRedirectUrl()) .uploadTime(buy.getUploadTime()) .approvedTime(buy.getApprovedTime()) diff --git a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java index e6472f8..99d193e 100644 --- a/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java +++ b/api/src/main/java/com/mm/api/domain/buy/service/BuyService.java @@ -9,7 +9,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import com.mm.api.domain.buy.dto.response.BuyListResponse; import com.mm.api.domain.buy.dto.response.BuyMeListResponse; import com.mm.api.domain.buy.dto.response.BuyResponse; import com.mm.api.exception.CustomException; @@ -54,7 +53,7 @@ public BuyResponse postBuy(OAuth2UserDetails userDetails, Long itemId, Multipart .certImageUrl(url) .build(); - return BuyResponse.of(buyRepository.save(buy)); + return BuyResponse.of(buyRepository.save(buy), buy.getMember()); } public BuyResponse updateBuyRefundStatus(Long buyId, String refundStatus) { @@ -62,7 +61,7 @@ public BuyResponse updateBuyRefundStatus(Long buyId, String refundStatus) { Buy buy = getBuy(buyId); buy.updateRefundStatus(convertedRefundStatus); - return BuyResponse.of(buy); + return BuyResponse.of(buy, buy.getMember()); } public void deleteBuy(Long buyId) { @@ -70,20 +69,12 @@ public void deleteBuy(Long buyId) { buyRepository.delete(buy); } - @Transactional(readOnly = true) - public BuyListResponse getBuys(Integer page, Long memberId) { - if (memberId == null) { - return getBuyListResponseByMember(page, memberId); - } - return getBuyListResponseWhole(page); - } - public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) { Member member = getMember(userDetails.getId()); List buyResponses = buyCustomRepository.getBuysMeByMember(page, member) .stream() - .map(BuyResponse::of) + .map(buy -> BuyResponse.of(buy, buy.getMember())) .toList(); Long pageNum = buyCustomRepository.getBuysMePageNum(member); @@ -93,7 +84,8 @@ public BuyMeListResponse getBuysMe(Integer page, OAuth2UserDetails userDetails) } public BuyResponse getBuyResponse(Long buyId) { - return BuyResponse.of(getBuy(buyId)); + Buy buy = getBuy(buyId); + return BuyResponse.of(buy, buy.getMember()); } private Buy getBuy(Long buyId) { @@ -101,26 +93,6 @@ private Buy getBuy(Long buyId) { .orElseThrow(() -> new CustomException(BUY_NOT_FOUND)); } - private BuyListResponse getBuyListResponseWhole(Integer page) { - List buys = buyCustomRepository.getBuysByPage(page); - List buyResponses = buys.stream() - .map(BuyResponse::of) - .toList(); - - Long pageNum = buyCustomRepository.getPageNum(); - return new BuyListResponse(pageNum, buyResponses); - } - - private BuyListResponse getBuyListResponseByMember(Integer page, Long memberId) { - Member member = getMember(memberId); - List buyResponses = buyCustomRepository.getBuysMeByMember(page, member) - .stream() - .map(BuyResponse::of) - .toList(); - Long pageNum = buyCustomRepository.getBuysMePageNum(member); - return new BuyListResponse(pageNum, buyResponses); - } - private Item getItem(Long id) { return itemRepository.findById(id) .orElseThrow(() -> new CustomException(ITEM_NOT_FOUND)); diff --git a/api/src/main/java/com/mm/api/domain/member/dto/response/MemberInfoResponse.java b/api/src/main/java/com/mm/api/domain/member/dto/response/MemberInfoResponse.java index 79f76ad..009054a 100644 --- a/api/src/main/java/com/mm/api/domain/member/dto/response/MemberInfoResponse.java +++ b/api/src/main/java/com/mm/api/domain/member/dto/response/MemberInfoResponse.java @@ -11,6 +11,7 @@ public record MemberInfoResponse(Long id, String name, String email, Integer point, + String depositor, String account, String accountBank, MemberStatus memberStatus, @@ -22,6 +23,7 @@ public static MemberInfoResponse of(Member member) { .name(member.getName()) .email(member.getEmail()) .point(member.getPoint()) + .depositor(member.getDepositorName()) .account(member.getAccount()) .accountBank(member.getAccountBank()) .memberStatus(member.getMemberStatus()) diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepository.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepository.java index 559caf0..a971809 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepository.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepository.java @@ -2,10 +2,24 @@ import java.util.List; +import com.mm.coredomain.domain.Buy; import com.mm.coredomain.domain.Item; +import com.mm.coredomain.domain.Member; public interface AdminCustomRepository { List getItemsByPage(Integer page); - Long getPageNum(); + Long getItemsPageNum(); + + List getBuysAdminByPage(Integer page); + + Long getBuysAdminPageNum(); + + List getWithdrawsAdminByPage(Integer page); + + Long getWithdrawsAdminPageNum(); + + List getWithdrawsAdminByPageByMember(Integer page, Member member); + + Long getWithdrawsAdminPageNumByMember(Member member); } diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepositoryImpl.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepositoryImpl.java index 7039b4a..2974af7 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepositoryImpl.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/AdminCustomRepositoryImpl.java @@ -1,12 +1,17 @@ package com.mm.coreinfraqdsl.repository; +import static com.mm.coredomain.domain.QBuy.*; import static com.mm.coredomain.domain.QItem.*; import java.util.List; import org.springframework.stereotype.Repository; +import com.mm.coredomain.domain.Buy; import com.mm.coredomain.domain.Item; +import com.mm.coredomain.domain.Member; +import com.mm.coredomain.domain.RefundStatus; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -26,7 +31,7 @@ public List getItemsByPage(Integer page) { } @Override - public Long getPageNum() { + public Long getItemsPageNum() { Long count = jpaQueryFactory.select(item.count()) .from(item) .fetchOne(); @@ -35,4 +40,76 @@ public Long getPageNum() { } return count / PAGE_OFFSET; } + + @Override + public List getBuysAdminByPage(Integer page) { + return jpaQueryFactory.selectFrom(buy) + .where(isBuy()) + .offset((page - 1) * PAGE_OFFSET) + .limit(PAGE_OFFSET) + .fetch(); + } + + @Override + public Long getBuysAdminPageNum() { + Long count = jpaQueryFactory.select(buy.count()) + .from(buy) + .where(isBuy()) + .fetchOne(); + if (count % PAGE_OFFSET != 0) { + return count / PAGE_OFFSET + 1; + } + return count / PAGE_OFFSET; + } + + @Override + public List getWithdrawsAdminByPage(Integer page) { + return jpaQueryFactory.selectFrom(buy) + .where(isWithdraw()) + .offset((page - 1) * PAGE_OFFSET) + .limit(PAGE_OFFSET) + .fetch(); + } + + @Override + public Long getWithdrawsAdminPageNum() { + Long count = jpaQueryFactory.select(buy.count()) + .from(buy) + .where(isWithdraw()) + .fetchOne(); + if (count % PAGE_OFFSET != 0) { + return count / PAGE_OFFSET + 1; + } + return count / PAGE_OFFSET; + } + + @Override + public List getWithdrawsAdminByPageByMember(Integer page, Member member) { + return jpaQueryFactory.selectFrom(buy) + .where(isWithdraw(), buy.member.eq(member)) + .offset((page - 1) * PAGE_OFFSET) + .limit(PAGE_OFFSET) + .fetch(); + } + + @Override + public Long getWithdrawsAdminPageNumByMember(Member member) { + Long count = jpaQueryFactory.select(buy.count()) + .from(buy) + .where(isWithdraw(), buy.member.eq(member)) + .fetchOne(); + if (count % PAGE_OFFSET != 0) { + return count / PAGE_OFFSET + 1; + } + return count / PAGE_OFFSET; + } + + private BooleanExpression isBuy() { + return buy.refundStatus.in(RefundStatus.IN_PROGRESS, RefundStatus.COMPLETED, RefundStatus.REJECTED); + } + + private BooleanExpression isWithdraw() { + return buy.refundStatus.in(RefundStatus.WITHDRAWN_IN_PROGRESS, RefundStatus.WITHDRAWN_COMPLETED, + RefundStatus.WITHDRAWN_REJECTED); + } } diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java index e7aeb0c..9238947 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepository.java @@ -6,11 +6,8 @@ import com.mm.coredomain.domain.Member; public interface BuyCustomRepository { - List getBuysByPage(Integer page); List getBuysMeByMember(Integer page, Member member); - Long getPageNum(); - Long getBuysMePageNum(Member member); } diff --git a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java index 2b6e0e5..35146a6 100644 --- a/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java +++ b/core/core-infra-qdsl/src/main/java/com/mm/coreinfraqdsl/repository/BuyCustomRepositoryImpl.java @@ -20,14 +20,6 @@ public class BuyCustomRepositoryImpl implements BuyCustomRepository { private static final Long PAGE_OFFSET = 10L; private static final Long PAGE_OFFSET_ME = 9L; - @Override - public List getBuysByPage(Integer page) { - return jpaQueryFactory.selectFrom(buy) - .offset((page - 1) * PAGE_OFFSET) - .limit(PAGE_OFFSET) - .fetch(); - } - @Override public List getBuysMeByMember(Integer page, Member member) { return jpaQueryFactory.selectFrom(buy) @@ -37,17 +29,6 @@ public List getBuysMeByMember(Integer page, Member member) { .fetch(); } - @Override - public Long getPageNum() { - Long count = jpaQueryFactory.select(buy.count()) - .from(buy) - .fetchOne(); - if (count % PAGE_OFFSET != 0) { - return count / PAGE_OFFSET + 1; - } - return count / PAGE_OFFSET; - } - @Override public Long getBuysMePageNum(Member member) { Long count = jpaQueryFactory.select(buy.count()) From a7540e6b489a9976b7186df6e7f9f015336084b9 Mon Sep 17 00:00:00 2001 From: KarmaPol Date: Fri, 9 Feb 2024 05:34:52 +0900 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=EC=9D=BC=EB=B6=80=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminController.java | 4 +- .../domain/admin/service/AdminService.java | 11 ++- .../member/controller/MemberController.java | 2 +- .../domain/point/service/PointService.java | 6 +- .../java/com/mm/coredomain/domain/Buy.java | 2 +- .../java/com/mm/coredomain/domain/Member.java | 71 +++++++++++-------- 6 files changed, 56 insertions(+), 40 deletions(-) diff --git a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java index ba1e705..bf9321a 100644 --- a/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java +++ b/api/src/main/java/com/mm/api/domain/admin/controller/AdminController.java @@ -99,10 +99,10 @@ public CommonResponse getWithdraws( } @Operation(summary = "특정 유저 출금 신청을 페이지 단위로 가져옵니다") - @GetMapping("/buys/{buyId}/withdraw") + @GetMapping("/buys/{buyId}/withdraw/members/{memberId}") public CommonResponse getWithdraws( @RequestParam(required = false, defaultValue = "1") Integer page, - @RequestParam(required = true) Long memberId) { + @PathVariable Long memberId) { WithdrawListResponse response = adminService.getWithdrawsByMember(page, memberId); return CommonResponse.ok(response); } diff --git a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java index 4154ae1..21344bc 100644 --- a/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java +++ b/api/src/main/java/com/mm/api/domain/admin/service/AdminService.java @@ -95,21 +95,28 @@ public void updateItemNotSuggest(Long itemId) { item.setItemNotSuggested(); } + @Transactional(readOnly = true) public WithdrawListResponse getWithdraws(Integer page) { List buys = adminCustomRepository.getWithdrawsAdminByPage(page); List withdrawResponses = buys.stream() - .map(buy -> WithdrawResponse.of(buy, buy.getMember())) + .map(buy -> { + Member member = buy.getMember(); + return WithdrawResponse.of(buy, member); + }) .toList(); Long pageNum = adminCustomRepository.getWithdrawsAdminPageNum(); return new WithdrawListResponse(pageNum, withdrawResponses); } + @Transactional(readOnly = true) public WithdrawListResponse getWithdrawsByMember(Integer page, Long memberId) { Member member = getMember(memberId); List buys = adminCustomRepository.getWithdrawsAdminByPageByMember(page, member); List withdrawResponses = buys.stream() - .map(buy -> WithdrawResponse.of(buy, buy.getMember())) + .map(buy -> { + return WithdrawResponse.of(buy, member); + }) .toList(); Long pageNum = adminCustomRepository.getWithdrawsAdminPageNumByMember(member); diff --git a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java index 81be7eb..2f20ad6 100644 --- a/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java +++ b/api/src/main/java/com/mm/api/domain/member/controller/MemberController.java @@ -50,7 +50,7 @@ public CommonResponse updateMyAccount(@RequestBody UpdateMemberAccountRequest } @Operation(summary = "사용자 닉네임을 변경합니다.") - @PatchMapping("/members/{memberId}/name") + @PatchMapping("/members/me/nickname") public CommonResponse updateMemberName(@AuthenticationPrincipal OAuth2UserDetails userDetails, @RequestParam(value = "name") String name) { memberService.updateMemberName(userDetails, name); diff --git a/api/src/main/java/com/mm/api/domain/point/service/PointService.java b/api/src/main/java/com/mm/api/domain/point/service/PointService.java index 933f1b5..9fa0604 100644 --- a/api/src/main/java/com/mm/api/domain/point/service/PointService.java +++ b/api/src/main/java/com/mm/api/domain/point/service/PointService.java @@ -42,7 +42,7 @@ public PointsResponse getCumulativeHistory(OAuth2UserDetails userDetails) { List buyResponses = buys .stream() .filter(this::isRefundCumulative) - .map(BuyResponse::of) + .map(buy -> BuyResponse.of(buy, buy.getMember())) .toList(); Integer totalPoint = buys.stream() .filter(this::isRefundCumulativeTotalPoint) @@ -61,7 +61,7 @@ public PointsResponse getExpectedHistory(OAuth2UserDetails userDetails) { List buyResponses = buyRepository.findAllByMember(member) .stream() .filter(this::isRefundExpected) - .map(BuyResponse::of) + .map(buy -> BuyResponse.of(buy, buy.getMember())) .toList(); Integer totalPoint = buys.stream() .filter(this::isRefundExpectedTotalPoint) @@ -84,7 +84,7 @@ public BuyResponse postPointsWithdraw(OAuth2UserDetails userDetails, Integer ref .build(); Buy savedBuy = buyRepository.save(buy); - return BuyResponse.of(savedBuy); + return BuyResponse.of(savedBuy, savedBuy.getMember()); } private void isPointsEnoughForRefund(Integer refund, Member member) { diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java index 5e89af5..547f72c 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/Buy.java @@ -58,7 +58,7 @@ public void updatePointsBeforeRefund(Integer point) { } public void updatePointsAfterRefund(Integer point) { - pointsBeforeRefund = point; + pointsAfterRefund = point; } public void updateRefundStatus(RefundStatus refundStatus) { diff --git a/core/core-domain/src/main/java/com/mm/coredomain/domain/Member.java b/core/core-domain/src/main/java/com/mm/coredomain/domain/Member.java index ebbce78..abaf61f 100644 --- a/core/core-domain/src/main/java/com/mm/coredomain/domain/Member.java +++ b/core/core-domain/src/main/java/com/mm/coredomain/domain/Member.java @@ -1,7 +1,16 @@ package com.mm.coredomain.domain; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Entity @@ -9,46 +18,46 @@ @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - private String name; + private String name; - private String email; + private String email; - @Builder.Default - private Integer point = 0; + @Builder.Default + private Integer point = 0; - private String depositorName; + private String depositorName; - private String account; + private String account; - private String accountBank; + private String accountBank; - @Builder.Default - private MemberStatus memberStatus = MemberStatus.ACTIVE; + @Builder.Default + private MemberStatus memberStatus = MemberStatus.ACTIVE; - private OAuthProvider provider; + private OAuthProvider provider; - @ManyToOne(fetch = FetchType.LAZY) - private Groups groups; + @ManyToOne(fetch = FetchType.LAZY) + private Groups groups; - public void updateMemberAccount(String depositorName, String account, String accountBank) { - this.depositorName = depositorName; - this.account = account; - this.accountBank = accountBank; - } + public void updateMemberAccount(String depositorName, String account, String accountBank) { + this.depositorName = depositorName; + this.account = account; + this.accountBank = accountBank; + } - public void updateMemberName(String name) { - this.name = name; - } + public void updateMemberName(String name) { + this.name = name; + } - public void plusMemberPoint(Integer point) { - this.point += point; - } + public void plusMemberPoint(Integer point) { + this.point += point; + } - public void minusMemberPoint(Integer point) { - this.point += point; - } + public void minusMemberPoint(Integer point) { + this.point -= point; + } }