From 790e8ad72db59931f7e1ef3ec4b98870230dcfa8 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:48:48 +0900 Subject: [PATCH 01/82] =?UTF-8?q?:recycle:=20:=20nicepay=20->=20portone=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/NicepayController.java | 25 +++ .../common/aop/CheckIdExistAspect.java | 7 - .../donation/service/DonationService.java | 4 +- .../order/controller/OrderController.java | 30 +-- .../order/convertor/OrderConvertor.java | 56 ++++- .../matchapi/order/helper/DataEncrypt.java | 35 ++++ .../matchapi/order/service/OrderService.java | 194 ++++++++---------- .../portone/controller/PaymentController.java | 31 +++ .../matchapi/portone/dto/PaymentReq.java | 17 ++ .../portone/service/PaymentService.java | 99 +++++++++ .../example/matchapi/security/JwtService.java | 3 +- .../matchbatch/convertor/OrderConvertor.java | 12 +- .../matchbatch/service/OrderService.java | 86 ++++---- .../config/ConfigurationPropertiesConfig.java | 3 +- .../matchcommon/constants/MatchStatic.java | 2 + .../properties/NicePayProperties.java | 2 + .../properties/PortOneProperties.java | 21 ++ .../donation/entity/QUserCard.java | 4 +- .../matchdomain/donation/entity/UserCard.java | 5 +- .../order/exception/PortOneAuthErrorCode.java | 44 ++++ .../project/repository/ProjectRepository.java | 2 + .../redis/entity/OrderRequest.java | 1 + .../discord/config/DiscordInfoConfig.java | 1 - .../portone/client/PortOneFeignClient.java | 39 ++++ .../config/PortOneFeignConfiguration.java | 24 +++ .../pay/portone/config/PortOneInfoConfig.java | 23 +++ .../config/PortOneInfoErrorDecoder.java | 72 +++++++ .../portone/convertor/PortOneConvertor.java | 33 +++ .../pay/portone/dto/PortOneAuth.java | 14 ++ .../portone/dto/PortOneBillPayResponse.java | 70 +++++++ .../pay/portone/dto/PortOneBillResponse.java | 26 +++ .../pay/portone/dto/PortOneResponse.java | 32 +++ .../portone/dto/req/PayWithBillKeyReq.java | 14 ++ .../pay/portone/dto/req/PortOneAuthReq.java | 14 ++ .../pay/portone/dto/req/PortOneBillReq.java | 16 ++ .../portone/service/PortOneAuthService.java | 52 +++++ 36 files changed, 919 insertions(+), 194 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/portone/dto/PaymentReq.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/properties/PortOneProperties.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneFeignConfiguration.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoConfig.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoErrorDecoder.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneAuth.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillPayResponse.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillResponse.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneResponse.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PayWithBillKeyReq.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneAuthReq.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneBillReq.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java b/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java index b914b6a8..c8bdb63d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java @@ -1,5 +1,6 @@ package com.example.matchapi.common; +import com.example.matchapi.order.helper.DataEncrypt; import com.example.matchapi.order.service.OrderService; import com.example.matchcommon.properties.NicePayProperties; import com.example.matchdomain.redis.entity.OrderRequest; @@ -34,7 +35,9 @@ public class NicepayController { private String redirectUrl; @Value("${server.host}") private String serverHost; + private final DataEncrypt dataEncrypt; + /* @RequestMapping("") public String indexDemo( @RequestParam String method, @@ -51,6 +54,26 @@ public String indexDemo( return "index"; } + @RequestMapping("/goPay") + public String goPay( + @RequestParam(required = false) String method, + @RequestParam String orderId, + @RequestParam int amount, + Model model + ){ + String ediDate = orderService.getyyyyMMddHHmmss(); + String hashString = dataEncrypt.encrypt(ediDate + orderId + amount + nicePayProperties.getKey()); + model.addAttribute("payMethod", "CreditCard"); + model.addAttribute("goodsName", "Sample Product"); + model.addAttribute("Amt", amount); + model.addAttribute("mid", nicePayProperties.getMid()); + model.addAttribute("moid", orderId); + model.addAttribute("EdiDate", ediDate); + model.addAttribute("signData", hashString); + // model.addAttribute("ReturnURL", "http://localhost:8080/nicepay3.0_utf-8/payResult_utf.jsp"); + return "gopay"; + } + @RequestMapping("/serverAuth") public RedirectView requestPaymentAuth( @RequestParam String tid, @@ -62,4 +85,6 @@ public RedirectView requestPaymentAuth( redirectView.setUrl(redirectUrl+"/auth/payComplete/once"); return redirectView; } + + */ } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/common/aop/CheckIdExistAspect.java b/Match-Api/src/main/java/com/example/matchapi/common/aop/CheckIdExistAspect.java index 80458d87..0a90ce3a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/aop/CheckIdExistAspect.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/aop/CheckIdExistAspect.java @@ -57,13 +57,6 @@ public void checkIdsExist(JoinPoint joinPoint) { } break; } - if ("cardId".equals(parameterNames[i])) { - Long cardId = (Long) args[i]; - UserCard userCard = userCardRepository.findByIdAndStatus(cardId, Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); - if(!userCard.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); - if(!userCard.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); - break; - } } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index d3f1b2db..bff86a74 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -4,6 +4,7 @@ import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; import com.example.matchapi.order.service.OrderService; +import com.example.matchapi.portone.service.PaymentService; import com.example.matchapi.project.convertor.ProjectConvertor; import com.example.matchapi.project.dto.ProjectRes; import com.example.matchcommon.exception.BadRequestException; @@ -52,6 +53,7 @@ public class DonationService { private final DonationHelper donationHelper; private final ProjectConvertor projectConvertor; private final DonationHistoryRepository donationHistoryRepository; + private final PaymentService paymentService; public PageResponse> getDonationList(Long userId, int filter, int page, int size) { Pageable pageable = PageRequest.of(page, size); @@ -93,7 +95,7 @@ public void refundDonation(User user, Long donationId) { DonationUser donationUser = donationUserRepository.findById(donationId).orElseThrow(() -> new NotFoundException(DONATION_NOT_EXIST)); if(!donationUser.getUserId().equals(user.getId())) throw new BadRequestException(DONATION_NOT_CORRECT_USER); if(!donationUser.getDonationStatus().equals(EXECUTION_BEFORE)) throw new BadRequestException(CANNOT_DELETE_DONATION_STATUS); - orderService.cancelPayment(donationUser.getTid(), donationUser.getOrderId()); + paymentService.refundPayment(donationUser.getTid()); donationUser.setDonationStatus(EXECUTION_REFUND); } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java index 996aefae..80e8d060 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java @@ -20,6 +20,7 @@ import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.exception.UserAuthErrorCode; import com.example.matchinfrastructure.pay.nice.dto.NicePaymentAuth; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -61,26 +62,6 @@ public CommonResponse requestPay( return CommonResponse.onSuccess(orderId); } - @Deprecated - @PostMapping("/test/pay") - @ApiErrorCodeExample(OtherServerErrorCode.class) - @Operation(summary= "04-00 Order๐Ÿ’ธ ๊ฒฐ์ œ ์ธ์ฆ์šฉ API ์‚ฌ์šฉ X ํ…Œ์ŠคํŠธ์šฉ",description = "๊ฒฐ์ œ ์ธ์ฆ์šฉ API ์ž…๋‹ˆ๋‹ค ํ…Œ์ŠคํŠธ ์šฉ") - public CommonResponse requestPayment(@RequestParam String tid, - @RequestParam Long amount){ - log.info("04-00 Order ๊ฒฐ์ œ ์ธ์ฆ ํ…Œ์ŠคํŠธ์šฉ API ๊ฒฐ์ œ ID: " + tid + " ๊ฒฐ์ œ ๊ธˆ์•ก " +amount); - return CommonResponse.onSuccess(orderService.authPayment(tid, amount)); - } - - @Deprecated - @PostMapping("/test/cancel/pay") - @ApiErrorCodeExample(OtherServerErrorCode.class) - @Operation(summary= "04-00 Order๐Ÿ’ธ ๊ฒฐ์ œ ์ทจ์†Œ์šฉ API ์‚ฌ์šฉ X ํ…Œ์ŠคํŠธ์šฉ",description = "๊ฒฐ์ œ ์ธ์ฆ์šฉ API ์ž…๋‹ˆ๋‹ค ํ…Œ์ŠคํŠธ ์šฉ") - public CommonResponse cancelPayment(@RequestParam String tid, - @RequestParam String orderId){ - log.info("04-00 Order ๊ฒฐ์ œ ์ทจ์†Œ ํ…Œ์ŠคํŠธ์šฉ API ๊ฒฐ์ œ ID: " + tid + " ์ฃผ๋ฌธ ๋ฒˆํ˜ธ " +orderId); - return CommonResponse.onSuccess(orderService.cancelPayment(tid, orderId)); - } - @PostMapping("/pay/{projectId}") @ApiErrorCodeExample({OtherServerErrorCode.class, UserAuthErrorCode.class, RequestErrorCode.class, ProjectOneTimeErrorCode.class}) @@ -97,11 +78,10 @@ public CommonResponse requestPayment( @PostMapping("/pay/card") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, RegistrationCardErrorCode.class, NicePayErrorCode.class}) @Operation(summary = "04-02 Order๐Ÿ’ธ ์ •๊ธฐ ๊ฒฐ์ œ์šฉ ์นด๋“œ ๋“ฑ๋ก api",description = "์ •๊ธฐ ๊ฒฐ์ œ๋ฅผ ์œ„ํ•œ ์นด๋“œ ๋“ฑ๋ก API ์ž…๋‹ˆ๋‹ค.") - public CommonResponse registrationCard( + public CommonResponse registrationCard( @Parameter(hidden = true) @AuthenticationPrincipal User user, @Valid @RequestBody OrderReq.RegistrationCard registrationCard){ - orderService.registrationCard(user, registrationCard); - return CommonResponse.onSuccess("์นด๋“œ ๋“ฑ๋ก ์„ฑ๊ณต"); + return CommonResponse.onSuccess(orderService.postCard(user, registrationCard)); } @GetMapping("/pay/card") @@ -124,8 +104,6 @@ public CommonResponse deleteBillCard(@Parameter(hidden = true) @Authenti @PostMapping("/pay/card/{cardId}/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, ProjectRegualrErrorCode.class, DeleteCardErrorCode.class}) @Operation(summary = "04-05 Order๐Ÿ’ธ ์ •๊ธฐ ๊ฒฐ์ œ ๋“ฑ๋ก api #FRAME ๊ฒฐ์ œ ํ™”๋ฉด - ์ •๊ธฐ ๊ฒฐ์ œ",description = "์ •๊ธฐ ๊ฒฐ์ œ ์‹ ์ฒญํ•˜๊ธฐ API ์ž…๋‹ˆ๋‹ค.") - @CheckIdExist - @CheckRegularProject public CommonResponse regularDonation( @Parameter(hidden = true) @AuthenticationPrincipal User user, @Parameter(description = "์นด๋“œ id",example = "1") @PathVariable Long cardId, @@ -138,8 +116,6 @@ public CommonResponse regularDonation( @PostMapping("/pay/one/card/{cardId}/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, ProjectOneTimeErrorCode.class, DeleteCardErrorCode.class}) @Operation(summary = "04-06 Order๐Ÿ’ธ ๋นŒํ‚ค๋กœ ๋‹จ๊ธฐ ๊ฒฐ์ œ api #FRAME ๊ฒฐ์ œ ํ™”๋ฉด - ๋‹จ๊ธฐ ๊ฒฐ์ œ",description = "๋‹จ ๊ฒฐ์ œ ์‹ ์ฒญํ•˜๊ธฐ API ์ž…๋‹ˆ๋‹ค.") - @CheckIdExist - @CheckOneTimeProject public CommonResponse oneTimeDonationCard( @Parameter(hidden = true) @AuthenticationPrincipal User user, @Parameter(description = "์นด๋“œ id",example = "1") @PathVariable Long cardId, diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 0a6b65f9..84dd2092 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -2,12 +2,15 @@ import com.example.matchapi.order.dto.OrderReq; import com.example.matchapi.order.helper.OrderHelper; +import com.example.matchapi.portone.dto.PaymentReq; import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.donation.entity.*; -import com.example.matchdomain.donation.entity.enums.DonationStatus; -import com.example.matchdomain.donation.entity.enums.RegularStatus; +import com.example.matchdomain.donation.entity.enums.*; import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchinfrastructure.pay.nice.dto.*; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; +import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import static java.lang.Integer.parseInt; @@ -82,7 +85,6 @@ public UserCard UserCard(Long id, OrderReq.RegistrationCard registrationCard, Ni .expMonth(registrationCard.getExpMonth()) .idNo(registrationCard.getIdNo()) .cardPw(registrationCard.getCardPw()) - .cardCode(nicePayBillkeyResponse.getCardCode()) .cardName(nicePayBillkeyResponse.getCardName()) .orderId(nicePayBillkeyResponse.getOrderId()) .build(); @@ -132,4 +134,52 @@ public DonationUser donationBillUser(NiceBillOkResponse niceBillOkResponse, Long .regularPaymentId(regularPaymentId) .build(); } + + public DonationUser donationUserPortone(Payment payment, Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { + return DonationUser.builder() + .userId(userId) + .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) + .projectId(projectId) + .price((long) validatePayment.getAmount()) + .tid(payment.getImpUid()) + .orderId(payment.getMerchantUid()) + .donationStatus(DonationStatus.EXECUTION_BEFORE) + .payMethod(orderHelper.getPayMethod(payment.getPayMethod())) + .inherenceName(flameName) + .inherenceNumber(inherenceNumber) + .regularStatus(RegularStatus.ONE_TIME) + .build(); + } + + public UserCard UserBillCard(Long id, OrderReq.RegistrationCard registrationCard, PortOneBillResponse portOneBillResponse) { + return UserCard.builder() + .userId(id) + .bid(portOneBillResponse.getCustomer_uid()) + .cardNo(registrationCard.getCardNo()) + .expYear(registrationCard.getExpYear()) + .expMonth(registrationCard.getExpMonth()) + .idNo(registrationCard.getIdNo()) + .cardPw(registrationCard.getCardPw()) + .cardCode(CardCode.getNameByCode(portOneBillResponse.getCard_code())) + .cardName(portOneBillResponse.getCard_name()) + .customerId(portOneBillResponse.getCustomer_id()) + .cardAbleStatus(CardAbleStatus.ABLE) + .build(); + } + + public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id, Long amount, Long projectId, String flameName, String inherenceNumber, RegularStatus regularStatus, Long regularPaymentId) { + return DonationUser.builder() + .userId(id) + .projectId(projectId) + .price(amount) + .tid(response.getImp_uid()) + .orderId(response.getMerchant_uid()) + .donationStatus(DonationStatus.EXECUTION_BEFORE) + .payMethod(PayMethod.CARD) + .inherenceName(flameName) + .inherenceNumber(inherenceNumber) + .regularStatus(regularStatus) + .regularPaymentId(regularPaymentId) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java new file mode 100644 index 00000000..bba621ea --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java @@ -0,0 +1,35 @@ +package com.example.matchapi.order.helper; + +import org.apache.commons.codec.binary.Hex; +import org.springframework.stereotype.Service; + +import java.security.MessageDigest; + +@Service +public class DataEncrypt{ + MessageDigest md; + String strSRCData = ""; + String strENCData = ""; + String strOUTData = ""; + + public DataEncrypt(){ } + public String encrypt(String strData){ + String passACL = null; + MessageDigest md = null; + try{ + md = MessageDigest.getInstance("SHA-256"); + md.reset(); + md.update(strData.getBytes()); + byte[] raw = md.digest(); + passACL = encodeHex(raw); + }catch(Exception e){ + System.out.print("์•”ํ˜ธํ™” ์—๋Ÿฌ" + e.toString()); + } + return passACL; + } + + public String encodeHex(byte [] b){ + char [] c = Hex.encodeHex(b); + return new String(c); + } +} \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index fc6e2096..588c5fe9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -5,24 +5,37 @@ import com.example.matchapi.order.dto.OrderReq; import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.helper.OrderHelper; +import com.example.matchapi.portone.service.PaymentService; import com.example.matchcommon.exception.BadRequestException; +import com.example.matchcommon.exception.BaseException; import com.example.matchcommon.exception.InternalServerException; import com.example.matchcommon.exception.NotFoundException; import com.example.matchcommon.properties.NicePayProperties; import com.example.matchdomain.common.model.Status; import com.example.matchdomain.donation.entity.*; +import com.example.matchdomain.donation.entity.enums.CardAbleStatus; import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.RegularPayStatus; import com.example.matchdomain.donation.entity.enums.RegularStatus; import com.example.matchdomain.donation.repository.*; +import com.example.matchdomain.project.entity.Project; +import com.example.matchdomain.project.repository.ProjectRepository; import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchdomain.redis.repository.OrderRequestRepository; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.repository.UserRepository; import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; import com.example.matchinfrastructure.pay.nice.dto.*; +import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; +import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; import lombok.RequiredArgsConstructor; import org.apache.commons.codec.binary.Hex; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import javax.crypto.Cipher; @@ -31,20 +44,19 @@ import javax.crypto.spec.SecretKeySpec; import javax.transaction.Transactional; import javax.validation.Valid; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import static com.example.matchcommon.constants.MatchStatic.*; import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; import static com.example.matchdomain.donation.entity.enums.HistoryStatus.TURN_ON; -import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.CARD_NOT_CORRECT_USER; -import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.CARD_NOT_EXIST; +import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.*; import static com.example.matchdomain.donation.exception.DonationGerErrorCode.DONATION_NOT_EXIST; import static com.example.matchdomain.order.exception.RegistrationCardErrorCode.FAILED_ERROR_ENCRYPT; +import static com.example.matchdomain.project.exception.ProjectOneTimeErrorCode.PROJECT_NOT_EXIST; @RequiredArgsConstructor @Service @@ -61,35 +73,11 @@ public class OrderService { private final UserRepository userRepository; private final DonationHistoryRepository donationHistoryRepository; private final DonationConvertor donationConvertor; - - @Transactional - public NicePaymentAuth authPayment(String tid, Long amount) { - String authorizationHeader = orderHelper.getNicePaymentAuthorizationHeader(); - NicePaymentAuth nicePaymentAuth = niceAuthFeignClient.paymentAuth(authorizationHeader, tid, new NicePayRequest(String.valueOf(amount))); - - orderHelper.checkNicePaymentsResult(nicePaymentAuth.getResultCode(), nicePaymentAuth.getResultMsg()); - return nicePaymentAuth; - } - - @Transactional - public String payForProject(OrderReq.OrderDetail orderDetail) { - String authorizationHeader = orderHelper.getNicePaymentAuthorizationHeader(); - NicePaymentAuth nicePaymentAuth = niceAuthFeignClient.paymentAuth(authorizationHeader, orderDetail.getTid(), new NicePayRequest(String.valueOf(orderDetail.getAmount()))); - - orderHelper.checkNicePaymentsResult(nicePaymentAuth.getResultCode(), nicePaymentAuth.getResultMsg()); - - return null; - } - - - @Transactional - public NicePaymentAuth cancelPayment(String tid, String orderId) { - NicePaymentAuth nicePaymentAuth = niceAuthFeignClient.cancelPayment(orderHelper.getNicePaymentAuthorizationHeader(), tid, new NicePayCancelRequest("๋‹จ์ˆœ์ทจ์†Œ", orderId)); - - orderHelper.checkNicePaymentsResult(nicePaymentAuth.getResultCode(), nicePaymentAuth.getResultMsg()); - - return nicePaymentAuth; - } + private final PortOneFeignClient portOneFeignClient; + private final PortOneAuthService portOneAuthService; + private final PortOneConvertor portOneConvertor; + private final ProjectRepository projectRepository; + private final PaymentService paymentService; @Transactional public String requestPayment(User user, OrderReq.OrderDetail orderDetail, Long projectId) { @@ -109,52 +97,18 @@ public String requestPayment(User user, OrderReq.OrderDetail orderDetail, Long p return flameName; } - @Transactional - public void registrationCard(User user, OrderReq.RegistrationCard registrationCard) { - String encrypt = encrypt(orderConvertor.createPlainText(registrationCard), nicePayProperties.getSecret().substring(0, 32), nicePayProperties.getSecret().substring(0, 16)); - String orderId = BILL + createRandomOrderId(); - Long userId = user.getId(); - //๋นŒํ‚ค ๋ฐœ๊ธ‰ - NicePayBillkeyResponse nicePayBillkeyResponse = niceAuthFeignClient.registrationCard( - orderHelper.getNicePaymentAuthorizationHeader(), - new NicePayRegistrationCardRequest(encrypt, orderId, "A2")); - - //๋‚˜์ด์Šค ์นด๋“œ ํ™•์ธ์šฉ OrderId, Bid ํ•„์š” - NiceBillOkResponse niceBillOkResponse = niceAuthFeignClient.billOkRequest(orderHelper.getNicePaymentAuthorizationHeader(), nicePayBillkeyResponse.getBid(), orderConvertor.niceBillOk(nicePayBillkeyResponse, orderId)); - - //์—๋Ÿฌ์ฝ”๋“œ ํ•ธ๋“ค๋ง - orderHelper.checkBillResult(niceBillOkResponse.getResultCode(), niceBillOkResponse.getResultMsg(), niceBillOkResponse.getTid(), niceBillOkResponse.getOrderId()); - - //๊ฒฐ์ œ ์™„๋ฃŒ ํ›„ - //Billing Key ์นด๋“œ ์ €์žฅ - UserCard userCard = userCardRepository.save(orderConvertor.UserCard(userId, registrationCard, nicePayBillkeyResponse)); - - } - - @Transactional - public String encrypt(String plainText, String secretKey, String iv) { - SecretKey secureKey = new SecretKeySpec(secretKey.getBytes(), "AES"); - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes())); - byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8")); - return Hex.encodeHexString(encrypted); - } catch (Exception e) { - throw new InternalServerException(FAILED_ERROR_ENCRYPT); - } - } - @Transactional public String createRandomUUID() { return UUID.randomUUID().toString(); } - @Transactional - public String createRandomOrderId() { - return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + UUID.randomUUID().toString(); + public String createRandomId(){ + boolean useLetters = true; + boolean useNumbers = true; + String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; } - @Transactional public List getUserBillCard(Long userId) { List userCards = userCardRepository.findByUserIdAndStatus(userId,Status.ACTIVE); @@ -165,7 +119,7 @@ public List getUserBillCard(Long userId) { userBillCards.add( new OrderRes.UserBillCard( result.getId(), - result.getCardCode(), + result.getCardCode().getName(), result.getCardName(), orderHelper.maskMiddleNum(result.getCardNo()), result.getCardAbleStatus().getName() @@ -179,7 +133,7 @@ public List getUserBillCard(Long userId) { @Transactional public void deleteBillCard(Long cardId) { Optional userCard = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE); - NiceBillExpireResponse niceBillExpireResponse = niceAuthFeignClient.billKeyExpire(orderHelper.getNicePaymentAuthorizationHeader(), userCard.get().getBid(), new NiceBillExpireRequest(DELETE + createRandomOrderId())); + NiceBillExpireResponse niceBillExpireResponse = niceAuthFeignClient.billKeyExpire(orderHelper.getNicePaymentAuthorizationHeader(), userCard.get().getBid(), new NiceBillExpireRequest(DELETE + createRandomId())); System.out.println(niceBillExpireResponse.getResultCode() + niceBillExpireResponse.getResultMsg()); userCard.get().setStatus(Status.INACTIVE); } @@ -188,41 +142,47 @@ public void deleteBillCard(Long cardId) { @Transactional public void regularDonation(User user, OrderReq.RegularDonation regularDonation, Long cardId, Long projectId) { - Optional card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE); + UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); + if(!card.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); + Project project = projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, RegularStatus.REGULAR).orElseThrow(() ->new BadRequestException(PROJECT_NOT_EXIST)); - String orderId = REGULAR + createRandomOrderId(); + String orderId = REGULAR + createRandomId(); - NiceBillOkResponse niceBillOkResponse = niceAuthFeignClient.billOkRequest(orderHelper.getNicePaymentAuthorizationHeader(), card.get().getBid(), orderConvertor.billCardOneTime(regularDonation.getAmount(),orderId)); + String accessToken = portOneAuthService.getToken(); - orderHelper.checkNicePaymentsResult(niceBillOkResponse.getResultCode(), niceBillOkResponse.getResultMsg()); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), orderId, regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + + System.out.println(portOneResponse.getCode()); + System.out.println(portOneResponse.getMessage()); String flameName = orderHelper.createFlameName(user.getName()); String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); RegularPayment regularPayment = regularPaymentRepository.save(orderConvertor.RegularPayment(user.getId(), regularDonation, cardId, projectId)); - - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillUser(niceBillOkResponse, user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); - + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); donationHistoryRepository.save(donationConvertor.DonationHistoryTurnOn(regularPayment.getId(), TURN_ON)); donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); } @Transactional - public void oneTimeDonationCard(User user, OrderReq.@Valid OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { - Optional card = userCardRepository.findByIdAndStatus(cardId, Status.ACTIVE); + public void oneTimeDonationCard(User user, OrderReq. @Valid OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { + UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + + Project project = projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, RegularStatus.ONE_TIME).orElseThrow(() ->new BadRequestException(PROJECT_NOT_EXIST)); - String orderId = ONE_TIME + createRandomOrderId(); + String orderId = ONE_TIME + createRandomId(); - NiceBillOkResponse niceBillOkResponse = niceAuthFeignClient.billOkRequest(orderHelper.getNicePaymentAuthorizationHeader(), card.get().getBid(), orderConvertor.billCardOneTime(oneTimeDonation.getAmount(),orderId)); + String accessToken = portOneAuthService.getToken(); - orderHelper.checkNicePaymentsResult(niceBillOkResponse.getResultCode(), niceBillOkResponse.getResultMsg()); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), orderId, oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); String flameName = orderHelper.createFlameName(user.getName()); String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillUser(niceBillOkResponse, user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); @@ -230,29 +190,13 @@ public void oneTimeDonationCard(User user, OrderReq.@Valid OneTimeDonation oneTi @Transactional public String saveRequest(User user, Long projectId) { - String orderId = ONE_TIME + createRandomOrderId(); + String orderId = ONE_TIME + createRandomId(); orderRequestRepository.save(orderConvertor.CreateRequest(user.getId(), projectId, orderId)); return orderId; } - @Transactional - public String saveRequest(Long projectId) { - String orderId = ONE_TIME + createRandomOrderId(); - - orderRequestRepository.save(orderConvertor.CreateRequest(1L, projectId, orderId)); - - return orderId; - } - - @Transactional - public OrderRequest getOrderRequest(String orderId) { - Optional orderRequest = orderRequestRepository.findById(orderId); - return orderRequest.get(); - - } - @Transactional public void requestPaymentAuth(String tid, Long amount) { NicePaymentAuth nicePaymentAuth = niceAuthFeignClient. @@ -280,7 +224,7 @@ public void requestPaymentAuth(String tid, Long amount) { public void adminRefundDonation(Long donationUserId) { DonationUser donationUser = donationUserRepository.findById(donationUserId).orElseThrow(()-> new BadRequestException(DONATION_NOT_EXIST)); donationUser.setDonationStatus(DonationStatus.EXECUTION_REFUND); - cancelPayment(donationUser.getTid(), donationUser.getOrderId()); + paymentService.refundPayment(donationUser.getTid()); donationUserRepository.save(donationUser); } @@ -303,4 +247,40 @@ public void revokePay(User user, Long cardId) { regularPaymentRepository.saveAll(regularPayments); } + + public final synchronized String getyyyyMMddHHmmss(){ + SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss"); + return yyyyMMddHHmmss.format(new Date()); + } + + public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registrationCard) { + String accessToken = portOneAuthService.getToken(); + String customerUid = BILL + createRandomId(); + String cardNo = formatString(registrationCard.getCardNo(), 4); + String expiry = "20" + registrationCard.getExpYear() + "-" + registrationCard.getExpMonth(); + PortOneResponse portOneResponse = portOneFeignClient.getBillKey( + accessToken, + customerUid, + portOneConvertor.PortOneBill(cardNo, expiry, registrationCard.getIdNo(), registrationCard.getCardPw()) + ); + if(portOneResponse.getCode()!=0){ + throw new BaseException(HttpStatus.BAD_REQUEST, false, "PORT_ONE_BILL_AUTH_001", portOneResponse.getMessage()); + } + UserCard userCard = userCardRepository.save(orderConvertor.UserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); + + return portOneResponse.getResponse(); + } + + public static String formatString(String input, int length) { + StringBuilder formatted = new StringBuilder(); + + for (int i = 0; i < input.length(); i++) { + if (i > 0 && i % length == 0) { + formatted.append('-'); + } + formatted.append(input.charAt(i)); + } + + return formatted.toString(); + } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java b/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java new file mode 100644 index 00000000..414bb564 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java @@ -0,0 +1,31 @@ +package com.example.matchapi.portone.controller; + +import com.example.matchapi.portone.dto.PaymentReq; +import com.example.matchapi.portone.service.PaymentService; +import com.example.matchapi.project.dto.ProjectReq; +import com.example.matchcommon.reponse.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/payments") +@Tag(name = "08-PortOne๐Ÿ’ธ",description = "PortOne ๊ฒฐ์ œ API") +@RequiredArgsConstructor +public class PaymentController { + private final PaymentService paymentService; + @PostMapping("/validate") + @Operation(summary = "08-01 Payment ๊ฐ€๊ฒฉ ๊ฒ€์ฆ๐Ÿ’ธ") + public CommonResponse validatePayment(@RequestBody PaymentReq.ValidatePayment validatePayment){ + paymentService.checkPayment(validatePayment); + return CommonResponse.onSuccess("๊ฒฐ์ œ ์„ฑ๊ณต"); + } + + @PostMapping("/refund") + @Deprecated + public CommonResponse refundPayment(@RequestParam String impUid){ + paymentService.refundPayment(impUid); + return CommonResponse.onSuccess("ํ™˜๋ถˆ ์„ฑ๊ณต"); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/dto/PaymentReq.java b/Match-Api/src/main/java/com/example/matchapi/portone/dto/PaymentReq.java new file mode 100644 index 00000000..b5101d63 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/portone/dto/PaymentReq.java @@ -0,0 +1,17 @@ +package com.example.matchapi.portone.dto; + +import lombok.*; + +public class PaymentReq { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class ValidatePayment{ + private String impUid; + private String orderId; + private int amount; + private String payMethod; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java new file mode 100644 index 00000000..905651e6 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -0,0 +1,99 @@ +package com.example.matchapi.portone.service; + +import com.example.matchapi.order.convertor.OrderConvertor; +import com.example.matchapi.order.helper.OrderHelper; +import com.example.matchapi.portone.dto.PaymentReq; +import com.example.matchcommon.exception.BadRequestException; +import com.example.matchcommon.properties.PortOneProperties; +import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.redis.entity.OrderRequest; +import com.example.matchdomain.redis.repository.OrderRequestRepository; +import com.example.matchdomain.user.entity.User; +import com.example.matchdomain.user.repository.UserRepository; +import com.siot.IamportRestClient.IamportClient; +import com.siot.IamportRestClient.exception.IamportResponseException; +import com.siot.IamportRestClient.request.CancelData; +import com.siot.IamportRestClient.response.IamportResponse; +import com.siot.IamportRestClient.response.Payment; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Optional; +import java.util.UUID; + +import static com.example.matchdomain.order.exception.PortOneAuthErrorCode.*; + +@Service +@RequiredArgsConstructor +public class PaymentService { + private final PortOneProperties portOneProperties; + private final OrderRequestRepository orderRequestRepository; + private final UserRepository userRepository; + private final OrderHelper orderHelper; + private final DonationUserRepository donationUserRepository; + private final OrderConvertor orderConvertor; + private final IamportClient iamportClient; + + @Autowired + public PaymentService(PortOneProperties portOneProperties, + OrderRequestRepository orderRequestRepository, + UserRepository userRepository, + OrderHelper orderHelper, + DonationUserRepository donationUserRepository, + OrderConvertor orderConvertor) { + this.portOneProperties = portOneProperties; + this.orderRequestRepository = orderRequestRepository; + this.userRepository = userRepository; + this.orderHelper = orderHelper; + this.donationUserRepository = donationUserRepository; + this.orderConvertor = orderConvertor; + this.iamportClient = new IamportClient(portOneProperties.getKey(), portOneProperties.getSecret()); + } + + public void checkPayment(PaymentReq.ValidatePayment validatePayment){ + try { + OrderRequest orderRequest = orderRequestRepository.findById(validatePayment.getOrderId()).orElseThrow(()->new BadRequestException(NOT_EXIST_ORDER_ID)); + IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); + Optional user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE); + int paidAmount = payment.getResponse().getAmount().intValue(); //์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ œํ•œ ๊ธˆ์•ก + + if(paidAmount!=validatePayment.getAmount()){ + CancelData cancelData = createCancelData(payment, 0); + iamportClient.cancelPaymentByImpUid(cancelData); + throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); + }else{ + String flameName = orderHelper.createFlameName(user.get().getName()); + String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + donationUserRepository.save(orderConvertor.donationUserPortone(payment.getResponse(), user.get().getId(), validatePayment, Long.valueOf(orderRequest.getProjectId()), flameName, inherenceNumber)); + } + } catch (IamportResponseException | IOException e) { + System.out.println(e.getMessage()); + throw new BadRequestException(FAILED_ERROR_AUTH); + } + } + + public String createRandomUUID() { + return UUID.randomUUID().toString(); + } + + private CancelData createCancelData(IamportResponse response, int refundAmount) { + if (refundAmount == 0) { //์ „์•ก ํ™˜๋ถˆ์ผ ๊ฒฝ์šฐ + return new CancelData(response.getResponse().getImpUid(), true); + } + return new CancelData(response.getResponse().getImpUid(), true, new BigDecimal(refundAmount)); + } + + public void refundPayment(String impUid) { + try { + iamportClient.cancelPaymentByImpUid(new CancelData(impUid, true)); + } catch (IamportResponseException | IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java b/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java index 435c87ba..6c7b96ef 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java +++ b/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java @@ -4,6 +4,7 @@ import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.properties.JwtProperties; import com.example.matchdomain.redis.entity.AccessToken; +import com.example.matchdomain.redis.entity.RefreshToken; import com.example.matchdomain.redis.repository.AccessTokenRepository; import com.example.matchdomain.redis.repository.RefreshTokenRepository; import com.example.matchdomain.user.entity.User; @@ -101,7 +102,7 @@ public UserRes.Token createTokens(Long userId){ .signWith(encodedRefreshKey) .compact(); - //refreshTokenRepository.save(userConvertor.RefreshToken(userId,refreshToken,jwtProperties.getRefreshTokenSeconds())); + refreshTokenRepository.save(RefreshToken.builder().userId(userId.toString()).token(refreshToken).ttl(jwtProperties.getRefreshTokenSeconds()).build()); return new UserRes.Token(accessToken,refreshToken); } diff --git a/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java b/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java index 28c72081..d83d6cfa 100644 --- a/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java +++ b/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java @@ -4,10 +4,12 @@ import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.DonationStatus; +import com.example.matchdomain.donation.entity.enums.PayMethod; import com.example.matchdomain.donation.entity.enums.PaymentStatus; import com.example.matchdomain.donation.entity.enums.RegularStatus; import com.example.matchinfrastructure.pay.nice.dto.NiceBillOkRequest; import com.example.matchinfrastructure.pay.nice.dto.NiceBillOkResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; import lombok.RequiredArgsConstructor; import java.time.LocalDateTime; @@ -28,14 +30,14 @@ public NiceBillOkRequest niceBillRequest(RegularPayment regularPayment, String o .build(); } - public DonationUser donationUser(NiceBillOkResponse niceBillOkResponse, Long userId, String flameName, String inherenceNumber, Long projectId, Long regularPaymentId) { + public DonationUser donationUser(PortOneBillPayResponse response, Long userId, String flameName, String inherenceNumber, Long projectId, Long regularPaymentId) { return DonationUser.builder() .userId(userId) - .price(niceBillOkResponse.getAmount()) - .tid(niceBillOkResponse.getTid()) - .orderId(niceBillOkResponse.getOrderId()) + .price(Long.valueOf(response.getAmount())) + .tid(response.getImp_uid()) + .orderId(response.getMerchant_uid()) .donationStatus(DonationStatus.EXECUTION_BEFORE) - .payMethod(orderHelper.getPayMethod(niceBillOkResponse.getPayMethod())) + .payMethod(PayMethod.CARD) .inherenceName(flameName) .inherenceNumber(inherenceNumber) .regularStatus(RegularStatus.REGULAR) diff --git a/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java b/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java index ae86e6ad..e7b54e47 100644 --- a/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java +++ b/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java @@ -14,8 +14,14 @@ import com.example.matchinfrastructure.discord.convertor.DiscordConvertor; import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; import com.example.matchinfrastructure.pay.nice.dto.NiceBillOkResponse; +import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; +import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Service; import javax.transaction.Transactional; @@ -33,7 +39,6 @@ @RequiredArgsConstructor @Slf4j public class OrderService { - private final NiceAuthFeignClient niceAuthFeignClient; private final RegularPaymentRepository regularPaymentRepository; private final OrderHelper orderHelper; private final OrderConvertor orderConvertor; @@ -43,6 +48,9 @@ public class OrderService { private final DiscordConvertor discordConvertor; private final DonationHistoryRepository donationHistoryRepository; private final DonationConvertor donationConvertor; + private final PortOneFeignClient portOneFeignClient; + private final PortOneAuthService portOneAuthService; + private final PortOneConvertor portOneConvertor; @Transactional public void regularDonationPayment() { @@ -58,7 +66,7 @@ public void regularDonationPayment() { discordFeignClient.alertMessage(discordConvertor.AlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์‹œ์ž‘", regularPayments.size())); - + String accessToken = portOneAuthService.getTokens(); if (regularPayments.size() > 0) { LocalDate currentDate = LocalDate.now(); @@ -70,28 +78,26 @@ public void regularDonationPayment() { } else{ trueCnt +=1 ; - + UserCard userCard = regularPayment.getUserCard(); Long userId = regularPayment.getUserId(); - NiceBillOkResponse niceBillOkResponse = niceAuthFeignClient.billOkRequest(orderHelper.getNicePaymentAuthorizationHeader(), - regularPayment.getUserCard().getBid(), - orderConvertor.niceBillRequest(regularPayment, REGULAR + createRandomOrderId())); - if (niceBillOkResponse.getResultCode().equals("0000")) { - String flameName = orderHelper.createFlameName(regularPayment.getUser().getName()); - - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationUser(niceBillOkResponse, userId, flameName, inherenceNumber, regularPayment.getProjectId(),regularPayment.getId())); - donationHistories.add(donationConvertor.DonationHistory(donationUser.getId(), CREATE )); - - requestPaymentHistories.add(orderConvertor.RegularHistory(niceBillOkResponse, userId, COMPLETE, "SUCCESS",regularPayment.getId(), regularPayment.getPayDate(),regularPayment.getUserCardId())); - log.info("success Payment " + "userId :" + regularPayment.getUserId() + " orderId : " + niceBillOkResponse.getOrderId() + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount() + "์› projectId :" + regularPayment.getProjectId()); - amount += regularPayment.getAmount(); - successCnt += 1; - } else { - requestPaymentHistories.add(orderConvertor.RegularHistory(niceBillOkResponse, userId, FAIL, niceBillOkResponse.getResultMsg(), regularPayment.getId(), regularPayment.getPayDate(), regularPayment.getUserCardId())); - - log.info("fail Payment " + "userId :" + regularPayment.getUserId() + " orderId : " + niceBillOkResponse.getOrderId() + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount()); - } + + String orderId = REGULAR + createRandomOrderId(); + + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); + + + String flameName = orderHelper.createFlameName(regularPayment.getUser().getName()); + + String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationUser(portOneResponse.getResponse(), userId, flameName, inherenceNumber, regularPayment.getProjectId(),regularPayment.getId())); + donationHistories.add(donationConvertor.DonationHistory(donationUser.getId(), CREATE )); + + //requestPaymentHistories.add(orderConvertor.RegularHistory(niceBillOkResponse, userId, COMPLETE, "SUCCESS",regularPayment.getId(), regularPayment.getPayDate(),regularPayment.getUserCardId())); + log.info("success Payment " + "userId :" + regularPayment.getUserId() + " orderId : " + orderId + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount() + "์› projectId :" + regularPayment.getProjectId()); + amount += regularPayment.getAmount(); + successCnt += 1; + } } donationHistoryRepository.saveAll(donationHistories); @@ -131,8 +137,11 @@ public String createRandomUUID() { @Transactional public String createRandomOrderId() { - return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + UUID.randomUUID().toString(); + boolean useLetters = true; + boolean useNumbers = true; + String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; } @Transactional @@ -146,33 +155,32 @@ public void regularPaymentRetry() { int amount = 0; int trueCnt = 0; int successCnt = 0 ; - + String accessToken = portOneAuthService.getTokens(); discordFeignClient.alertMessage(discordConvertor.AlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์‹คํŒจ ํ•œ ๋ฆฌ์ŠคํŠธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹œ์ž‘", requestPaymentHistories.size())); for(RequestPaymentHistory requestPaymentHistory : requestPaymentHistories){ RegularPayment regularPayment = requestPaymentHistory.getRegularPayment(); UserCard userCard = requestPaymentHistory.getUserCard(); - NiceBillOkResponse niceBillOkResponse = niceAuthFeignClient.billOkRequest(orderHelper.getNicePaymentAuthorizationHeader(), - userCard.getBid(), - orderConvertor.niceBillRequest(requestPaymentHistory.getRegularPayment(), REGULAR + createRandomOrderId())); + String orderId = REGULAR + createRandomOrderId(); + + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); + trueCnt +=1 ; - if (niceBillOkResponse.getResultCode().equals("0000")) { - String flameName = orderHelper.createFlameName(requestPaymentHistory.getUser().getName()); + String flameName = orderHelper.createFlameName(requestPaymentHistory.getUser().getName()); - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - donationUsers.add(orderConvertor.donationUser(niceBillOkResponse, requestPaymentHistory.getUserId(), flameName, inherenceNumber, regularPayment.getProjectId(), regularPayment.getId())); + donationUsers.add(orderConvertor.donationUser(portOneResponse.getResponse(), requestPaymentHistory.getUserId(), flameName, inherenceNumber, regularPayment.getProjectId(), regularPayment.getId())); - requestPaymentHistory.setPaymentStatus(COMPLETE); - amount += regularPayment.getAmount(); - successCnt +=1; + requestPaymentHistory.setPaymentStatus(COMPLETE); + + amount += regularPayment.getAmount(); + successCnt +=1; + + log.info("success Payment Retry historyId: " + requestPaymentHistory.getId()+" userId :" + regularPayment.getUserId() + " orderId : " + orderId + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount() + "์› projectId :" + regularPayment.getProjectId()); - log.info("success Payment Retry historyId: " + requestPaymentHistory.getId()+" userId :" + regularPayment.getUserId() + " orderId : " + niceBillOkResponse.getOrderId() + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount() + "์› projectId :" + regularPayment.getProjectId()); - } else { - log.info("fail Payment Retry historyId: " + requestPaymentHistory.getId()+ " userId :" + regularPayment.getUserId() + " orderId : " + niceBillOkResponse.getOrderId() + " bid :" + regularPayment.getUserCard().getBid() + " amount :" + regularPayment.getAmount()); - } } donationUserRepository.saveAll(donationUsers); diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/ConfigurationPropertiesConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/ConfigurationPropertiesConfig.java index 2d48b2cc..58ef4ff5 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/config/ConfigurationPropertiesConfig.java +++ b/Match-Common/src/main/java/com/example/matchcommon/config/ConfigurationPropertiesConfig.java @@ -18,7 +18,8 @@ EmailPasswordProperties.class, MatchAligoUrl.class, ServerHostProperties.class, - WebReturnUrl.class + WebReturnUrl.class, + PortOneProperties.class }) @Configuration public class ConfigurationPropertiesConfig {} diff --git a/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java b/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java index 4499859b..e78b5afa 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java +++ b/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java @@ -25,5 +25,7 @@ public class MatchStatic { public static final String MATCH_NAME = "๋งค์น˜"; + public static final String PORT_ONE = "port_one"; + } diff --git a/Match-Common/src/main/java/com/example/matchcommon/properties/NicePayProperties.java b/Match-Common/src/main/java/com/example/matchcommon/properties/NicePayProperties.java index 0890eb8b..5122c509 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/properties/NicePayProperties.java +++ b/Match-Common/src/main/java/com/example/matchcommon/properties/NicePayProperties.java @@ -18,5 +18,7 @@ public class NicePayProperties { private String secret; private String client; private String url; + private String mid; + private String key; } diff --git a/Match-Common/src/main/java/com/example/matchcommon/properties/PortOneProperties.java b/Match-Common/src/main/java/com/example/matchcommon/properties/PortOneProperties.java new file mode 100644 index 00000000..12cbb780 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/properties/PortOneProperties.java @@ -0,0 +1,21 @@ +package com.example.matchcommon.properties; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.ConstructorBinding; +import org.springframework.stereotype.Component; + +@Getter +@Setter +@RequiredArgsConstructor +@ConstructorBinding +@Component +@ConfigurationProperties("portone") +public class PortOneProperties { + private String code; + private String key; + private String secret; + private String billmid; +} diff --git a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QUserCard.java b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QUserCard.java index 278a0789..44e5fd69 100644 --- a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QUserCard.java +++ b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QUserCard.java @@ -28,7 +28,7 @@ public class QUserCard extends EntityPathBase { public final EnumPath cardAbleStatus = createEnum("cardAbleStatus", com.example.matchdomain.donation.entity.enums.CardAbleStatus.class); - public final StringPath cardCode = createString("cardCode"); + public final EnumPath cardCode = createEnum("cardCode", com.example.matchdomain.donation.entity.enums.CardCode.class); public final StringPath cardName = createString("cardName"); @@ -39,6 +39,8 @@ public class QUserCard extends EntityPathBase { //inherited public final DateTimePath createdAt = _super.createdAt; + public final StringPath customerId = createString("customerId"); + public final StringPath expMonth = createString("expMonth"); public final StringPath expYear = createString("expYear"); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/UserCard.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/UserCard.java index 636f2a36..b717afe3 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/UserCard.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/UserCard.java @@ -2,6 +2,7 @@ import com.example.matchdomain.common.model.BaseEntity; import com.example.matchdomain.donation.entity.enums.CardAbleStatus; +import com.example.matchdomain.donation.entity.enums.CardCode; import com.example.matchdomain.user.entity.User; import lombok.*; import org.hibernate.annotations.DynamicInsert; @@ -42,6 +43,8 @@ public class UserCard extends BaseEntity { //๋นŒํ‚ค ๋ฒˆํ˜ธ private String bid; + private String customerId; + private String cardNo; private String expYear; @@ -52,7 +55,7 @@ public class UserCard extends BaseEntity { private String cardPw; - private String cardCode; + private CardCode cardCode; private String cardName; diff --git a/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java new file mode 100644 index 00000000..8dff2328 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java @@ -0,0 +1,44 @@ +package com.example.matchdomain.order.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.Objects; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +@Getter +@AllArgsConstructor +public enum PortOneAuthErrorCode implements BaseErrorCode { + FAILED_ERROR_AUTH_AMOUNT(BAD_REQUEST,"ORDER_001", "์ฃผ๋ฌธ ๊ฐ€๊ฒฉ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + NOT_EXIST_ORDER_ID(BAD_REQUEST,"ORDER_002", "์ฃผ๋ฌธ ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + FAILED_ERROR_AUTH(INTERNAL_SERVER_ERROR,"ORDER_003", "๊ฒฐ์ œ์š”์ฒญ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().message(message).code(code).isSuccess(false).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} \ No newline at end of file diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java index aadb7744..93dd93ec 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java @@ -202,6 +202,8 @@ Page findTodayProject(@Param("userId") Long userId, @Param("project "GROUP BY P.id ", nativeQuery = true) ProjectDetail getProjectAppDetail(@Param("userId") Long userId, @Param("projectId") Long projectId); + Optional findByIdAndStatusAndRegularStatus(Long projectId, Status status, RegularStatus regular); + interface ProjectList { Long getId(); String getImgUrl(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java b/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java index 09536e9c..bd2c2a4d 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java @@ -19,6 +19,7 @@ public class OrderRequest { private String projectId; + @TimeToLive private long ttl; diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/config/DiscordInfoConfig.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/config/DiscordInfoConfig.java index c2f4c8bf..f219da0d 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/config/DiscordInfoConfig.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/config/DiscordInfoConfig.java @@ -1,6 +1,5 @@ package com.example.matchinfrastructure.discord.config; -import com.example.matchinfrastructure.oauth.kakao.config.KakaoInfoErrorDecoder; import feign.codec.Encoder; import feign.codec.ErrorDecoder; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java new file mode 100644 index 00000000..be91a0d0 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java @@ -0,0 +1,39 @@ +package com.example.matchinfrastructure.pay.portone.client; + +import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserAddressDto; +import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserInfoDto; +import com.example.matchinfrastructure.pay.portone.config.PortOneFeignConfiguration; +import com.example.matchinfrastructure.pay.portone.config.PortOneInfoConfig; +import com.example.matchinfrastructure.pay.portone.config.PortOneInfoErrorDecoder; +import com.example.matchinfrastructure.pay.portone.dto.PortOneAuth; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.dto.req.PayWithBillKeyReq; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOneAuthReq; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOneBillReq; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.*; + +@FeignClient( + name = "PortOneFeignClient", + url = "https://api.iamport.kr", + configuration = PortOneInfoErrorDecoder.class) +@Component +public interface PortOneFeignClient { + @PostMapping("/users/getToken") + public PortOneResponse getAccessToken(@RequestBody PortOneAuthReq portOneAuthReq); + + @PostMapping("/subscribe/customers/{customer_uid}") + public PortOneResponse getBillKey( + @RequestHeader("Authorization") String accessToken, + @PathVariable("customer_uid") String customer_uid, + @RequestBody PortOneBillReq portOneBillReq); + + @PostMapping("/subscribe/payments/again") + public PortOneResponse payWithBillKey( + @RequestHeader("Authorization") String accessToken, + @RequestBody PayWithBillKeyReq payWithBillKeyReq + ); +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneFeignConfiguration.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneFeignConfiguration.java new file mode 100644 index 00000000..2384b859 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneFeignConfiguration.java @@ -0,0 +1,24 @@ +package com.example.matchinfrastructure.pay.portone.config; + +import feign.Logger; +import feign.RequestInterceptor; +import feign.codec.ErrorDecoder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@Import(PortOneInfoErrorDecoder.class) +public class PortOneFeignConfiguration { + @Bean + public RequestInterceptor requestInterceptor() { + return template -> template.header("Content-Type", "application/json"); + } + @Bean + public ErrorDecoder errorDecoder() { + return new PortOneInfoErrorDecoder(); + } + + @Bean + Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoConfig.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoConfig.java new file mode 100644 index 00000000..789c8f75 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoConfig.java @@ -0,0 +1,23 @@ +package com.example.matchinfrastructure.pay.portone.config; + + +import feign.codec.Encoder; +import feign.codec.ErrorDecoder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@Import(PortOneInfoErrorDecoder.class) +public class PortOneInfoConfig { + + @Bean + @ConditionalOnMissingBean(value = ErrorDecoder.class) + public PortOneInfoErrorDecoder commonFeignErrorDecoder() { + return new PortOneInfoErrorDecoder(); + } + + @Bean + Encoder formEncoder() { + return new feign.form.FormEncoder(); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoErrorDecoder.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoErrorDecoder.java new file mode 100644 index 00000000..d0e25bf4 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/config/PortOneInfoErrorDecoder.java @@ -0,0 +1,72 @@ +package com.example.matchinfrastructure.pay.portone.config; + + +import com.example.matchcommon.exception.OtherServerException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import feign.FeignException; +import feign.Response; +import feign.codec.ErrorDecoder; +import lombok.SneakyThrows; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static com.example.matchcommon.exception.errorcode.OtherServerErrorCode.*; + +public class PortOneInfoErrorDecoder implements ErrorDecoder { + + @Override + public Exception decode(String methodKey, Response response) { + InputStream responseBodyStream = null; + try { + responseBodyStream = response.body().asInputStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + String responseBody = null; + try { + responseBody = convertInputStreamToString(responseBodyStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = null; + try { + jsonNode = objectMapper.readTree(responseBody); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + System.out.println("์—๋Ÿฌ ๋””์ฝ”๋”ฉ"); + System.out.println(jsonNode); + + if (response.status() >= 400) { + switch (response.status()) { + case 401: + throw new OtherServerException(OTHER_SERVER_UNAUTHORIZED); + case 403: + throw new OtherServerException(OTHER_SERVER_FORBIDDEN); + case 419: + throw new OtherServerException(OTHER_SERVER_EXPIRED_TOKEN); + default: + throw new OtherServerException(OTHER_SERVER_BAD_REQUEST); + } + } + + return FeignException.errorStatus(methodKey, response); + } + + private String convertInputStreamToString(InputStream inputStream) throws IOException { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + return result.toString("UTF-8"); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java new file mode 100644 index 00000000..a4f3bef6 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java @@ -0,0 +1,33 @@ +package com.example.matchinfrastructure.pay.portone.convertor; + +import com.example.matchcommon.annotation.Convertor; +import com.example.matchcommon.properties.PortOneProperties; +import com.example.matchinfrastructure.pay.portone.dto.req.PayWithBillKeyReq; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOneBillReq; +import lombok.RequiredArgsConstructor; + +@Convertor +@RequiredArgsConstructor +public class PortOneConvertor { + private final PortOneProperties portOneProperties; + public PortOneBillReq PortOneBill(String cardNo, String expiry, String idNo, String cardPw) { + return PortOneBillReq + .builder() + .pg("nice."+portOneProperties.getBillmid()) + .card_number(cardNo) + .expiry(expiry) + .birth(idNo) + .pwd_2digit(cardPw) + .build(); + } + + public PayWithBillKeyReq PayWithBillKey(String bid, String orderId, Long amount, String projectName, String customerId) { + return PayWithBillKeyReq + .builder() + .customer_uid(bid) + .merchant_uid(orderId) + .amount(amount) + .name(projectName) + .build(); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneAuth.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneAuth.java new file mode 100644 index 00000000..01808404 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneAuth.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOneAuth { + private String access_token; + private Long expired_at; + private Long now; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillPayResponse.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillPayResponse.java new file mode 100644 index 00000000..59325039 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillPayResponse.java @@ -0,0 +1,70 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@RequiredArgsConstructor +public class PortOneBillPayResponse { + private String imp_uid; + private String merchant_uid; + private String pay_method; + private String channel; + private String pg_provider; + private String emb_pg_provider; + private String pg_tid; + private String pg_id; + private boolean escrow; + private String apply_num; + private String bank_code; + private String bank_name; + private String card_code; + private String card_name; + private int card_quota; + private String card_number; + private int card_type; + private String vbank_code; + private String vbank_name; + private String vbank_num; + private String vbank_holder; + private int vbank_date; + private int vbank_issued_at; + private String name; + private int amount; + private int cancel_amount; + private String currency; + private String buyer_name; + private String buyer_email; + private String buyer_tel; + private String buyer_addr; + private String buyer_postcode; + private String custom_data; + private String user_agent; + private String status; + private int started_at; + private int paid_at; + private int failed_at; + private int cancelled_at; + private String fail_reason; + private String cancel_reason; + private String receipt_url; + private boolean cash_receipt_issued; + private String customer_uid; + private String customer_uid_usage; + private List cancel_history; + private List cancel_receipt_urls; + + public static class CancelHistory { + private String pg_tid; + private int amount; + private int cancelled_at; + private String reason; + private String receipt_url; + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillResponse.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillResponse.java new file mode 100644 index 00000000..84e711b5 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillResponse.java @@ -0,0 +1,26 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOneBillResponse { + private String customer_uid; + private String pg_provider; + private String pg_id; + private String customer_id; + private String card_name; + private String card_code; + private String card_number; + private int card_type; + private String customer_name; + private String customer_tel; + private String customer_email; + private String customer_addr; + private String customer_postcode; + private int inserted; + private int updated; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneResponse.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneResponse.java new file mode 100644 index 00000000..73a9a465 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneResponse.java @@ -0,0 +1,32 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class PortOneResponse { + @SerializedName("code") + int code; + + @SerializedName("message") + String message; + + @SerializedName("response") + T response; + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public T getResponse() { + return response; + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PayWithBillKeyReq.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PayWithBillKeyReq.java new file mode 100644 index 00000000..25d78848 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PayWithBillKeyReq.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.pay.portone.dto.req; + +import lombok.*; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PayWithBillKeyReq { + private String customer_uid; + private String merchant_uid; + private double amount; + private String name; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneAuthReq.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneAuthReq.java new file mode 100644 index 00000000..a989fe98 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneAuthReq.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.pay.portone.dto.req; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOneAuthReq { + private String imp_key; + + private String imp_secret; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneBillReq.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneBillReq.java new file mode 100644 index 00000000..197cd3a9 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOneBillReq.java @@ -0,0 +1,16 @@ +package com.example.matchinfrastructure.pay.portone.dto.req; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOneBillReq { + private String pg; + private String card_number; + private String expiry; + private String birth; + private String pwd_2digit; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java new file mode 100644 index 00000000..28117605 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java @@ -0,0 +1,52 @@ +package com.example.matchinfrastructure.pay.portone.service; + +import com.example.matchcommon.properties.PortOneProperties; +import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; +import com.example.matchinfrastructure.pay.portone.dto.PortOneAuth; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOneAuthReq; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PortOneAuthService { + private final PortOneFeignClient portOneFeignClient; + private final PortOneProperties portOneProperties; + + public String getToken() { + String token = fetchPortOneToken(); + System.out.println(token); + return token; + } + + @CachePut(value = "portOneTokenCache") + public String fetchPortOneToken() { + PortOneResponse portOneResponse = portOneFeignClient.getAccessToken(PortOneAuthReq.builder().imp_key(portOneProperties.getKey()).imp_secret(portOneProperties.getSecret()).build()); + return portOneResponse.getResponse().getAccess_token(); + } + + @CachePut(value = "portOneTokenCache") + public String refreshToken() { + String newToken = fetchPortOneToken(); + System.out.println("refresh Token"); + return newToken; + } + + //@Scheduled(fixedRate = 100) + @Scheduled(fixedRate = 1700000) // 30๋ถ„๋งˆ๋‹ค ์‹คํ–‰ (1800์ดˆ) + public void scheduleTokenRefresh() { + System.out.println("refresh token Schedule"); + String refreshToken = refreshToken(); + } + + public String getTokens() { + PortOneResponse portOneResponse = portOneFeignClient.getAccessToken(PortOneAuthReq.builder().imp_key(portOneProperties.getKey()).imp_secret(portOneProperties.getSecret()).build()); + return portOneResponse.getResponse().getAccess_token(); + } +} + From fa1d08ab9111200784b363aac4e1996cfdc61685 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:34:32 +0900 Subject: [PATCH 02/82] =?UTF-8?q?:recycle:=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=EC=88=9C=20-=20=EC=B6=94=EC=B2=9C=EC=88=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=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 --- .../project/controller/ProjectController.java | 8 +- .../matchapi/project/enums/FILTER.java | 5 ++ .../project/service/ProjectService.java | 47 +++++++---- .../project/repository/ProjectRepository.java | 84 +++++++++++++++++++ 4 files changed, 127 insertions(+), 17 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java diff --git a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java index 0a6a7717..12d7e6e5 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java @@ -4,6 +4,7 @@ import com.example.matchapi.donation.service.DonationService; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; +import com.example.matchapi.project.enums.FILTER; import com.example.matchapi.project.service.ProjectService; import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.exception.errorcode.RequestErrorCode; @@ -91,10 +92,11 @@ public CommonResponse>> getProjectLis @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = true, defaultValue = "0") @Min(value = 0) int page, @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = true, defaultValue = "10") int size, @Parameter(description = "ํ›„์›์ข…๋ฅ˜") @RequestParam(required = false)ProjectKind projectKind, - @Parameter(description = "๊ฒ€์ƒ‰์–ด") @RequestParam(required = false) String content - ) { + @Parameter(description = "๊ฒ€์ƒ‰์–ด") @RequestParam(required = false) String content, + @Parameter(description = "ํ•„ํ„ฐ์ข…๋ฅ˜ \n์ตœ์‹ ์ˆœ = LATEST \n์ถ”์ฒœ์ˆœ RECOMMEND ") @RequestParam(required = false, defaultValue = "LATEST") FILTER filter + ) { log.info("03-05 ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ"); - return CommonResponse.onSuccess(projectService.getProjectLists(user, page, size, projectKind, content)); + return CommonResponse.onSuccess(projectService.getProjectLists(user, page, size, projectKind, content, filter)); } @Operation(summary = "03-06๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ด€์‹ฌ์„ค์ •/๊ด€์‹ฌ์‚ญ์ œ API #FRAME_ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ.",description = "ํ”„๋กœ์ ํŠธ ๊ด€์‹ฌ ์„ค์ •/์‚ญ์ œ API ์ž…๋‹ˆ๋‹ค.") diff --git a/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java b/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java new file mode 100644 index 00000000..94b03156 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java @@ -0,0 +1,5 @@ +package com.example.matchapi.project.enums; + +public enum FILTER { + RECOMMEND, LATEST +} diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index 56ed0877..adfcc6fe 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -3,6 +3,7 @@ import com.example.matchapi.project.convertor.ProjectConvertor; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; +import com.example.matchapi.project.enums.FILTER; import com.example.matchapi.user.helper.AuthHelper; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.NotFoundException; @@ -309,28 +310,46 @@ public void patchProjectActive(Long projectId) { projectRepository.save(project); } - public PageResponse> getProjectLists(User user, int page, int size, ProjectKind projectKind, String content) { + public PageResponse> getProjectLists(User user, int page, int size, ProjectKind projectKind, String content, FILTER filter) { Pageable pageable = PageRequest.of(page, size); Page projects = null; List project = new ArrayList<>(); - if(projectKind == null){ - if(content == null){ - projects = projectRepository.findLoginUserProjectList(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); - } - else{ - projects = projectRepository.findByContent(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); + if(filter == FILTER.RECOMMEND) { + if (projectKind == null) { + if (content == null) { + projects = projectRepository.findLoginUserProjectList(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); + } else { + projects = projectRepository.findByContent(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); + } + } else { + if (content == null) { + projects = projectRepository.findByProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); + + } else { + projects = projectRepository.findByContentAndProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); + } } }else{ - if(content == null){ - projects = projectRepository.findByProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); + if (projectKind == null) { + if (content == null) { + projects = projectRepository.findLoginUserProjectListLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); + } else { + projects = projectRepository.findByContentLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); - } - else{ - projects = projectRepository.findByContentAndProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); + } + } else { + if (content == null) { + projects = projectRepository.findByProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); + + } else { + projects = projectRepository.findByContentAndProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); + } } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java index 93dd93ec..1da1607f 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java @@ -95,6 +95,38 @@ Page searchProjectLoginUser(@Param("userId") Long userId, @Param("c Page findLoginUserProjectList(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status); + @Query(value = "SELECT\n" + + " P.id as 'id',\n" + + " P.usages as 'usages',\n" + + " P.projectKind as 'projectKind',\n" + + " viewCnt,\n" + + " P.projectName as 'projectName',\n" + + " PI.url as 'imgUrl',\n" + + " IF((\n" + + " SELECT EXISTS (\n" + + " SELECT *\n" + + " FROM ProjectUserAttention PUA\n" + + " WHERE PUA.userId = :userId\n" + + " AND P.id = PUA.projectId\n" + + " )\n" + + " ), 'true', 'false') AS 'like',\n" + + "GROUP_CONCAT(U.profileImgUrl SEPARATOR ',') AS 'imgUrlList', \n" + + " COUNT(RP.id) AS 'totalDonationCnt'\n" + + "FROM Project P\n" + + "JOIN ProjectImage PI ON P.id = PI.projectId\n" + + "LEFT JOIN RegularPayment RP ON RP.projectId = P.id AND RP.regularPayStatus = 'PROCEEDING'\n" + + "left join User U on U.id = RP.userId " + + "WHERE PI.imageRepresentStatus = :imageRepresentStatus\n" + + "AND P.projectStatus = :projectStatus\n" + + "AND P.finishedAt >= :now\n" + + "AND P.status = :status\n" + + "GROUP BY P.id\n" + + "ORDER BY P.createdAt DESC" + , nativeQuery = true + , countQuery = "select * from Project where projectStatus = :projectStatus and finishedAt = :now and status = :status") + Page findLoginUserProjectListLatest(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, + @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status); + @Query(value = "select P.id'projectId', " + "P.projectName, " + "usages," + @@ -122,6 +154,19 @@ Page findLoginUserProjectList(@Param("userId") Long userId, @Param( , countQuery = "select * from Project where projectStatus = :projectStatus and finishedAt = :now and status = :status and projectKind = :projectKind") Page findByProjectKind(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, @Param("projectKind") String projectKind); + + @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + + "P.projectName as 'projectName', PI.url as 'imgUrl', " + + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + + "GROUP_CONCAT(U.profileImgUrl SEPARATOR ',') AS 'imgUrlList', \n" + + "count(RP.id)'totalDonationCnt' \n" + + "from Project P join ProjectImage PI on P.id = PI.projectId left join RegularPayment RP on RP.projectId=P.id and RP.regularPayStatus = 'PROCEEDING' " + + "left join User U on U.id = RP.userId " + + "where PI.imageRepresentStatus = :imageRepresentStatus and P.projectStatus = :projectStatus and P.finishedAt>=:now and P.status = :status and P.projectKind =:projectKind group by P.id order by P.createdAt desc" + , nativeQuery = true + , countQuery = "select * from Project where projectStatus = :projectStatus and finishedAt = :now and status = :status and projectKind = :projectKind") + Page findByProjectKindLatest(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, + @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, @Param("projectKind") String projectKind); @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + "P.projectName as 'projectName', PI.url as 'imgUrl', " + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + @@ -140,6 +185,25 @@ Page findByProjectKind(@Param("userId") Long userId, @Param("projec Page findByContentAndProjectKind(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, @Param("projectKind") String projectKind, @Param("content") String content); + + @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + + "P.projectName as 'projectName', PI.url as 'imgUrl', " + + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + + "GROUP_CONCAT(U.profileImgUrl SEPARATOR ',') AS 'imgUrlList', \n" + + "count(RP.id)'totalDonationCnt' \n" + + "from Project P join ProjectImage PI on P.id = PI.projectId " + + "left join RegularPayment RP on RP.projectId=P.id and RP.regularPayStatus = 'PROCEEDING' " + + "left join User U on U.id = RP.userId " + + "where PI.imageRepresentStatus = :imageRepresentStatus and P.projectStatus = :projectStatus and P.finishedAt>=:now and P.status = :status and P.projectKind =:projectKind " + + " and (P.projectName LIKE concat('%',:content,'%') OR P.projectExplanation " + + " LIKE concat('%',:content,'%') OR P.usages LIKE concat('%',:content,'%') OR P.searchKeyword LIKE concat('%',:content,'%')) group by P.id order by P.createdAt desc" + , nativeQuery = true + , countQuery = "select * from Project where projectStatus = :projectStatus and finishedAt = :now and status = :status and projectKind = :projectKind " + + "and (projectName LIKE concat('%',:content,'%') OR projectExplanation LIKE concat('%',:content,'%') " + + "OR usages LIKE concat('%',:content,'%') OR searchKeyword LIKE concat('%',:content,'%'))") + Page findByContentAndProjectKindLatest(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, + @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, + @Param("projectKind") String projectKind, @Param("content") String content); @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + "P.projectName as 'projectName', PI.url as 'imgUrl', " + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + @@ -160,6 +224,26 @@ Page findByContent(@Param("userId") Long userId, @Param("projectSta @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, @Param("content") String content); + @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + + "P.projectName as 'projectName', PI.url as 'imgUrl', " + + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + + "GROUP_CONCAT(U.profileImgUrl SEPARATOR ',') AS 'imgUrlList', \n" + + "count(RP.id)'totalDonationCnt' \n" + + "from Project P " + + "join ProjectImage PI on P.id = PI.projectId " + + "left join RegularPayment RP on RP.projectId=P.id and RP.regularPayStatus = 'PROCEEDING'" + + "left join User U on U.id = RP.userId " + + "where PI.imageRepresentStatus = :imageRepresentStatus and P.projectStatus = :projectStatus and P.finishedAt>=:now and P.status = :status" + + " and (P.projectName LIKE concat('%',:content,'%') OR P.projectExplanation LIKE concat('%',:content,'%') " + + " OR P.usages LIKE concat('%',:content,'%') OR P.searchKeyword LIKE concat('%',:content,'%')) group by P.id order by P.createdAt desc" + , nativeQuery = true + , countQuery = "select * from Project where projectStatus = :projectStatus and finishedAt = :now and status = :status " + + "and (projectName LIKE concat('%',:content,'%') " + + "OR projectExplanation LIKE concat('%',:content,'%') OR usages LIKE concat('%',:content,'%') OR searchKeyword LIKE concat('%',:content,'%')) ") + Page findByContentLatest(@Param("userId") Long userId, @Param("projectStatus") String projectStatus, @Param("now") LocalDateTime now, + @Param("imageRepresentStatus") String imageRepresentStatus, Pageable pageable,@Param("status") String status, + @Param("content") String content); + @Query(value = "select P.id as 'id', P.usages as 'usages', P.projectKind as 'projectKind', viewCnt, " + "P.projectName as 'projectName', PI.url as 'imgUrl', " + "If((select exists (select * from ProjectUserAttention PUA where PUA.userId=:userId and P.id = PUA.projectId )),'true','false')'like', " + From 741a4eff46f037516d65300e54f090ae9dbae4f3 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:40:50 +0900 Subject: [PATCH 03/82] =?UTF-8?q?:truck:=20:=20security=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20common=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20move?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => common}/security/JwtAccessDeniedHandler.java | 2 +- .../security/JwtAuthenticationEntryPoint.java | 2 +- .../matchapi/{ => common}/security/JwtFilter.java | 2 +- .../{ => common}/security/JwtSecurityConfig.java | 2 +- .../matchapi/{ => common}/security/JwtService.java | 10 +++------- .../{ => common}/security/UserDetailsServiceImpl.java | 2 +- .../com/example/matchapi/config/SecurityConfig.java | 4 +--- .../matchapi/user/controller/UserController.java | 3 +-- .../com/example/matchapi/user/service/AuthService.java | 2 +- 9 files changed, 11 insertions(+), 18 deletions(-) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/JwtAccessDeniedHandler.java (96%) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/JwtAuthenticationEntryPoint.java (98%) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/JwtFilter.java (97%) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/JwtSecurityConfig.java (94%) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/JwtService.java (95%) rename Match-Api/src/main/java/com/example/matchapi/{ => common}/security/UserDetailsServiceImpl.java (97%) diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtAccessDeniedHandler.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java similarity index 96% rename from Match-Api/src/main/java/com/example/matchapi/security/JwtAccessDeniedHandler.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java index 0bf339d9..1225f039 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtAccessDeniedHandler.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java @@ -1,4 +1,4 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; import com.example.matchdomain.user.exception.UserAuthErrorCode; import org.json.JSONException; diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtAuthenticationEntryPoint.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java similarity index 98% rename from Match-Api/src/main/java/com/example/matchapi/security/JwtAuthenticationEntryPoint.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java index 3e91e67e..b4ca8d9c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtAuthenticationEntryPoint.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; import com.example.matchdomain.user.exception.UserAuthErrorCode; import org.json.JSONException; diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtFilter.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java similarity index 97% rename from Match-Api/src/main/java/com/example/matchapi/security/JwtFilter.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java index d6cdf34d..f134c614 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtFilter.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java @@ -1,4 +1,4 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtSecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtSecurityConfig.java similarity index 94% rename from Match-Api/src/main/java/com/example/matchapi/security/JwtSecurityConfig.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/JwtSecurityConfig.java index 64d859a4..b2498f12 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtSecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtSecurityConfig.java @@ -1,4 +1,4 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; diff --git a/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtService.java similarity index 95% rename from Match-Api/src/main/java/com/example/matchapi/security/JwtService.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/JwtService.java index 6c7b96ef..5d27e1e5 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/JwtService.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtService.java @@ -1,6 +1,5 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; -import com.example.matchapi.user.convertor.UserConvertor; import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.properties.JwtProperties; import com.example.matchdomain.redis.entity.AccessToken; @@ -29,9 +28,6 @@ import java.util.NoSuchElementException; import java.util.Optional; -import static com.example.matchapi.security.JwtFilter.AUTHORIZATION_HEADER; -import static com.example.matchapi.security.JwtFilter.REFRESH_TOKEN_HEADER; - @RequiredArgsConstructor @Component @Slf4j @@ -168,12 +164,12 @@ public boolean validateToken(ServletRequest servletRequest, String token) { public String getJwt(){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - return request.getHeader(AUTHORIZATION_HEADER); + return request.getHeader(JwtFilter.AUTHORIZATION_HEADER); } public String getRefreshToken(){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - return request.getHeader(REFRESH_TOKEN_HEADER); + return request.getHeader(JwtFilter.REFRESH_TOKEN_HEADER); } public Date getExpiredTime(String token){ diff --git a/Match-Api/src/main/java/com/example/matchapi/security/UserDetailsServiceImpl.java b/Match-Api/src/main/java/com/example/matchapi/common/security/UserDetailsServiceImpl.java similarity index 97% rename from Match-Api/src/main/java/com/example/matchapi/security/UserDetailsServiceImpl.java rename to Match-Api/src/main/java/com/example/matchapi/common/security/UserDetailsServiceImpl.java index fcf60951..6ce6099e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/security/UserDetailsServiceImpl.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/UserDetailsServiceImpl.java @@ -1,4 +1,4 @@ -package com.example.matchapi.security; +package com.example.matchapi.common.security; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.repository.UserRepository; diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index bd8327de..1b3bd5b7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -1,12 +1,11 @@ package com.example.matchapi.config; +import com.example.matchapi.common.security.*; import com.example.matchapi.security.*; import com.example.matchdomain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; @@ -17,7 +16,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.cors.CorsUtils; -import org.springframework.http.HttpMethod; @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java index dd92b229..ec57602c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java @@ -1,6 +1,6 @@ package com.example.matchapi.user.controller; -import com.example.matchapi.security.JwtService; +import com.example.matchapi.common.security.JwtService; import com.example.matchapi.user.dto.UserRes; import com.example.matchapi.user.dto.UserReq; import com.example.matchapi.user.service.UserService; @@ -25,7 +25,6 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; -import java.util.Optional; import static com.example.matchdomain.user.exception.UserAuthErrorCode.INVALID_REFRESH_TOKEN; diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java index b7990e1e..60b9e292 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java @@ -1,6 +1,6 @@ package com.example.matchapi.user.service; -import com.example.matchapi.security.JwtService; +import com.example.matchapi.common.security.JwtService; import com.example.matchapi.user.convertor.UserConvertor; import com.example.matchapi.user.dto.UserReq; import com.example.matchapi.user.dto.UserRes; From 671c2bd7ead4044a68581af499a4ce9d7cf1e18c Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:41:04 +0900 Subject: [PATCH 04/82] =?UTF-8?q?:zap:=20:=20SearchKeyword=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyword/entity/SearchKeyword.java | 28 +++++++++++++++++++ .../repository/SearchKeywordRepository.java | 7 +++++ 2 files changed, 35 insertions(+) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java diff --git a/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java b/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java new file mode 100644 index 00000000..fd572d38 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java @@ -0,0 +1,28 @@ +package com.example.matchdomain.keyword.entity; + +import com.example.matchdomain.common.model.BaseEntity; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "SearchKeyword") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@DynamicInsert +@BatchSize(size = 20) +public class SearchKeyword extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String keyword; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java new file mode 100644 index 00000000..a3771801 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java @@ -0,0 +1,7 @@ +package com.example.matchdomain.keyword.repository; + +import com.example.matchdomain.keyword.entity.SearchKeyword; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SearchKeywordRepository extends JpaRepository { +} From 76735a4d08abe972cdb8db8cf67d81268e3231f8 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:41:28 +0900 Subject: [PATCH 05/82] =?UTF-8?q?:truck:=20:=20security=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20common=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20move?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/matchapi/config/SecurityConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index 1b3bd5b7..116dd07f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -1,7 +1,6 @@ package com.example.matchapi.config; import com.example.matchapi.common.security.*; -import com.example.matchapi.security.*; import com.example.matchdomain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; From f07b8bfbbd1c7c30dabebd8b3728a6aeb4edc913 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 11:08:13 +0900 Subject: [PATCH 06/82] =?UTF-8?q?:zap:=20:=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/NicepayController.java | 90 ------------------- .../keword/controller/keywordController.java | 27 ++++++ .../keword/convertor/KeywordConvertor.java | 18 ++++ .../matchapi/keword/dto/KeywordRes.java | 20 +++++ .../keword/service/KeywordService.java | 30 +++++++ .../keyword/entity/SearchKeyword.java | 2 + .../repository/SearchKeywordRepository.java | 3 + 7 files changed, 100 insertions(+), 90 deletions(-) delete mode 100644 Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/keword/controller/keywordController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java b/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java deleted file mode 100644 index c8bdb63d..00000000 --- a/Match-Api/src/main/java/com/example/matchapi/common/NicepayController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.example.matchapi.common; - -import com.example.matchapi.order.helper.DataEncrypt; -import com.example.matchapi.order.service.OrderService; -import com.example.matchcommon.properties.NicePayProperties; -import com.example.matchdomain.redis.entity.OrderRequest; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -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.client.RestTemplate; -import org.springframework.web.servlet.view.RedirectView; - -import java.io.IOException; -import java.util.Base64; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -@Controller -@RequiredArgsConstructor -@Slf4j -public class NicepayController { - private final OrderService orderService; - private final NicePayProperties nicePayProperties; - @Value("${web.return.url}") - private String redirectUrl; - @Value("${server.host}") - private String serverHost; - private final DataEncrypt dataEncrypt; - - /* - @RequestMapping("") - public String indexDemo( - @RequestParam String method, - @RequestParam String orderId, - @RequestParam String productName, - @RequestParam int amount, - Model model) { - model.addAttribute("method",method); - model.addAttribute("orderId", orderId); - model.addAttribute("productName", productName); - model.addAttribute("amount", amount); - model.addAttribute("clientId", nicePayProperties.getClient()); - model.addAttribute("returnUrl",serverHost+"/serverAuth"); - return "index"; - } - - @RequestMapping("/goPay") - public String goPay( - @RequestParam(required = false) String method, - @RequestParam String orderId, - @RequestParam int amount, - Model model - ){ - String ediDate = orderService.getyyyyMMddHHmmss(); - String hashString = dataEncrypt.encrypt(ediDate + orderId + amount + nicePayProperties.getKey()); - model.addAttribute("payMethod", "CreditCard"); - model.addAttribute("goodsName", "Sample Product"); - model.addAttribute("Amt", amount); - model.addAttribute("mid", nicePayProperties.getMid()); - model.addAttribute("moid", orderId); - model.addAttribute("EdiDate", ediDate); - model.addAttribute("signData", hashString); - // model.addAttribute("ReturnURL", "http://localhost:8080/nicepay3.0_utf-8/payResult_utf.jsp"); - return "gopay"; - } - - @RequestMapping("/serverAuth") - public RedirectView requestPaymentAuth( - @RequestParam String tid, - @RequestParam Long amount) throws IOException { - log.info("04-01 Order ๊ฒฐ์ œ ์ธ์ฆ์šฉ API ๊ฒฐ์ œ ID: " + tid + " ๊ฒฐ์ œ ๊ธˆ์•ก " + amount); - log.info("URL : " + redirectUrl); - orderService.requestPaymentAuth(tid, amount); - RedirectView redirectView = new RedirectView(); - redirectView.setUrl(redirectUrl+"/auth/payComplete/once"); - return redirectView; - } - - */ -} \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/controller/keywordController.java b/Match-Api/src/main/java/com/example/matchapi/keword/controller/keywordController.java new file mode 100644 index 00000000..d36c226c --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/keword/controller/keywordController.java @@ -0,0 +1,27 @@ +package com.example.matchapi.keword.controller; + +import com.example.matchapi.keword.dto.KeywordRes; +import com.example.matchapi.keword.service.KeywordService; +import com.example.matchcommon.reponse.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/keywords") +@Tag(name = "09-Keyword ์ถ”์ฒœ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ๐Ÿ”Ž",description = "๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ API") +public class keywordController { + private final KeywordService keywordService; + + @GetMapping("") + @Operation(summary = "09-01 Keyword ์ถ”์ฒœ ํ‚ค์›Œ๋“œ ์กฐํšŒ๐Ÿ’ธ") + public CommonResponse> getKeywordList(){ + return CommonResponse.onSuccess(keywordService.getKeywordList()); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java b/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java new file mode 100644 index 00000000..34feb3c1 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java @@ -0,0 +1,18 @@ +package com.example.matchapi.keword.convertor; + +import com.example.matchapi.keword.dto.KeywordRes; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchdomain.keyword.entity.SearchKeyword; + +@Convertor +public class KeywordConvertor { + public KeywordRes.KeywordList KeywordList(SearchKeyword result) { + return KeywordRes.KeywordList + .builder() + .keywordId(result.getId()) + .keyword(result.getKeyword()) + .priority(result.getPriority()) + .build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java b/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java new file mode 100644 index 00000000..620ff584 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java @@ -0,0 +1,20 @@ +package com.example.matchapi.keword.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +public class KeywordRes { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class KeywordList { + private Long keywordId; + + @Schema(name = "priority", description = "์šฐ์„  ์ˆœ์œ„ ์ž…๋‹ˆ๋‹ค.") + private int priority; + + private String keyword; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java new file mode 100644 index 00000000..1cd086b9 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java @@ -0,0 +1,30 @@ +package com.example.matchapi.keword.service; + +import com.example.matchapi.keword.convertor.KeywordConvertor; +import com.example.matchapi.keword.dto.KeywordRes; +import com.example.matchdomain.keyword.entity.SearchKeyword; +import com.example.matchdomain.keyword.repository.SearchKeywordRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class KeywordService { + private final KeywordConvertor keywordConvertor; + private final SearchKeywordRepository searchKeywordRepository; + + + public List getKeywordList() { + List searchKeywords = searchKeywordRepository.findAllByOrderByPriorityAsc(); + List keywordLists = new ArrayList<>(); + + searchKeywords.forEach( + result -> keywordLists.add(keywordConvertor.KeywordList(result)) + ); + return keywordLists; + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java b/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java index fd572d38..e62a776f 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/keyword/entity/SearchKeyword.java @@ -24,5 +24,7 @@ public class SearchKeyword extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + private int priority; + private String keyword; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java index a3771801..8c6cb89d 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/keyword/repository/SearchKeywordRepository.java @@ -3,5 +3,8 @@ import com.example.matchdomain.keyword.entity.SearchKeyword; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface SearchKeywordRepository extends JpaRepository { + List findAllByOrderByPriorityAsc(); } From 27c6bb4d24894067c9576e287f9c283bba4435b4 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:08:03 +0900 Subject: [PATCH 07/82] =?UTF-8?q?:memo:=20:=20ehcache=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Match-Api/src/main/resources/application.yml | 3 ++ Match-Api/src/main/resources/ehcache.xml | 33 +++++++++++++++++++ .../resources/application-infrastructure.yml | 5 --- build.gradle | 2 ++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 Match-Api/src/main/resources/ehcache.xml diff --git a/Match-Api/src/main/resources/application.yml b/Match-Api/src/main/resources/application.yml index b4d6db11..7b759d57 100644 --- a/Match-Api/src/main/resources/application.yml +++ b/Match-Api/src/main/resources/application.yml @@ -4,6 +4,9 @@ server: context-path: / spring: + cache: + ehcache: + config: classpath:ehcache.xml thymeleaf: prefix: classpath:/templates/ suffix: .html diff --git a/Match-Api/src/main/resources/ehcache.xml b/Match-Api/src/main/resources/ehcache.xml new file mode 100644 index 00000000..a59fb9cb --- /dev/null +++ b/Match-Api/src/main/resources/ehcache.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/Match-Infrastructure/src/main/resources/application-infrastructure.yml b/Match-Infrastructure/src/main/resources/application-infrastructure.yml index ab58f428..fa2d047b 100644 --- a/Match-Infrastructure/src/main/resources/application-infrastructure.yml +++ b/Match-Infrastructure/src/main/resources/application-infrastructure.yml @@ -3,11 +3,6 @@ feign: config: default: loggerLevel: FULL -spring: - cache: - cache-names: portOneTokenCache - caffeine: - spec: maximumSize=100,expireAfterWrite=1700s # 30๋ถ„๋งˆ๋‹ค ๊ฐฑ์‹  --- spring: config: diff --git a/build.gradle b/build.gradle index b25aae15..e49ee220 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,8 @@ subprojects{ implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'net.sf.ehcache:ehcache:2.10.3' + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' From bf646194e7f68a41ef2c809335405339655bdb89 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:08:25 +0900 Subject: [PATCH 08/82] =?UTF-8?q?:zap:=20:=20=ED=82=A4=EC=9B=8C=EB=93=9C?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=8B=9C=20=EC=BA=90=EC=8B=9C?= =?UTF-8?q?=20=EA=B0=B1=EC=8B=A0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminKeywordController.java | 37 ++++++++++++++++ .../convertor/AdminKeywordConvertor.java | 12 ++++++ .../admin/keyword/dto/AdminKeywordReq.java | 18 ++++++++ .../keyword/service/AdminKeywordService.java | 43 +++++++++++++++++++ .../matchapi/keword/dto/KeywordRes.java | 6 ++- .../keword/service/KeywordService.java | 8 ++++ .../portone/service/PortOneAuthService.java | 22 ++-------- 7 files changed, 127 insertions(+), 19 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/keyword/controller/AdminKeywordController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/keyword/dto/AdminKeywordReq.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/controller/AdminKeywordController.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/controller/AdminKeywordController.java new file mode 100644 index 00000000..b233bf8e --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/controller/AdminKeywordController.java @@ -0,0 +1,37 @@ +package com.example.matchapi.admin.keyword.controller; + +import com.example.matchapi.admin.keyword.dto.AdminKeywordReq; +import com.example.matchapi.admin.keyword.service.AdminKeywordService; +import com.example.matchapi.keword.dto.KeywordRes; +import com.example.matchapi.keword.service.KeywordService; +import com.example.matchcommon.reponse.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/keywords") +@Tag(name = "ADMIN-07-Keyword ์ถ”์ฒœ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ๐Ÿ”Ž",description = "๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ API") +public class AdminKeywordController { + private final KeywordService keywordService; + private final AdminKeywordService adminKeywordService; + + @GetMapping("") + @Operation(summary = "07-01 ADMIN Keyword ์ถ”์ฒœ ์กฐํšŒ๐Ÿ”Ž") + public CommonResponse> getKeywordList(){ + return CommonResponse.onSuccess(keywordService.getKeywordList()); + } + + @PostMapping("") + @Operation(summary = "07-02 ADMIN Keyword ์—…๋กœ๋“œ๐Ÿ”Ž") + public CommonResponse> postKeywordList( + @RequestBody AdminKeywordReq.KeywordUpload keyword + ){ + + return CommonResponse.onSuccess(adminKeywordService.postKeyword(keyword)); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java new file mode 100644 index 00000000..8bcdeb4f --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java @@ -0,0 +1,12 @@ +package com.example.matchapi.admin.keyword.convertor; + +import com.example.matchapi.admin.keyword.dto.AdminKeywordReq; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.keyword.entity.SearchKeyword; + +@Convertor +public class AdminKeywordConvertor { + public SearchKeyword Keyword(AdminKeywordReq.KeywordUpload keyword) { + return SearchKeyword.builder().keyword(keyword.getSearchKeyword()).priority(keyword.getPriority()).build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/dto/AdminKeywordReq.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/dto/AdminKeywordReq.java new file mode 100644 index 00000000..f898c6fe --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/dto/AdminKeywordReq.java @@ -0,0 +1,18 @@ +package com.example.matchapi.admin.keyword.dto; + +import lombok.*; + +import java.io.Serializable; + +public class AdminKeywordReq { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class KeywordUpload implements Serializable { + private String searchKeyword; + + private int priority; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java new file mode 100644 index 00000000..b0cbe923 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java @@ -0,0 +1,43 @@ +package com.example.matchapi.admin.keyword.service; + +import com.example.matchapi.admin.keyword.convertor.AdminKeywordConvertor; +import com.example.matchapi.admin.keyword.dto.AdminKeywordReq; +import com.example.matchapi.keword.convertor.KeywordConvertor; +import com.example.matchapi.keword.dto.KeywordRes; +import com.example.matchdomain.keyword.entity.SearchKeyword; +import com.example.matchdomain.keyword.repository.SearchKeywordRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AdminKeywordService { + private final SearchKeywordRepository searchKeywordRepository; + private final KeywordConvertor keywordConvertor; + private final AdminKeywordConvertor adminKeywordConvertor; + + @Transactional + @CachePut(cacheNames = "keywordList", key = "'all'") + public List postKeyword(AdminKeywordReq.KeywordUpload keyword) { + searchKeywordRepository.save(adminKeywordConvertor.Keyword(keyword)); + return cachingKeywordList(); + } + + @CacheEvict(cacheNames = "keywordList") + public List cachingKeywordList(){ + List searchKeywords = searchKeywordRepository.findAllByOrderByPriorityAsc(); + List keywordLists = new ArrayList<>(); + + searchKeywords.forEach( + result -> keywordLists.add(keywordConvertor.KeywordList(result)) + ); + return keywordLists; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java b/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java index 620ff584..de174255 100644 --- a/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/keword/dto/KeywordRes.java @@ -3,13 +3,17 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.io.Serializable; + public class KeywordRes { @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor - public static class KeywordList { + public static class KeywordList implements Serializable { + private static final long serialVersionUID = 12312312421412L; + private Long keywordId; @Schema(name = "priority", description = "์šฐ์„  ์ˆœ์œ„ ์ž…๋‹ˆ๋‹ค.") diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java index 1cd086b9..4269ba83 100644 --- a/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java +++ b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java @@ -1,10 +1,13 @@ package com.example.matchapi.keword.service; +import com.example.matchapi.admin.keyword.dto.AdminKeywordReq; import com.example.matchapi.keword.convertor.KeywordConvertor; import com.example.matchapi.keword.dto.KeywordRes; import com.example.matchdomain.keyword.entity.SearchKeyword; import com.example.matchdomain.keyword.repository.SearchKeywordRepository; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -18,7 +21,12 @@ public class KeywordService { private final SearchKeywordRepository searchKeywordRepository; + @Cacheable(cacheNames = "keywordList", key = "'all'") public List getKeywordList() { + return getKeyword(); + } + + public List getKeyword(){ List searchKeywords = searchKeywordRepository.findAllByOrderByPriorityAsc(); List keywordLists = new ArrayList<>(); diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java index 28117605..56978e95 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java @@ -18,30 +18,16 @@ public class PortOneAuthService { private final PortOneFeignClient portOneFeignClient; private final PortOneProperties portOneProperties; + @Cacheable(value = "portOneTokenCache") public String getToken() { String token = fetchPortOneToken(); - System.out.println(token); + System.out.println("request : " + token); return token; } - @CachePut(value = "portOneTokenCache") public String fetchPortOneToken() { - PortOneResponse portOneResponse = portOneFeignClient.getAccessToken(PortOneAuthReq.builder().imp_key(portOneProperties.getKey()).imp_secret(portOneProperties.getSecret()).build()); - return portOneResponse.getResponse().getAccess_token(); - } - - @CachePut(value = "portOneTokenCache") - public String refreshToken() { - String newToken = fetchPortOneToken(); - System.out.println("refresh Token"); - return newToken; - } - - //@Scheduled(fixedRate = 100) - @Scheduled(fixedRate = 1700000) // 30๋ถ„๋งˆ๋‹ค ์‹คํ–‰ (1800์ดˆ) - public void scheduleTokenRefresh() { - System.out.println("refresh token Schedule"); - String refreshToken = refreshToken(); + System.out.println("request token"); + return getTokens(); } public String getTokens() { From d988c17f5db6e41abf55cffb963b895cccc075fc Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:37:38 +0900 Subject: [PATCH 09/82] =?UTF-8?q?:recycle:=20:=20redis=20=ED=81=B4?= =?UTF-8?q?=EB=9F=AC=EC=8A=A4=ED=84=B0=20profile=20=EB=A1=9C=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=ED=9B=84=20return?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/matchcommon/config/RedisConfig.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/RedisConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/RedisConfig.java index 5e2746a8..9f46b659 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/config/RedisConfig.java +++ b/Match-Common/src/main/java/com/example/matchcommon/config/RedisConfig.java @@ -4,6 +4,7 @@ import io.lettuce.core.ClientOptions; import io.lettuce.core.SocketOptions; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -23,8 +24,11 @@ @EnableRedisRepositories( basePackages = "com.example") @RequiredArgsConstructor +@Slf4j public class RedisConfig { private final RedisProperties redisProperties; + @Value("${spring.config.activate.on-profile}") + private String profile; @Bean public RedisConnectionFactory redisConnectionFactory() { @@ -37,8 +41,13 @@ public RedisConnectionFactory redisConnectionFactory() { .build()) .commandTimeout(Duration.ofSeconds(1000L)).build(); - //return new LettuceConnectionFactory(clusterConfiguration, clientConfiguration); - return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort()); + if(profile.equals("prod")){ + log.info(profile + " profile"); + return new LettuceConnectionFactory(clusterConfiguration, clientConfiguration); + }else { + log.info(profile + " profile"); + return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort()); + } } @Bean From 58bc4f680d39612abc3f82b7e9533c717f8a76f5 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:15:41 +0900 Subject: [PATCH 10/82] =?UTF-8?q?:recycle:=20:=20adaptor=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80=20don?= =?UTF-8?q?ation=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/util/TimeHelper.java | 31 +++ .../donation/convertor/DonationConvertor.java | 90 +++++- .../convertor/RegularPaymentConvertor.java | 39 +++ .../donation/helper/DonationHelper.java | 16 -- .../donation/service/DonationService.java | 258 ++++-------------- .../project/convertor/ProjectConvertor.java | 5 +- .../matchcommon/annotation/Adaptor.java | 15 + .../donation/adaptor/DonationAdaptor.java | 74 +++++ .../adaptor/DonationHistoryAdaptor.java | 34 +++ .../adaptor/RegularPaymentAdaptor.java | 33 +++ .../repository/RegularPaymentRepository.java | 4 + 11 files changed, 362 insertions(+), 237 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/annotation/Adaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java b/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java new file mode 100644 index 00000000..a72180a7 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java @@ -0,0 +1,31 @@ +package com.example.matchapi.common.util; + +import com.example.matchcommon.annotation.Helper; + +import java.time.LocalDateTime; + +@Helper +public class TimeHelper { + + public String timeFormat(LocalDateTime createdAt) { + return createdAt.getYear() + "." + createdAt.getMonthValue() + "." + createdAt.getDayOfMonth(); + } + + public String dayTimeFormat(LocalDateTime createdAt) { + return createdAt.getYear() + "." + createdAt.getMonthValue() + "." + createdAt.getDayOfMonth() + " " + checkTimes(createdAt.getHour()) + ":" + checkTimes(createdAt.getMinute()); + } + + public String matchTimeFormat(LocalDateTime createdAt) { + return createdAt.getYear() + "." + checkTimes(createdAt.getMonthValue()) + "." + checkTimes(createdAt.getDayOfMonth()); + } + + public String checkTimes(int value){ + if(value < 10){ + return "0" + value; + } + else{ + return String.valueOf(value); + } + } + +} diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index a0fc9ae0..eedf6b11 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -1,5 +1,6 @@ package com.example.matchapi.donation.convertor; +import com.example.matchapi.common.util.TimeHelper; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; import com.example.matchapi.project.dto.ProjectRes; @@ -8,7 +9,9 @@ import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.donation.repository.HistoryImageRepository; +import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import java.util.ArrayList; import java.util.List; @@ -23,6 +26,7 @@ @RequiredArgsConstructor public class DonationConvertor { private final DonationHelper donationHelper; + private final TimeHelper timeHelper; private final HistoryImageRepository historyImageRepository; public DonationRes.FlameList Flame(DonationUser result) { return DonationRes.FlameList.builder() @@ -60,7 +64,7 @@ public DonationRes.FlameList Flame(DonationUser result) { } - public DonationRes.DonationList DonationList(DonationUser result) { + public DonationRes.DonationList DonationListDetail(DonationUser result) { String payDate=""; if(result.getRegularPayment()!=null) { payDate = "๋งค์›” " + result.getRegularPayment().getPayDate() + "์ผ " + donationHelper.parsePriceComma(Math.toIntExact(result.getRegularPayment().getAmount())); @@ -97,7 +101,7 @@ public DonationRes.DonationRegular DonationRegular(RegularPayment regularPayment .build(); } - public DonationRes.DonationRegularList DonationRegularList(DonationHistory result) { + public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory result) { String histories = ""; String flameImage = null; List donationHistoryImages = new ArrayList<>(); @@ -142,21 +146,21 @@ private List DonationHistoryImage(List imgUrlList = null; if(result.getImgUrlList()!=null){ imgUrlList = Stream.of(result.getImgUrlList().split(",")).collect(Collectors.toList()); @@ -195,7 +199,7 @@ public DonationRes.DonationFlame DonationFlame(RegularPayment regularPayment, Do .build(); } - public ProjectRes.MatchHistory MatchHistory(DonationHistory result) { + public ProjectRes.MatchHistory MatchHistoryDetail(DonationHistory result) { String histories = ""; String profileImgUrl = ""; String nickname = ""; @@ -234,7 +238,7 @@ public ProjectRes.MatchHistory MatchHistory(DonationHistory result) { .profileImageUrl(profileImgUrl) .nickname(nickname) .historyStatus(result.getHistoryStatus()) - .historyDate(donationHelper.dayTimeFormat(result.getCreatedAt())) + .historyDate(timeHelper.dayTimeFormat(result.getCreatedAt())) .build(); } @@ -244,4 +248,76 @@ public DonationHistory DonationHistoryTurnOn(Long id, HistoryStatus historyStatu .historyStatus(historyStatus) .build(); } + + public List DonationList(Page donationUsers) { + List donationLists = new ArrayList<>(); + donationUsers.getContent().forEach( + result ->{ + donationLists.add( + DonationListDetail(result) + ); + } + ); + + return donationLists; + } + + public List BurningMatch(List flameLists) { + List burningMatchRes = new ArrayList<>(); + flameLists.forEach( + result -> { + burningMatchRes.add(BurningMatchDetail(result)); + } + ); + + return burningMatchRes; + } + + public List DonationRegularList(List donationHistories){ + List donationRegularLists = new ArrayList<>(); + donationHistories.forEach( + result -> donationRegularLists.add( + DonationRegularListDetail(result) + ) + ); + return donationRegularLists; + } + + public List MatchHistory(List donationHistories){ + List matchHistories = new ArrayList<>(); + + donationHistories.forEach( + result -> matchHistories.add( + MatchHistoryDetail(result) + ) + ); + + return matchHistories; + } + + public List FlameProjectList(List donationUsers){ + List flameProjectLists = new ArrayList<>(); + + donationUsers.forEach( + result -> flameProjectLists.add( + FlameProject(result) + ) + ); + + return flameProjectLists; + } + + public List PayList(List donationUsers) { + List payLists = new ArrayList<>(); + + donationUsers.forEach( + result -> payLists.add( + PayListDetail(result) + ) + ); + + return payLists; + } + + } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java new file mode 100644 index 00000000..6f6428d1 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java @@ -0,0 +1,39 @@ +package com.example.matchapi.donation.convertor; + +import com.example.matchapi.common.util.TimeHelper; +import com.example.matchapi.donation.dto.DonationRes; +import com.example.matchapi.donation.helper.DonationHelper; +import com.example.matchapi.user.dto.UserRes; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.donation.entity.RegularPayment; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Convertor +@RequiredArgsConstructor +public class RegularPaymentConvertor { + private final TimeHelper timeHelper; + private final DonationHelper donationHelper; + public List MatchList(List regularPayments) { + List matchLists = new ArrayList<>(); + + regularPayments.forEach( + result -> matchLists.add(MatchListDetail(result)) + ); + + return matchLists; + } + + private DonationRes.MatchList MatchListDetail(RegularPayment result) { + return DonationRes.MatchList + .builder() + .regularDate(timeHelper.matchTimeFormat(result.getCreatedAt())) + .projectTitle(result.getProject().getProjectName()) + .regularPayStatus(result.getRegularPayStatus()) + .payDate(result.getPayDate()) + .amount(donationHelper.parsePriceComma(Math.toIntExact(result.getAmount()))) + .build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java index 3af67f29..ef0f0534 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java @@ -15,20 +15,4 @@ public String parsePriceComma(int amount){ return decimalFormat.format(amount)+"์›"; } - public String timeFormat(LocalDateTime createdAt) { - return createdAt.getYear() + "." + createdAt.getMonthValue() + "." + createdAt.getDayOfMonth(); - } - - public String dayTimeFormat(LocalDateTime createdAt) { - return createdAt.getYear() + "." + createdAt.getMonthValue() + "." + createdAt.getDayOfMonth() + " " + checkTimes(createdAt.getHour()) + ":" + checkTimes(createdAt.getMinute()); - } - - public String checkTimes(int time){ - if(time < 10){ - return "0" + time; - } - else{ - return String.valueOf(time); - } - } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index bff86a74..3162772f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -1,17 +1,17 @@ package com.example.matchapi.donation.service; import com.example.matchapi.donation.convertor.DonationConvertor; +import com.example.matchapi.donation.convertor.RegularPaymentConvertor; import com.example.matchapi.donation.dto.DonationRes; -import com.example.matchapi.donation.helper.DonationHelper; -import com.example.matchapi.order.service.OrderService; import com.example.matchapi.portone.service.PaymentService; -import com.example.matchapi.project.convertor.ProjectConvertor; import com.example.matchapi.project.dto.ProjectRes; +import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.exception.BadRequestException; -import com.example.matchcommon.exception.NotFoundException; import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.donation.adaptor.DonationAdaptor; +import com.example.matchdomain.donation.adaptor.DonationHistoryAdaptor; +import com.example.matchdomain.donation.adaptor.RegularPaymentAdaptor; import com.example.matchdomain.donation.entity.*; -import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.repository.DonationHistoryRepository; import com.example.matchdomain.donation.repository.DonationUserRepository; @@ -21,289 +21,123 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import javax.transaction.Transactional; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; -import static com.example.matchcommon.constants.MatchStatic.FIRST_TIME; -import static com.example.matchcommon.constants.MatchStatic.LAST_TIME; import static com.example.matchdomain.common.model.Status.ACTIVE; import static com.example.matchdomain.donation.entity.enums.DonationStatus.*; import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; import static com.example.matchdomain.donation.entity.enums.RegularPayStatus.USER_CANCEL; import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_CORRECT_USER; -import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_EXIST; -import static com.example.matchdomain.donation.exception.DonationListErrorCode.FILTER_NOT_EXIST; import static com.example.matchdomain.donation.exception.DonationRefundErrorCode.*; -import static com.example.matchdomain.donation.exception.GetRegularErrorCode.REGULAR_NOT_EXIST; -import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; @Service @RequiredArgsConstructor public class DonationService { - private final DonationUserRepository donationUserRepository; - private final OrderService orderService; private final DonationConvertor donationConvertor; private final RegularPaymentRepository regularPaymentRepository; - private final DonationHelper donationHelper; - private final ProjectConvertor projectConvertor; - private final DonationHistoryRepository donationHistoryRepository; private final PaymentService paymentService; - - public PageResponse> getDonationList(Long userId, int filter, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - Page donationUsers = null; - - List donationLists = new ArrayList<>(); - - if(filter == 0){ - donationUsers = donationUserRepository.findByUserIdAndStatusAndDonationStatusNotOrderByCreatedAtDesc(userId, ACTIVE,EXECUTION_REFUND, pageable); - } - else if(filter == 1){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId,DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); - } - else if(filter == 2){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId,DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); - - }else if(filter == 3){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId, DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); - - }else{ - throw new BadRequestException(FILTER_NOT_EXIST); - } - - donationUsers.getContent().forEach( - result ->{ - donationLists.add( - donationConvertor.DonationList(result) - ); - } - ); + private final RegularPaymentAdaptor regularPaymentAdaptor; + private final DonationAdaptor donationAdaptor; + private final DonationHistoryAdaptor donationHistoryAdaptor; + private final RegularPaymentConvertor regularPaymentConvertor; + public PageResponse> getDonationList(Long userId, int filter, int page, int size) { + Page donationUsers = donationAdaptor.findDonationList(userId, filter, page ,size); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationLists); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.DonationList(donationUsers)); } @Transactional public void refundDonation(User user, Long donationId) { - DonationUser donationUser = donationUserRepository.findById(donationId).orElseThrow(() -> new NotFoundException(DONATION_NOT_EXIST)); + DonationUser donationUser = donationAdaptor.findById(donationId); + if(!donationUser.getUserId().equals(user.getId())) throw new BadRequestException(DONATION_NOT_CORRECT_USER); + if(!donationUser.getDonationStatus().equals(EXECUTION_BEFORE)) throw new BadRequestException(CANNOT_DELETE_DONATION_STATUS); + paymentService.refundPayment(donationUser.getTid()); - donationUser.setDonationStatus(EXECUTION_REFUND); - } - //๋ถˆ๊ฝƒ์ด ํ•„ํ„ฐ๋ง 0 = ๋ถˆ๊ฝƒ์ด ์ „์ฒด, 1 = ์ „๋‹ฌ ์ „ ๋ถˆ๊ฝƒ์ด, 2 = ์ ˆ๋‹ฌ ์ค‘์ธ ๋ถˆ๊ฝƒ์ด, 3 = ์ „๋‹ฌ ์™„๋ฃŒ๋œ ๋ถˆ๊ฝƒ์ด - //์ •๋ ฌ ํ•„ํ„ฐ๋ง 0 = ์ตœ์‹ ์ˆœ, 1 = ์˜ค๋ž˜๋œ ์ˆœ, 2 = ๊ธฐ๋ถ€๊ธˆ์•ก ํฐ ์ˆœ, 3 = ๊ธฐ๋ถ€๊ธˆ์•ก ์ž‘์€ ์ˆœ - public PageResponse> getFlameList(User user, int page, int size, int flame, int order, String content) { - Pageable pageable = PageRequest.of(page, size); - - Page donationUsers = null; - - List flameLists = new ArrayList<>(); - - if(flame == 0){ - if(content == null){ - if(order == 0 ){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotAndStatusOrderByCreatedAtDesc(user.getId(), EXECUTION_REFUND, ACTIVE, pageable); - } - else if(order == 1){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotAndStatusOrderByCreatedAtAsc(user.getId(),EXECUTION_REFUND, ACTIVE, pageable); - } - else if(order == 2){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotAndStatusOrderByPriceDesc(user.getId(), EXECUTION_REFUND, ACTIVE, pageable); - } - else if(order ==3){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotAndStatusOrderByPriceAsc(user.getId(), EXECUTION_REFUND, ACTIVE, pageable); - } - } - else{ - if(order == 0 ){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByCreatedAtDesc(user.getId(), EXECUTION_REFUND, content, content, content, ACTIVE, pageable); - } - else if(order == 1){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByCreatedAtAsc(user.getId(), EXECUTION_REFUND, content, content, content, ACTIVE, pageable); - } - else if(order == 2){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByPriceDesc(user.getId(), EXECUTION_REFUND, content, content, content, ACTIVE, pageable); - } - else if(order ==3){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusNotOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByPriceAsc(user.getId(), EXECUTION_REFUND, content, content, content, ACTIVE, pageable); - } - } - } - else { - DonationStatus donationStatus = null; - if(flame == 1){ - donationStatus = EXECUTION_BEFORE; - } - else if(flame ==2){ - donationStatus = EXECUTION_UNDER; - } - else{ - donationStatus = EXECUTION_SUCCESS; - } - - if(content == null){ - if(order == 0 ){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(user.getId(), donationStatus, ACTIVE, pageable); - } - else if(order == 1){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtAsc(user.getId(),donationStatus, ACTIVE,pageable); - } - else if(order == 2){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByPriceDesc(user.getId(), donationStatus, ACTIVE, pageable); - } - else if(order ==3){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByPriceAsc(user.getId(), donationStatus, ACTIVE, pageable); - } - } - else{ - if(order == 0 ){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByCreatedAtDesc(user.getId(), donationStatus, content, content, content, ACTIVE, pageable); - } - else if(order == 1){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByCreatedAtAsc(user.getId(), donationStatus, content, content, content, ACTIVE, pageable); - } - else if(order == 2){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByPriceDesc(user.getId(), donationStatus, content, content, content, ACTIVE, pageable); - } - else if(order ==3){ - donationUsers = donationUserRepository.findByUserIdAndDonationStatusOrProject_UsagesContainingOrProject_ProjectNameContainingOrProject_ProjectExplanationContainingAndStatusOrderByPriceAsc(user.getId(), donationStatus, content, content, content, ACTIVE, pageable); - } - } - } - - donationUsers.getContent().forEach( - result -> flameLists.add( - donationConvertor.Flame(result) - ) - ); - - - return new PageResponse<>(donationUsers.isLast(),donationUsers.getTotalElements(),flameLists); + donationUser.setDonationStatus(EXECUTION_REFUND); } public void cancelRegularPay(User user, Long regularId) { - RegularPayment regularPayment = regularPaymentRepository.findByIdAndStatus(regularId, ACTIVE).orElseThrow(() -> new BadRequestException(REGULAR_PAY_NOT_EXIST)); + RegularPayment regularPayment = regularPaymentAdaptor.findRegularPaymentByStatus(regularId, ACTIVE); if(!regularPayment.getUserId().equals(user.getId())) throw new BadRequestException(REGULAR_PAY_NOT_CORRECT_USER); regularPayment.setRegularPayStatus(USER_CANCEL); + regularPaymentRepository.save(regularPayment); } public DonationRes.DonationCount getDonationCount(User user) { - List donationUser = donationUserRepository.findByUserAndDonationStatusNotAndStatus(user, EXECUTION_REFUND, ACTIVE); + List donationUser = donationAdaptor.findByDonationCount(user); return donationConvertor.DonationCount(donationUser); } public PageResponse> getBurningMatch(User user, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - Page flameLists = donationUserRepository.getFlameList(user.getId(), pageable); - - List burningMatchRes = new ArrayList<>(); + Page flameLists = donationAdaptor.findFlameList(user, page, size); - flameLists.forEach( - result -> { - burningMatchRes.add(donationConvertor.BurningMatch(result)); - } - ); - - - return new PageResponse<>(flameLists.isLast(), flameLists.getTotalElements(), burningMatchRes); + return new PageResponse<>(flameLists.isLast(), flameLists.getTotalElements(), donationConvertor.BurningMatch(flameLists.getContent())); } @Transactional public DonationRes.DonationRegular getDonationRegular(Long regularPayId, User user) { - RegularPayment regularPayment = regularPaymentRepository.findById(regularPayId).orElseThrow(()-> new BadRequestException(REGULAR_NOT_EXIST)); + RegularPayment regularPayment = regularPaymentAdaptor.findById(regularPayId); return donationConvertor.DonationRegular(regularPayment); } @Transactional public PageResponse> getDonationRegularList(Long regularPayId, User user, int page, int size) { - System.out.println("์กด์žฌ ์œ ๋ฌด ํ™•์ธ"); - RegularPayment regularPayment = regularPaymentRepository.findById(regularPayId).orElseThrow(()-> new BadRequestException(REGULAR_NOT_EXIST)); - Pageable pageable = PageRequest.of(page, size); - System.out.println("ํŽ˜์ด์ง€ ๋„ค์ด์…˜"); - Page donationHistories = donationHistoryRepository.findByDonationUser_RegularPaymentIdOrRegularPaymentIdOrProjectIdAndHistoryStatusNotOrderByCreatedAtAsc(regularPayId, regularPayId, regularPayment.getProjectId(), HistoryStatus.TURN_ON ,pageable); - - List donationRegularLists = new ArrayList<>(); + RegularPayment regularPayment = regularPaymentAdaptor.findById(regularPayId); + Page donationHistories = donationHistoryAdaptor.findDonationRegularList(regularPayId, regularPayment.getProjectId(), HistoryStatus.TURN_ON ,page, size); - donationHistories.forEach( - result -> donationRegularLists.add( - donationConvertor.DonationRegularList(result) - ) - ); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationRegularLists); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent())); } public List getPayList(User user, Long regularPayId) { - List donationUsers = donationUserRepository.findByRegularPaymentIdAndStatusOrderByCreatedAtDesc(regularPayId, ACTIVE); - List payLists = new ArrayList<>(); + List donationUsers = donationAdaptor.findPayList(regularPayId); - donationUsers.forEach( - result -> payLists.add( - donationConvertor.PayList(result) - ) - ); - - return payLists; + return donationConvertor.PayList(donationUsers); } public PageResponse> getFlameProjectList(User user, String content, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - Page donationUsers = donationUserRepository.findByUserAndInherenceNameContainingAndProject_ProjectImg_RepresentStatusOrderByCreatedAtDesc(user, content, REPRESENT, pageable); - List flameProjectLists = new ArrayList<>(); - - donationUsers.getContent().forEach( - result -> flameProjectLists.add( - donationConvertor.FlameProject(result) - ) - ); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), flameProjectLists); + Page donationUsers = donationAdaptor.getFlameProjectList(user, content, page, size); + + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.FlameProjectList(donationUsers.getContent())); } public PageResponse> getFlameRegularList(Long donationId, User user, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - DonationUser donationUser = donationUserRepository.findById(donationId).orElseThrow(()-> new BadRequestException(DONATION_NOT_EXIST)); - List donationRegularLists = new ArrayList<>(); - Page donationHistories = donationHistoryRepository.getDonationHistoryCustom(donationUser.getRegularPaymentId(), donationId, CREATE, pageable, donationUser.getProjectId()); - donationHistories.forEach( - result -> donationRegularLists.add( - donationConvertor.DonationRegularList(result) - ) - ); - - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationRegularLists); + DonationUser donationUser = donationAdaptor.findById(donationId); + + Page donationHistories = donationHistoryAdaptor.findDonationHistory(donationUser, donationId, page, size); + + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent())); } public DonationRes.DonationFlame getFlameRegular(Long donationId, User user) { - DonationUser donationUser = donationUserRepository.findById(donationId).orElseThrow(()-> new BadRequestException(DONATION_NOT_EXIST)); - RegularPayment regularPayment = regularPaymentRepository.findById(donationUser.getRegularPaymentId()).orElseThrow(()-> new BadRequestException(REGULAR_NOT_EXIST)); - return donationConvertor.DonationFlame(regularPayment, donationUser); + DonationUser donationUser = donationAdaptor.findById(donationId); + + return donationConvertor.DonationFlame(regularPaymentAdaptor.findById(donationUser.getRegularPaymentId()), donationUser); } public PageResponse> getMatchHistory(User user, Long projectId, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - List matchHistories = new ArrayList<>(); - Page donationHistories = donationHistoryRepository.findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtAsc(projectId, pageable); + Page donationHistories = donationHistoryAdaptor.findMatchHistory(projectId, page, size); - donationHistories.forEach( - result -> matchHistories.add( - donationConvertor.MatchHistory(result) - ) - ); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.MatchHistory(donationHistories.getContent())); + } + public PageResponse> getUserMatchList(User user, int page, int size) { + Page regularPayments = regularPaymentAdaptor.findByUser(user, page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), matchHistories); + return new PageResponse<>(regularPayments.isLast(), regularPayments.getTotalElements(), regularPaymentConvertor.MatchList(regularPayments.getContent())); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java index 9c0e9e52..53f35e17 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java @@ -1,5 +1,6 @@ package com.example.matchapi.project.convertor; +import com.example.matchapi.common.util.TimeHelper; import com.example.matchapi.donation.helper.DonationHelper; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; @@ -31,7 +32,7 @@ public class ProjectConvertor { private final ProjectHelper projectHelper; private final RegularPaymentRepository regularPaymentRepository; - private final DonationHelper donationHelper; + private final TimeHelper timeHelper; private static final String FIRST_TIME = "T00:00:00"; private static final String LAST_TIME = "T23:59:59"; public ProjectRes.ProjectDetail projectImgList(List projectImage) { @@ -86,7 +87,7 @@ public ProjectRes.CommentList projectComment(Long userId, ProjectComment result) return ProjectRes.CommentList.builder() .commentId(result.getId()) .comment(result.getComment()) - .commentDate(donationHelper.dayTimeFormat(result.getCreatedAt())) + .commentDate(timeHelper.dayTimeFormat(result.getCreatedAt())) .nickname(result.getUser().getNickname()) .userId(result.getUserId()) .isMy(result.getUserId().equals(userId)) diff --git a/Match-Common/src/main/java/com/example/matchcommon/annotation/Adaptor.java b/Match-Common/src/main/java/com/example/matchcommon/annotation/Adaptor.java new file mode 100644 index 00000000..fb7d7ab8 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/annotation/Adaptor.java @@ -0,0 +1,15 @@ +package com.example.matchcommon.annotation; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface Adaptor { + @AliasFor(annotation = Component.class) + String value() default ""; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java new file mode 100644 index 00000000..872258ab --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java @@ -0,0 +1,74 @@ +package com.example.matchdomain.donation.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; +import com.example.matchcommon.exception.NotFoundException; +import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.donation.entity.enums.DonationStatus; +import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.security.core.parameters.P; + +import java.util.List; + +import static com.example.matchdomain.common.model.Status.ACTIVE; +import static com.example.matchdomain.donation.entity.enums.DonationStatus.EXECUTION_REFUND; +import static com.example.matchdomain.donation.exception.DonationListErrorCode.FILTER_NOT_EXIST; +import static com.example.matchdomain.donation.exception.DonationRefundErrorCode.DONATION_NOT_EXIST; +import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; + +@Adaptor +@RequiredArgsConstructor +public class DonationAdaptor { + private final DonationUserRepository donationUserRepository; + + public Page findDonationList(Long userId, int filter, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + Page donationUsers = null; + if(filter == 0){ + donationUsers = donationUserRepository.findByUserIdAndStatusAndDonationStatusNotOrderByCreatedAtDesc(userId, ACTIVE,EXECUTION_REFUND, pageable); + } + else if(filter == 1){ + donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId, DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); + } + else if(filter == 2){ + donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId,DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); + + }else if(filter == 3){ + donationUsers = donationUserRepository.findByUserIdAndDonationStatusAndStatusOrderByCreatedAtDesc(userId, DonationStatus.EXECUTION_SUCCESS, ACTIVE, pageable); + + }else{ + throw new BadRequestException(FILTER_NOT_EXIST); + } + + return donationUsers; + } + + public DonationUser findById(Long donationId){ + return donationUserRepository.findById(donationId).orElseThrow(() -> new NotFoundException(DONATION_NOT_EXIST)); + } + + public List findByDonationCount(User user){ + return donationUserRepository.findByUserAndDonationStatusNotAndStatus(user, EXECUTION_REFUND, ACTIVE); + } + + public Page findFlameList(User user, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + + return donationUserRepository.getFlameList(user.getId(), pageable); + } + + public List findPayList(Long regularPayId){ + return donationUserRepository.findByRegularPaymentIdAndStatusOrderByCreatedAtDesc(regularPayId, ACTIVE); + } + + public Page getFlameProjectList(User user,String content, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + + return donationUserRepository.findByUserAndInherenceNameContainingAndProject_ProjectImg_RepresentStatusOrderByCreatedAtDesc(user, content, REPRESENT, pageable); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java new file mode 100644 index 00000000..e67009e4 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java @@ -0,0 +1,34 @@ +package com.example.matchdomain.donation.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.donation.entity.DonationHistory; +import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.donation.entity.enums.HistoryStatus; +import com.example.matchdomain.donation.repository.DonationHistoryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; + +@Adaptor +@RequiredArgsConstructor +public class DonationHistoryAdaptor { + private final DonationHistoryRepository donationHistoryRepository; + + public Page findDonationRegularList(Long regularPayId, Long projectId, HistoryStatus turnOn, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + return donationHistoryRepository.findByDonationUser_RegularPaymentIdOrRegularPaymentIdOrProjectIdAndHistoryStatusNotOrderByCreatedAtAsc(regularPayId, regularPayId, projectId, HistoryStatus.TURN_ON ,pageable); + } + + public Page findMatchHistory(Long projectId, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + return donationHistoryRepository.findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtAsc(projectId, pageable); + } + + public Page findDonationHistory(DonationUser donationUser, Long donationId, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + return donationHistoryRepository.getDonationHistoryCustom(donationUser.getRegularPaymentId(), donationId, CREATE, pageable, donationUser.getProjectId()); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java new file mode 100644 index 00000000..c2769b34 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java @@ -0,0 +1,33 @@ +package com.example.matchdomain.donation.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; +import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.RegularPayment; +import com.example.matchdomain.donation.repository.RegularPaymentRepository; +import com.example.matchdomain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_EXIST; +import static com.example.matchdomain.donation.exception.GetRegularErrorCode.REGULAR_NOT_EXIST; + +@Adaptor +@RequiredArgsConstructor +public class RegularPaymentAdaptor { + private final RegularPaymentRepository regularPaymentRepository; + + public RegularPayment findRegularPaymentByStatus(Long regularId, Status status) { + return regularPaymentRepository.findByIdAndStatus(regularId, status).orElseThrow(() -> new BadRequestException(REGULAR_PAY_NOT_EXIST)); + } + + public RegularPayment findById(Long regularPayId){ + return regularPaymentRepository.findById(regularPayId).orElseThrow(()-> new BadRequestException(REGULAR_NOT_EXIST)); + } + public Page findByUser(User user, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + return regularPaymentRepository.findByUserOrderByCreatedAtDesc(user, pageable); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java index 17f8f576..fb8120ac 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java @@ -5,6 +5,8 @@ import com.example.matchdomain.donation.entity.enums.RegularPayStatus; import com.example.matchdomain.donation.entity.RegularPayment; import com.example.matchdomain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -32,4 +34,6 @@ public interface RegularPaymentRepository extends JpaRepository findByUser(User user); List findByUserCardId(Long cardId); + + Page findByUserOrderByCreatedAtDesc(User user, Pageable pageable); } From e7657b6f14148dd563f0a33089ae59295d9b8522 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:15:54 +0900 Subject: [PATCH 11/82] =?UTF-8?q?:zap:=20:=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EB=A7=A4=EC=B9=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../donation/controller/DonationController.java | 16 ++++++++++++++++ .../matchapi/donation/dto/DonationRes.java | 17 +++++++++++++++++ .../matchapi/user/service/UserService.java | 2 ++ 3 files changed, 35 insertions(+) diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java index ef32ee03..c301bfa9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java @@ -2,6 +2,7 @@ import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.service.DonationService; +import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.reponse.PageResponse; @@ -36,6 +37,7 @@ public CommonResponse refundDonation( return CommonResponse.onSuccess("๊ธฐ๋ถ€๊ธˆ ํ™˜๋ถˆ ์„ฑ๊ณต"); } + /* @GetMapping("/flame/filter") @Deprecated @ApiErrorCodeExample(UserAuthErrorCode.class) @@ -51,6 +53,8 @@ public CommonResponse>> getFlameList( return CommonResponse.onSuccess(donationService.getFlameList(user, page, size, flame, order, content)); } + */ + @DeleteMapping("/{regularId}") @ApiErrorCodeExample({UserAuthErrorCode.class, CancelRegularPayErrorCode.class}) @Operation(summary = "05-04 Donation๐Ÿ’ธ ์ •๊ธฐ ๊ฒฐ์ œ ํ•ด์ง€ API") @@ -156,4 +160,16 @@ public CommonResponse>> getFl return CommonResponse.onSuccess(donationService.getFlameRegularList(donationId, user, page, size)); } + @Operation(summary = "05-11 ์ง„ํ–‰ ์ค‘์ธ ๋งค์น˜ ์กฐํšŒ ",description = "์ง„ํ–‰์ค‘์ธ ๋งค์น˜ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @GetMapping("/match") + @ApiErrorCodeExample({UserAuthErrorCode.class}) + public CommonResponse>> getUserMatchList( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, + @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size + ){ + PageResponse> matchLists = donationService.getUserMatchList(user, page, size); + return CommonResponse.onSuccess(matchLists); + } + } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index 5792eede..488b26a8 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -259,4 +259,21 @@ public static class FlameProjectList { private String imgUrl; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class MatchList { + private String projectTitle; + + private String regularDate; + + private RegularPayStatus regularPayStatus; + + private int payDate; + + private String amount; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java index 127d376f..20542103 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java @@ -93,6 +93,7 @@ public UserRes.SignUpInfo getUserSignUpInfo() { return userConvertor.UserSignUpInfo(oneDayUser,weekUser,monthUser,totalUser); } + @Transactional public PageResponse> getUserList(int page, int size, Status status, String content) { Pageable pageable = PageRequest.of(page, size); Page userList = null; @@ -133,6 +134,7 @@ public UserRes.Profile getProfile(User user) { return userConvertor.UserProfile(user); } + @Transactional public void modifyUserProfile(User user, UserReq.ModifyProfile modifyProfile) { if(modifyProfile.getName() == null && modifyProfile.getMultipartFile()!=null){ String beforeProfileImg = user.getProfileImgUrl(); From 4a7643f5626c3bfdbad949cfd24d5782224c26fd Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 16 Oct 2023 17:31:03 +0900 Subject: [PATCH 12/82] =?UTF-8?q?:recycle:=20:=20=ED=99=88=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=ED=9A=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convertor/AdminDonationConvertor.java | 6 +- .../service/AdminDonationService.java | 2 +- .../security/JwtAccessDeniedHandler.java | 1 - .../matchapi/config/SwaggerConfig.java | 3 + .../controller/DonationController.java | 19 +- .../donation/convertor/DonationConvertor.java | 27 +- .../convertor/RegularPaymentConvertor.java | 27 +- .../matchapi/donation/dto/DonationRes.java | 43 ++- .../donation/helper/DonationHelper.java | 23 +- .../donation/service/DonationService.java | 22 +- .../order/convertor/OrderConvertor.java | 6 + .../project/controller/ProjectController.java | 14 +- .../project/convertor/ProjectConvertor.java | 64 ++++- .../matchapi/project/enums/FILTER.java | 5 - .../project/service/ProjectService.java | 264 +++--------------- Match-Api/src/main/resources/application.yml | 2 +- .../matchbatch/convertor/OrderConvertor.java | 2 + .../matchcommon/constants/enums/FILTER.java | 5 + .../matchcommon/properties/JwtProperties.java | 2 - .../donation/entity/QDonationHistory.java | 6 +- .../donation/entity/QDonationUser.java | 4 + .../donation/adaptor/DonationAdaptor.java | 13 +- .../adaptor/RegularPaymentAdaptor.java | 20 ++ .../donation/entity/DonationHistory.java | 11 +- .../donation/entity/DonationUser.java | 6 + .../donation/entity/flameEnum/FlameImage.java | 11 + .../donation/entity/flameEnum/FlameType.java | 14 + .../DonationCustomRepositoryImpl.java | 20 ++ .../repository/DonationUserRepository.java | 5 + .../RegularPaymentCustomRepository.java | 11 + .../RegularPaymentCustomRepositoryImpl.java | 49 ++++ .../repository/RegularPaymentRepository.java | 35 ++- .../project/adaptor/ProjectAdaptor.java | 116 ++++++++ .../project/adaptor/ProjectImgAdaptor.java | 32 +++ 34 files changed, 588 insertions(+), 302 deletions(-) delete mode 100644 Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/constants/enums/FILTER.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameImage.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepository.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepositoryImpl.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java index 8817c5aa..5c5cf2ae 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java @@ -8,6 +8,8 @@ import com.example.matchdomain.donation.entity.HistoryImage; import com.example.matchdomain.donation.entity.enums.HistoryStatus; +import java.util.List; + @Convertor public class AdminDonationConvertor { public DonationRes.DonationDetail getDonationDetail(DonationUser donationUser) { @@ -28,11 +30,12 @@ public DonationRes.DonationDetail getDonationDetail(DonationUser donationUser) { .build(); } - public DonationHistory DonationHistoryComplete(Long projectId) { + public DonationHistory DonationHistoryComplete(Long projectId, List donationUserLists) { return DonationHistory .builder() .projectId(projectId) .historyStatus(HistoryStatus.COMPLETE) + .completeIdLists(donationUserLists) .build(); } @@ -50,6 +53,7 @@ public DonationHistory DonationHistoryChange(DonationReq.EnforceDonation enforce .projectId(enforceDonation.getProjectId()) .cnt(enforceDonation.getDonationUserLists().size()) .historyStatus(HistoryStatus.CHANGE) + .changeIdLists(enforceDonation.getDonationUserLists()) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java b/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java index 70e7fa74..0f1b5350 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java @@ -74,7 +74,7 @@ public DonationRes.DonationDetail getDonationDetail(Long donationId) { public void enforceDonation(List imageLists, DonationReq.EnforceDonation enforceDonation) { donationHistoryRepository.save(adminDonationConvertor.DonationHistoryChange(enforceDonation)); - DonationHistory donationHistory = donationHistoryRepository.save(adminDonationConvertor.DonationHistoryComplete(enforceDonation.getProjectId())); + DonationHistory donationHistory = donationHistoryRepository.save(adminDonationConvertor.DonationHistoryComplete(enforceDonation.getProjectId(), enforceDonation.getDonationUserLists())); saveDonationHistoryImages(imageLists, donationHistory.getId()); diff --git a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java index 1225f039..f36f24be 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAccessDeniedHandler.java @@ -6,7 +6,6 @@ import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java index 8bf4b333..52ab40ce 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java @@ -17,6 +17,7 @@ import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -31,6 +32,7 @@ @Configuration @RequiredArgsConstructor +@Slf4j public class SwaggerConfig { //jwt ํ† ํฐ ์ธ์ฆ์„ ์œ„ํ•œ ๋ฒ„ํŠผ๊นŒ์ง€ ํฌํ•จ @@ -39,6 +41,7 @@ public class SwaggerConfig { @Bean public OpenAPI openAPI() { + log.info("Open API conifg"); Info info = new Info() .title("Match Aligo Rest API ๋ฌธ์„œ") // ํƒ€์ดํ‹€ .version("0.0.1") // ๋ฌธ์„œ ๋ฒ„์ „ diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java index c301bfa9..0208884f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java @@ -86,7 +86,7 @@ public CommonResponse>> getDonationL return CommonResponse.onSuccess(donationService.getDonationList(user.getId(), filter, page, size)); } - @GetMapping("/burning-match") +/* @GetMapping("/burning-match") @ApiErrorCodeExample({UserAuthErrorCode.class}) @Operation(summary = "05-06 ์œ ์ €์˜ ๋ถˆํƒ€๋Š” ๋งค์น˜ #FRAME_ํ™ˆ_๋ถˆํƒ€๋Š” ๋งค์น˜") public CommonResponse>> getBurningMatch( @@ -95,9 +95,9 @@ public CommonResponse>> getBurnin @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "5") int size ) { return CommonResponse.onSuccess(donationService.getBurningMatch(user, page, size)); - } + }*/ - @GetMapping("/top/{regularPayId}") + /* @GetMapping("/top/{regularPayId}") @ApiErrorCodeExample({UserAuthErrorCode.class, GetRegularErrorCode.class}) @Operation(summary = "05-07-01 ํ›„์› ์ƒ์„ธ ๋ณด๊ธฐ ์กฐํšŒ #FRAME_๋ถˆํƒ€๋Š” ๋งค์น˜_ํ›„์›_์ƒ์„ธ_๋ณด๊ธฐ_์ƒ๋‹จ์กฐํšŒ") public CommonResponse getDonationRegular(@PathVariable Long regularPayId, @@ -116,7 +116,7 @@ public CommonResponse>> getDo @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "5") int size ) { return CommonResponse.onSuccess(donationService.getDonationRegularList(regularPayId, user, page, size)); - } + }*/ @GetMapping("/pay/{regularPayId}") @ApiErrorCodeExample({UserAuthErrorCode.class, GetRegularErrorCode.class}) @@ -172,4 +172,15 @@ public CommonResponse>> getUserMatchLis return CommonResponse.onSuccess(matchLists); } + @Operation(summary = "05-12 ํƒ€์˜ค๋ฅด๋Š” ๋ถˆ๊ฝƒ์ด ๋ฆฌ์ŠคํŠธ ์กฐํšŒ #FRAME_๋ถˆ๊ฝƒ์ด_๋‘˜๋Ÿฌ๋ณด๊ธฐ", description = "ํƒ€์˜ค๋ฅด๋Š” ๋ถˆ๊ฝƒ์ด ๋ฆฌ์ŠคํŠธ ์กฐํšŒ์ž…๋‹ˆ๋‹ค, ํ›„์›์ค‘์ธ ๊ณณ์ด ์—†์„ ๋•Œ ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.") + @GetMapping("/burning-flame") + @ApiErrorCodeExample(UserAuthErrorCode.class) + public CommonResponse>> getBurningFlameList( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, + @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size + ){ + return CommonResponse.onSuccess(donationService.getBurningFlameList(user, page, size)); + } + } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index eedf6b11..5cca3101 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -9,7 +9,6 @@ import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.donation.repository.HistoryImageRepository; -import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -101,27 +100,27 @@ public DonationRes.DonationRegular DonationRegular(RegularPayment regularPayment .build(); } - public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory result) { + public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory result, String inherenceName) { String histories = ""; String flameImage = null; List donationHistoryImages = new ArrayList<>(); System.out.println("๋ถ„๊ธฐ"); if(result.getHistoryStatus() == HistoryStatus.CREATE){ System.out.println("CREATE"); - histories = result.getDonationUser().getUser().getName() + "๋‹˜์˜ ๋ถˆ๊ฝƒ์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."; - flameImage= result.getFlameImage(); + histories = inherenceName + "๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."; + flameImage= result.getDonationUser().getFlameImage(); }else if(result.getHistoryStatus() == HistoryStatus.COMPLETE) { System.out.println("COMPLETE"); histories = "'ํ›„์›ํ’ˆ'์„ 'ํ›„์›์ฒ˜'์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค."; donationHistoryImages = DonationHistoryImage(result.getHistoryImages()); }else{ - histories = result.getCnt() + "๋ช…์˜ ๋ถˆ๊ฝƒ์ด ํ›„์›ํ’ˆ์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค."; + histories = inherenceName + " ์™ธ " + (result.getCnt()-1) + "๋งˆ๋ฆฌ์˜ ๋ถˆ๊ฝƒ์ด๋“ค์ด 'ํ›„์›ํ’ˆ'์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค."; } return DonationRes.DonationRegularList .builder() .historyId(result.getId()) - .historyDate(result.getCreatedAt().getYear()+"."+result.getCreatedAt().getMonthValue()+"."+result.getCreatedAt().getDayOfMonth()) + .historyDate(timeHelper.matchTimeFormat(result.getCreatedAt())) .histories(histories) .flameImage(flameImage) .historyStatus(result.getHistoryStatus()) @@ -187,15 +186,15 @@ public DonationRes.FlameProjectList FlameProject(DonationUser result) { .build(); } - public DonationRes.DonationFlame DonationFlame(RegularPayment regularPayment, DonationUser donationUser) { + public DonationRes.DonationFlame DonationFlame(int sequence, DonationUser donationUser) { return DonationRes.DonationFlame .builder() + .imgUrl(donationUser.getFlameImage()) + .flameType(donationUser.getFlameType().getType()) .inherenceName(donationUser.getInherenceName()) - .regularPayStatus(regularPayment.getRegularPayStatus()) - .imgUrl(regularPayment.getProject().getProjectImage().get(0).getUrl()) - .regularPayId(regularPayment.getId()) - .payDate(regularPayment.getPayDate()) - .amount(Math.toIntExact(regularPayment.getAmount())) + .usages(donationUser.getProject().getUsages()) + .amount(Math.toIntExact(donationUser.getPrice())) + .sequence(sequence) .build(); } @@ -273,11 +272,11 @@ public List BurningMatch(List DonationRegularList(List donationHistories){ + public List DonationRegularList(List donationHistories, String inherenceName){ List donationRegularLists = new ArrayList<>(); donationHistories.forEach( result -> donationRegularLists.add( - DonationRegularListDetail(result) + DonationRegularListDetail(result, inherenceName) ) ); return donationRegularLists; diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java index 6f6428d1..dca39a1f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java @@ -3,8 +3,8 @@ import com.example.matchapi.common.util.TimeHelper; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; -import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.RegularPayment; import lombok.RequiredArgsConstructor; @@ -36,4 +36,29 @@ private DonationRes.MatchList MatchListDetail(RegularPayment result) { .amount(donationHelper.parsePriceComma(Math.toIntExact(result.getAmount()))) .build(); } + + public List BurningFlameList(List donationUsers) { + List burningFlameDto = new ArrayList<>(); + + donationUsers.forEach( + result -> burningFlameDto.add( + BurningFlame(result) + ) + ); + + return burningFlameDto; + + } + + private DonationRes.BurningFlameDto BurningFlame(DonationUser donationUser) { + + return DonationRes.BurningFlameDto + .builder() + .donationId(donationUser.getId()) + .usages(donationUser.getProject().getUsages()) + .image(donationUser.getFlameImage()) + .inherenceName(donationUser.getInherenceName()) + .randomMessage(donationHelper.createRandomMessage()) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index 488b26a8..7ce6c06f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -3,6 +3,7 @@ import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.entity.enums.RegularPayStatus; +import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -161,23 +162,23 @@ public static class DonationRegular { @AllArgsConstructor @NoArgsConstructor public static class DonationFlame { - @Schema(description = "ํ›„์› ๋Œ€ํ‘œ ์ด๋ฏธ์ง€", required = true, example = "์ด๋ฏธ์ง€ url") + @Schema(description = "๋ถˆ๊ฝƒ์ด ์ด๋ฏธ์ง€", required = true, example = "์ด๋ฏธ์ง€ url") private String imgUrl; + @Schema(description = "๋ถˆ๊ฝƒ์ด ์œ ํ˜•", required = true, example = "์ผ๋ฐ˜ ๋ถˆ๊ฝƒ") + private String flameType; + @Schema(description = "๊ณ ์œ  ์ด๋ฆ„", required = true, example = "๋ถˆ๊ฝƒ์ด ๊ณ ์œ  ์ด๋ฆ„") private String inherenceName; - @Schema(description = "PROCEEDING = ๊ธฐ๋ถ€ ์ง„ํ–‰์ค‘, PROJECT_FINISH = ํ”„๋กœ์ ํŠธ ๋งˆ๊ฐ์œผ๋กœ ์ธํ•œ ๋งค์นญ ์ข…๋ฃŒ, USER_CANCEL = ์œ ์ € ํ›„์› ์ทจ์†Œ") - private RegularPayStatus regularPayStatus; + @Schema(description = "์„ฑ์‹ฌ์ˆ˜๋…€ํšŒ") + private String usages; - @Schema(description = "ํ›„์› ๊ธˆ์•ก" , required = true, example = "ํ›„์› ๊ธˆ์•ก") + @Schema(description = "ํ›„์› ๊ธˆ์•ก(์ „๋‹ฌ๋œ ์˜จ๋„)" , required = true, example = "1000") private int amount; - @Schema(description = "ํ›„์› id", required = true, example = "2") - private Long regularPayId; - - @Schema(description = "ํ›„์› ๋‚ ์งœ", required = true, example = "2") - private int payDate; + @Schema(description = "์ƒ์„ฑ ์ˆœ์„œ 0์ผ์‹œ ๋‹จ์ผ ๊ธฐ๋ถ€(์ฆ‰ 1ํšŒ์„ฑ ๊ธฐ๋ถ€์ž…๋‹ˆ๋‹ค) ์ƒ์„ฑ ์ˆœ์„œ ํ‘œ์‹œ x", required = true, example = "2") + private int sequence; } @Getter @@ -199,9 +200,11 @@ public static class DonationRegularList { private String historyDate; @Schema(description = "๋ถˆ๊ฝƒ์ด ์ด๋ฏธ์ง€", required = true, example = "์ด๋ฏธ์ง€ url") + @JsonInclude(JsonInclude.Include.NON_EMPTY) private String flameImage; @Schema(description = "์ „๋‹ฌ ์‚ฌ์ง„ ๋ฆฌ์ŠคํŠธ COMPLETE ์ธ ๊ฒฝ์šฐ์— ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.", required = true, example = "") + @JsonInclude(JsonInclude.Include.NON_EMPTY) private List donationHistoryImages; } @Getter @@ -276,4 +279,26 @@ public static class MatchList { private String amount; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class BurningFlameDto { + @Schema(description = "๋ถˆ๊ฝƒ์ด id ์ƒ์„ธ์กฐํšŒ์‹œ ํ•„์š”", required = true, example = "2") + private Long donationId; + + @Schema(description = "ํ›„์›์ฒ˜ ๋ช…") + private String usages; + + @Schema(description = "๊ณ ์œ  ๋ถˆ๊ฝƒ์ด ์ด๋ฆ„") + private String inherenceName; + + @Schema(description = "๋ถˆ๊ฝƒ์ด ์ด๋ฏธ์ง€") + private String image; + + @Schema(description = "๋žœ๋ค ๋ถˆ๊ฝƒ์ด ๋ฉ”์„ธ์ง€") + private String randomMessage; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java index ef0f0534..30b29692 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java @@ -1,10 +1,14 @@ package com.example.matchapi.donation.helper; import com.example.matchcommon.annotation.Helper; +import com.example.matchdomain.donation.entity.DonationUser; import lombok.RequiredArgsConstructor; import java.text.DecimalFormat; -import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static com.example.matchdomain.donation.entity.enums.RegularStatus.ONE_TIME; @Helper @RequiredArgsConstructor @@ -15,4 +19,21 @@ public String parsePriceComma(int amount){ return decimalFormat.format(amount)+"์›"; } + public String createRandomMessage() { + return "ํ•˜์ด"; + } + + public int getDonationSequence(DonationUser donationUser, Long donationId) { + + if(donationUser.getRegularStatus() == ONE_TIME){ + return 0; + } + else{ + return donationIdLists(donationUser.getRegularPayment().getDonationUser()).indexOf(donationId) + 1; + } + } + + public List donationIdLists(List donationUser) { + return donationUser.stream().map(DonationUser::getId).collect(Collectors.toList()); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index 3162772f..ea459312 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -3,9 +3,9 @@ import com.example.matchapi.donation.convertor.DonationConvertor; import com.example.matchapi.donation.convertor.RegularPaymentConvertor; import com.example.matchapi.donation.dto.DonationRes; +import com.example.matchapi.donation.helper.DonationHelper; import com.example.matchapi.portone.service.PaymentService; import com.example.matchapi.project.dto.ProjectRes; -import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.reponse.PageResponse; import com.example.matchdomain.donation.adaptor.DonationAdaptor; @@ -13,24 +13,18 @@ import com.example.matchdomain.donation.adaptor.RegularPaymentAdaptor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.HistoryStatus; -import com.example.matchdomain.donation.repository.DonationHistoryRepository; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.donation.repository.RegularPaymentRepository; import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import javax.transaction.Transactional; -import java.util.ArrayList; import java.util.List; import static com.example.matchdomain.common.model.Status.ACTIVE; import static com.example.matchdomain.donation.entity.enums.DonationStatus.*; -import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; import static com.example.matchdomain.donation.entity.enums.RegularPayStatus.USER_CANCEL; import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_CORRECT_USER; import static com.example.matchdomain.donation.exception.DonationRefundErrorCode.*; @@ -45,6 +39,7 @@ public class DonationService { private final DonationAdaptor donationAdaptor; private final DonationHistoryAdaptor donationHistoryAdaptor; private final RegularPaymentConvertor regularPaymentConvertor; + private final DonationHelper donationHelper; public PageResponse> getDonationList(Long userId, int filter, int page, int size) { @@ -100,7 +95,7 @@ public PageResponse> getDonationRegularLis Page donationHistories = donationHistoryAdaptor.findDonationRegularList(regularPayId, regularPayment.getProjectId(), HistoryStatus.TURN_ON ,page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent())); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent(), "")); } public List getPayList(User user, Long regularPayId) { @@ -120,13 +115,13 @@ public PageResponse> getFlameRegularList(L Page donationHistories = donationHistoryAdaptor.findDonationHistory(donationUser, donationId, page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent())); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent(), donationUser.getInherenceName())); } public DonationRes.DonationFlame getFlameRegular(Long donationId, User user) { DonationUser donationUser = donationAdaptor.findById(donationId); - - return donationConvertor.DonationFlame(regularPaymentAdaptor.findById(donationUser.getRegularPaymentId()), donationUser); + int sequence = donationHelper.getDonationSequence(donationUser, donationId); + return donationConvertor.DonationFlame(sequence, donationUser); } public PageResponse> getMatchHistory(User user, Long projectId, int page, int size) { @@ -140,4 +135,9 @@ public PageResponse> getUserMatchList(User user, int return new PageResponse<>(regularPayments.isLast(), regularPayments.getTotalElements(), regularPaymentConvertor.MatchList(regularPayments.getContent())); } + + public PageResponse> getBurningFlameList(User user, int page, int size) { + Page donationUsers = donationAdaptor.findByUser(user, page, size); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), regularPaymentConvertor.BurningFlameList(donationUsers.getContent())); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 84dd2092..0ceaac6c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -6,6 +6,7 @@ import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.*; +import com.example.matchdomain.donation.entity.flameEnum.FlameImage; import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchinfrastructure.pay.nice.dto.*; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; @@ -31,6 +32,7 @@ public DonationUser donationUser(NicePaymentAuth nicePaymentAuth, Long id, Order .inherenceName(flameName) .inherenceNumber(inherenceNumber) .regularStatus(RegularStatus.ONE_TIME) + .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); } public DonationUser donationUserV2(NicePaymentAuth nicePaymentAuth, Long id, Long amount, String projectId, String flameName, String inherenceNumber) { @@ -45,6 +47,7 @@ public DonationUser donationUserV2(NicePaymentAuth nicePaymentAuth, Long id, Lon .inherenceName(flameName) .inherenceNumber(inherenceNumber) .regularStatus(RegularStatus.ONE_TIME) + .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); } @@ -73,6 +76,7 @@ public RegularPayment RegularPayment(Long id, OrderReq.RegularDonation regularDo .amount(regularDonation.getAmount()) .userCardId(userCardId) .projectId(projectId) + .regularPayStatus(RegularPayStatus.PROCEEDING) .build(); } @@ -148,6 +152,7 @@ public DonationUser donationUserPortone(Payment payment, Long userId, PaymentReq .inherenceName(flameName) .inherenceNumber(inherenceNumber) .regularStatus(RegularStatus.ONE_TIME) + .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); } @@ -180,6 +185,7 @@ public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id .inherenceNumber(inherenceNumber) .regularStatus(regularStatus) .regularPaymentId(regularPaymentId) + .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java index 12d7e6e5..7316f073 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java @@ -4,7 +4,7 @@ import com.example.matchapi.donation.service.DonationService; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; -import com.example.matchapi.project.enums.FILTER; +import com.example.matchcommon.constants.enums.FILTER; import com.example.matchapi.project.service.ProjectService; import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.exception.errorcode.RequestErrorCode; @@ -72,18 +72,6 @@ public CommonResponse>> searchProjectL return CommonResponse.onSuccess(projectService.searchProjectList(user, content, page, size)); } - @Operation(summary = "03-04๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋Œ“๊ธ€ ์กฐํšŒ",description = "ํ”„๋กœ์ ํŠธ ๋Œ“๊ธ€ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") - @GetMapping("/comment/{projectId}") - public CommonResponse>> getProjectComment( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = true, defaultValue = "0") @Min(value = 0) int page, - @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = true, defaultValue = "10") int size, - @Parameter(description = "ํ”„๋กœ์ ํŠธ id") @PathVariable("projectId") Long projectId - ){ - log.info("03-04 ํ”„๋กœ์ ํŠธ ๋Œ“๊ธ€ ์กฐํšŒ projectId : "+ projectId); - return CommonResponse.onSuccess(projectService.getProjectComment(user, projectId, page, size)); - } - @Operation(summary = "03-05๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API #FRAME_ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ.",description = "ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/list") @ApiErrorCodeExample(UserAuthErrorCode.class) diff --git a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java index 53f35e17..f73a0ce9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java @@ -163,7 +163,18 @@ public ProjectRes.ProjectAdminDetail ProjectAdminDetail(ProjectRepository.Projec .build(); } - public ProjectRes.DonationList DonationUserInfo(DonationUser result) { + public List DonationUserInfo(List donationUsers){ + List donationLists = new ArrayList<>(); + donationUsers.forEach( + result -> donationLists.add( + DonationUserInfoDetail(result) + ) + ); + + return donationLists; + } + + public ProjectRes.DonationList DonationUserInfoDetail(DonationUser result) { return ProjectRes.DonationList .builder() .donationId(result.getId()) @@ -182,7 +193,7 @@ public ProjectRes.DonationList DonationUserInfo(DonationUser result) { .build(); } - public ProjectRes.ProjectLists ProjectLists(ProjectRepository.ProjectList result) { + public ProjectRes.ProjectLists ProjectListsDetail(ProjectRepository.ProjectList result) { List imgUrlList = new ArrayList<>(); if(result.getImgUrlList()!=null){ imgUrlList = Stream.of(result.getImgUrlList().split(",")).collect(Collectors.toList()); @@ -203,6 +214,17 @@ public ProjectRes.ProjectLists ProjectLists(ProjectRepository.ProjectList result .build(); } + public List ProjectLists(List projects){ + List projectLists = new ArrayList<>(); + projects.forEach( + result -> { + projectLists.add(ProjectListsDetail(result)); + } + ); + + return projectLists; + } + public ProjectRes.ProjectLists ProjectListQueryDsl(ProjectList result) { return ProjectRes.ProjectLists .builder() @@ -305,4 +327,42 @@ public CommentReport ReportComment(Long commentId, ReportReason reportReason) { .reportReason(reportReason) .build(); } + + public List ProjectListWeb(List projects) { + List projectLists = new ArrayList<>(); + + projects.forEach( + result -> { + projectLists.add(new ProjectRes.ProjectList( + result.getId(), + result.getImgUrl(), + result.getProjectName(), + result.getUsages(), + result.getProjectKind(), + result.getLike() + )); + } + ); + + return projectLists; + } + + public List ProjectListWebForNotLogin(List projects) { + List projectLists = new ArrayList<>(); + + projects.forEach( + result -> { + String imageUrl = result.getProjectImage().isEmpty() ? null : result.getProjectImage().get(0).getUrl(); + projectLists.add(new ProjectRes.ProjectList( + result.getId(), + imageUrl, + result.getProjectName(), + result.getUsages(), + result.getProjectKind().getValue(), + false + )); + } + ); + return projectLists; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java b/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java deleted file mode 100644 index 94b03156..00000000 --- a/Match-Api/src/main/java/com/example/matchapi/project/enums/FILTER.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.matchapi.project.enums; - -public enum FILTER { - RECOMMEND, LATEST -} diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index adfcc6fe..4a2077a4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -3,16 +3,19 @@ import com.example.matchapi.project.convertor.ProjectConvertor; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; -import com.example.matchapi.project.enums.FILTER; +import com.example.matchcommon.constants.enums.FILTER; import com.example.matchapi.user.helper.AuthHelper; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.NotFoundException; import com.example.matchcommon.reponse.PageResponse; import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.adaptor.DonationAdaptor; import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.repository.DonationHistoryRepository; import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.project.adaptor.ProjectAdaptor; +import com.example.matchdomain.project.adaptor.ProjectImgAdaptor; import com.example.matchdomain.project.dto.ProjectDto; import com.example.matchdomain.project.entity.*; import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; @@ -43,7 +46,6 @@ import static com.example.matchdomain.project.entity.enums.TodayStatus.TODAY; import static com.example.matchdomain.project.exception.CommentDeleteErrorCode.COMMENT_DELETE_ERROR_CODE; import static com.example.matchdomain.project.exception.CommentGetErrorCode.COMMENT_NOT_EXIST; -import static com.example.matchdomain.project.exception.PatchProjectImageErrorCode.PROJECT_IMAGE_NOT_EXIST; import static com.example.matchdomain.project.exception.PatchProjectImageErrorCode.PROJECT_NOT_CORRECT_IMAGE; import static com.example.matchdomain.project.exception.ProjectGetErrorCode.PROJECT_NOT_EXIST; @@ -51,6 +53,7 @@ @Service @RequiredArgsConstructor public class ProjectService { + private final ProjectAdaptor projectAdaptor; private final ProjectRepository projectRepository; private final ProjectConvertor projectConvertor; private final ProjectImageRepository projectImageRepository; @@ -61,140 +64,49 @@ public class ProjectService { private final ProjectUserAttentionRepository projectUserAttentionRepository; private final DonationHistoryRepository donationHistoryRepository; private final CommentReportRepository commentReportRepository; + private final ProjectImgAdaptor projectImgAdaptor; + private final DonationAdaptor donationAdaptor; public PageResponse> getProjectList(User user, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - Long userId = 0L; - if(authHelper.checkGuest(user)) userId = user.getId(); - - List projectLists = new ArrayList<>(); + if(authHelper.checkGuest(user)) userId = user.getId(); if(!userId.equals(0L)){ - Page projects = projectRepository.findLoginUserProjectList(userId, PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); - projects.getContent().forEach( - result -> { - projectLists.add(new ProjectRes.ProjectList( - result.getId(), - result.getImgUrl(), - result.getProjectName(), - result.getUsages(), - result.getProjectKind(), - result.getLike() - )); - } - ); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectLists); - } + Page projects = projectAdaptor.findLoginUserProjectList(userId, page, size); - else{ - Page projects = projectRepository.findByStatusAndProjectStatusAndFinishedAtGreaterThanEqualAndProjectImage_ImageRepresentStatusOrderByViewCnt(ACTIVE, PROCEEDING, LocalDateTime.now(), ImageRepresentStatus.REPRESENT, pageable); - projects.getContent().forEach( - result -> { - String imageUrl = result.getProjectImage().isEmpty() ? null : result.getProjectImage().get(0).getUrl(); - projectLists.add(new ProjectRes.ProjectList( - result.getId(), - imageUrl, - result.getProjectName(), - result.getUsages(), - result.getProjectKind().getValue(), - false - )); - } - ); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectLists); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWeb(projects.getContent())); + } else{ + Page projects = projectAdaptor.findNotLoginUserProjectList(page, size); + + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWebForNotLogin(projects.getContent())); } } public ProjectRes.ProjectDetail getProjectDetail(User user, Long projectId) { - List projectImage = projectImageRepository.findByProjectIdAndImageRepresentStatusAndProject_StatusOrderBySequenceAsc(projectId, ImageRepresentStatus.NORMAL, ACTIVE); - return projectConvertor.projectImgList(projectImage); + return projectConvertor.projectImgList(projectImgAdaptor.getProjectDetail(projectId)); } public PageResponse> searchProjectList(User user, String content, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - - - List projectLists = new ArrayList<>(); - Long userId = 0L; + if(authHelper.checkGuest(user)) userId = user.getId(); if(!userId.equals(0L)){ + Page projects = projectAdaptor.findLoginUserSearchProjectList(userId, page, size, content); - Page projects = projectRepository.searchProjectLoginUser(userId,content,content,content, PROCEEDING.getValue(),LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(),pageable, ACTIVE.getValue()); - - projects.getContent().forEach( - result -> { - projectLists.add(new ProjectRes.ProjectList( - result.getId(), - result.getImgUrl(), - result.getProjectName(), - result.getUsages(), - result.getProjectKind(), - result.getLike() - )); - } - ); - - - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectLists); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWeb(projects.getContent())); + } else{ + Page projects = projectAdaptor.findNotLoginUserSearchProjectList(content, page, size); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWebForNotLogin(projects.getContent())); } - else{ - Page projects = projectRepository.searchProject(content,content,content, PROCEEDING,LocalDateTime.now(), ImageRepresentStatus.REPRESENT,pageable, ACTIVE); - - projects.getContent().forEach( - result -> { - String imageUrl = result.getProjectImage().isEmpty() ? null : result.getProjectImage().get(0).getUrl(); - projectLists.add(new ProjectRes.ProjectList( - result.getId(), - imageUrl, - result.getProjectName(), - result.getUsages(), - result.getProjectKind().getValue(), - false - )); - } - ); - - - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectLists); - } - - } - - public PageResponse> getProjectComment(User user, Long projectId, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - - Long userId; - if(authHelper.checkGuest(user)) userId = user.getId(); - else { - userId = 0L; - } - - Page projectComments = projectCommentRepository.findByProjectIdAndStatusOrderByCreatedAtAsc(projectId, ACTIVE, pageable); - - List commentLists = new ArrayList<>(); - projectComments.getContent().forEach( - result-> { - commentLists.add( - projectConvertor.projectComment(userId, result) - ); - } - ); - - - return new PageResponse<>(projectComments.isLast(), projectComments.getTotalElements(), commentLists); } @Transactional public void postProject(ProjectReq.Project projects, MultipartFile presentFile, List multipartFiles) { - - System.out.println(projects.getProjectName()); Project project = projectRepository.save(projectConvertor.postProject(projects)); String url = s3UploadService.uploadProjectPresentFile(project.getId() ,presentFile); @@ -224,7 +136,7 @@ public PageResponse> getProjectList(int page, @Transactional public void patchProjectStatus(ProjectStatus projectStatus, Long projectId) { - Project project = projectRepository.findById(projectId).orElseThrow(()-> new NotFoundException(PROJECT_NOT_EXIST)); + Project project = projectAdaptor.findById(projectId); project.setProjectStatus(projectStatus); @@ -234,7 +146,7 @@ public void patchProjectStatus(ProjectStatus projectStatus, Long projectId) { } public void deleteProject(Long projectId) { - Project project = projectRepository.findById(projectId).orElseThrow(()-> new NotFoundException(PROJECT_NOT_EXIST)); + Project project = projectAdaptor.findById(projectId); project.setStatus(Status.INACTIVE); @@ -243,7 +155,7 @@ public void deleteProject(Long projectId) { @Transactional public void patchProject(Long projectId, ProjectReq.ModifyProject modifyProject) { - Project project = projectRepository.findById(projectId).orElseThrow(()-> new NotFoundException(PROJECT_NOT_EXIST)); + Project project = projectAdaptor.findById(projectId); project.modifyProject(modifyProject.getProjectName(), modifyProject.getUsages(), modifyProject.getDetail(), modifyProject.getRegularStatus(), modifyProject.getStartDate(), modifyProject.getEndDate(), modifyProject.getProjectKind(), modifyProject.getSearchKeyword()); @@ -268,42 +180,40 @@ public void saveImgList(Long id, String url, List imgUrlList) { @Transactional public ProjectRes.ProjectAdminDetail getProjectAdminDetail(Long projectId) { - ProjectRepository.ProjectAdminDetail projectAdminDetail = projectRepository.getProjectAdminDetail(projectId); + ProjectRepository.ProjectAdminDetail projectAdminDetail = projectAdaptor.projectAdminDetail(projectId); + if(projectAdminDetail == null) throw new BadRequestException(PROJECT_NOT_EXIST); - List projectImages = projectImageRepository.findByProjectIdOrderBySequenceAsc(projectId); + + List projectImages = projectImgAdaptor.findProjectImages(projectId); + return projectConvertor.ProjectAdminDetail(projectAdminDetail,projectImages); } public PageResponse> getDonationList(Long projectId, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - - List donationLists = new ArrayList<>(); + Page donationUsers = donationAdaptor.findDonationUsers(projectId, page, size); - Page donationUsers = donationUserRepository.findByProjectId(projectId, pageable); - - donationUsers.getContent().forEach( - result -> donationLists.add( - projectConvertor.DonationUserInfo(result) - ) - ); - - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationLists); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), projectConvertor.DonationUserInfo(donationUsers.getContent())); } @Transactional public ProjectRes.PatchProjectImg modifyProjectImg(Long projectId, Long projectImgId, MultipartFile multipartFile) { + ProjectImage projectImage = projectImgAdaptor.findById(projectImgId); - ProjectImage projectImage = projectImageRepository.findById(projectImgId).orElseThrow(()-> new BadRequestException(PROJECT_IMAGE_NOT_EXIST)); if(!projectImage.getProjectId().equals(projectId)) throw new BadRequestException(PROJECT_NOT_CORRECT_IMAGE); + String imgUrl = s3UploadService.uploadProjectPresentFile(projectId, multipartFile); + s3UploadService.deleteFile(projectImage.getUrl()); + projectImage.setUrl(imgUrl); + projectImageRepository.save(projectImage); + return new ProjectRes.PatchProjectImg(projectImgId, projectImage.getUrl()); } public void patchProjectActive(Long projectId) { - Project project = projectRepository.findById(projectId).orElseThrow(()-> new NotFoundException(PROJECT_NOT_EXIST)); + Project project = projectAdaptor.findById(projectId); project.setStatus(ACTIVE); @@ -311,54 +221,9 @@ public void patchProjectActive(Long projectId) { } public PageResponse> getProjectLists(User user, int page, int size, ProjectKind projectKind, String content, FILTER filter) { - Pageable pageable = PageRequest.of(page, size); - Page projects = null; - List project = new ArrayList<>(); + Page projects = projectAdaptor.findProject(user, page, size, projectKind, content, filter); - if(filter == FILTER.RECOMMEND) { - if (projectKind == null) { - if (content == null) { - projects = projectRepository.findLoginUserProjectList(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); - } else { - projects = projectRepository.findByContent(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); - - } - } else { - if (content == null) { - projects = projectRepository.findByProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); - - } else { - projects = projectRepository.findByContentAndProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); - } - } - }else{ - if (projectKind == null) { - if (content == null) { - projects = projectRepository.findLoginUserProjectListLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); - } else { - projects = projectRepository.findByContentLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); - - } - } else { - if (content == null) { - projects = projectRepository.findByProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); - - } else { - projects = projectRepository.findByContentAndProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); - } - } - } - - projects.getContent().forEach( - result -> { - project.add(projectConvertor.ProjectLists(result)); - } - ); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), project); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectLists(projects.getContent())); } @Transactional @@ -373,55 +238,10 @@ public ProjectRes.ProjectLike patchProjectLike(User user, Long projectId) { return new ProjectRes.ProjectLike(!checkProjectLike); } - - public PageResponse> getProjectListQueryDsl(User user, int page, int size, ProjectKind projectKind, String content) { - Pageable pageable = PageRequest.of(page, size); - List project = new ArrayList<>(); - - Page projects = null; - - - if(projectKind == null){ - if(content == null){ - projects = projectRepository.findLoginUserProjectList(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), REPRESENT.getValue(), pageable, ACTIVE.getValue()); - } - else{ - projects = projectRepository.findByContent(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); - - } - }else{ - if(content == null){ - projects = projectRepository.findByProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); - - } - else{ - projects = projectRepository.findByContentAndProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), - REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); - } - } - - - projects.getContent().forEach( - result -> { - project.add(projectConvertor.ProjectLists(result)); - } - ); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), project); - } - public PageResponse> getTodayProjectLists(User user, int page, int size) { - Pageable pageable = PageRequest.of(page, size); - List project = new ArrayList<>(); - - Page projects = projectRepository.findTodayProject(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), REPRESENT.getValue(), ACTIVE.getValue(), TODAY.getValue(), pageable); + Page projects = projectAdaptor.getTodayProjectLists(user.getId(), page, size); - projects.getContent().forEach( - result -> { - project.add(projectConvertor.ProjectLists(result)); - } - ); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), project); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectLists(projects.getContent())); } public ProjectRes.ProjectAppDetail getProjectAppDetail(User user, Long projectId) { diff --git a/Match-Api/src/main/resources/application.yml b/Match-Api/src/main/resources/application.yml index 7b759d57..60ebeabb 100644 --- a/Match-Api/src/main/resources/application.yml +++ b/Match-Api/src/main/resources/application.yml @@ -34,7 +34,7 @@ springdoc: swagger-ui: path: demo-ui.html # Swagger UI ๊ฒฝ๋กœ => localhost:8000/demo-ui.html tags-sorter: alpha # alpha: ์•ŒํŒŒ๋ฒณ ์ˆœ ํƒœ๊ทธ ์ •๋ ฌ, method: HTTP Method ์ˆœ ์ •๋ ฌ - operations-sorter: summary # alpha: ์•ŒํŒŒ๋ฒณ ์ˆœ ํƒœ๊ทธ ์ •๋ ฌ, method: HTTP Method ์ˆœ ์ •๋ ฌ + operations-sorter: alpha # alpha: ์•ŒํŒŒ๋ฒณ ์ˆœ ํƒœ๊ทธ ์ •๋ ฌ, method: HTTP Method ์ˆœ ์ •๋ ฌ api-docs: path: /api-docs/json groups: diff --git a/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java b/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java index d83d6cfa..e00a7ae9 100644 --- a/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java +++ b/Match-Batch/src/main/java/com/example/matchbatch/convertor/OrderConvertor.java @@ -7,6 +7,7 @@ import com.example.matchdomain.donation.entity.enums.PayMethod; import com.example.matchdomain.donation.entity.enums.PaymentStatus; import com.example.matchdomain.donation.entity.enums.RegularStatus; +import com.example.matchdomain.donation.entity.flameEnum.FlameImage; import com.example.matchinfrastructure.pay.nice.dto.NiceBillOkRequest; import com.example.matchinfrastructure.pay.nice.dto.NiceBillOkResponse; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; @@ -43,6 +44,7 @@ public DonationUser donationUser(PortOneBillPayResponse response, Long userId, S .regularStatus(RegularStatus.REGULAR) .projectId(projectId) .regularPaymentId(regularPaymentId) + .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); } diff --git a/Match-Common/src/main/java/com/example/matchcommon/constants/enums/FILTER.java b/Match-Common/src/main/java/com/example/matchcommon/constants/enums/FILTER.java new file mode 100644 index 00000000..0a9dada7 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/constants/enums/FILTER.java @@ -0,0 +1,5 @@ +package com.example.matchcommon.constants.enums; + +public enum FILTER { + RECOMMEND, LATEST +} diff --git a/Match-Common/src/main/java/com/example/matchcommon/properties/JwtProperties.java b/Match-Common/src/main/java/com/example/matchcommon/properties/JwtProperties.java index 13567d51..cbf355b2 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/properties/JwtProperties.java +++ b/Match-Common/src/main/java/com/example/matchcommon/properties/JwtProperties.java @@ -20,6 +20,4 @@ public class JwtProperties { private String refresh; private Long accessTokenSeconds; private Long refreshTokenSeconds; - - } diff --git a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationHistory.java b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationHistory.java index e794bd4f..42e74dc6 100644 --- a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationHistory.java +++ b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationHistory.java @@ -24,8 +24,12 @@ public class QDonationHistory extends EntityPathBase { public final com.example.matchdomain.common.model.QBaseEntity _super = new com.example.matchdomain.common.model.QBaseEntity(this); + public final ListPath> changeIdLists = this.>createList("changeIdLists", Long.class, NumberPath.class, PathInits.DIRECT2); + public final NumberPath cnt = createNumber("cnt", Integer.class); + public final ListPath> completeIdLists = this.>createList("completeIdLists", Long.class, NumberPath.class, PathInits.DIRECT2); + //inherited public final DateTimePath createdAt = _super.createdAt; @@ -33,8 +37,6 @@ public class QDonationHistory extends EntityPathBase { public final NumberPath donationUserId = createNumber("donationUserId", Long.class); - public final StringPath flameImage = createString("flameImage"); - public final ListPath historyImages = this.createList("historyImages", HistoryImage.class, QHistoryImage.class, PathInits.DIRECT2); public final EnumPath historyStatus = createEnum("historyStatus", com.example.matchdomain.donation.entity.enums.HistoryStatus.class); diff --git a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationUser.java b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationUser.java index e46715d1..4a2d38f9 100644 --- a/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationUser.java +++ b/Match-Domain/src/main/generated/com/example/matchdomain/donation/entity/QDonationUser.java @@ -31,6 +31,10 @@ public class QDonationUser extends EntityPathBase { public final EnumPath donationStatus = createEnum("donationStatus", com.example.matchdomain.donation.entity.enums.DonationStatus.class); + public final StringPath flameImage = createString("flameImage"); + + public final EnumPath flameType = createEnum("flameType", com.example.matchdomain.donation.entity.flameEnum.FlameType.class); + public final NumberPath id = createNumber("id", Long.class); public final StringPath inherenceName = createString("inherenceName"); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java index 872258ab..1d47bdc6 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java @@ -11,7 +11,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.security.core.parameters.P; import java.util.List; @@ -71,4 +70,16 @@ public Page getFlameProjectList(User user,String content, int page return donationUserRepository.findByUserAndInherenceNameContainingAndProject_ProjectImg_RepresentStatusOrderByCreatedAtDesc(user, content, REPRESENT, pageable); } + + public Page findDonationUsers(Long projectId, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + return donationUserRepository.findByProjectId(projectId, pageable); + } + + public Page findByUser(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + return donationUserRepository.findByUserAndDonationStatusNotOrderByCreatedAtDesc(user, EXECUTION_REFUND, pageable); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java index c2769b34..1569b430 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java @@ -11,6 +11,10 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import java.util.List; +import java.util.stream.Collectors; + +import static com.example.matchdomain.donation.entity.enums.RegularPayStatus.PROCEEDING; import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_EXIST; import static com.example.matchdomain.donation.exception.GetRegularErrorCode.REGULAR_NOT_EXIST; @@ -30,4 +34,20 @@ public Page findByUser(User user, int page, int size){ Pageable pageable = PageRequest.of(page, size); return regularPaymentRepository.findByUserOrderByCreatedAtDesc(user, pageable); } + + public Page findBurningFlameList(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + return regularPaymentRepository.findRegularListCustom(user, PROCEEDING, pageable); + } + + public Page getBurningFlameList(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + return regularPaymentRepository.getBurningFlameListCustom(user.getId(), PROCEEDING.getValue(), pageable); + } + + public List findByIdList(Long regularPayId, User user){ + return regularPaymentRepository.findByIdAndUserOrderByCreatedAtDesc(regularPayId, user).stream() + .map(RegularPayment :: getId) + .collect(Collectors.toList()); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationHistory.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationHistory.java index 6f191716..fbd6380b 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationHistory.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationHistory.java @@ -47,8 +47,6 @@ public class DonationHistory extends BaseEntity { @Column(name="donationUserId") private Long donationUserId; - private String flameImage; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "projectId",nullable = false, insertable=false, updatable=false) private Project project; @@ -60,4 +58,13 @@ public class DonationHistory extends BaseEntity { @JoinColumn(name = "donationHistoryId") private List historyImages = new ArrayList<>(); + @Column + @ElementCollection + private List completeIdLists; + + @Column + @ElementCollection + private List changeIdLists; + + } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationUser.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationUser.java index 4d9ad468..96194a7b 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationUser.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/DonationUser.java @@ -4,6 +4,7 @@ import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.PayMethod; import com.example.matchdomain.donation.entity.enums.RegularStatus; +import com.example.matchdomain.donation.entity.flameEnum.FlameType; import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; import lombok.*; @@ -71,6 +72,11 @@ public class DonationUser extends BaseEntity { @Enumerated(EnumType.STRING) private RegularStatus regularStatus; + private String flameImage; + + @Enumerated(EnumType.STRING) + private FlameType flameType = FlameType.NORMAL_FLAME; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "donationUserId") @BatchSize(size = 100) diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameImage.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameImage.java new file mode 100644 index 00000000..9654a99e --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameImage.java @@ -0,0 +1,11 @@ +package com.example.matchdomain.donation.entity.flameEnum; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum FlameImage { + NORMAL_IMG("https://match-image.s3.ap-northeast-2.amazonaws.com/flame.png"); + private final String img; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameType.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameType.java new file mode 100644 index 00000000..81f9c2ba --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/flameEnum/FlameType.java @@ -0,0 +1,14 @@ +package com.example.matchdomain.donation.entity.flameEnum; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum FlameType { + NORMAL_FLAME("NORMAL_FLAME", "์ผ๋ฐ˜ ๋ถˆ๊ฝƒ"); + + private final String value; + + private final String type; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationCustomRepositoryImpl.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationCustomRepositoryImpl.java index a761f21a..d35adaeb 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationCustomRepositoryImpl.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationCustomRepositoryImpl.java @@ -11,6 +11,8 @@ import java.util.List; +import static com.example.matchdomain.donation.entity.enums.HistoryStatus.COMPLETE; + @RequiredArgsConstructor public class DonationCustomRepositoryImpl implements DonationCustomRepository{ private final JPAQueryFactory queryFactory; @@ -30,6 +32,15 @@ public Page getDonationHistoryCustom(Long regularPaymentId, Lon .and(donationHistory.historyStatus.ne(HistoryStatus.TURN_ON)) .and(donationHistory.historyStatus.ne(HistoryStatus.START)) .and(donationHistory.historyStatus.ne(HistoryStatus.FINISH)) + .and( + donationHistory.historyStatus.eq(HistoryStatus.COMPLETE) + .and(donationHistory.completeIdLists.contains(donationId)) + .or(donationHistory.historyStatus.ne(HistoryStatus.COMPLETE))) + .and( + donationHistory.historyStatus.eq(HistoryStatus.CHANGE) + .and(donationHistory.changeIdLists.contains(donationId)) + .or(donationHistory.historyStatus.ne(HistoryStatus.CHANGE))) + ) .orderBy(donationHistory.createdAt.asc()) .offset(pageable.getOffset()) @@ -44,6 +55,15 @@ public Page getDonationHistoryCustom(Long regularPaymentId, Lon .and(donationHistory.historyStatus.ne(HistoryStatus.TURN_ON)) .and(donationHistory.historyStatus.ne(HistoryStatus.START)) .and(donationHistory.historyStatus.ne(HistoryStatus.FINISH)) + .and( + donationHistory.historyStatus.eq(HistoryStatus.COMPLETE) + .and(donationHistory.completeIdLists.contains(donationId)) + .or(donationHistory.historyStatus.ne(HistoryStatus.COMPLETE))) + .and( + donationHistory.historyStatus.eq(HistoryStatus.CHANGE) + .and(donationHistory.changeIdLists.contains(donationId)) + .or(donationHistory.historyStatus.ne(HistoryStatus.CHANGE))) + ) .orderBy(donationHistory.createdAt.asc()); return PageableExecutionUtils.getPage(donationHistories, pageable, countQuery::fetchCount); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java index dd20e282..e5b87de4 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java @@ -110,6 +110,11 @@ public interface DonationUserRepository extends JpaRepository List findByIdIn(List donationUserLists); + @Query(value = "select du from DonationUser du join fetch du.project p " + + " where du.user = :user and du.donationStatus != :donationStatus order by du.createdAt asc", + countQuery = "select count(du) from DonationUser du where du.user = :user and du.donationStatus =:donationStatus") + Page findByUserAndDonationStatusNotOrderByCreatedAtDesc(@Param("user") User user, @Param("donationStatus") DonationStatus donationStatus, Pageable pageable); + interface flameList { Long getRegularPayId(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepository.java new file mode 100644 index 00000000..7330b3e4 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepository.java @@ -0,0 +1,11 @@ +package com.example.matchdomain.donation.repository; + +import com.example.matchdomain.donation.entity.RegularPayment; +import com.example.matchdomain.donation.entity.enums.RegularPayStatus; +import com.example.matchdomain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface RegularPaymentCustomRepository { + Page findRegularListCustom(User user, RegularPayStatus regularPayStatus, Pageable pageable); +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepositoryImpl.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepositoryImpl.java new file mode 100644 index 00000000..6f4e42ba --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentCustomRepositoryImpl.java @@ -0,0 +1,49 @@ +package com.example.matchdomain.donation.repository; + +import com.example.matchdomain.donation.entity.QDonationUser; +import com.example.matchdomain.donation.entity.QRegularPayment; +import com.example.matchdomain.donation.entity.RegularPayment; +import com.example.matchdomain.donation.entity.enums.RegularPayStatus; +import com.example.matchdomain.user.entity.User; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; + +import java.util.List; + +@RequiredArgsConstructor +public class RegularPaymentCustomRepositoryImpl implements RegularPaymentCustomRepository{ + private final JPAQueryFactory queryFactory; + @Override + public Page findRegularListCustom(User user, RegularPayStatus regularPayStatus, Pageable pageable) { + QRegularPayment regularPayment = QRegularPayment.regularPayment; + QDonationUser donationUser = QDonationUser.donationUser; + + List regularPayments = + queryFactory.selectFrom(regularPayment) + .leftJoin(donationUser).on(regularPayment.id.eq(donationUser.regularPaymentId)) + .where(donationUser.createdAt.eq( + JPAExpressions + .select(donationUser.createdAt.max()) + .from(donationUser) + .where(donationUser.regularPayment.eq(regularPayment))) + .and(regularPayment.user.eq(user)) + .and(regularPayment.regularPayStatus.eq(regularPayStatus)) + + ) + .orderBy(regularPayment.createdAt.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + JPAQuery countQuery = queryFactory + .selectFrom(regularPayment) + .where(regularPayment.user.eq(user) + .and(regularPayment.regularPayStatus.eq(regularPayStatus))); + + return PageableExecutionUtils.getPage(regularPayments, pageable, countQuery::fetchCount); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java index fb8120ac..f025b88d 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java @@ -7,7 +7,6 @@ import com.example.matchdomain.user.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -16,24 +15,42 @@ import java.util.Optional; -public interface RegularPaymentRepository extends JpaRepository { +public interface RegularPaymentRepository extends JpaRepository, RegularPaymentCustomRepository { Optional findByIdAndStatus(Long regularId, Status status); - @EntityGraph(attributePaths = "userCard") - List findByPayDateGreaterThanEqualAndStatus(int currentDay, Status status); - - @EntityGraph(attributePaths = "userCard") - List findByPayDateAndStatus(int currentDay, Status status); - List findByPayDateGreaterThanEqualAndStatusAndRegularPayStatus(int currentDay, Status status, RegularPayStatus regularPayStatus); @Query("SELECT RP FROM RegularPayment RP join fetch RP.user where RP.projectId=:id and RP.regularPayStatus=:regularPayStatus") List findByProjectIdAndRegularPayStatus(@Param("id") Long id,@Param("regularPayStatus") RegularPayStatus regularPayStatus); List findByUser(User user); - + List findByUserCardId(Long cardId); Page findByUserOrderByCreatedAtDesc(User user, Pageable pageable); + + @Query(value = "select RP.id as 'regularPayId', P.usages as 'usages', DU.inherenceName as 'inherenceName', DU.flameImage as 'image'" + + "from RegularPayment RP " + + "join Project P on P.id = RP.projectId " + + "join DonationUser DU on DU.regularPaymentId = RP.id " + + "where RP.userId = :userId and regularPayStatus = :regularPayStatus and DU.createdAt = " + + "(select max(DU2.createdAt) from DonationUser DU2 where DU2.regularPaymentId = RP.id )", + nativeQuery = true, + countQuery = "select count(*) from RegularPayment RP where RP.userId = :userId and regularPayStatus = :regularPayStatus") + Page getBurningFlameListCustom(@Param("userId") Long userId, @Param("regularPayStatus") String regularPayStatus, + Pageable pageable); + + List findByIdAndUserOrderByCreatedAtDesc(Long regularPayId, User user); + + interface RegularPaymentFlame { + Long getRegularPayId(); + + String getUsages(); + + String getInherenceName(); + + String getImage(); + + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java new file mode 100644 index 00000000..4ac3b214 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java @@ -0,0 +1,116 @@ +package com.example.matchdomain.project.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.constants.enums.FILTER; +import com.example.matchcommon.exception.NotFoundException; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.project.entity.Project; +import com.example.matchdomain.project.entity.ProjectImage; +import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; +import com.example.matchdomain.project.entity.enums.ProjectKind; +import com.example.matchdomain.project.repository.ProjectRepository; +import com.example.matchdomain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDateTime; +import java.util.List; + +import static com.example.matchdomain.common.model.Status.ACTIVE; +import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; +import static com.example.matchdomain.project.entity.enums.ProjectStatus.PROCEEDING; +import static com.example.matchdomain.project.entity.enums.TodayStatus.TODAY; +import static com.example.matchdomain.project.exception.ProjectGetErrorCode.PROJECT_NOT_EXIST; + +@Adaptor +@RequiredArgsConstructor +public class ProjectAdaptor { + private final ProjectRepository projectRepository; + + public Page findLoginUserProjectList(Long userId, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + + return projectRepository.findLoginUserProjectList(userId, PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); + } + public Page findNotLoginUserProjectList(int page, int size){ + Pageable pageable = PageRequest.of(page, size); + + return projectRepository.findByStatusAndProjectStatusAndFinishedAtGreaterThanEqualAndProjectImage_ImageRepresentStatusOrderByViewCnt(ACTIVE, PROCEEDING, LocalDateTime.now(), ImageRepresentStatus.REPRESENT, pageable); + } + + public Page findLoginUserSearchProjectList(Long userId, int page, int size, String content){ + Pageable pageable = PageRequest.of(page, size); + + return projectRepository.searchProjectLoginUser(userId,content,content,content, PROCEEDING.getValue(),LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(),pageable, ACTIVE.getValue()); + } + public Page findNotLoginUserSearchProjectList(String content, int page, int size){ + Pageable pageable = PageRequest.of(page, size); + + return projectRepository.searchProject(content,content,content, PROCEEDING,LocalDateTime.now(), ImageRepresentStatus.REPRESENT,pageable, ACTIVE); + + } + + public ProjectRepository.ProjectAdminDetail projectAdminDetail(Long projectId) { + return projectRepository.getProjectAdminDetail(projectId); + } + + public Project findById(Long projectId) { + return projectRepository.findById(projectId).orElseThrow(()-> new NotFoundException(PROJECT_NOT_EXIST)); + } + + + public Page findProject(User user, int page, int size, ProjectKind projectKind, String content, FILTER filter) { + Page projects = null; + Pageable pageable = PageRequest.of(page, size); + + if(filter == FILTER.RECOMMEND) { + if (projectKind == null) { + if (content == null) { + projects = projectRepository.findLoginUserProjectList(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); + } else { + projects = projectRepository.findByContent(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); + + } + } else { + if (content == null) { + projects = projectRepository.findByProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); + + } else { + projects = projectRepository.findByContentAndProjectKind(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); + } + } + }else{ + if (projectKind == null) { + if (content == null) { + projects = projectRepository.findLoginUserProjectListLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue()); + } else { + projects = projectRepository.findByContentLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), content); + + } + } else { + if (content == null) { + projects = projectRepository.findByProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue()); + + } else { + projects = projectRepository.findByContentAndProjectKindLatest(user.getId(), PROCEEDING.getValue(), LocalDateTime.now(), + ImageRepresentStatus.REPRESENT.getValue(), pageable, ACTIVE.getValue(), projectKind.getValue(), content); + } + } + } + + return projects; + } + + public Page getTodayProjectLists(Long userId, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + return projectRepository.findTodayProject(userId, PROCEEDING.getValue(), LocalDateTime.now(), REPRESENT.getValue(), ACTIVE.getValue(), TODAY.getValue(), pageable); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java new file mode 100644 index 00000000..891aa1d1 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java @@ -0,0 +1,32 @@ +package com.example.matchdomain.project.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; +import com.example.matchdomain.project.entity.ProjectImage; +import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; +import com.example.matchdomain.project.repository.ProjectImageRepository; +import com.example.matchdomain.user.entity.User; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +import static com.example.matchdomain.common.model.Status.ACTIVE; +import static com.example.matchdomain.project.exception.PatchProjectImageErrorCode.PROJECT_IMAGE_NOT_EXIST; + +@Adaptor +@RequiredArgsConstructor +public class ProjectImgAdaptor { + private final ProjectImageRepository projectImageRepository; + + public List getProjectDetail(Long projectId) { + return projectImageRepository.findByProjectIdAndImageRepresentStatusAndProject_StatusOrderBySequenceAsc(projectId, ImageRepresentStatus.NORMAL, ACTIVE); + } + + public List findProjectImages(Long projectId) { + return projectImageRepository.findByProjectIdOrderBySequenceAsc(projectId); + } + + public ProjectImage findById(Long projectImgId) { + return projectImageRepository.findById(projectImgId).orElseThrow(()-> new BadRequestException(PROJECT_IMAGE_NOT_EXIST)); + } +} From ffc5aa9cd15a6223d782a36edf4dc2ed3bf96a81 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 16 Oct 2023 17:48:59 +0900 Subject: [PATCH 13/82] =?UTF-8?q?:recycle:=20:=20Swagger=20Operation=20des?= =?UTF-8?q?cription=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/project/controller/ProjectController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java index 7316f073..d192e573 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java @@ -38,7 +38,7 @@ public class ProjectController { private final ProjectService projectService; private final DonationService donationService; - @Operation(summary = "03-01๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API.",description = "ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-01๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API. #Web version",description = "ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("") public CommonResponse>> getProjectList( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -48,7 +48,7 @@ public CommonResponse>> getProjectList return CommonResponse.onSuccess(projectService.getProjectList(user, page, size)); } - @Operation(summary = "03-02๐Ÿ’ป ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API.",description = "ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-02๐Ÿ’ป ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API. #Web version",description = "ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/{projectId}") @CheckIdExist @ApiErrorCodeExample({ProjectOneTimeErrorCode.class}) @@ -60,7 +60,7 @@ public CommonResponse getProject( } - @Operation(summary = "03-03๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ",description = "ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-03๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ #Web version",description = "ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/search") public CommonResponse>> searchProjectList( @Parameter(hidden = true) @AuthenticationPrincipal User user, From 1fdff2c12bfd7e45a9181ff0163e85c2b8f6a922 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:41:35 +0900 Subject: [PATCH 14/82] =?UTF-8?q?:recycle:=20:=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchdomain/donation/repository/DonationUserRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java index e5b87de4..7b984f5d 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java @@ -112,7 +112,7 @@ public interface DonationUserRepository extends JpaRepository @Query(value = "select du from DonationUser du join fetch du.project p " + " where du.user = :user and du.donationStatus != :donationStatus order by du.createdAt asc", - countQuery = "select count(du) from DonationUser du where du.user = :user and du.donationStatus =:donationStatus") + countQuery = "select count(du) from DonationUser du where du.user = :user and du.donationStatus != :donationStatus") Page findByUserAndDonationStatusNotOrderByCreatedAtDesc(@Param("user") User user, @Param("donationStatus") DonationStatus donationStatus, Pageable pageable); From 52bfe802da6eaf5031ec5be089d49ad225218f30 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 16 Oct 2023 17:48:59 +0900 Subject: [PATCH 15/82] =?UTF-8?q?:recycle:=20:=20Swagger=20Operation=20des?= =?UTF-8?q?cription=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/project/controller/ProjectController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java index 7316f073..d192e573 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java @@ -38,7 +38,7 @@ public class ProjectController { private final ProjectService projectService; private final DonationService donationService; - @Operation(summary = "03-01๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API.",description = "ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-01๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API. #Web version",description = "ํ”„๋กœ์ ํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("") public CommonResponse>> getProjectList( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -48,7 +48,7 @@ public CommonResponse>> getProjectList return CommonResponse.onSuccess(projectService.getProjectList(user, page, size)); } - @Operation(summary = "03-02๐Ÿ’ป ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API.",description = "ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-02๐Ÿ’ป ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API. #Web version",description = "ํ”„๋กœ์ ํŠธ ์ƒ์„ธ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/{projectId}") @CheckIdExist @ApiErrorCodeExample({ProjectOneTimeErrorCode.class}) @@ -60,7 +60,7 @@ public CommonResponse getProject( } - @Operation(summary = "03-03๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ",description = "ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "03-03๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ #Web version",description = "ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/search") public CommonResponse>> searchProjectList( @Parameter(hidden = true) @AuthenticationPrincipal User user, From 5767786fabfd41df93731635704f0f0a572ac07f Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:41:00 +0900 Subject: [PATCH 16/82] =?UTF-8?q?:zap:=20:=20=EC=95=A0=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/AuthController.java | 7 ++ .../matchapi/user/service/AuthService.java | 11 +++ .../user/exception/AppleErrorCode.java | 44 ++++++++++ .../oauth/apple/client/AppleFeignClient.java | 18 +++++ .../apple/config/AppleFeignConfiguration.java | 25 ++++++ .../oauth/apple/config/AppleInfoConfig.java | 24 ++++++ .../apple/config/AppleInfoErrorDecoder.java | 30 +++++++ .../oauth/apple/dto/ApplePublicResponse.java | 17 ++++ .../oauth/apple/dto/Key.java | 17 ++++ .../oauth/apple/exception/AppleErrorCode.java | 44 ++++++++++ .../oauth/apple/service/AppleAuthService.java | 80 +++++++++++++++++++ 11 files changed, 317 insertions(+) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/user/exception/AppleErrorCode.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/client/AppleFeignClient.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleFeignConfiguration.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoConfig.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoErrorDecoder.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/ApplePublicResponse.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/Key.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/AuthController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/AuthController.java index 37001bd5..a2546a5b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/AuthController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/AuthController.java @@ -162,4 +162,11 @@ public CommonResponse checkEmailAuth(@RequestBody UserReq.UserPhoneAuth return CommonResponse.onSuccess("ํ•ธ๋“œํฐ ์ธ์ฆ ์„ฑ๊ณต"); } + @Operation(summary="01-11๐Ÿ”‘ ์• ํ”Œ๋กœ๊ทธ์ธ API", description= "์• ํ”Œ๋กœ๊ทธ์ธ API ์ž…๋‹ˆ๋‹ค.") + @PostMapping("/apple") + @ApiErrorCodeExample({UserSignUpErrorCode.class, OtherServerErrorCode.class, RequestErrorCode.class}) + public CommonResponse appleLogin(@RequestBody @Valid UserReq.SocialLoginToken socialLoginToken){ + return CommonResponse.onSuccess(authService.appleLogin(socialLoginToken)); + } + } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java index 60b9e292..91adcfb0 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java @@ -22,6 +22,9 @@ import com.example.matchdomain.user.repository.UserAddressRepository; import com.example.matchdomain.user.repository.UserRepository; import com.example.matchinfrastructure.match_aligo.client.MatchAligoFeignClient; +import com.example.matchinfrastructure.oauth.apple.client.AppleFeignClient; +import com.example.matchinfrastructure.oauth.apple.dto.ApplePublicResponse; +import com.example.matchinfrastructure.oauth.apple.service.AppleAuthService; import com.example.matchinfrastructure.oauth.kakao.client.KakaoFeignClient; import com.example.matchinfrastructure.oauth.kakao.client.KakaoLoginFeignClient; import com.example.matchinfrastructure.oauth.kakao.dto.KakaoLoginTokenRes; @@ -74,6 +77,7 @@ public class AuthService { private final MailService mailService; private final CodeAuthRepository codeAuthRepository; private final MatchAligoFeignClient matchAligoFeignClient; + private final AppleAuthService authService; @Transactional @@ -254,4 +258,11 @@ public void checkPhoneAuth(UserReq.UserPhoneAuth phone) { CodeAuth codeAuth = codeAuthRepository.findById(phone.getPhone()).orElseThrow(()->new BadRequestException(NOT_CORRECT_AUTH)); if(!codeAuth.getCode().equals(phone.getCode()))throw new BadRequestException(NOT_CORRECT_CODE); } + + public UserRes.UserToken appleLogin(UserReq.SocialLoginToken socialLoginToken) { + authService.appleLogin(socialLoginToken.getAccessToken()); + + + return null; + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/exception/AppleErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/user/exception/AppleErrorCode.java new file mode 100644 index 00000000..e10a3042 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/exception/AppleErrorCode.java @@ -0,0 +1,44 @@ +package com.example.matchdomain.user.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Objects; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.FORBIDDEN; + +@Getter +@AllArgsConstructor +public enum AppleErrorCode implements BaseErrorCode { + @ExplainError("๊ณต๊ฐœํ‚ค ์—๋Ÿฌ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์œ„") + MISMATCH_APPLE_KEY(BAD_REQUEST,"APPLE_001","๊ณต๊ฐœ ํ‚ค์ค‘ ์ผ์น˜ํ•˜๋Š” ํ‚ค ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); + private final HttpStatus httpStatus; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + HashMap data = new HashMap<>(); + data.put("signUpType","์ด๋ฏธ ๊ฐ€์ž…๋œ (๊ฐ€์ž…ํ•œ ํƒ€์ž…) ๊ณ„์ •์ด ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค. (๊ฐ€์ž…ํ•œ ํƒ€์ž…) ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ•ด์ฃผ์„ธ์š”."); + return ErrorReason.builder().message(message).code(code).isSuccess(false).result(data).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/client/AppleFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/client/AppleFeignClient.java new file mode 100644 index 00000000..05b65665 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/client/AppleFeignClient.java @@ -0,0 +1,18 @@ +package com.example.matchinfrastructure.oauth.apple.client; + +import com.example.matchinfrastructure.oauth.apple.config.AppleInfoConfig; +import com.example.matchinfrastructure.oauth.apple.dto.ApplePublicResponse; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +@FeignClient( + name = "AppleFeignClient", + url = "https://appleid.apple.com", + configuration = AppleInfoConfig.class) +@Component +public interface AppleFeignClient { + @GetMapping("/auth/keys") + ApplePublicResponse getPublicKey(); +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleFeignConfiguration.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleFeignConfiguration.java new file mode 100644 index 00000000..f5493410 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleFeignConfiguration.java @@ -0,0 +1,25 @@ +package com.example.matchinfrastructure.oauth.apple.config; + +import com.example.matchinfrastructure.oauth.kakao.config.KakaoInfoErrorDecoder; +import feign.Logger; +import feign.RequestInterceptor; +import feign.codec.ErrorDecoder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@Import(AppleInfoErrorDecoder.class) +public class AppleFeignConfiguration { + @Bean + public RequestInterceptor requestInterceptor() { + return template -> template.header("Content-Type", "application/json"); + } + @Bean + public ErrorDecoder errorDecoder() { + return new AppleInfoErrorDecoder(); + } + + @Bean + Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoConfig.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoConfig.java new file mode 100644 index 00000000..ced15c9f --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoConfig.java @@ -0,0 +1,24 @@ +package com.example.matchinfrastructure.oauth.apple.config; + + +import com.example.matchinfrastructure.oauth.kakao.config.KakaoInfoErrorDecoder; +import feign.codec.Encoder; +import feign.codec.ErrorDecoder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@Import(AppleInfoErrorDecoder.class) +public class AppleInfoConfig { + + @Bean + @ConditionalOnMissingBean(value = ErrorDecoder.class) + public AppleInfoErrorDecoder commonFeignErrorDecoder() { + return new AppleInfoErrorDecoder(); + } + + @Bean + Encoder formEncoder() { + return new feign.form.FormEncoder(); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoErrorDecoder.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoErrorDecoder.java new file mode 100644 index 00000000..475dfd7a --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/config/AppleInfoErrorDecoder.java @@ -0,0 +1,30 @@ +package com.example.matchinfrastructure.oauth.apple.config; + + +import com.example.matchcommon.exception.OtherServerException; +import feign.FeignException; +import feign.Response; +import feign.codec.ErrorDecoder; + +import static com.example.matchcommon.exception.errorcode.OtherServerErrorCode.*; + +public class AppleInfoErrorDecoder implements ErrorDecoder { + + @Override + public Exception decode(String methodKey, Response response) { + if (response.status() >= 400) { + switch (response.status()) { + case 401: + throw new OtherServerException(OTHER_SERVER_UNAUTHORIZED); + case 403: + throw new OtherServerException(OTHER_SERVER_FORBIDDEN); + case 419: + throw new OtherServerException(OTHER_SERVER_EXPIRED_TOKEN); + default: + throw new OtherServerException(OTHER_SERVER_BAD_REQUEST); + } + } + + return FeignException.errorStatus(methodKey, response); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/ApplePublicResponse.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/ApplePublicResponse.java new file mode 100644 index 00000000..1bdc9d35 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/ApplePublicResponse.java @@ -0,0 +1,17 @@ +package com.example.matchinfrastructure.oauth.apple.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; +import java.util.Optional; + +@Getter +@Setter +@NoArgsConstructor +public class ApplePublicResponse { + private List keys; +} + diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/Key.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/Key.java new file mode 100644 index 00000000..2f0131e1 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/Key.java @@ -0,0 +1,17 @@ +package com.example.matchinfrastructure.oauth.apple.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class Key { + private String kty; + private String kid; + private String use; + private String alg; + private String n; + private String e; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java new file mode 100644 index 00000000..40f62ad1 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java @@ -0,0 +1,44 @@ +package com.example.matchinfrastructure.oauth.apple.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Objects; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; + +@Getter +@AllArgsConstructor +public enum AppleErrorCode implements BaseErrorCode { + @ExplainError("๊ณต๊ฐœํ‚ค ์—๋Ÿฌ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์œ„") + MISMATCH_APPLE_KEY(BAD_REQUEST,"APPLE_001","๊ณต๊ฐœ ํ‚ค์ค‘ ์ผ์น˜ํ•˜๋Š” ํ‚ค ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + FAIL_MAKE_PUBLIC_KEY(BAD_REQUEST,"APPLE_002", "๊ณต๊ฐœํ‚ค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + private final HttpStatus httpStatus; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + HashMap data = new HashMap<>(); + data.put("signUpType","์ด๋ฏธ ๊ฐ€์ž…๋œ (๊ฐ€์ž…ํ•œ ํƒ€์ž…) ๊ณ„์ •์ด ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค. (๊ฐ€์ž…ํ•œ ํƒ€์ž…) ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ•ด์ฃผ์„ธ์š”."); + return ErrorReason.builder().message(message).code(code).isSuccess(false).result(data).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java new file mode 100644 index 00000000..c7f125e6 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java @@ -0,0 +1,80 @@ +package com.example.matchinfrastructure.oauth.apple.service; + +import com.example.matchcommon.exception.BadRequestException; +import com.example.matchinfrastructure.oauth.apple.client.AppleFeignClient; +import com.example.matchinfrastructure.oauth.apple.dto.ApplePublicResponse; +import com.example.matchinfrastructure.oauth.apple.dto.Key; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.RSAPublicKeySpec; +import java.util.Base64; +import java.util.List; + +import static com.example.matchinfrastructure.oauth.apple.exception.AppleErrorCode.FAIL_MAKE_PUBLIC_KEY; +import static com.example.matchinfrastructure.oauth.apple.exception.AppleErrorCode.MISMATCH_APPLE_KEY; + +@Service +@RequiredArgsConstructor +public class AppleAuthService { + private final AppleFeignClient appleFeignClient; + public void appleLogin(String identityToken) { + JsonParser parser = new JsonParser(); + ApplePublicResponse applePublicResponse = appleFeignClient.getPublicKey(); + + String headerOfIdentityToken = identityToken.substring(0, identityToken.indexOf(".")); + + String header = new String(Base64.getDecoder().decode(headerOfIdentityToken), StandardCharsets.UTF_8); + + JsonObject parseHeader = (new Gson()).fromJson(header, JsonObject.class); + String kidValue = parseHeader.get("kid").getAsString(); + String algValue = parseHeader.get("alg").getAsString(); + Key foundKey = getMatchedKeyBy(kidValue, algValue, applePublicResponse.getKeys()); + + PublicKey publicKey = getPublicKey(foundKey); + + Claims userInfo = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(identityToken).getBody(); + JsonObject userInfoObject = (JsonObject) parser.parse(new Gson().toJson(userInfo)); + String iss = userInfoObject.get("iss").getAsString(); + String aud = userInfoObject.get("aud").getAsString(); + + String appleId = userInfoObject.get("sub").getAsString(); + String email = userInfoObject.get("email").getAsString(); + } + + + public Key getMatchedKeyBy(String kid, String alg, List keys) { + return keys.stream() + .filter(key -> key.getKid().equals(kid) && key.getAlg().equals(alg)) + .findFirst().orElseThrow(()->new BadRequestException(MISMATCH_APPLE_KEY)); + } + + + public PublicKey getPublicKey(Key key) { + String nStr = key.getN(); + String eStr = key.getE(); + + byte[] nBytes = Base64.getUrlDecoder().decode(nStr.substring(0)); + byte[] eBytes = Base64.getUrlDecoder().decode(eStr.substring(0)); + + BigInteger n = new BigInteger(1, nBytes); + BigInteger e = new BigInteger(1, eBytes); + + try { + RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(n, e); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(publicKeySpec); + } catch (Exception exception) { + throw new BadRequestException(FAIL_MAKE_PUBLIC_KEY); + } + } +} From ad6307687dc9efea6982785384698220fdef4074 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 17 Oct 2023 14:06:06 +0900 Subject: [PATCH 17/82] =?UTF-8?q?:zap:=20:=20=EB=8B=89=EB=84=A4=EC=9E=84?= =?UTF-8?q?=20=EB=9E=9C=EB=8D=A4=20=EC=83=9D=EC=84=B1=20hanmoo=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 --- .../config/FeignCommonConfig.java | 4 +++- .../user/UserFeignClientPackage.java | 3 +++ .../user/client/NickNameFeignClient.java | 17 +++++++++++++++++ .../user/dto/NickNameRes.java | 10 ++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/UserFeignClientPackage.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/client/NickNameFeignClient.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/dto/NickNameRes.java diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/FeignCommonConfig.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/FeignCommonConfig.java index 60ccef62..3667b1ab 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/FeignCommonConfig.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/FeignCommonConfig.java @@ -9,6 +9,7 @@ import com.example.matchinfrastructure.oauth.BaseFeignClientPackage; import com.example.matchinfrastructure.pay.BasePayFeignClientPackage; import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; +import com.example.matchinfrastructure.user.UserFeignClientPackage; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -24,7 +25,8 @@ @Configuration @EnableFeignClients(basePackageClasses = {BaseFeignClientPackage.class, BasePayFeignClientPackage.class, - BaseFeignDiscordPackage.class, BaseFeignAligoPackage.class, BaseFeignMatchAligoPackage.class}) + BaseFeignDiscordPackage.class, BaseFeignAligoPackage.class, BaseFeignMatchAligoPackage.class, + UserFeignClientPackage.class}) public class FeignCommonConfig { @Bean diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/UserFeignClientPackage.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/UserFeignClientPackage.java new file mode 100644 index 00000000..fa667b0d --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/UserFeignClientPackage.java @@ -0,0 +1,3 @@ +package com.example.matchinfrastructure.user; + +public interface UserFeignClientPackage {} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/client/NickNameFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/client/NickNameFeignClient.java new file mode 100644 index 00000000..1aaa8bea --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/client/NickNameFeignClient.java @@ -0,0 +1,17 @@ +package com.example.matchinfrastructure.user.client; + +import com.example.matchinfrastructure.user.dto.NickNameRes; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; + +@FeignClient( + name = "NickNameFeignClient", + url = "https://nickname.hwanmoo.kr" +) +@Component +public interface NickNameFeignClient { + + @GetMapping(value = "/?format=json&count=1&max_length=8") + NickNameRes getNickName(); +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/dto/NickNameRes.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/dto/NickNameRes.java new file mode 100644 index 00000000..df8c6b2a --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/user/dto/NickNameRes.java @@ -0,0 +1,10 @@ +package com.example.matchinfrastructure.user.dto; + +import lombok.Getter; + +import java.util.List; + +@Getter +public class NickNameRes { + private List words; +} From 41e1c0189628ab5760ffc3b04b1f682784478423 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 17 Oct 2023 14:12:31 +0900 Subject: [PATCH 18/82] =?UTF-8?q?:recycle:=20:=20nickname=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=EC=83=9D=EC=84=B1=EC=9C=BC=EB=A1=9C=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 --- .../matchapi/user/convertor/UserConvertor.java | 6 +++--- .../example/matchapi/user/helper/UserHelper.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index b9d73f03..6658ede6 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -50,7 +50,7 @@ public User KakaoSignUpUser(KakaoUserInfoDto kakaoUserInfoDto, SocialType authTy .birth(authHelper.birthConversion(kakaoUserInfoDto.getBirthYear(), kakaoUserInfoDto.getBirthDay())) .gender(authHelper.genderConversion(kakaoUserInfoDto.getGender())) .role(AuthorityEnum.ROLE_USER.getValue()) - .nickname(kakaoUserInfoDto.getProperties().getNickname()) + .nickname(userHelper.createRandomNickName()) .build(); } @@ -77,7 +77,7 @@ public User NaverSignUpUser(NaverUserInfoDto naverUserInfoDto, SocialType authTy .birth(authHelper.birthConversion(naverUserInfoDto.getBirthyear(), naverUserInfoDto.getBirthday())) .gender(authHelper.genderConversion(naverUserInfoDto.getGender())) .role(AuthorityEnum.ROLE_USER.getValue()) - .nickname(naverUserInfoDto.getNickname()) + .nickname(userHelper.createRandomNickName()) .build(); } @@ -93,7 +93,7 @@ public User SignUpUser(UserReq.SignUpUser signUpUser, Authority authority) { .birth(authHelper.birthConversionToLocalDate(signUpUser.getBirthDate())) .gender(signUpUser.getGender()) .role(AuthorityEnum.ROLE_USER.getValue()) - .nickname(signUpUser.getName()) + .nickname(userHelper.createRandomNickName()) .build(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/helper/UserHelper.java b/Match-Api/src/main/java/com/example/matchapi/user/helper/UserHelper.java index 81e0b399..1b726ed9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/helper/UserHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/helper/UserHelper.java @@ -1,16 +1,31 @@ package com.example.matchapi.user.helper; import com.example.matchcommon.annotation.Helper; +import com.example.matchinfrastructure.user.client.NickNameFeignClient; import lombok.RequiredArgsConstructor; +import javax.annotation.PostConstruct; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @Helper @RequiredArgsConstructor public class UserHelper { + private final NickNameFeignClient nickNameFeignClient; + + private static NickNameFeignClient staticNickNameFeignClient; + + + @PostConstruct + void init() { + staticNickNameFeignClient = this.nickNameFeignClient; + } public String birthConversion(LocalDate birth) { return birth.format(DateTimeFormatter.ofPattern("yyyyMMdd")); } + + public String createRandomNickName(){ + return staticNickNameFeignClient.getNickName().getWords().get(0); + } } From 65752368ba4acd41a88371befc59d843051d91b5 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:14:37 +0900 Subject: [PATCH 19/82] =?UTF-8?q?:zap:=20:=20=EC=95=A0=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth/apple/dto/AppleUserRes.java | 14 +++++++++++++ .../oauth/apple/exception/AppleErrorCode.java | 3 ++- .../oauth/apple/service/AppleAuthService.java | 21 ++++++++++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/AppleUserRes.java diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/AppleUserRes.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/AppleUserRes.java new file mode 100644 index 00000000..a276ec7d --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/dto/AppleUserRes.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.oauth.apple.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class AppleUserRes { + private String email; + + private String socialId; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java index 40f62ad1..c3f2de68 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/exception/AppleErrorCode.java @@ -18,7 +18,8 @@ public enum AppleErrorCode implements BaseErrorCode { @ExplainError("๊ณต๊ฐœํ‚ค ์—๋Ÿฌ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์œ„") MISMATCH_APPLE_KEY(BAD_REQUEST,"APPLE_001","๊ณต๊ฐœ ํ‚ค์ค‘ ์ผ์น˜ํ•˜๋Š” ํ‚ค ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), - FAIL_MAKE_PUBLIC_KEY(BAD_REQUEST,"APPLE_002", "๊ณต๊ฐœํ‚ค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + FAIL_MAKE_PUBLIC_KEY(BAD_REQUEST,"APPLE_002", "๊ณต๊ฐœํ‚ค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."), + APPLE_BAD_REQUEST(BAD_REQUEST,"APPLE_003","์ธ์ฆ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); private final HttpStatus httpStatus; private final String code; private final String message; diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java index c7f125e6..8d066737 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java @@ -3,6 +3,7 @@ import com.example.matchcommon.exception.BadRequestException; import com.example.matchinfrastructure.oauth.apple.client.AppleFeignClient; import com.example.matchinfrastructure.oauth.apple.dto.ApplePublicResponse; +import com.example.matchinfrastructure.oauth.apple.dto.AppleUserRes; import com.example.matchinfrastructure.oauth.apple.dto.Key; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -19,18 +20,20 @@ import java.security.spec.RSAPublicKeySpec; import java.util.Base64; import java.util.List; +import java.util.Objects; -import static com.example.matchinfrastructure.oauth.apple.exception.AppleErrorCode.FAIL_MAKE_PUBLIC_KEY; -import static com.example.matchinfrastructure.oauth.apple.exception.AppleErrorCode.MISMATCH_APPLE_KEY; +import static com.example.matchinfrastructure.oauth.apple.exception.AppleErrorCode.*; @Service @RequiredArgsConstructor public class AppleAuthService { private final AppleFeignClient appleFeignClient; - public void appleLogin(String identityToken) { + public AppleUserRes appleLogin(String identityToken) { JsonParser parser = new JsonParser(); ApplePublicResponse applePublicResponse = appleFeignClient.getPublicKey(); + System.out.println(applePublicResponse.getKeys().get(0).getKid()); + String headerOfIdentityToken = identityToken.substring(0, identityToken.indexOf(".")); String header = new String(Base64.getDecoder().decode(headerOfIdentityToken), StandardCharsets.UTF_8); @@ -47,8 +50,20 @@ public void appleLogin(String identityToken) { String iss = userInfoObject.get("iss").getAsString(); String aud = userInfoObject.get("aud").getAsString(); + checkValidationInfo(iss, aud); + String appleId = userInfoObject.get("sub").getAsString(); String email = userInfoObject.get("email").getAsString(); + + return new AppleUserRes(email, appleId); + } + + private void checkValidationInfo(String iss, String aud) { + if (!Objects.equals(iss, "https://appleid.apple.com")) + throw new BadRequestException(APPLE_BAD_REQUEST); + + if (!Objects.equals(aud, "com.dev.match")) + throw new BadRequestException(APPLE_BAD_REQUEST); } From e9001965f4310fec7f7fc3d477f8849df56a7768 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:14:47 +0900 Subject: [PATCH 20/82] =?UTF-8?q?:zap:=20:=20=EC=95=A0=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/user/service/AuthService.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java index 91adcfb0..4f9c69f1 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java @@ -16,6 +16,7 @@ import com.example.matchdomain.redis.entity.CodeAuth; import com.example.matchdomain.redis.repository.CodeAuthRepository; import com.example.matchdomain.redis.repository.RefreshTokenRepository; +import com.example.matchdomain.user.adaptor.UserAdaptor; import com.example.matchdomain.user.entity.Authority; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.entity.UserAddress; @@ -24,6 +25,7 @@ import com.example.matchinfrastructure.match_aligo.client.MatchAligoFeignClient; import com.example.matchinfrastructure.oauth.apple.client.AppleFeignClient; import com.example.matchinfrastructure.oauth.apple.dto.ApplePublicResponse; +import com.example.matchinfrastructure.oauth.apple.dto.AppleUserRes; import com.example.matchinfrastructure.oauth.apple.service.AppleAuthService; import com.example.matchinfrastructure.oauth.kakao.client.KakaoFeignClient; import com.example.matchinfrastructure.oauth.kakao.client.KakaoLoginFeignClient; @@ -46,8 +48,7 @@ import static com.example.matchcommon.constants.MatchStatic.BEARER; import static com.example.matchdomain.user.entity.enums.AuthorityEnum.ROLE_ADMIN; -import static com.example.matchdomain.user.entity.enums.SocialType.KAKAO; -import static com.example.matchdomain.user.entity.enums.SocialType.NAVER; +import static com.example.matchdomain.user.entity.enums.SocialType.*; import static com.example.matchdomain.user.exception.AdminLoginErrorCode.NOT_ADMIN; import static com.example.matchdomain.user.exception.CodeAuthErrorCode.NOT_CORRECT_AUTH; import static com.example.matchdomain.user.exception.CodeAuthErrorCode.NOT_CORRECT_CODE; @@ -78,6 +79,7 @@ public class AuthService { private final CodeAuthRepository codeAuthRepository; private final MatchAligoFeignClient matchAligoFeignClient; private final AppleAuthService authService; + private final UserAdaptor userAdaptor; @Transactional @@ -260,9 +262,22 @@ public void checkPhoneAuth(UserReq.UserPhoneAuth phone) { } public UserRes.UserToken appleLogin(UserReq.SocialLoginToken socialLoginToken) { - authService.appleLogin(socialLoginToken.getAccessToken()); + AppleUserRes appleUserRes = authService.appleLogin(socialLoginToken.getAccessToken()); + if(userRepository.existsByEmail(appleUserRes.getEmail())) throw new BadRequestException(USERS_EXISTS_EMAIL); + Optional user = userAdaptor.existsSocialUser(appleUserRes.getSocialId(), APPLE); - return null; + Long userId; + if (user.isEmpty()) userId = appleSignUp(appleUserRes); + + else userId = user.get().getId(); + + UserRes.Token token = createToken(userId); + + return new UserRes.UserToken(userId, token.getAccessToken(), token.getRefreshToken()); + } + + private Long appleSignUp(AppleUserRes appleUserRes) { + return userRepository.save(userConvertor.AppleUserSignUp(appleUserRes)).getId(); } } From 40c0547429980c1963d3722227e6ad880a7f3699 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:15:06 +0900 Subject: [PATCH 21/82] =?UTF-8?q?:recycle:=20:=20=EB=B9=84=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=20=EC=93=B0=EB=A0=88=EB=93=9C=20Bean=20=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20name=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchcommon/config/AsyncConfig.java | 19 ++++++++++++++++--- .../matchcommon/service/MailService.java | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java index 04b9561e..2715dde6 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java +++ b/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java @@ -1,5 +1,6 @@ package com.example.matchcommon.config; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurerSupport; import org.springframework.scheduling.annotation.EnableAsync; @@ -10,12 +11,24 @@ @EnableAsync public class AsyncConfig extends AsyncConfigurerSupport { - public Executor getAsyncExecutor() { + @Bean(name = "email") + public Executor emailThreadAsync() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(2); // ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ Thread ๊ฐœ์ˆ˜ + executor.setCorePoolSize(10); // ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ Thread ๊ฐœ์ˆ˜ executor.setMaxPoolSize(10); // ๋™์‹œ์— ๋™์ž‘ํ•˜๋Š” ์ตœ๋Œ€ Thread ๊ฐœ์ˆ˜ executor.setQueueCapacity(500); // CorePool์ด ์ดˆ๊ณผ๋ ๋•Œ Queue์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๊บผ๋‚ด์„œ ์‹คํ–‰๋œ๋‹ค. (500๊ฐœ๊นŒ์ง€ ์ €์žฅํ•จ) - executor.setThreadNamePrefix("async-"); // Spring์—์„œ ์ƒ์„ฑํ•˜๋Š” Thread ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ + executor.setThreadNamePrefix("async-mail-thread"); // Spring์—์„œ ์ƒ์„ฑํ•˜๋Š” Thread ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ + executor.initialize(); + return executor; + } + + @Bean(name = "fcm") + public Executor fcmThreadAsync() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); // ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ Thread ๊ฐœ์ˆ˜ + executor.setMaxPoolSize(10); // ๋™์‹œ์— ๋™์ž‘ํ•˜๋Š” ์ตœ๋Œ€ Thread ๊ฐœ์ˆ˜ + executor.setQueueCapacity(500); // CorePool์ด ์ดˆ๊ณผ๋ ๋•Œ Queue์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๊บผ๋‚ด์„œ ์‹คํ–‰๋œ๋‹ค. (500๊ฐœ๊นŒ์ง€ ์ €์žฅํ•จ) + executor.setThreadNamePrefix("async-fcm-thread"); // Spring์—์„œ ์ƒ์„ฑํ•˜๋Š” Thread ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ executor.initialize(); return executor; } diff --git a/Match-Common/src/main/java/com/example/matchcommon/service/MailService.java b/Match-Common/src/main/java/com/example/matchcommon/service/MailService.java index 3735c637..c8586cdb 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/service/MailService.java +++ b/Match-Common/src/main/java/com/example/matchcommon/service/MailService.java @@ -53,7 +53,7 @@ private SimpleMailMessage createEmailForm(String toEmail, return message; } - @Async + @Async("email") public void sendEmailMessage(String email, String code){ try { MimeMessage message = emailSender.createMimeMessage(); From 263e234030e7d9604d48d35fcd22861801d22787 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:15:28 +0900 Subject: [PATCH 22/82] =?UTF-8?q?:zap:=20:=20fcm=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=95=8C=EB=A6=BC=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 --- ...rebaseConfig.java => FirebaseService.java} | 8 ++- .../adaptor/NotificationAdaptor.java | 11 +++ .../notification/entity/Notification.java | 43 ++++++++++++ .../notification/enums/NotificationType.java | 15 ++++ .../repository/NotificationRepository.java | 7 ++ .../fcm/convertor/FcmConvertor.java | 8 +++ .../fcm/dto/FCMNotificationRequestDto.java | 16 +++++ .../fcm/service/FcmNotificationService.java | 68 +++++++++++++++++++ 8 files changed, 174 insertions(+), 2 deletions(-) rename Match-Common/src/main/java/com/example/matchcommon/config/{FirebaseConfig.java => FirebaseService.java} (91%) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/convertor/FcmConvertor.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/dto/FCMNotificationRequestDto.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/service/FcmNotificationService.java diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/FirebaseConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/FirebaseService.java similarity index 91% rename from Match-Common/src/main/java/com/example/matchcommon/config/FirebaseConfig.java rename to Match-Common/src/main/java/com/example/matchcommon/config/FirebaseService.java index 98c1dc1a..58efd8bc 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/config/FirebaseConfig.java +++ b/Match-Common/src/main/java/com/example/matchcommon/config/FirebaseService.java @@ -6,15 +6,15 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; -import java.io.FileInputStream; import java.io.IOException; import java.util.List; @Configuration @Slf4j -public class FirebaseConfig { +public class FirebaseService { @PostConstruct public void init() { @@ -31,8 +31,12 @@ public void init() { } } catch (IOException e) { log.info(e.getMessage()); + log.info("FireBase Config Failed"); // spring ๋œฐ๋•Œ ์•Œ๋ฆผ ์„œ๋ฒ„๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์ฃฝ์ž„ throw new RuntimeException(e.getMessage()); + } } + + } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java new file mode 100644 index 00000000..4712014f --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java @@ -0,0 +1,11 @@ +package com.example.matchdomain.notification.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.notification.repository.NotificationRepository; +import lombok.RequiredArgsConstructor; + +@Adaptor +@RequiredArgsConstructor +public class NotificationAdaptor { + private final NotificationRepository notificationRepository; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java new file mode 100644 index 00000000..828b7c8b --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java @@ -0,0 +1,43 @@ +package com.example.matchdomain.notification.entity; + +import com.example.matchdomain.notification.enums.NotificationType; +import com.example.matchdomain.user.entity.User; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "Notification") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@DynamicInsert +@BatchSize(size = 100) +public class Notification { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userId",nullable = false, insertable=false, updatable=false) + private User user; + + @Column(name="userId") + private Long userId; + + @Enumerated(EnumType.STRING) + private NotificationType notificationType; + + private String title; + + private String body; + + private boolean isRead = false; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java new file mode 100644 index 00000000..73449817 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java @@ -0,0 +1,15 @@ +package com.example.matchdomain.notification.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum NotificationType { + DONATION("DONATION", "๊ธฐ๋ถ€"), + NOTICE("NOTICE", "๊ณต์ง€"); + + private final String value; + + private final String type; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java new file mode 100644 index 00000000..f862368e --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java @@ -0,0 +1,7 @@ +package com.example.matchdomain.notification.repository; + +import com.example.matchdomain.notification.entity.Notification; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NotificationRepository extends JpaRepository { +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/convertor/FcmConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/convertor/FcmConvertor.java new file mode 100644 index 00000000..2f0531e2 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/convertor/FcmConvertor.java @@ -0,0 +1,8 @@ +package com.example.matchinfrastructure.fcm.convertor; + +import com.example.matchcommon.annotation.Convertor; + +@Convertor +public class FcmConvertor { + +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/dto/FCMNotificationRequestDto.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/dto/FCMNotificationRequestDto.java new file mode 100644 index 00000000..11c41119 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/dto/FCMNotificationRequestDto.java @@ -0,0 +1,16 @@ +package com.example.matchinfrastructure.fcm.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class FCMNotificationRequestDto { + private String title; + + private String body; + + private String token; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/service/FcmNotificationService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/service/FcmNotificationService.java new file mode 100644 index 00000000..ab795d43 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/fcm/service/FcmNotificationService.java @@ -0,0 +1,68 @@ +package com.example.matchinfrastructure.fcm.service; + +import com.example.matchinfrastructure.fcm.dto.FCMNotificationRequestDto; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class FcmNotificationService { + @PostConstruct + public void init() { + log.info("init"); + try { + FirebaseOptions options = new FirebaseOptions.Builder() + .setCredentials( + GoogleCredentials + .fromStream(new ClassPathResource("serviceAccountKey.json").getInputStream()) + .createScoped(List.of("https://www.googleeapis.com/auth/cloud-platform"))) + .build(); + if (FirebaseApp.getApps().isEmpty()) { + FirebaseApp.initializeApp(options); + log.info("Firebase application has been initialized"); + } + } catch (IOException e) { + log.info(e.getMessage()); + log.info("FireBase Config Failed"); + // spring ๋œฐ๋•Œ ์•Œ๋ฆผ ์„œ๋ฒ„๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์ฃฝ์ž„ + throw new RuntimeException(e.getMessage()); + + } + } + + @Async("fcm") + public void testNotification(FCMNotificationRequestDto fcmNotificationRequestDto){ + Notification notification = Notification + .builder() + .setTitle(fcmNotificationRequestDto.getTitle()) + .setBody(fcmNotificationRequestDto.getBody()) + .build(); + + Message message = Message + .builder() + .setToken(fcmNotificationRequestDto.getToken()) + .setNotification(notification) + .build(); + try { + FirebaseMessaging.getInstance().send(message); + } catch (FirebaseMessagingException e) { + throw new RuntimeException(e); + } + + } +} From d6b7570e6d3aa98f894459ce4ca02476503727ac Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:15:38 +0900 Subject: [PATCH 23/82] =?UTF-8?q?:zap:=20:=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/common/TestController.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/common/TestController.java b/Match-Api/src/main/java/com/example/matchapi/common/TestController.java index 1afaa257..48013481 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/TestController.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/TestController.java @@ -4,12 +4,11 @@ import com.example.matchapi.order.helper.OrderHelper; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.service.MailService; +import com.example.matchinfrastructure.fcm.dto.FCMNotificationRequestDto; +import com.example.matchinfrastructure.fcm.service.FcmNotificationService; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -21,6 +20,7 @@ public class TestController { private final OrderHelper orderHelper; private final MailService mailService; + private final FcmNotificationService fcmNotificationService; @GetMapping("") public void exRedirect3(HttpServletResponse httpServletResponse) throws IOException { @@ -32,6 +32,14 @@ public void exRedirect3(HttpServletResponse httpServletResponse) throws IOExcept public CommonResponse getTest(@PathVariable Long projectId, @PathVariable Long userId, @PathVariable Long donationId){ return CommonResponse.onSuccess("์„ฑ๊ณต"); } + + @PostMapping("/fcm") + public String fcmTest( + @RequestBody FCMNotificationRequestDto fcmNotificationRequestDto + ){ + fcmNotificationService.testNotification(fcmNotificationRequestDto); + return "์„ฑ๊ณต"; + } /* @GetMapping("/email") From 0ed2fc4aad23bda93bd446a18858557b11b818c2 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:16:03 +0900 Subject: [PATCH 24/82] =?UTF-8?q?:zap:=20:=20=EC=95=A0=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/user/convertor/UserConvertor.java | 15 +++++++++++++++ .../matchdomain/user/adaptor/UserAdaptor.java | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index 6658ede6..454eae46 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -15,6 +15,7 @@ import com.example.matchdomain.user.entity.pk.UserFcmPk; import com.example.matchdomain.user.repository.UserRepository; import com.example.matchinfrastructure.aligo.dto.SendReq; +import com.example.matchinfrastructure.oauth.apple.dto.AppleUserRes; import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserAddressDto; import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserInfoDto; import com.example.matchinfrastructure.oauth.naver.dto.NaverUserInfoDto; @@ -216,4 +217,18 @@ public UserFcmToken UserFcm(User user, UserReq.FcmToken token) { .fcmToken(token.getFcmToken()) .build(); } + + public User AppleUserSignUp(AppleUserRes appleUserRes) { + return User.builder() + .username(appleUserRes.getSocialId()) + .password(authHelper.createRandomPassword()) + .profileImgUrl(BASE_PROFILE) + .name(userHelper.createRandomNickName()) + .email(appleUserRes.getEmail()) + .socialId(appleUserRes.getSocialId()) + .socialType(SocialType.APPLE) + .role(AuthorityEnum.ROLE_USER.getValue()) + .nickname(userHelper.createRandomNickName()) + .build(); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java new file mode 100644 index 00000000..a9c07e68 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java @@ -0,0 +1,18 @@ +package com.example.matchdomain.user.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.user.entity.User; +import com.example.matchdomain.user.entity.enums.SocialType; +import com.example.matchdomain.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; + +import java.util.Optional; + +@Adaptor +@RequiredArgsConstructor +public class UserAdaptor { + private final UserRepository userRepository; + public Optional existsSocialUser(String socialId, SocialType socialType){ + return userRepository.findBySocialIdAndSocialType(socialId, socialType); + } +} From 18aedd3a9816bbc20e7b2bda7c677d8678a49b75 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:48:18 +0900 Subject: [PATCH 25/82] =?UTF-8?q?:zap:=20:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20Entity=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/adaptor/EventAdaptor.java | 11 ++++++ .../matchdomain/event/entity/Event.java | 39 +++++++++++++++++++ .../matchdomain/event/enums/EventType.java | 14 +++++++ .../event/repository/EventRepository.java | 7 ++++ 4 files changed, 71 insertions(+) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java new file mode 100644 index 00000000..045fc13c --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java @@ -0,0 +1,11 @@ +package com.example.matchdomain.event.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.event.repository.EventRepository; +import lombok.RequiredArgsConstructor; + +@Adaptor +@RequiredArgsConstructor +public class EventAdaptor { + private final EventRepository eventRepository; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java new file mode 100644 index 00000000..322e3ce5 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java @@ -0,0 +1,39 @@ +package com.example.matchdomain.event.entity; + +import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.donation.entity.DonationUser; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "User") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@BatchSize(size = 100) +@DynamicInsert +public class Event extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String eventImg; + + private String text; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "donationId",nullable = false, insertable=false, updatable=false) + private DonationUser donationUser; + + @Column(name="donationId") + private Long donationId; + +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventType.java b/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventType.java new file mode 100644 index 00000000..a73c22be --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventType.java @@ -0,0 +1,14 @@ +package com.example.matchdomain.event.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EventType { + MATCHING("MATCHING", "๋งค์นญ ๊ธฐ๋ถ€"), + MATCH_EVENT("MATCH_EVENT", "๋งค์น˜ ์ด๋ฒคํŠธ"); + private final String value; + + private final String type; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java new file mode 100644 index 00000000..c86d1457 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java @@ -0,0 +1,7 @@ +package com.example.matchdomain.event.repository; + +import com.example.matchdomain.event.entity.Event; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EventRepository extends JpaRepository { +} From 06551db1128559fc8e73a85293bdabd7197e1972 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:48:33 +0900 Subject: [PATCH 26/82] =?UTF-8?q?:zap:=20:=20=EB=B0=B0=EB=84=88=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20Entity=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../banner/adaptor/BannerAdaptor.java | 11 +++++ .../matchdomain/banner/entity/Banner.java | 42 +++++++++++++++++++ .../matchdomain/banner/enums/BannerType.java | 14 +++++++ .../banner/repository/BannerRepository.java | 7 ++++ 4 files changed, 74 insertions(+) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/banner/enums/BannerType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java new file mode 100644 index 00000000..4d0e995b --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java @@ -0,0 +1,11 @@ +package com.example.matchdomain.banner.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.banner.repository.BannerRepository; +import lombok.RequiredArgsConstructor; + +@Adaptor +@RequiredArgsConstructor +public class BannerAdaptor { + private final BannerRepository bannerRepository; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java new file mode 100644 index 00000000..b1b8ba03 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java @@ -0,0 +1,42 @@ +package com.example.matchdomain.banner.entity; + +import com.example.matchdomain.banner.enums.BannerType; +import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.event.entity.Event; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "`Banner`") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@BatchSize(size = 100) +@DynamicInsert +public class Banner extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + private BannerType bannerType; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "eventId",nullable = false, insertable=false, updatable=false) + private Event event; + + @Column(name="eventId") + private Long eventId; + + private String bannerImg; + + private String url; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/enums/BannerType.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/enums/BannerType.java new file mode 100644 index 00000000..fd815459 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/enums/BannerType.java @@ -0,0 +1,14 @@ +package com.example.matchdomain.banner.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum BannerType { + EVENT("EVENT", "์ด๋ฒคํŠธ"), + CONTENTS("CONTENTS", "SNS ์ฝ˜ํ…์ธ "); + private final String value; + + private final String type; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java new file mode 100644 index 00000000..daf1d202 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java @@ -0,0 +1,7 @@ +package com.example.matchdomain.banner.repository; + +import com.example.matchdomain.banner.entity.Banner; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BannerRepository extends JpaRepository { +} From 3420af1a8c52ae8e03f47e85c01ca3a0e058e0a8 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:32:30 +0900 Subject: [PATCH 27/82] =?UTF-8?q?:zap:=20:=20=EB=B0=B0=EB=84=88=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20+=20=EB=B0=B0=EB=84=88=20=EC=96=B4?= =?UTF-8?q?=EB=93=9C=EB=AF=BC=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=BA=90?= =?UTF-8?q?=EC=8B=B1=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminBannerController.java | 30 +++++++++++ .../banner/service/AdminBannerService.java | 44 ++++++++++++++++ .../banner/controller/BannerController.java | 17 +++++++ .../banner/convertor/BannerConvertor.java | 50 +++++++++++++++++++ .../matchapi/banner/dto/BannerReq.java | 17 +++++++ .../matchapi/banner/dto/BannerRes.java | 25 ++++++++++ .../banner/service/BannerService.java | 15 ++++++ Match-Api/src/main/resources/ehcache.xml | 13 ++++- .../banner/adaptor/BannerAdaptor.java | 10 ++++ .../matchdomain/banner/entity/Banner.java | 2 +- .../banner/repository/BannerRepository.java | 3 ++ .../config/s3/S3UploadService.java | 20 ++++++++ 12 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerReq.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java b/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java new file mode 100644 index 00000000..1c185531 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java @@ -0,0 +1,30 @@ +package com.example.matchapi.admin.banner.controller; + +import com.example.matchapi.admin.banner.service.AdminBannerService; +import com.example.matchapi.banner.dto.BannerReq; +import com.example.matchapi.banner.dto.BannerRes; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchdomain.banner.enums.BannerType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@Slf4j +@RequestMapping("/admin/banners") +public class AdminBannerController { + private final AdminBannerService adminBannerService; + @PostMapping("") + public CommonResponse> uploadBanner( + @RequestParam BannerType bannerType, + @RequestPart MultipartFile bannerImage, + @RequestPart BannerReq.BannerUpload bannerUploadDto + ){ + System.out.println(bannerUploadDto.getContentsUrl()); + return CommonResponse.onSuccess(adminBannerService.uploadBanner(bannerType, bannerImage, bannerUploadDto)); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java b/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java new file mode 100644 index 00000000..e0c9a63d --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java @@ -0,0 +1,44 @@ +package com.example.matchapi.admin.banner.service; + +import com.example.matchapi.banner.convertor.BannerConvertor; +import com.example.matchapi.banner.dto.BannerReq; +import com.example.matchapi.banner.dto.BannerRes; +import com.example.matchdomain.banner.adaptor.BannerAdaptor; +import com.example.matchdomain.banner.entity.Banner; +import com.example.matchdomain.banner.enums.BannerType; +import com.example.matchdomain.banner.repository.BannerRepository; +import com.example.matchinfrastructure.config.s3.S3UploadService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.transaction.Transactional; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AdminBannerService { + private final BannerRepository bannerRepository; + private final BannerConvertor bannerConvertor; + private final S3UploadService s3UploadService; + private final BannerAdaptor bannerAdaptor; + + @Transactional + @CachePut(cacheNames = "bannerCache", key = "'all'") + public List uploadBanner(BannerType bannerType, + MultipartFile bannerImage, + BannerReq.BannerUpload bannerUploadDto) { + String bannerImg = s3UploadService.uploadBannerImage(bannerImage); + bannerRepository.save(bannerConvertor.BannerUpload(bannerType, bannerImg, bannerUploadDto)); + return cachingBannerList(); + } + + @CacheEvict(cacheNames = "bannerCache") + public List cachingBannerList() { + List banners = bannerAdaptor.getBannerList(); + + return bannerConvertor.BannerList(banners); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/controller/BannerController.java b/Match-Api/src/main/java/com/example/matchapi/banner/controller/BannerController.java index 30261711..484d7e5e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/controller/BannerController.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/controller/BannerController.java @@ -1,15 +1,32 @@ package com.example.matchapi.banner.controller; +import com.example.matchapi.banner.dto.BannerRes; +import com.example.matchapi.banner.service.BannerService; +import com.example.matchcommon.reponse.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/banners") @Slf4j @RequiredArgsConstructor @Tag(name = "06-Banner๐Ÿ’ณ", description = "๋ฐฐ๋„ˆ API") public class BannerController { + private final BannerService bannerService; + + @GetMapping + @Operation( + summary = "06-01 ๋ฐฐ๋„ˆ ์กฐํšŒ", + description = "BannerType ์ด Event ๋ฉด eventId ์‚ฌ์šฉํ›„ ์ด๋ฒคํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™,\n" + + "Contents ๋ฉด contentsUrl ์‚ฌ์šฉํ›„ ๋งํฌ๋กœ ์ด๋™") + public CommonResponse> getBannerList(){ + return CommonResponse.onSuccess(bannerService.getBannerList()); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java b/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java index 8e604c51..e11302fb 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java @@ -1,7 +1,57 @@ package com.example.matchapi.banner.convertor; +import com.example.matchapi.banner.dto.BannerReq; +import com.example.matchapi.banner.dto.BannerRes; import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.banner.entity.Banner; +import com.example.matchdomain.banner.enums.BannerType; + +import java.util.ArrayList; +import java.util.List; @Convertor public class BannerConvertor { + + public Banner BannerUpload(BannerType bannerType, String bannerImg, BannerReq.BannerUpload bannerUploadDto) { + if(bannerType.equals(BannerType.EVENT)){ + return Banner + .builder() + .bannerImg(bannerImg) + .bannerType(bannerType) + .eventId(bannerUploadDto.getEventId()) + .build(); + } + else{ + return Banner + .builder() + .bannerImg(bannerImg) + .bannerType(bannerType) + .contentsUrl(bannerUploadDto.getContentsUrl()) + .build(); + } + } + + public List BannerList(List banners) { + List bannerLists = new ArrayList<>(); + + banners.forEach( + result -> + bannerLists.add( + BannerInfo(result) + ) + ); + + return bannerLists; + } + + private BannerRes.BannerList BannerInfo(Banner result) { + return BannerRes.BannerList + .builder() + .bannerId(result.getId()) + .bannerType(result.getBannerType()) + .bannerImg(result.getBannerImg()) + .eventId(result.getEventId()) + .contentsUrl(result.getContentsUrl()) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerReq.java b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerReq.java new file mode 100644 index 00000000..26359a67 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerReq.java @@ -0,0 +1,17 @@ +package com.example.matchapi.banner.dto; + +import lombok.*; + +public class BannerReq { + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class BannerUpload { + private Long eventId; + + private String contentsUrl; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java new file mode 100644 index 00000000..1bb18a60 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java @@ -0,0 +1,25 @@ +package com.example.matchapi.banner.dto; + +import com.example.matchdomain.banner.enums.BannerType; +import lombok.*; + +public class BannerRes { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class BannerList { + private Long bannerId; + + private BannerType bannerType; + + private String bannerImg; + + private Long eventId; + + private String contentsUrl; + + + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java b/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java index 9b929e22..da99f9b7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java @@ -1,9 +1,24 @@ package com.example.matchapi.banner.service; +import com.example.matchapi.banner.convertor.BannerConvertor; +import com.example.matchapi.banner.dto.BannerRes; +import com.example.matchdomain.banner.adaptor.BannerAdaptor; +import com.example.matchdomain.banner.entity.Banner; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class BannerService { + private final BannerAdaptor bannerAdaptor; + private final BannerConvertor bannerConvertor; + + @Cacheable(cacheNames = "bannerCache", key = "'all'") + public List getBannerList() { + List banners = bannerAdaptor.getBannerList(); + return bannerConvertor.BannerList(banners); + } } diff --git a/Match-Api/src/main/resources/ehcache.xml b/Match-Api/src/main/resources/ehcache.xml index a59fb9cb..06134a08 100644 --- a/Match-Api/src/main/resources/ehcache.xml +++ b/Match-Api/src/main/resources/ehcache.xml @@ -17,7 +17,6 @@ - + + + + diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java index 4d0e995b..2fe52148 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/adaptor/BannerAdaptor.java @@ -1,11 +1,21 @@ package com.example.matchdomain.banner.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.banner.entity.Banner; import com.example.matchdomain.banner.repository.BannerRepository; +import com.example.matchdomain.keyword.entity.SearchKeyword; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; + +import java.util.ArrayList; +import java.util.List; @Adaptor @RequiredArgsConstructor public class BannerAdaptor { private final BannerRepository bannerRepository; + + public List getBannerList() { + return bannerRepository.findAllByOrderByCreatedAtDesc(); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java index b1b8ba03..c48067e9 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/entity/Banner.java @@ -38,5 +38,5 @@ public class Banner extends BaseEntity { private String bannerImg; - private String url; + private String contentsUrl; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java index daf1d202..35c2ce85 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/banner/repository/BannerRepository.java @@ -3,5 +3,8 @@ import com.example.matchdomain.banner.entity.Banner; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface BannerRepository extends JpaRepository { + List findAllByOrderByCreatedAtDesc(); } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java index 3b76ea32..e4257c8d 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java @@ -173,4 +173,24 @@ public String uploadProfilePresentFile(Long userId,MultipartFile presentFile) { } return amazonS3.getUrl(awsS3Properties.getS3().getBucket(), fileName).toString(); } + + public String uploadBannerImage(MultipartFile bannerImage) { + String fileName = getForBannerFileName(getFileExtension(bannerImage.getOriginalFilename())); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(bannerImage.getSize()); + objectMetadata.setContentType(bannerImage.getContentType()); + + try (InputStream inputStream = bannerImage.getInputStream()) { + amazonS3.putObject(new PutObjectRequest(awsS3Properties.getS3().getBucket(), fileName, inputStream, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead)); + } catch (IOException e) { + throw new ForbiddenException(IMAGE_UPLOAD_ERROR); + } + return amazonS3.getUrl(awsS3Properties.getS3().getBucket(), fileName).toString(); + } + + private String getForBannerFileName(String fileExtension) { + return "banner/" + + UUID.randomUUID() + + fileExtension; + } } From a44ea39dbb4c244d0b27c6fd8f4d39630c9715c7 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:32:42 +0900 Subject: [PATCH 28/82] =?UTF-8?q?:zap:=20:=20Redisson=20=EB=9D=BD=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20+=20config=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20Prod=20=ED=99=98=EA=B2=BD=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20Cluster=20=EB=AA=A8=EB=93=9C=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchcommon/annotation/RedissonLock.java | 36 ++++++++++ .../matchcommon/aop/AopForTransaction.java | 15 ++++ .../matchcommon/aop/RedissonCheckLockAop.java | 70 +++++++++++++++++++ .../matchcommon/config/RedissonConfig.java | 37 ++++++++++ 4 files changed, 158 insertions(+) create mode 100644 Match-Common/src/main/java/com/example/matchcommon/annotation/RedissonLock.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/aop/AopForTransaction.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/aop/RedissonCheckLockAop.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/config/RedissonConfig.java diff --git a/Match-Common/src/main/java/com/example/matchcommon/annotation/RedissonLock.java b/Match-Common/src/main/java/com/example/matchcommon/annotation/RedissonLock.java new file mode 100644 index 00000000..4075f471 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/annotation/RedissonLock.java @@ -0,0 +1,36 @@ +package com.example.matchcommon.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RedissonLock { + + // ๋ฝ ์ด๋ฆ„ + String LockName(); + /** + * ๋ฝ์„ ๊ฑธ ํŒŒ๋ผ๋ฏธํ„ฐ ํ‚ค๊ฐ’ + */ + String key(); + + /** + * ๋ฝ์˜ ์‹œ๊ฐ„ ๋‹จ์œ„ + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * ๋ฝ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ (default - 5s) + * ๋ฝ ํš๋“์„ ์œ„ํ•ด waitTime ๋งŒํผ ๋Œ€๊ธฐํ•œ๋‹ค + */ + long waitTime() default 10L; + + /** + * ๋ฝ ์ž„๋Œ€ ์‹œ๊ฐ„ (default - 3s) + * ๋ฝ์„ ํš๋“ํ•œ ์ดํ›„ leaseTime ์ด ์ง€๋‚˜๋ฉด ๋ฝ์„ ํ•ด์ œํ•œ๋‹ค + */ + long leaseTime() default 10L; +} diff --git a/Match-Common/src/main/java/com/example/matchcommon/aop/AopForTransaction.java b/Match-Common/src/main/java/com/example/matchcommon/aop/AopForTransaction.java new file mode 100644 index 00000000..da9cc8c0 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/aop/AopForTransaction.java @@ -0,0 +1,15 @@ +package com.example.matchcommon.aop; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class AopForTransaction { + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Object proceed(final ProceedingJoinPoint joinPoint) throws Throwable { + return joinPoint.proceed(); + } +} \ No newline at end of file diff --git a/Match-Common/src/main/java/com/example/matchcommon/aop/RedissonCheckLockAop.java b/Match-Common/src/main/java/com/example/matchcommon/aop/RedissonCheckLockAop.java new file mode 100644 index 00000000..3bc20933 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/aop/RedissonCheckLockAop.java @@ -0,0 +1,70 @@ +package com.example.matchcommon.aop; + +import com.example.matchcommon.annotation.RedissonLock; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +@RequiredArgsConstructor +@Slf4j +public class RedissonCheckLockAop { + private static final String REDISSON_LOCK_PREFIX = "LOCK:"; + + private final RedissonClient redissonClient; + private final AopForTransaction aopForTransaction; + + @Around("@annotation(com.example.matchcommon.annotation.RedissonLock)") + public Object lock(final ProceedingJoinPoint joinPoint) throws Throwable { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + RedissonLock redissonLock = method.getAnnotation(RedissonLock.class); + + String key = REDISSON_LOCK_PREFIX + redissonLock.LockName() + "-" + getDynamicValue(signature.getParameterNames(), joinPoint.getArgs(), redissonLock.key()); + + RLock rLock = redissonClient.getLock("key" + key); // (1) + + try { + boolean available = rLock.tryLock(redissonLock.waitTime(), redissonLock.leaseTime(), redissonLock.timeUnit()); // (2) + if (!available) { + return false; + } + return aopForTransaction.proceed(joinPoint); // (3) + } catch (InterruptedException e) { + throw new InterruptedException(); + } finally { + try { + rLock.unlock(); // (4) + log.info("key : " + key); + log.info("unlock - redisson"); + } catch (IllegalMonitorStateException e) { + log.info("Redisson Lock Already UnLock"); + log.info("serviceName : " + method.getName()); + log.info("key : " + key); + } + } + } + + private Object getDynamicValue(String[] parameterNames, Object[] args, String key) { + ExpressionParser parser = new SpelExpressionParser(); + StandardEvaluationContext context = new StandardEvaluationContext(); + + for (int i = 0; i < parameterNames.length; i++) { + context.setVariable(parameterNames[i], args[i]); + } + + return parser.parseExpression(key).getValue(context, Object.class); + } +} diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/RedissonConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/RedissonConfig.java new file mode 100644 index 00000000..fc26f113 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/config/RedissonConfig.java @@ -0,0 +1,37 @@ +package com.example.matchcommon.config; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +@Slf4j +public class RedissonConfig { + private final RedisProperties redisProperties; + private static final String REDISSON_HOST_PREFIX = "redis://"; + + @Value("${spring.config.activate.on-profile}") + private String profile; + + @Bean + public RedissonClient redissonClient() { + Config config = new Config(); + log.info("RedissonConfig " + profile + " profile"); + if (profile.equals("prod")) { + config.useClusterServers() + .addNodeAddress(REDISSON_HOST_PREFIX + redisProperties.getHost() + ":" + redisProperties.getPort()) + // ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋„ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ + .setScanInterval(2000); + } else { + config.useSingleServer().setAddress(REDISSON_HOST_PREFIX + redisProperties.getHost() + ":" + redisProperties.getPort()); + } + return Redisson.create(config); + } +} From af619147d1512dc3049bd5f5b8a67e79ee5c0e22 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:33:36 +0900 Subject: [PATCH 29/82] =?UTF-8?q?:recycle:=20:=20banner=20dto=20=EC=A7=81?= =?UTF-8?q?=EB=A0=AC=ED=99=94=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/matchapi/banner/dto/BannerRes.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java index 1bb18a60..1cc454da 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/dto/BannerRes.java @@ -3,13 +3,15 @@ import com.example.matchdomain.banner.enums.BannerType; import lombok.*; +import java.io.Serializable; + public class BannerRes { @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor - public static class BannerList { + public static class BannerList implements Serializable { private Long bannerId; private BannerType bannerType; From 4185841d202ee8411ead5ddebbee0057375908a2 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:34:09 +0900 Subject: [PATCH 30/82] =?UTF-8?q?:recycle:=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20+=20Redisson=20=EB=9D=BD?= =?UTF-8?q?=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../donation/convertor/DonationConvertor.java | 8 +- .../order/controller/OrderController.java | 13 +- .../matchapi/order/service/OrderService.java | 167 ++++++------------ .../project/service/ProjectService.java | 8 +- .../adaptor/DonationHistoryAdaptor.java | 2 +- .../adaptor/RegularPaymentAdaptor.java | 5 + .../repository/DonationHistoryRepository.java | 4 +- .../repository/RegularPaymentRepository.java | 3 + .../project/adaptor/ProjectAdaptor.java | 13 +- .../portone/client/PortOneFeignClient.java | 11 +- .../dto/PortOneBillDeleteResponse.java | 28 +++ 11 files changed, 122 insertions(+), 140 deletions(-) create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillDeleteResponse.java diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index 5cca3101..33f67e15 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -204,15 +204,15 @@ public ProjectRes.MatchHistory MatchHistoryDetail(DonationHistory result) { String nickname = ""; System.out.println(result.getHistoryStatus()); if(result.getHistoryStatus().equals(HistoryStatus.CREATE)){ - histories = result.getDonationUser().getUser().getName() + "๋‹˜์˜ ๋ถˆ๊ฝƒ์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."; + histories = result.getDonationUser().getInherenceName() + "๊ฐ€ ์—ฌ๊ธฐ์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค."; profileImgUrl = result.getDonationUser().getUser().getProfileImgUrl(); nickname = result.getDonationUser().getUser().getNickname(); }else if(result.getHistoryStatus().equals(HistoryStatus.COMPLETE)) { - histories = "'ํ›„์›ํ’ˆ'์„ 'ํ›„์›์ฒ˜'์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค."; + histories = "'ํ›„์›ํ’ˆ'์„ " + result.getProject().getUsages() + "์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค."; profileImgUrl = MATCH_PROFILE; nickname = MATCH_NAME; }else if(result.getHistoryStatus().equals(HistoryStatus.CHANGE)){ - histories = result.getCnt() + "๋ช…์˜ ๋ถˆ๊ฝƒ์ด ํ›„์›ํ’ˆ์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค."; + histories = result.getCnt() + "๋งˆ๋ฆฌ์˜ ๋ถˆ๊ฝƒ์ด ํ›„์›ํ’ˆ์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค."; profileImgUrl = MATCH_PROFILE; nickname = MATCH_NAME; }else if(result.getHistoryStatus().equals(HistoryStatus.TURN_ON)){ @@ -224,7 +224,7 @@ public ProjectRes.MatchHistory MatchHistoryDetail(DonationHistory result) { profileImgUrl = MATCH_PROFILE; nickname = MATCH_NAME; }else if(result.getHistoryStatus().equals(HistoryStatus.FINISH)){ - histories = "๋งค์น˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.."; + histories = "๋งค์น˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."; profileImgUrl = MATCH_PROFILE; nickname = MATCH_NAME; } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java index 80e8d060..169a812b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java @@ -45,10 +45,7 @@ @Tag(name = "04-Order๐Ÿ’ธ",description = "NicePayment ๊ฒฐ์ œ API") public class OrderController { private final OrderService orderService; - private final NicePayProperties nicePayProperties; private final UserService userService; - @Value("${web.return.url}") - private String redirectUrl; @PostMapping("/{projectId}") @ApiErrorCodeExample(UserAuthErrorCode.class) @@ -63,7 +60,7 @@ public CommonResponse requestPay( } - @PostMapping("/pay/{projectId}") +/* @PostMapping("/pay/{projectId}") @ApiErrorCodeExample({OtherServerErrorCode.class, UserAuthErrorCode.class, RequestErrorCode.class, ProjectOneTimeErrorCode.class}) @Operation(summary= "04-01 Order๐Ÿ’ธ ๋‹จ๊ธฐ ๊ฒฐ์ œ API",description = "๊ฒฐ์ œ API ์ž…๋‹ˆ๋‹ค") @CheckRegularProject @@ -73,7 +70,7 @@ public CommonResponse requestPayment( @Valid @RequestBody OrderReq.OrderDetail orderDetail){ log.info("04-03 Order ๊ฒฐ์ œ ์ธ์ฆ์šฉ API ๊ฒฐ์ œ ID: " + orderDetail.getTid() + " ๊ฒฐ์ œ ๊ธˆ์•ก " + orderDetail.getAmount() +" ๊ธฐ๋ถ€ ํ”„๋กœ์ ํŠธ ID : " + projectId); return CommonResponse.onSuccess(orderService.requestPayment(user , orderDetail, projectId)); - } + }*/ @PostMapping("/pay/card") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, RegistrationCardErrorCode.class, NicePayErrorCode.class}) @@ -135,14 +132,14 @@ public CommonResponse getUserInfo( } - @DeleteMapping("/revoke/{cardId}") +/* @DeleteMapping("/revoke/{cardId}") @ApiErrorCodeExample({UserAuthErrorCode.class}) - @Operation(summary = "04-08 Order๐Ÿ’ธ ๊ฐ„ํŽธ๊ฒฐ์ œ ํ•ด์ง€",description = "ํ›„์›์ž ์ •๋ณด์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "04-08 Order๐Ÿ’ธ ๊ฐ„ํŽธ๊ฒฐ์ œ ํ•ด์ง€",description = "๊ฐ„ํŽธ๊ฒฐ์ œ ํ•ด์ง€ ์ž…๋‹ˆ๋‹ค.") public CommonResponse revokePay( @Parameter(hidden = true) @AuthenticationPrincipal User user, @PathVariable Long cardId ) { orderService.revokePay(user, cardId); return CommonResponse.onSuccess("๊ฐ„ํŽธ ๊ฒฐ์ œ ํ•ด์ง€"); - } + }*/ } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index 588c5fe9..541629bb 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -6,12 +6,14 @@ import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.helper.OrderHelper; import com.example.matchapi.portone.service.PaymentService; +import com.example.matchapi.project.service.ProjectService; +import com.example.matchcommon.annotation.RedissonLock; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.BaseException; -import com.example.matchcommon.exception.InternalServerException; import com.example.matchcommon.exception.NotFoundException; -import com.example.matchcommon.properties.NicePayProperties; import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.adaptor.DonationAdaptor; +import com.example.matchdomain.donation.adaptor.RegularPaymentAdaptor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.CardAbleStatus; import com.example.matchdomain.donation.entity.enums.DonationStatus; @@ -19,13 +21,8 @@ import com.example.matchdomain.donation.entity.enums.RegularStatus; import com.example.matchdomain.donation.repository.*; import com.example.matchdomain.project.entity.Project; -import com.example.matchdomain.project.repository.ProjectRepository; -import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchdomain.redis.repository.OrderRequestRepository; import com.example.matchdomain.user.entity.User; -import com.example.matchdomain.user.repository.UserRepository; -import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; -import com.example.matchinfrastructure.pay.nice.dto.*; import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; @@ -33,19 +30,10 @@ import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; import lombok.RequiredArgsConstructor; -import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; - -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; import javax.transaction.Transactional; -import javax.validation.Valid; -import java.security.MessageDigest; -import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -55,60 +43,26 @@ import static com.example.matchdomain.donation.entity.enums.HistoryStatus.TURN_ON; import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.*; import static com.example.matchdomain.donation.exception.DonationGerErrorCode.DONATION_NOT_EXIST; -import static com.example.matchdomain.order.exception.RegistrationCardErrorCode.FAILED_ERROR_ENCRYPT; -import static com.example.matchdomain.project.exception.ProjectOneTimeErrorCode.PROJECT_NOT_EXIST; @RequiredArgsConstructor @Service public class OrderService { - private final NiceAuthFeignClient niceAuthFeignClient; - private final NicePayProperties nicePayProperties; private final DonationUserRepository donationUserRepository; private final OrderConvertor orderConvertor; private final OrderHelper orderHelper; private final RegularPaymentRepository regularPaymentRepository; private final UserCardRepository userCardRepository; - private final RequestPaymentHistoryRepository requestPaymentHistoryRepository; private final OrderRequestRepository orderRequestRepository; - private final UserRepository userRepository; private final DonationHistoryRepository donationHistoryRepository; private final DonationConvertor donationConvertor; private final PortOneFeignClient portOneFeignClient; private final PortOneAuthService portOneAuthService; private final PortOneConvertor portOneConvertor; - private final ProjectRepository projectRepository; private final PaymentService paymentService; + private final ProjectService projectService; + private final DonationAdaptor donationAdaptor; + private final RegularPaymentAdaptor regularPaymentAdaptor; - @Transactional - public String requestPayment(User user, OrderReq.OrderDetail orderDetail, Long projectId) { - NicePaymentAuth nicePaymentAuth = niceAuthFeignClient. - paymentAuth(orderHelper.getNicePaymentAuthorizationHeader(), - orderDetail.getTid(), - new NicePayRequest(String.valueOf(orderDetail.getAmount()))); - - orderHelper.checkNicePaymentsResult(nicePaymentAuth.getResultCode(), nicePaymentAuth.getResultMsg()); - - String flameName = orderHelper.createFlameName(user.getName()); - - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - - donationUserRepository.save(orderConvertor.donationUser(nicePaymentAuth, user.getId(), orderDetail, projectId, flameName, inherenceNumber)); - - return flameName; - } - - @Transactional - public String createRandomUUID() { - return UUID.randomUUID().toString(); - } - - public String createRandomId(){ - boolean useLetters = true; - boolean useNumbers = true; - String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); - - return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; - } @Transactional public List getUserBillCard(Long userId) { List userCards = userCardRepository.findByUserIdAndStatus(userId,Status.ACTIVE); @@ -130,97 +84,78 @@ public List getUserBillCard(Long userId) { return userBillCards; } - @Transactional + @RedissonLock(LockName = "์นด๋“œ-์‚ญ์ œ", key = "#cardId") public void deleteBillCard(Long cardId) { - Optional userCard = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE); - NiceBillExpireResponse niceBillExpireResponse = niceAuthFeignClient.billKeyExpire(orderHelper.getNicePaymentAuthorizationHeader(), userCard.get().getBid(), new NiceBillExpireRequest(DELETE + createRandomId())); - System.out.println(niceBillExpireResponse.getResultCode() + niceBillExpireResponse.getResultMsg()); - userCard.get().setStatus(Status.INACTIVE); + UserCard userCard = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + + List regularPayments = regularPaymentAdaptor.findByCardId(cardId); + + for(RegularPayment regularPayment : regularPayments){ + regularPayment.setRegularPayStatus(RegularPayStatus.USER_CANCEL); + } + + regularPaymentRepository.saveAll(regularPayments); + + portOneFeignClient.deleteBillKey(portOneAuthService.getToken(), userCard.getBid()); + + userCard.setStatus(Status.INACTIVE); + + userCardRepository.save(userCard); } - @Transactional + @RedissonLock(LockName = "์ •๊ธฐ-๊ธฐ๋ถ€-์‹ ์ฒญ", key = "#cardId") public void regularDonation(User user, OrderReq.RegularDonation regularDonation, Long cardId, Long projectId) { - UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); - if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); - if(!card.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); - Project project = projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, RegularStatus.REGULAR).orElseThrow(() ->new BadRequestException(PROJECT_NOT_EXIST)); - String orderId = REGULAR + createRandomId(); + if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); - String accessToken = portOneAuthService.getToken(); + if(!card.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), orderId, regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + Project project = projectService.checkProjectExists(projectId, RegularStatus.REGULAR); - System.out.println(portOneResponse.getCode()); - System.out.println(portOneResponse.getMessage()); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(portOneAuthService.getToken(), portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); String flameName = orderHelper.createFlameName(user.getName()); - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + String inherenceNumber = createRandomUUID(); RegularPayment regularPayment = regularPaymentRepository.save(orderConvertor.RegularPayment(user.getId(), regularDonation, cardId, projectId)); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); + donationHistoryRepository.save(donationConvertor.DonationHistoryTurnOn(regularPayment.getId(), TURN_ON)); + donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); } - @Transactional - public void oneTimeDonationCard(User user, OrderReq. @Valid OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { + @RedissonLock(LockName = "๋นŒํ‚ค-๋‹จ๊ธฐ-๊ธฐ๋ถ€", key = "#cardId") + public void oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); - Project project = projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, RegularStatus.ONE_TIME).orElseThrow(() ->new BadRequestException(PROJECT_NOT_EXIST)); + Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); - String orderId = ONE_TIME + createRandomId(); - - String accessToken = portOneAuthService.getToken(); - - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), orderId, oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(portOneAuthService.getToken(), portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(ONE_TIME), oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); String flameName = orderHelper.createFlameName(user.getName()); - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + String inherenceNumber = createRandomUUID(); DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); - } @Transactional public String saveRequest(User user, Long projectId) { - String orderId = ONE_TIME + createRandomId(); + String orderId = createOrderId(ONE_TIME); orderRequestRepository.save(orderConvertor.CreateRequest(user.getId(), projectId, orderId)); return orderId; } - @Transactional - public void requestPaymentAuth(String tid, Long amount) { - NicePaymentAuth nicePaymentAuth = niceAuthFeignClient. - paymentAuth(orderHelper.getNicePaymentAuthorizationHeader(), - tid, - new NicePayRequest(String.valueOf(amount))); - - orderHelper.checkNicePaymentsResult(nicePaymentAuth.getResultCode(), nicePaymentAuth.getResultMsg()); - - Optional orderRequest = orderRequestRepository.findById(nicePaymentAuth.getOrderId()); - - Optional user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.get().getUserId()),Status.ACTIVE); - - String flameName = orderHelper.createFlameName(user.get().getName()); - - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationUserV2(nicePaymentAuth, user.get().getId(), amount, orderRequest.get().getProjectId(), flameName, inherenceNumber)); - - donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); - - } - - @Transactional + @RedissonLock(LockName = "๊ด€๋ฆฌ์ž-ํ™˜๋ถˆ-์ฒ˜๋ฆฌ", key = "#donationUserId") public void adminRefundDonation(Long donationUserId) { DonationUser donationUser = donationUserRepository.findById(donationUserId).orElseThrow(()-> new BadRequestException(DONATION_NOT_EXIST)); donationUser.setDonationStatus(DonationStatus.EXECUTION_REFUND); @@ -248,30 +183,25 @@ public void revokePay(User user, Long cardId) { regularPaymentRepository.saveAll(regularPayments); } - public final synchronized String getyyyyMMddHHmmss(){ - SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss"); - return yyyyMMddHHmmss.format(new Date()); - } - + @RedissonLock(LockName = "์œ ์ €-์นด๋“œ-๋“ฑ๋ก", key = "user") public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registrationCard) { String accessToken = portOneAuthService.getToken(); - String customerUid = BILL + createRandomId(); String cardNo = formatString(registrationCard.getCardNo(), 4); String expiry = "20" + registrationCard.getExpYear() + "-" + registrationCard.getExpMonth(); PortOneResponse portOneResponse = portOneFeignClient.getBillKey( accessToken, - customerUid, + createOrderId(BILL), portOneConvertor.PortOneBill(cardNo, expiry, registrationCard.getIdNo(), registrationCard.getCardPw()) ); if(portOneResponse.getCode()!=0){ throw new BaseException(HttpStatus.BAD_REQUEST, false, "PORT_ONE_BILL_AUTH_001", portOneResponse.getMessage()); } - UserCard userCard = userCardRepository.save(orderConvertor.UserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); + userCardRepository.save(orderConvertor.UserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); return portOneResponse.getResponse(); } - public static String formatString(String input, int length) { + public String formatString(String input, int length) { StringBuilder formatted = new StringBuilder(); for (int i = 0; i < input.length(); i++) { @@ -283,4 +213,15 @@ public static String formatString(String input, int length) { return formatted.toString(); } + + public String createRandomUUID() { + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + UUID.randomUUID().toString(); + } + + public String createOrderId(String type){ + boolean useLetters = true; + boolean useNumbers = true; + String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); + return type + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; + } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index 4a2077a4..c21c801d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -12,13 +12,13 @@ import com.example.matchdomain.donation.adaptor.DonationAdaptor; import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.HistoryStatus; +import com.example.matchdomain.donation.entity.enums.RegularStatus; import com.example.matchdomain.donation.repository.DonationHistoryRepository; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.project.adaptor.ProjectAdaptor; import com.example.matchdomain.project.adaptor.ProjectImgAdaptor; import com.example.matchdomain.project.dto.ProjectDto; import com.example.matchdomain.project.entity.*; -import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; import com.example.matchdomain.project.entity.enums.ProjectKind; import com.example.matchdomain.project.entity.enums.ProjectStatus; import com.example.matchdomain.project.entity.enums.ReportReason; @@ -43,7 +43,6 @@ import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.NORMAL; import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; import static com.example.matchdomain.project.entity.enums.ProjectStatus.PROCEEDING; -import static com.example.matchdomain.project.entity.enums.TodayStatus.TODAY; import static com.example.matchdomain.project.exception.CommentDeleteErrorCode.COMMENT_DELETE_ERROR_CODE; import static com.example.matchdomain.project.exception.CommentGetErrorCode.COMMENT_NOT_EXIST; import static com.example.matchdomain.project.exception.PatchProjectImageErrorCode.PROJECT_NOT_CORRECT_IMAGE; @@ -60,7 +59,6 @@ public class ProjectService { private final AuthHelper authHelper; private final ProjectCommentRepository projectCommentRepository; private final S3UploadService s3UploadService; - private final DonationUserRepository donationUserRepository; private final ProjectUserAttentionRepository projectUserAttentionRepository; private final DonationHistoryRepository donationHistoryRepository; private final CommentReportRepository commentReportRepository; @@ -285,4 +283,8 @@ public void deleteComment(User user, Long commentId) { projectComment.setStatus(INACTIVE); projectCommentRepository.save(projectComment); } + + public Project checkProjectExists(Long projectId, RegularStatus regularStatus) { + return projectAdaptor.checkRegularProjects(projectId, regularStatus); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java index e67009e4..51301128 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java @@ -24,7 +24,7 @@ public Page findDonationRegularList(Long regularPayId, Long pro public Page findMatchHistory(Long projectId, int page, int size){ Pageable pageable = PageRequest.of(page, size); - return donationHistoryRepository.findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtAsc(projectId, pageable); + return donationHistoryRepository.findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtDesc(projectId, pageable); } public Page findDonationHistory(DonationUser donationUser, Long donationId, int page, int size){ diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java index 1569b430..ab5829ea 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/RegularPaymentAdaptor.java @@ -3,6 +3,7 @@ import com.example.matchcommon.annotation.Adaptor; import com.example.matchcommon.exception.BadRequestException; import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.RegularPayment; import com.example.matchdomain.donation.repository.RegularPaymentRepository; import com.example.matchdomain.user.entity.User; @@ -50,4 +51,8 @@ public List findByIdList(Long regularPayId, User user){ .map(RegularPayment :: getId) .collect(Collectors.toList()); } + + public List findByCardId(Long cardId) { + return regularPaymentRepository.findByUserCardIdAndRegularPayStatus(cardId, PROCEEDING); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationHistoryRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationHistoryRepository.java index 2fe78da4..5aac4716 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationHistoryRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationHistoryRepository.java @@ -27,10 +27,10 @@ public interface DonationHistoryRepository extends JpaRepository findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtAsc(@Param("projectId") Long projectId, Pageable pageable); + Page findByDonationUser_ProjectOrProjectIdIdOrderByCreatedAtDesc(@Param("projectId") Long projectId, Pageable pageable); } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java index f025b88d..5f42b8d0 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/RegularPaymentRepository.java @@ -2,6 +2,7 @@ import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.RegularPayStatus; import com.example.matchdomain.donation.entity.RegularPayment; import com.example.matchdomain.user.entity.User; @@ -43,6 +44,8 @@ Page getBurningFlameListCustom(@Param("userId") Long userId List findByIdAndUserOrderByCreatedAtDesc(Long regularPayId, User user); + List findByUserCardIdAndRegularPayStatus(Long cardId, RegularPayStatus regularPayStatus); + interface RegularPaymentFlame { Long getRegularPayId(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java index 4ac3b214..247c461e 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java @@ -2,23 +2,22 @@ import com.example.matchcommon.annotation.Adaptor; import com.example.matchcommon.constants.enums.FILTER; +import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.NotFoundException; -import com.example.matchcommon.reponse.PageResponse; -import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.enums.RegularStatus; import com.example.matchdomain.project.entity.Project; -import com.example.matchdomain.project.entity.ProjectImage; import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; import com.example.matchdomain.project.entity.enums.ProjectKind; +import com.example.matchdomain.project.exception.ProjectOneTimeErrorCode; import com.example.matchdomain.project.repository.ProjectRepository; import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; -import java.util.List; import static com.example.matchdomain.common.model.Status.ACTIVE; import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; @@ -113,4 +112,8 @@ public Page getTodayProjectLists(Long userId, int return projectRepository.findTodayProject(userId, PROCEEDING.getValue(), LocalDateTime.now(), REPRESENT.getValue(), ACTIVE.getValue(), TODAY.getValue(), pageable); } + + public Project checkRegularProjects(Long projectId, RegularStatus regularStatus) { + return projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, regularStatus).orElseThrow(() -> new BadRequestException(ProjectOneTimeErrorCode.PROJECT_NOT_EXIST)); + } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java index be91a0d0..5baf6648 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java @@ -5,10 +5,7 @@ import com.example.matchinfrastructure.pay.portone.config.PortOneFeignConfiguration; import com.example.matchinfrastructure.pay.portone.config.PortOneInfoConfig; import com.example.matchinfrastructure.pay.portone.config.PortOneInfoErrorDecoder; -import com.example.matchinfrastructure.pay.portone.dto.PortOneAuth; -import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; -import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; -import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.dto.*; import com.example.matchinfrastructure.pay.portone.dto.req.PayWithBillKeyReq; import com.example.matchinfrastructure.pay.portone.dto.req.PortOneAuthReq; import com.example.matchinfrastructure.pay.portone.dto.req.PortOneBillReq; @@ -36,4 +33,10 @@ public PortOneResponse payWithBillKey( @RequestHeader("Authorization") String accessToken, @RequestBody PayWithBillKeyReq payWithBillKeyReq ); + + @DeleteMapping("/subscribe/customers/{customer_uid}") + public PortOneResponse deleteBillKey( + @RequestHeader("Authorization") String accessToken, + @PathVariable("customer_uid") String customer_uid + ); } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillDeleteResponse.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillDeleteResponse.java new file mode 100644 index 00000000..7729938d --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOneBillDeleteResponse.java @@ -0,0 +1,28 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@RequiredArgsConstructor +public class PortOneBillDeleteResponse { + private String customer_uid; // ๊ตฌ๋งค์ž์˜ ๊ฒฐ์ œ ์ˆ˜๋‹จ ์‹๋ณ„ ๊ณ ์œ ๋ฒˆํ˜ธ + private String pg_provider; // PG์‚ฌ ๊ตฌ๋ถ„์ฝ”๋“œ + private String pg_id; // PG์‚ฌ ์ƒ์ ์•„์ด๋””(MID) + private String customer_id; // ๊ตฌ๋งค์ž ID + private String card_name; // ๋นŒ๋งํ‚ค ๋ฐœ๊ธ‰ ํ•œ ์นด๋“œ๋ช… + private String card_code; // ์นด๋“œ์‚ฌ ์ฝ”๋“œ + private String card_number; // ๋งˆ์Šคํ‚น๋œ ์นด๋“œ๋ฒˆํ˜ธ + private Integer card_type; // ์นด๋“œ์œ ํ˜• + private String customer_name; // ๊ณ ๊ฐ ์„ฑํ•จ + private String customer_tel; // ์ „ํ™”๋ฒˆํ˜ธ + private String customer_email; // Email ์ฃผ์†Œ + private String customer_addr; // ์ฃผ์†Œ + private String customer_postcode; // ์šฐํŽธ๋ฒˆํ˜ธ + private Integer inserted; // ๋นŒ๋งํ‚ค ๋ฐœ๊ธ‰ ์‹œ๊ฐ UNIX timestamp + private Integer updated; // ๋นŒ๋งํ‚ค ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ UNIX timestamp +} From bfdee2bc44a0cc8444c7119f9b41d9a44e3e859f Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:34:46 +0900 Subject: [PATCH 31/82] =?UTF-8?q?:heavy=5Fplus=5Fsign:=20:=20Redisson=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=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 --- Match-Common/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Match-Common/build.gradle b/Match-Common/build.gradle index 1c995b4e..250aa5c7 100644 --- a/Match-Common/build.gradle +++ b/Match-Common/build.gradle @@ -22,6 +22,9 @@ dependencies { api group: 'org.json', name: 'json', version: '20090211' + api 'org.redisson:redisson-spring-boot-starter:3.18.0' + + api 'org.springframework.boot:spring-boot-starter-mail:2.5.5' api group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2' From 6fce6d36ce4aea1a7358067c4939f1a08dd5766e Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:59:54 +0900 Subject: [PATCH 32/82] =?UTF-8?q?:recycle:=20:=20=EA=B2=B0=EC=A0=9C=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EB=B0=98=ED=99=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/controller/OrderController.java | 11 +++++------ .../order/convertor/OrderConvertor.java | 17 +++++++++++++++++ .../example/matchapi/order/dto/OrderRes.java | 19 +++++++++++++++++++ .../matchapi/order/service/OrderService.java | 19 ++++++++++++++----- .../portone/controller/PaymentController.java | 6 +++--- .../portone/service/PaymentService.java | 16 ++++++++++++---- .../donation/entity/enums/RegularStatus.java | 2 +- .../project/adaptor/ProjectAdaptor.java | 5 +++++ .../portone/service/PortOneAuthService.java | 3 ++- 9 files changed, 78 insertions(+), 20 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java index 169a812b..86084c8b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java @@ -3,6 +3,7 @@ import com.example.matchapi.common.aop.CheckIdExist; import com.example.matchapi.common.aop.CheckOneTimeProject; import com.example.matchapi.common.aop.CheckRegularProject; +import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.order.dto.OrderReq; import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.service.OrderService; @@ -101,25 +102,23 @@ public CommonResponse deleteBillCard(@Parameter(hidden = true) @Authenti @PostMapping("/pay/card/{cardId}/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, ProjectRegualrErrorCode.class, DeleteCardErrorCode.class}) @Operation(summary = "04-05 Order๐Ÿ’ธ ์ •๊ธฐ ๊ฒฐ์ œ ๋“ฑ๋ก api #FRAME ๊ฒฐ์ œ ํ™”๋ฉด - ์ •๊ธฐ ๊ฒฐ์ œ",description = "์ •๊ธฐ ๊ฒฐ์ œ ์‹ ์ฒญํ•˜๊ธฐ API ์ž…๋‹ˆ๋‹ค.") - public CommonResponse regularDonation( + public CommonResponse regularDonation( @Parameter(hidden = true) @AuthenticationPrincipal User user, @Parameter(description = "์นด๋“œ id",example = "1") @PathVariable Long cardId, @Parameter(description = "ํ”„๋กœ์ ํŠธ id", example = "2") @PathVariable Long projectId, @Valid @RequestBody OrderReq.RegularDonation regularDonation){ - orderService.regularDonation(user, regularDonation, cardId, projectId); - return CommonResponse.onSuccess("์ •๊ธฐ ๊ฒฐ์ œ ๋“ฑ๋ก ์„ฑ๊ณต"); + return CommonResponse.onSuccess(orderService.regularDonation(user, regularDonation, cardId, projectId)); } @PostMapping("/pay/one/card/{cardId}/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, ProjectOneTimeErrorCode.class, DeleteCardErrorCode.class}) @Operation(summary = "04-06 Order๐Ÿ’ธ ๋นŒํ‚ค๋กœ ๋‹จ๊ธฐ ๊ฒฐ์ œ api #FRAME ๊ฒฐ์ œ ํ™”๋ฉด - ๋‹จ๊ธฐ ๊ฒฐ์ œ",description = "๋‹จ ๊ฒฐ์ œ ์‹ ์ฒญํ•˜๊ธฐ API ์ž…๋‹ˆ๋‹ค.") - public CommonResponse oneTimeDonationCard( + public CommonResponse oneTimeDonationCard( @Parameter(hidden = true) @AuthenticationPrincipal User user, @Parameter(description = "์นด๋“œ id",example = "1") @PathVariable Long cardId, @Parameter(description = "ํ”„๋กœ์ ํŠธ id", example = "2") @PathVariable Long projectId, @Valid @RequestBody OrderReq.OneTimeDonation oneTimeDonation){ - orderService.oneTimeDonationCard(user, oneTimeDonation, cardId, projectId); - return CommonResponse.onSuccess("๋‹จ๊ธฐ ๊ฒฐ์ œ ์„ฑ๊ณต"); + return CommonResponse.onSuccess(orderService.oneTimeDonationCard(user, oneTimeDonation, cardId, projectId)); } @PostMapping("/user") diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 0ceaac6c..3ac03b3e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -1,12 +1,16 @@ package com.example.matchapi.order.convertor; +import com.example.matchapi.donation.helper.DonationHelper; import com.example.matchapi.order.dto.OrderReq; +import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.helper.OrderHelper; import com.example.matchapi.portone.dto.PaymentReq; import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.*; import com.example.matchdomain.donation.entity.flameEnum.FlameImage; +import com.example.matchdomain.donation.entity.flameEnum.FlameType; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchinfrastructure.pay.nice.dto.*; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; @@ -20,6 +24,7 @@ @RequiredArgsConstructor public class OrderConvertor { private final OrderHelper orderHelper; + private final DonationHelper donationHelper; public DonationUser donationUser(NicePaymentAuth nicePaymentAuth, Long id, OrderReq.OrderDetail orderDetail, Long projectId, String flameName, String inherenceNumber) { return DonationUser.builder() .userId(id) @@ -186,6 +191,18 @@ public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id .regularStatus(regularStatus) .regularPaymentId(regularPaymentId) .flameImage(FlameImage.NORMAL_IMG.getImg()) + .flameType(FlameType.NORMAL_FLAME) + .build(); + } + + public OrderRes.CompleteDonation CompleteDonation(String name, Project project, Long amount) { + return OrderRes.CompleteDonation + .builder() + .username(name) + .title(project.getProjectName()) + .usages(project.getUsages()) + .amount(donationHelper.parsePriceComma(Math.toIntExact(amount))) + .regularStatus(project.getRegularStatus().getName()) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java b/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java index 41f37410..32174bfc 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java @@ -1,5 +1,6 @@ package com.example.matchapi.order.dto; +import com.example.matchdomain.donation.entity.enums.RegularStatus; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -34,4 +35,22 @@ public static class UserDetail { private String phoneNumber; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + @Schema(description = "๊ธฐ๋ถ€ API API Response") + public static class CompleteDonation { + private String username; + + private String title; + + private String usages; + + private String amount; + + private String regularStatus; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index 541629bb..8106d489 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -96,7 +96,9 @@ public void deleteBillCard(Long cardId) { regularPaymentRepository.saveAll(regularPayments); - portOneFeignClient.deleteBillKey(portOneAuthService.getToken(), userCard.getBid()); + String accessToken = portOneAuthService.getToken(); + + portOneFeignClient.deleteBillKey(accessToken, userCard.getBid()); userCard.setStatus(Status.INACTIVE); @@ -105,7 +107,7 @@ public void deleteBillCard(Long cardId) { @RedissonLock(LockName = "์ •๊ธฐ-๊ธฐ๋ถ€-์‹ ์ฒญ", key = "#cardId") - public void regularDonation(User user, OrderReq.RegularDonation regularDonation, Long cardId, Long projectId) { + public OrderRes.CompleteDonation regularDonation(User user, OrderReq.RegularDonation regularDonation, Long cardId, Long projectId) { UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); @@ -114,7 +116,8 @@ public void regularDonation(User user, OrderReq.RegularDonation regularDonation, Project project = projectService.checkProjectExists(projectId, RegularStatus.REGULAR); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(portOneAuthService.getToken(), portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + String accessToken = portOneAuthService.getToken(); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); String flameName = orderHelper.createFlameName(user.getName()); @@ -127,15 +130,19 @@ public void regularDonation(User user, OrderReq.RegularDonation regularDonation, donationHistoryRepository.save(donationConvertor.DonationHistoryTurnOn(regularPayment.getId(), TURN_ON)); donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); + + return orderConvertor.CompleteDonation(user.getName(), project, regularDonation.getAmount()); } @RedissonLock(LockName = "๋นŒํ‚ค-๋‹จ๊ธฐ-๊ธฐ๋ถ€", key = "#cardId") - public void oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { + public OrderRes.CompleteDonation oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(portOneAuthService.getToken(), portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(ONE_TIME), oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + String accessToken = portOneAuthService.getToken(); + + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(ONE_TIME), oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); String flameName = orderHelper.createFlameName(user.getName()); @@ -144,6 +151,8 @@ public void oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonat DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); + + return orderConvertor.CompleteDonation(user.getName(), project, oneTimeDonation.getAmount()); } @Transactional diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java b/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java index 414bb564..af4e5a53 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/controller/PaymentController.java @@ -1,5 +1,6 @@ package com.example.matchapi.portone.controller; +import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.portone.dto.PaymentReq; import com.example.matchapi.portone.service.PaymentService; import com.example.matchapi.project.dto.ProjectReq; @@ -17,9 +18,8 @@ public class PaymentController { private final PaymentService paymentService; @PostMapping("/validate") @Operation(summary = "08-01 Payment ๊ฐ€๊ฒฉ ๊ฒ€์ฆ๐Ÿ’ธ") - public CommonResponse validatePayment(@RequestBody PaymentReq.ValidatePayment validatePayment){ - paymentService.checkPayment(validatePayment); - return CommonResponse.onSuccess("๊ฒฐ์ œ ์„ฑ๊ณต"); + public CommonResponse validatePayment(@RequestBody PaymentReq.ValidatePayment validatePayment){ + return CommonResponse.onSuccess(paymentService.checkPayment(validatePayment)); } @PostMapping("/refund") diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 905651e6..6960a11b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -1,12 +1,16 @@ package com.example.matchapi.portone.service; import com.example.matchapi.order.convertor.OrderConvertor; +import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.helper.OrderHelper; import com.example.matchapi.portone.dto.PaymentReq; +import com.example.matchcommon.annotation.RedissonLock; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.properties.PortOneProperties; import com.example.matchdomain.common.model.Status; import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.project.adaptor.ProjectAdaptor; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.redis.entity.OrderRequest; import com.example.matchdomain.redis.repository.OrderRequestRepository; import com.example.matchdomain.user.entity.User; @@ -39,6 +43,7 @@ public class PaymentService { private final DonationUserRepository donationUserRepository; private final OrderConvertor orderConvertor; private final IamportClient iamportClient; + private final ProjectAdaptor projectAdaptor; @Autowired public PaymentService(PortOneProperties portOneProperties, @@ -46,7 +51,7 @@ public PaymentService(PortOneProperties portOneProperties, UserRepository userRepository, OrderHelper orderHelper, DonationUserRepository donationUserRepository, - OrderConvertor orderConvertor) { + OrderConvertor orderConvertor, ProjectAdaptor projectAdaptor) { this.portOneProperties = portOneProperties; this.orderRequestRepository = orderRequestRepository; this.userRepository = userRepository; @@ -54,16 +59,18 @@ public PaymentService(PortOneProperties portOneProperties, this.donationUserRepository = donationUserRepository; this.orderConvertor = orderConvertor; this.iamportClient = new IamportClient(portOneProperties.getKey(), portOneProperties.getSecret()); + this.projectAdaptor = projectAdaptor; } - public void checkPayment(PaymentReq.ValidatePayment validatePayment){ + @RedissonLock(LockName = "๊ฒฐ์ œ-๊ฒ€์ฆ", key = "#validatePayment") + public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validatePayment){ try { OrderRequest orderRequest = orderRequestRepository.findById(validatePayment.getOrderId()).orElseThrow(()->new BadRequestException(NOT_EXIST_ORDER_ID)); IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); Optional user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE); - int paidAmount = payment.getResponse().getAmount().intValue(); //์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ œํ•œ ๊ธˆ์•ก + Optional project = projectAdaptor.findByProjectId(Long.valueOf(orderRequest.getProjectId())); - if(paidAmount!=validatePayment.getAmount()){ + if(payment.getResponse().getAmount().intValue()!=validatePayment.getAmount()){ CancelData cancelData = createCancelData(payment, 0); iamportClient.cancelPaymentByImpUid(cancelData); throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); @@ -72,6 +79,7 @@ public void checkPayment(PaymentReq.ValidatePayment validatePayment){ String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); donationUserRepository.save(orderConvertor.donationUserPortone(payment.getResponse(), user.get().getId(), validatePayment, Long.valueOf(orderRequest.getProjectId()), flameName, inherenceNumber)); } + return orderConvertor.CompleteDonation(user.get().getName(), project.get(), (long) validatePayment.getAmount()); } catch (IamportResponseException | IOException e) { System.out.println(e.getMessage()); throw new BadRequestException(FAILED_ERROR_AUTH); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/RegularStatus.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/RegularStatus.java index f4ddc176..32ad4d3a 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/RegularStatus.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/RegularStatus.java @@ -10,7 +10,7 @@ @AllArgsConstructor public enum RegularStatus { REGULAR("REGULAR","์ •๊ธฐ ํ›„์›"), - ONE_TIME("ONE_TIME","์ผํšŒ์„ฑ ํ›„์›"); + ONE_TIME("ONE_TIME","์ผ์‹œ ํ›„์›"); private final String value; private final String name; diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java index 247c461e..90de255e 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java @@ -18,6 +18,7 @@ import org.springframework.data.domain.Pageable; import java.time.LocalDateTime; +import java.util.Optional; import static com.example.matchdomain.common.model.Status.ACTIVE; import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; @@ -116,4 +117,8 @@ public Page getTodayProjectLists(Long userId, int public Project checkRegularProjects(Long projectId, RegularStatus regularStatus) { return projectRepository.findByIdAndStatusAndRegularStatus(projectId, Status.ACTIVE, regularStatus).orElseThrow(() -> new BadRequestException(ProjectOneTimeErrorCode.PROJECT_NOT_EXIST)); } + + public Optional findByProjectId(Long projectId) { + return projectRepository.findById(projectId); + } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java index 56978e95..613f8da7 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneAuthService.java @@ -18,7 +18,7 @@ public class PortOneAuthService { private final PortOneFeignClient portOneFeignClient; private final PortOneProperties portOneProperties; - @Cacheable(value = "portOneTokenCache") + @Cacheable(value = "portOneTokenCache", key = "'all'") public String getToken() { String token = fetchPortOneToken(); System.out.println("request : " + token); @@ -30,6 +30,7 @@ public String fetchPortOneToken() { return getTokens(); } + @CachePut(value = "portOneTokenCache", key = "'all'") public String getTokens() { PortOneResponse portOneResponse = portOneFeignClient.getAccessToken(PortOneAuthReq.builder().imp_key(portOneProperties.getKey()).imp_secret(portOneProperties.getSecret()).build()); return portOneResponse.getResponse().getAccess_token(); From bf17e5f30db299e80360236b0972187b1c708244 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:00:09 +0900 Subject: [PATCH 33/82] =?UTF-8?q?:zap:=20:=20Cache=20Config=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchcommon/config/CacheConfig.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Match-Common/src/main/java/com/example/matchcommon/config/CacheConfig.java diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/CacheConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/CacheConfig.java new file mode 100644 index 00000000..de1f61d3 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/config/CacheConfig.java @@ -0,0 +1,27 @@ +package com.example.matchcommon.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.ehcache.EhCacheCacheManager; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; + +@Configuration +@Slf4j +public class CacheConfig { + @Bean + public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { + EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); + ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); + ehCacheManagerFactoryBean.setShared(true); + return ehCacheManagerFactoryBean; + } + + @Bean + public EhCacheCacheManager ehcacheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean) { + EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager(); + ehCacheCacheManager.setCacheManager(ehCacheManagerFactoryBean.getObject()); + return ehCacheCacheManager; + } +} \ No newline at end of file From fe2efd206a7f504e6c7b33405ed21e9da48d82ee Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:57:13 +0900 Subject: [PATCH 34/82] =?UTF-8?q?:recycle:=20:=20=EC=A0=95=EA=B8=B0?= =?UTF-8?q?=EA=B8=B0=EB=B6=80=20=ED=95=B4=EC=A7=80=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/donation/controller/DonationController.java | 2 +- .../matchapi/donation/convertor/DonationConvertor.java | 1 + .../java/com/example/matchapi/donation/dto/DonationRes.java | 2 ++ .../example/matchapi/donation/service/DonationService.java | 4 +++- .../donation/exception/CancelRegularPayErrorCode.java | 6 ++++-- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java index 0208884f..88ea4703 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java @@ -160,7 +160,7 @@ public CommonResponse>> getFl return CommonResponse.onSuccess(donationService.getFlameRegularList(donationId, user, page, size)); } - @Operation(summary = "05-11 ์ง„ํ–‰ ์ค‘์ธ ๋งค์น˜ ์กฐํšŒ ",description = "์ง„ํ–‰์ค‘์ธ ๋งค์น˜ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") + @Operation(summary = "05-11 ์ง„ํ–‰ ์ค‘์ธ ๋งค์น˜ ์กฐํšŒ #FRAME_๊ธฐ๋ถ€ ๋‚ด์—ญ",description = "์ง„ํ–‰์ค‘์ธ ๋งค์น˜ ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.") @GetMapping("/match") @ApiErrorCodeExample({UserAuthErrorCode.class}) public CommonResponse>> getUserMatchList( diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index 33f67e15..cd8fa7e2 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -156,6 +156,7 @@ public DonationRes.PayList PayListDetail(DonationUser result) { .payMethod(result.getPayMethod().getName()) .payStatus(payStatus) .amount(donationHelper.parsePriceComma(Math.toIntExact(result.getPrice()))) + .inherenceNumber(result.getInherenceNumber()) .build(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index 7ce6c06f..b0b24975 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -233,6 +233,8 @@ public static class PayList { private String payMethod; private String amount; + + private String inherenceNumber; } @Getter diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index ea459312..8f81ca7c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -25,8 +25,10 @@ import static com.example.matchdomain.common.model.Status.ACTIVE; import static com.example.matchdomain.donation.entity.enums.DonationStatus.*; +import static com.example.matchdomain.donation.entity.enums.RegularPayStatus.PROCEEDING; import static com.example.matchdomain.donation.entity.enums.RegularPayStatus.USER_CANCEL; import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_CORRECT_USER; +import static com.example.matchdomain.donation.exception.CancelRegularPayErrorCode.REGULAR_PAY_NOT_STATUS; import static com.example.matchdomain.donation.exception.DonationRefundErrorCode.*; @Service @@ -65,7 +67,7 @@ public void cancelRegularPay(User user, Long regularId) { RegularPayment regularPayment = regularPaymentAdaptor.findRegularPaymentByStatus(regularId, ACTIVE); if(!regularPayment.getUserId().equals(user.getId())) throw new BadRequestException(REGULAR_PAY_NOT_CORRECT_USER); - + if(!regularPayment.getRegularPayStatus().equals(PROCEEDING)) throw new BadRequestException(REGULAR_PAY_NOT_STATUS); regularPayment.setRegularPayStatus(USER_CANCEL); regularPaymentRepository.save(regularPayment); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/exception/CancelRegularPayErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/exception/CancelRegularPayErrorCode.java index b3a3d0ef..64e0718f 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/exception/CancelRegularPayErrorCode.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/exception/CancelRegularPayErrorCode.java @@ -17,9 +17,11 @@ @AllArgsConstructor public enum CancelRegularPayErrorCode implements BaseErrorCode { @ExplainError("ํ•ด๋‹น ๋„๋„ค์ด์…˜์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") - REGULAR_PAY_NOT_EXIST(NOT_FOUND,"REGULAR001", "ํ•ด๋‹น ์ •๊ธฐ๊ธฐ๋ถ€ ๋‚ด์—ญ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + REGULAR_PAY_NOT_EXIST(NOT_FOUND,"REGULAR_CANCEL_001", "ํ•ด๋‹น ์ •๊ธฐ๊ธฐ๋ถ€ ๋‚ด์—ญ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), @ExplainError("๋„๋„ค์ด์…˜ ํ™˜๋ถˆ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.") - REGULAR_PAY_NOT_CORRECT_USER(BAD_REQUEST,"REGULAR002","์ •๊ธฐ๊ธฐ๋ถ€๋ฅผ ์ทจ์†Œํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค."); + REGULAR_PAY_NOT_CORRECT_USER(BAD_REQUEST,"REGULAR_CANCEL_002","์ •๊ธฐ๊ธฐ๋ถ€๋ฅผ ์ทจ์†Œํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค."), + @ExplainError("ํ˜„์žฌ ๊ธฐ๋ถ€ ์ƒํƒœ๊ฐ€ ์ง„ํ–‰์ค‘์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Œ") + REGULAR_PAY_NOT_STATUS(BAD_REQUEST,"REGULAR_CANCEL_003", "์ด๋ฏธ ์ •๊ธฐ๊ธฐ๋ถ€๋ฅผ ์ทจ์†Œํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค."); private final HttpStatus httpStatus; From 0c5df138c005707eb34e38e56671616a7ec1e90a Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:57:22 +0900 Subject: [PATCH 35/82] =?UTF-8?q?:recycle:=20:=20security=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/matchapi/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index d09f1777..7c3fd308 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -89,6 +89,7 @@ protected void configure(HttpSecurity httpSecurity) throws Exception { .antMatchers("/order/serverAuth").permitAll() .antMatchers("/projects").permitAll() .antMatchers("/projects/**").permitAll() + .antMatchers("/projects/list").authenticated() .antMatchers("/").permitAll() .antMatchers("/serverAuth").permitAll() .antMatchers(HttpMethod.GET,"/donation-temporaries").permitAll() From 6749f0b850d371e0018e3fe2e05cd2162dc7fe1a Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:45:27 +0900 Subject: [PATCH 36/82] =?UTF-8?q?:zap:=20:=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=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 --- .../controller/NotificationController.java | 38 +++++++++++++ .../convertor/NotificationConvertor.java | 54 +++++++++++++++++++ .../notification/dto/NotificationRes.java | 36 +++++++++++++ .../service/NotificationService.java | 33 ++++++++++++ .../adaptor/NotificationAdaptor.java | 19 +++++++ .../notification/entity/Notification.java | 7 ++- .../notification/enums/NotificationType.java | 3 +- .../repository/NotificationRepository.java | 6 +++ 8 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java new file mode 100644 index 00000000..a086de9c --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java @@ -0,0 +1,38 @@ +package com.example.matchapi.notification.controller; + +import com.example.matchapi.notification.dto.NotificationRes; +import com.example.matchapi.notification.service.NotificationService; +import com.example.matchcommon.annotation.ApiErrorCodeExample; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.user.entity.User; +import com.example.matchdomain.user.exception.UserAuthErrorCode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notifications") +@Tag(name = "") +public class NotificationController { + private final NotificationService notificationService; + @ApiErrorCodeExample(UserAuthErrorCode.class) + @Operation(summary = "Notification-01 ์•Œ๋ฆผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") + @GetMapping("") + public CommonResponse> getNotificationList( + @AuthenticationPrincipal User user, + @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, + @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size + ){ + return CommonResponse.onSuccess(notificationService.getNotificationList(user, page, size)); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java new file mode 100644 index 00000000..9831b09d --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java @@ -0,0 +1,54 @@ +package com.example.matchapi.notification.convertor; + +import com.example.matchapi.common.util.TimeHelper; +import com.example.matchapi.notification.dto.NotificationRes; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.notification.entity.Notification; +import com.example.matchdomain.notification.enums.NotificationType; +import com.example.matchdomain.user.entity.User; +import com.example.matchinfrastructure.fcm.dto.FCMNotificationRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; + +import java.util.ArrayList; +import java.util.List; + +@Convertor +@RequiredArgsConstructor +public class NotificationConvertor { + private final TimeHelper timeHelper; + public List NotificationList(List notifications) { + List notificationLists = new ArrayList<>(); + + notifications.forEach( + result -> notificationLists.add( + NotificationDetail(result) + ) + ); + + return notificationLists; + } + + private NotificationRes.NotificationList NotificationDetail(Notification result) { + + return NotificationRes.NotificationList + .builder() + .notificationId(result.getId()) + .notificationType(result.getNotificationType().getType()) + .title(result.getTitle()) + .notificationDate(timeHelper.matchTimeFormat(result.getCreatedAt())) + .isRead(result.getIsRead()) + .build(); + } + + public Notification NotificationTest(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { + return Notification + .builder() + .body(fcmNotificationRequestDto.getBody()) + .notificationType(NotificationType.TEST) + .userId(user.getId()) + .title(fcmNotificationRequestDto.getTitle()) + .build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java b/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java new file mode 100644 index 00000000..03223ec6 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java @@ -0,0 +1,36 @@ +package com.example.matchapi.notification.dto; + +import lombok.*; + +import java.util.List; + +public class NotificationRes { + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NotificationDetail { + private int unReadCount; + + private List notificationLists; + } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NotificationList{ + private Long notificationId; + + private String notificationType; + + private String title; + + private String notificationDate; + + private boolean isRead; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java new file mode 100644 index 00000000..4adba18b --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java @@ -0,0 +1,33 @@ +package com.example.matchapi.notification.service; + +import com.example.matchapi.notification.convertor.NotificationConvertor; +import com.example.matchapi.notification.dto.NotificationRes; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.notification.adaptor.NotificationAdaptor; +import com.example.matchdomain.notification.entity.Notification; +import com.example.matchdomain.user.entity.User; +import com.example.matchinfrastructure.fcm.dto.FCMNotificationRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class NotificationService { + private final NotificationAdaptor notificationAdaptor; + private final NotificationConvertor notificationConvertor; + + public PageResponse getNotificationList(User user, int page, int size) { + Page notifications = notificationAdaptor.findByUser(user, page, size); + int notificationCount = notificationAdaptor.countByUnRead(user); + return new PageResponse<>(notifications.isLast(), notifications.getTotalElements(), new NotificationRes.NotificationDetail(notificationCount, notificationConvertor.NotificationList(notifications.getContent()))); + } + + public void saveTestNotification(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { + Notification notification = notificationConvertor.NotificationTest(user, fcmNotificationRequestDto); + + notificationAdaptor.saveNotification(notification); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java index 4712014f..25226f29 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java @@ -1,11 +1,30 @@ package com.example.matchdomain.notification.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.notification.entity.Notification; import com.example.matchdomain.notification.repository.NotificationRepository; +import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; @Adaptor @RequiredArgsConstructor public class NotificationAdaptor { private final NotificationRepository notificationRepository; + + public Page findByUser(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + return notificationRepository.findByUserOrderByCreatedAt(user, pageable); + } + + public int countByUnRead(User user) { + return notificationRepository.countByUserAndIsRead(user, false); + } + + public void saveNotification(Notification notification) { + notificationRepository.save(notification); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java index 828b7c8b..ae94ae43 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java @@ -1,5 +1,6 @@ package com.example.matchdomain.notification.entity; +import com.example.matchdomain.common.model.BaseEntity; import com.example.matchdomain.notification.enums.NotificationType; import com.example.matchdomain.user.entity.User; import lombok.*; @@ -19,7 +20,7 @@ @DynamicUpdate @DynamicInsert @BatchSize(size = 100) -public class Notification { +public class Notification extends BaseEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -40,4 +41,8 @@ public class Notification { private String body; private boolean isRead = false; + + public boolean getIsRead() { + return isRead; + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java index 73449817..d3ba9a13 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java @@ -7,7 +7,8 @@ @AllArgsConstructor public enum NotificationType { DONATION("DONATION", "๊ธฐ๋ถ€"), - NOTICE("NOTICE", "๊ณต์ง€"); + NOTICE("NOTICE", "๊ณต์ง€"), + TEST("TEST","ํ…Œ์ŠคํŠธ ์•Œ๋ฆผ"); private final String value; diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java index f862368e..2f54d445 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/repository/NotificationRepository.java @@ -1,7 +1,13 @@ package com.example.matchdomain.notification.repository; import com.example.matchdomain.notification.entity.Notification; +import com.example.matchdomain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface NotificationRepository extends JpaRepository { + Page findByUserOrderByCreatedAt(User user, Pageable pageable); + + int countByUserAndIsRead(User user, boolean b); } From b1191eff702223a8ab0551441d83c7e5fd11adeb Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:45:55 +0900 Subject: [PATCH 37/82] =?UTF-8?q?:recycle:=20:=20config=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/config/SecurityConfig.java | 1 + .../example/matchapi/config/SwaggerConfig.java | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index 7c3fd308..5ce9e62a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -102,6 +102,7 @@ protected void configure(HttpSecurity httpSecurity) throws Exception { .antMatchers("/admin/donation-temporaries/**").hasAnyRole("ADMIN") .antMatchers("/admin/order/**").hasAnyRole("ADMIN") .antMatchers("/admin/auth/logIn").permitAll() + .antMatchers("/test/fcm/user").authenticated() .anyRequest().authenticated() .and() diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java index 52ab40ce..79260e98 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java @@ -18,32 +18,38 @@ import io.swagger.v3.oas.models.security.SecurityScheme; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springdoc.core.SpringDocUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.method.HandlerMethod; import org.springdoc.core.customizers.OperationCustomizer; import java.util.*; import java.util.stream.Collectors; -import static java.lang.Integer.parseInt; -import static java.util.stream.Collectors.groupingBy; - @Configuration @RequiredArgsConstructor @Slf4j public class SwaggerConfig { //jwt ํ† ํฐ ์ธ์ฆ์„ ์œ„ํ•œ ๋ฒ„ํŠผ๊นŒ์ง€ ํฌํ•จ + static { + SpringDocUtils.getConfig().addAnnotationsToIgnore(AuthenticationPrincipal.class, CookieValue.class); + } private final ApplicationContext applicationContext; + @Value("${spring.config.activate.on-profile}") + private String profile; + @Bean public OpenAPI openAPI() { - log.info("Open API conifg"); Info info = new Info() - .title("Match Aligo Rest API ๋ฌธ์„œ") // ํƒ€์ดํ‹€ + .title(profile + "ํ™˜๊ฒฝ Match Rest API ๋ฌธ์„œ") // ํƒ€์ดํ‹€ .version("0.0.1") // ๋ฌธ์„œ ๋ฒ„์ „ .description("์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ฐ”๋กœ ๋ง์”€ํ•ด์ฃผ์„ธ์š”.") // ๋ฌธ์„œ ์„ค๋ช… .contact(new Contact() // ์—ฐ๋ฝ์ฒ˜ From 225597f32e415ed589d434712c6ecac7e916a5d4 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:46:10 +0900 Subject: [PATCH 38/82] =?UTF-8?q?:recycle:=20:=20fcm=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generated/com/example/matchdomain/user/entity/QUser.java | 2 ++ .../main/java/com/example/matchdomain/user/entity/User.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/Match-Domain/src/main/generated/com/example/matchdomain/user/entity/QUser.java b/Match-Domain/src/main/generated/com/example/matchdomain/user/entity/QUser.java index 804c5cb4..db30ac52 100644 --- a/Match-Domain/src/main/generated/com/example/matchdomain/user/entity/QUser.java +++ b/Match-Domain/src/main/generated/com/example/matchdomain/user/entity/QUser.java @@ -67,6 +67,8 @@ public class QUser extends EntityPathBase { public final ListPath userCard = this.createList("userCard", com.example.matchdomain.donation.entity.UserCard.class, com.example.matchdomain.donation.entity.QUserCard.class, PathInits.DIRECT2); + public final ListPath userFcmTokens = this.createList("userFcmTokens", UserFcmToken.class, QUserFcmToken.class, PathInits.DIRECT2); + public final StringPath username = createString("username"); public QUser(String variable) { diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java index 47b91e98..fb791d6c 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java @@ -80,6 +80,11 @@ public class User extends BaseEntity implements UserDetails { @JoinColumn(name = "userId") private List userCard = new ArrayList<>(); + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "userId") + @BatchSize(size = 10) + private List userFcmTokens = new ArrayList<>(); + @Column(name = "logInAt") private LocalDateTime logInAt; From 57d35f0304f463eb5317068eb17c0f38bac85437 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:46:23 +0900 Subject: [PATCH 39/82] =?UTF-8?q?:recycle:=20:=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/common/TestController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Match-Api/src/main/java/com/example/matchapi/common/TestController.java b/Match-Api/src/main/java/com/example/matchapi/common/TestController.java index 48013481..413a04d2 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/TestController.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/TestController.java @@ -1,13 +1,16 @@ package com.example.matchapi.common; import com.example.matchapi.common.aop.CheckIdExist; +import com.example.matchapi.notification.service.NotificationService; import com.example.matchapi.order.helper.OrderHelper; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.service.MailService; +import com.example.matchdomain.user.entity.User; import com.example.matchinfrastructure.fcm.dto.FCMNotificationRequestDto; import com.example.matchinfrastructure.fcm.service.FcmNotificationService; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -20,6 +23,7 @@ public class TestController { private final OrderHelper orderHelper; private final MailService mailService; + private final NotificationService notificationService; private final FcmNotificationService fcmNotificationService; @GetMapping("") @@ -40,6 +44,17 @@ public String fcmTest( fcmNotificationService.testNotification(fcmNotificationRequestDto); return "์„ฑ๊ณต"; } + + @PostMapping("/fcm/user") + public String fcmUserTest( + @AuthenticationPrincipal User user, + @RequestBody FCMNotificationRequestDto fcmNotificationRequestDto + ){ + fcmNotificationService.testNotification(fcmNotificationRequestDto); + notificationService.saveTestNotification(user, fcmNotificationRequestDto); + + return "์„ฑ๊ณต"; + } /* @GetMapping("/email") From abab6f81dff07324b0cf93da89776d9488641a6b Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:21:33 +0900 Subject: [PATCH 40/82] =?UTF-8?q?:recycle:=20:=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=82=AD=EC=A0=9C=20=EC=98=A4=EB=A5=98=20X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchinfrastructure/config/s3/S3UploadService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java index e4257c8d..8bf26f2d 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java @@ -150,8 +150,6 @@ public void deleteFile(String fileName){ boolean isObjectExist = amazonS3.doesObjectExist(awsS3Properties.getS3().getBucket(), fileRoute); if (isObjectExist) { amazonS3.deleteObject(awsS3Properties.getS3().getBucket(),fileRoute); - } else { - throw new InternalServerException(IMAGE_DELETE_ERROR); } } catch (Exception e) { throw new InternalServerException(IMAGE_DELETE_ERROR); From 27947cf68369268e5a57152c0e40497c8fe2738a Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:21:59 +0900 Subject: [PATCH 41/82] =?UTF-8?q?:zap:=20:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD,=20Event,=20=EC=95=8C=EB=A6=BC=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/util/TimeHelper.java | 15 +++++++ .../event/controller/EventController.java | 35 +++++++++++++++++ .../event/convetor/EventConvertor.java | 38 ++++++++++++++++++ .../example/matchapi/event/dto/EventRes.java | 26 +++++++++++++ .../matchapi/event/service/EventService.java | 24 ++++++++++++ .../controller/NotificationController.java | 4 +- .../common/model/ContentsType.java | 16 ++++++++ .../event/adaptor/EventAdaptor.java | 9 +++++ .../matchdomain/event/entity/Event.java | 26 ++++++++----- .../event/entity/EventContent.java | 39 +++++++++++++++++++ .../matchdomain/event/enums/EventStatus.java | 13 +++++++ .../repository/EventContentRepository.java | 7 ++++ .../event/repository/EventRepository.java | 3 ++ .../matchdomain/notice/entity/Notice.java | 39 +++++++++++++++++++ .../notice/entity/NoticeContent.java | 35 +++++++++++++++++ .../matchdomain/notice/enums/NoticeType.java | 24 ++++++++++++ .../notification/entity/Notification.java | 16 ++++++++ .../notification/enums/NotificationType.java | 1 + 18 files changed, 359 insertions(+), 11 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventStatus.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventContentRepository.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/enums/NoticeType.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java b/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java index a72180a7..cd51f65f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/util/TimeHelper.java @@ -2,8 +2,12 @@ import com.example.matchcommon.annotation.Helper; +import java.time.LocalDate; import java.time.LocalDateTime; +import static com.example.matchdomain.event.enums.EventStatus.FINISH; +import static com.example.matchdomain.event.enums.EventStatus.UNDER; + @Helper public class TimeHelper { @@ -28,4 +32,15 @@ public String checkTimes(int value){ } } + public String checkFinishStatus(LocalDate eventEndDate) { + LocalDate nowDate = LocalDate.now(); + + if(nowDate.isBefore(eventEndDate)){ + return UNDER.getValue(); + } + else{ + return FINISH.getValue(); + } + + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java new file mode 100644 index 00000000..6eaf5a67 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java @@ -0,0 +1,35 @@ +package com.example.matchapi.event.controller; + +import com.example.matchapi.event.dto.EventRes; +import com.example.matchapi.event.service.EventService; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchcommon.reponse.PageResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/events") +@RequiredArgsConstructor +@Tag(name = "12-Event ๐ŸŽ‰ ์ด๋ฒคํŠธ ๊ด€๋ จ API") +public class EventController { + private final EventService eventService; + + @GetMapping("") + @Operation(summary = "12-01 ์ด๋ฒคํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") + public CommonResponse>> getEventLists( + @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, + @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size + ){ + return CommonResponse.onSuccess(eventService.getEventList(page, size)); + } + +} diff --git a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java new file mode 100644 index 00000000..057066b8 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java @@ -0,0 +1,38 @@ +package com.example.matchapi.event.convetor; + +import com.example.matchapi.common.util.TimeHelper; +import com.example.matchapi.event.dto.EventRes; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.event.entity.Event; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Convertor +@RequiredArgsConstructor +public class EventConvertor { + private final TimeHelper timeHelper; + public List EventList(List content) { + List eventLists = new ArrayList<>(); + + content.forEach( + result -> { + eventLists.add(EventDetail(result)); + } + ); + return eventLists; + } + + private EventRes.EventList EventDetail(Event result) { + return EventRes.EventList + .builder() + .eventId(result.getId()) + .title(result.getTitle()) + .smallTitle(result.getSmallTitle()) + .eventStatus(timeHelper.checkFinishStatus(result.getEventEndDate())) + .startDate(result.getEventStartDate()) + .endDate(result.getEventEndDate()) + .build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java new file mode 100644 index 00000000..7c845657 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java @@ -0,0 +1,26 @@ +package com.example.matchapi.event.dto; + +import lombok.*; + +import java.time.LocalDate; + +public class EventRes { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class EventList { + private Long eventId; + + private String title; + + private String smallTitle; + + private String eventStatus; + + private LocalDate startDate; + + private LocalDate endDate; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java new file mode 100644 index 00000000..61f02df1 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java @@ -0,0 +1,24 @@ +package com.example.matchapi.event.service; + +import com.example.matchapi.event.convetor.EventConvertor; +import com.example.matchapi.event.dto.EventRes; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.event.adaptor.EventAdaptor; +import com.example.matchdomain.event.entity.Event; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class EventService { + private final EventConvertor eventConvertor; + private final EventAdaptor eventAdaptor; + + public PageResponse> getEventList(int page, int size) { + Page events = eventAdaptor.findEvent(page, size); + return new PageResponse<>(events.isLast(), events.getTotalElements(), eventConvertor.EventList(events.getContent())); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java index a086de9c..d434191e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java @@ -22,11 +22,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/notifications") -@Tag(name = "") +@Tag(name = "10-Notification๐Ÿ”” ์•Œ๋ฆผ") public class NotificationController { private final NotificationService notificationService; @ApiErrorCodeExample(UserAuthErrorCode.class) - @Operation(summary = "Notification-01 ์•Œ๋ฆผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") + @Operation(summary = "10-01 ์•Œ๋ฆผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") @GetMapping("") public CommonResponse> getNotificationList( @AuthenticationPrincipal User user, diff --git a/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsType.java b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsType.java new file mode 100644 index 00000000..1dcaee18 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsType.java @@ -0,0 +1,16 @@ +package com.example.matchdomain.common.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum ContentsType { + IMG("IMG", "์ด๋ฏธ์ง€"), + TEXT("TEXT", "ํ…์ŠคํŠธ"); + + private final String value; + + private final String type; + +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java index 045fc13c..537f3318 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java @@ -1,11 +1,20 @@ package com.example.matchdomain.event.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.event.entity.Event; import com.example.matchdomain.event.repository.EventRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; @Adaptor @RequiredArgsConstructor public class EventAdaptor { private final EventRepository eventRepository; + + public Page findEvent(int page, int size) { + Pageable pageable = PageRequest.of(page, size); + return eventRepository.findAllByOrderByCreatedAtDesc(pageable); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java index 322e3ce5..90f64013 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java @@ -1,16 +1,19 @@ package com.example.matchdomain.event.entity; import com.example.matchdomain.common.model.BaseEntity; -import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.event.enums.EventType; import lombok.*; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; @Entity -@Table(name = "User") +@Table(name = "Event") @Getter @Setter @Builder @@ -25,15 +28,20 @@ public class Event extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String eventImg; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "eventId") + private List eventContents = new ArrayList<>(); - private String text; + @Enumerated(EnumType.STRING) + private EventType eventType; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "donationId",nullable = false, insertable=false, updatable=false) - private DonationUser donationUser; + private String title; - @Column(name="donationId") - private Long donationId; + private String smallTitle; + private String thumbnail; + + private LocalDate eventStartDate; + + private LocalDate eventEndDate; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java new file mode 100644 index 00000000..d3dfe4e5 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java @@ -0,0 +1,39 @@ +package com.example.matchdomain.event.entity; + +import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.common.model.ContentsType; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "EventContent") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@BatchSize(size = 100) +@DynamicInsert +public class EventContent extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + private ContentsType contentsType; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "eventId",nullable = false, insertable=false, updatable=false) + private Event event; + + @Column(name="eventId") + private Long eventId; + + private String contents; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventStatus.java b/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventStatus.java new file mode 100644 index 00000000..36d9920a --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/enums/EventStatus.java @@ -0,0 +1,13 @@ +package com.example.matchdomain.event.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EventStatus { + UNDER("์ง„ํ–‰์ค‘"), + FINISH("์ข…๋ฃŒ"); + + private final String value; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventContentRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventContentRepository.java new file mode 100644 index 00000000..eeab6374 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventContentRepository.java @@ -0,0 +1,7 @@ +package com.example.matchdomain.event.repository; + +import com.example.matchdomain.event.entity.EventContent; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EventContentRepository extends JpaRepository { +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java index c86d1457..63afc174 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/repository/EventRepository.java @@ -1,7 +1,10 @@ package com.example.matchdomain.event.repository; import com.example.matchdomain.event.entity.Event; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface EventRepository extends JpaRepository { + Page findAllByOrderByCreatedAtDesc(Pageable pageable); } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java new file mode 100644 index 00000000..2734d5bc --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java @@ -0,0 +1,39 @@ +package com.example.matchdomain.notice.entity; + +import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.notice.enums.NoticeType; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "Notice") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@BatchSize(size = 10) +@DynamicInsert +public class Notice extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "noticeId") + private List noticeContents = new ArrayList<>(); + + @Enumerated(EnumType.STRING) + private NoticeType noticeType; + + private String title; + +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java new file mode 100644 index 00000000..552e9cb0 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java @@ -0,0 +1,35 @@ +package com.example.matchdomain.notice.entity; + +import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.common.model.ContentsType; +import com.example.matchdomain.event.entity.Event; +import lombok.*; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Entity +@Table(name = "NoticeContent") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicUpdate +@BatchSize(size = 100) +@DynamicInsert +public class NoticeContent extends BaseEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "noticeId",nullable = false, insertable=false, updatable=false) + private Notice notice; + + @Column(name="noticeId") + private Long noticeId; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/enums/NoticeType.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/enums/NoticeType.java new file mode 100644 index 00000000..a19759eb --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/enums/NoticeType.java @@ -0,0 +1,24 @@ +package com.example.matchdomain.notice.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum NoticeType { + EVENT("EVENT", "์ด๋ฒคํŠธ ๋ฐ ํ–‰์‚ฌ ๊ณต์ง€"), + SCHEDULE("SCHEDULE", "์ผ์ • ๋ฐ ํœด๋ฌด ๊ณต์ง€"), + SERVICE_UPDATE("SERVICE_UPDATE", "์„œ๋น„์Šค ์—…๋ฐ์ดํŠธ"), + JOB("JOB", "์ฑ„์šฉ ๋ฐ ๊ตฌ์ธ ์ •๋ณด"), + SECURITY("SECURITY", "๋ณด์•ˆ ๊ณต์ง€"), + IMPORTANT("IMPORTANT", "์ค‘์š” ๊ณต์ง€"), + EMERGENCY("EMERGENCY", "์ฃผ์š” ์ด์Šˆ ๋ฐ ์žฌ๋‚œ ๊ณต์ง€"), + ADMIN("ADMIN", "ํ–‰์ • ๋ฐ ๊ด€๋ฆฌ ๊ณต์ง€"), + EDUCATION("EDUCATION", "ํ•™๊ต ๋ฐ ๊ต์œก ๊ณต์ง€"), + HEALTH("HEALTH", "๊ฑด๊ฐ• ๋ฐ ์˜๋ฃŒ ๊ณต์ง€"), + PROJECT("PROJECT", "์ฃผ์š” ํ”„๋กœ์ ํŠธ ๋ฐ ์—ฐ๊ตฌ ๊ณต์ง€"), + SOCIAL("SOCIAL", "์‚ฌํšŒ์  ํ™œ๋™ ๊ณต์ง€"); + + private final String value; + private final String type; +} \ No newline at end of file diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java index ae94ae43..0c10dd81 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/entity/Notification.java @@ -1,6 +1,8 @@ package com.example.matchdomain.notification.entity; import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.event.entity.Event; import com.example.matchdomain.notification.enums.NotificationType; import com.example.matchdomain.user.entity.User; import lombok.*; @@ -42,6 +44,20 @@ public class Notification extends BaseEntity { private boolean isRead = false; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "eventId",nullable = false, insertable=false, updatable=false) + private Event event; + + @Column(name="eventId") + private Long eventId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "donationUserId",nullable = false, insertable=false, updatable=false) + private DonationUser donationUser; + + @Column(name="donationUserId") + private Long donationUserId; + public boolean getIsRead() { return isRead; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java index d3ba9a13..e0fa702b 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/enums/NotificationType.java @@ -8,6 +8,7 @@ public enum NotificationType { DONATION("DONATION", "๊ธฐ๋ถ€"), NOTICE("NOTICE", "๊ณต์ง€"), + REGULAR_PAYMENT("REGULAR_PAYMENT", "์ •๊ธฐ๊ฒฐ์ œ ์‹ ์ฒญ"), TEST("TEST","ํ…Œ์ŠคํŠธ ์•Œ๋ฆผ"); private final String value; From eef36a4ee1105b532774719d4e112e08bb30228c Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:07:38 +0900 Subject: [PATCH 42/82] =?UTF-8?q?:recycle:=20:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/project/convertor/ProjectConvertor.java | 2 +- .../com/example/matchapi/user/controller/UserController.java | 1 + .../com/example/matchapi/user/convertor/UserConvertor.java | 2 +- .../src/main/java/com/example/matchapi/user/dto/UserRes.java | 3 ++- .../java/com/example/matchapi/user/service/UserService.java | 3 ++- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java index f73a0ce9..84068df3 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java @@ -75,7 +75,7 @@ public UserRes.MyPage getMyPage(List regularPayments, Long likeC } return UserRes.MyPage.builder() - .username(name) + .name(name) .likeCnt(Math.toIntExact(likeCnt)) .underCnt(underCnt) .successCnt(successCnt) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java index ec57602c..73c73f03 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java @@ -124,6 +124,7 @@ public CommonResponse getProfile( @Operation(summary = "02-06 ํ”„๋กœํ•„ ํŽธ์ง‘ ๐Ÿ‘ค FRAME MY",description = "์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ multipart ์— ๋„ฃ์–ด์ฃผ์‹œ๊ณ , ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์•ˆํ•  ์‹œ multipart null ๊ฐ’์œผ๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š” ์•„์ด๋””๋Š” ๊ธฐ์กด ์•„์ด๋””๊ฐ’+๋ณ€๊ฒฝํ•  ์•„์ด๋””๊ฐ’ ๋‘˜์ค‘ ํ•˜๋‚˜ ๋ณด๋‚ด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค") @PatchMapping("/profile") public CommonResponse modifyUserProfile(@ModelAttribute UserReq.ModifyProfile modifyProfile, @Parameter(hidden = true) @AuthenticationPrincipal User user) throws IOException { + System.out.println(modifyProfile.getName()); userService.modifyUserProfile(user, modifyProfile); return CommonResponse.onSuccess("๋ณ€๊ฒฝ ์„ฑ๊ณต"); } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index 454eae46..e27efb59 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -200,7 +200,7 @@ public UserRes.Profile UserProfile(User user) { return UserRes.Profile .builder() .profileImgUrl(user.getProfileImgUrl()) - .name(user.getName()) + .name(user.getNickname()) .socialType(user.getSocialType()) .email(user.getEmail()) .phone(user.getPhoneNumber()) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java index 85525dbc..7fb61786 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java @@ -78,7 +78,8 @@ public static class EditMyPage { @NoArgsConstructor @Schema(description ="02-01๐Ÿ‘ค ์œ ์ € ์ •๋ณด ์กฐํšŒ API Response") public static class MyPage { - private String username; + @Schema(description = "๋‹‰๋„ค์ž„") + private String name; @Schema(description = "์ง„ํ–‰์ค‘ ๋งค์น˜ ๊ฐฏ์ˆ˜", required = true, example = "ํ›„์› ์ง‘ํ–‰ ์ง„ํ–‰ ์ค‘ ๊ฐฏ์ˆ˜") private int underCnt; diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java index 20542103..04789cc9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java @@ -75,7 +75,7 @@ public UserRes.MyPage getMyPage(User user) { List regularPayments = regularPaymentRepository.findByUser(user); Long projectAttentionCnt = projectUserAttentionRepository.countById_userId(user.getId()); - return projectConvertor.getMyPage(regularPayments,projectAttentionCnt, user.getName()); + return projectConvertor.getMyPage(regularPayments,projectAttentionCnt, user.getNickname()); } public OrderRes.UserDetail getUserInfo(User user) { @@ -145,6 +145,7 @@ public void modifyUserProfile(User user, UserReq.ModifyProfile modifyProfile) { user.setProfileImgUrl(newProfileImg); } else if(modifyProfile.getMultipartFile() == null && modifyProfile.getName()!=null){ + System.out.println("์œ ์ € ์ด๋ฆ„ ํŽธ์ง‘"); user.setName(modifyProfile.getName()); } else if (modifyProfile.getMultipartFile() != null){ From e4e6be38f53f07893a5a46e5b4b45f3a5f290207 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:49:04 +0900 Subject: [PATCH 43/82] =?UTF-8?q?:zap:=20:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/controller/NoticeController.java | 36 ++++++++++++++++++ .../notice/convertor/NoticeConvertor.java | 37 +++++++++++++++++++ .../matchapi/notice/dto/NoticeRes.java | 20 ++++++++++ .../notice/service/NoticeService.java | 24 ++++++++++++ .../notice/adaptor/NoticeAdapter.java | 20 ++++++++++ .../repository/NoticeContentRepository.java | 8 ++++ .../notice/repository/NoticeRepository.java | 10 +++++ 7 files changed, 155 insertions(+) create mode 100644 Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeContentRepository.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeRepository.java diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java new file mode 100644 index 00000000..17c15e86 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java @@ -0,0 +1,36 @@ +package com.example.matchapi.notice.controller; + +import com.example.matchapi.notice.dto.NoticeRes; +import com.example.matchapi.notice.service.NoticeService; +import com.example.matchapi.notification.dto.NotificationRes; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.user.entity.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notices") +@Tag(name = "11-Notice๐Ÿ“ ๊ณต์ง€์‚ฌํ•ญ API") +public class NoticeController { + private final NoticeService noticeService; + + @Operation(summary = "11-01 ๊ณต์ง€์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") + @GetMapping("") + public CommonResponse>> getNotificationList( + @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, + @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size + ){ + return CommonResponse.onSuccess(noticeService.getNoticeList(page, size)); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java new file mode 100644 index 00000000..3d2bf663 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java @@ -0,0 +1,37 @@ +package com.example.matchapi.notice.convertor; + +import com.example.matchapi.common.util.TimeHelper; +import com.example.matchapi.notice.dto.NoticeRes; +import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.notice.entity.Notice; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Convertor +@RequiredArgsConstructor +public class NoticeConvertor { + private final TimeHelper timeHelper; + public List NoticeList(List content) { + List noticeLists = new ArrayList<>(); + + content.forEach( + result -> noticeLists.add( + NoticeListDetail(result) + ) + ); + + return noticeLists; + } + + private NoticeRes.NoticeList NoticeListDetail(Notice result) { + return NoticeRes.NoticeList + .builder() + .noticeId(result.getId()) + .title(result.getTitle()) + .noticeType(result.getNoticeType().getType()) + .noticeDate(timeHelper.matchTimeFormat(result.getCreatedAt())) + .build(); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java new file mode 100644 index 00000000..c7805f87 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java @@ -0,0 +1,20 @@ +package com.example.matchapi.notice.dto; + +import lombok.*; + +public class NoticeRes { + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NoticeList { + private Long noticeId; + + private String noticeType; + + private String title; + + private String noticeDate; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java new file mode 100644 index 00000000..6224908b --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java @@ -0,0 +1,24 @@ +package com.example.matchapi.notice.service; + +import com.example.matchapi.notice.convertor.NoticeConvertor; +import com.example.matchapi.notice.dto.NoticeRes; +import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.notice.adaptor.NoticeAdapter; +import com.example.matchdomain.notice.entity.Notice; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class NoticeService { + private final NoticeConvertor noticeConvertor; + private final NoticeAdapter noticeAdapter; + + public PageResponse> getNoticeList(int page, int size) { + Page notices = noticeAdapter.getNoticeList(page, size); + return new PageResponse<>(notices.isLast(), notices.getTotalElements(), noticeConvertor.NoticeList(notices.getContent())); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java new file mode 100644 index 00000000..54ec6649 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java @@ -0,0 +1,20 @@ +package com.example.matchdomain.notice.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchdomain.notice.entity.Notice; +import com.example.matchdomain.notice.repository.NoticeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +@Adaptor +@RequiredArgsConstructor +public class NoticeAdapter { + private final NoticeRepository noticeRepository; + + public Page getNoticeList(int page, int size) { + Pageable pageable = PageRequest.of(page, size); + return noticeRepository.findAllByOrderByCreatedAtDesc(pageable); + } +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeContentRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeContentRepository.java new file mode 100644 index 00000000..350aab02 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeContentRepository.java @@ -0,0 +1,8 @@ +package com.example.matchdomain.notice.repository; + +import com.example.matchdomain.notice.entity.NoticeContent; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NoticeContentRepository extends JpaRepository { + +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeRepository.java new file mode 100644 index 00000000..ff277b70 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/repository/NoticeRepository.java @@ -0,0 +1,10 @@ +package com.example.matchdomain.notice.repository; + +import com.example.matchdomain.notice.entity.Notice; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NoticeRepository extends JpaRepository { + Page findAllByOrderByCreatedAtDesc(Pageable pageable); +} From 26f533b2b1654fdef5ea010b93f2b26e4fb9dac6 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:55:16 +0900 Subject: [PATCH 44/82] =?UTF-8?q?:recycle:=20:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/matchapi/user/convertor/UserConvertor.java | 3 ++- .../src/main/java/com/example/matchapi/user/dto/UserRes.java | 2 ++ .../java/com/example/matchapi/user/service/UserService.java | 4 ++-- .../main/java/com/example/matchdomain/user/entity/User.java | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index e27efb59..ee9595cb 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -200,9 +200,10 @@ public UserRes.Profile UserProfile(User user) { return UserRes.Profile .builder() .profileImgUrl(user.getProfileImgUrl()) - .name(user.getNickname()) + .name(user.getName()) .socialType(user.getSocialType()) .email(user.getEmail()) + .nickName(user.getNickname()) .phone(user.getPhoneNumber()) .build(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java index 7fb61786..bf5be996 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java @@ -191,6 +191,8 @@ public static class Profile { private String name; + private String nickName; + private SocialType socialType; private String email;; diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java index 04789cc9..a8737115 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java @@ -145,8 +145,8 @@ public void modifyUserProfile(User user, UserReq.ModifyProfile modifyProfile) { user.setProfileImgUrl(newProfileImg); } else if(modifyProfile.getMultipartFile() == null && modifyProfile.getName()!=null){ - System.out.println("์œ ์ € ์ด๋ฆ„ ํŽธ์ง‘"); - user.setName(modifyProfile.getName()); + System.out.println("์œ ์ € ๋‹‰๋„ค์ž„ ํŽธ์ง‘"); + user.setNickname(modifyProfile.getName()); } else if (modifyProfile.getMultipartFile() != null){ String beforeProfileImg = user.getProfileImgUrl(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java index fb791d6c..976d7957 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java @@ -148,6 +148,6 @@ public boolean isActivated() { public void setModifyProfile(String newProfileImg, String name) { this.profileImgUrl = newProfileImg; - this.name = name; + this.nickname = name; } } From a8925a4a7399e69c7b11ee41fe27f0bef4e6d3cb Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:14:57 +0900 Subject: [PATCH 45/82] =?UTF-8?q?:zap:=20:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/controller/NoticeController.java | 15 +++++-- .../notice/convertor/NoticeConvertor.java | 26 ++++++++++++ .../matchapi/notice/dto/NoticeRes.java | 27 +++++++++++++ .../notice/service/NoticeService.java | 5 +++ .../notice/adaptor/NoticeAdapter.java | 7 ++++ .../notice/exception/GetNoticeErrorCode.java | 40 +++++++++++++++++++ 6 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notice/exception/GetNoticeErrorCode.java diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java index 17c15e86..d8d1cf52 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java @@ -3,18 +3,18 @@ import com.example.matchapi.notice.dto.NoticeRes; import com.example.matchapi.notice.service.NoticeService; import com.example.matchapi.notification.dto.NotificationRes; +import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.notice.exception.GetNoticeErrorCode; import com.example.matchdomain.user.entity.User; +import com.example.matchdomain.user.exception.UserAuthErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -33,4 +33,11 @@ public CommonResponse>> getNotificationL ){ return CommonResponse.onSuccess(noticeService.getNoticeList(page, size)); } + + @Operation(summary = "11-02 ๊ณต์ง€์‚ฌํ•ญ ์ƒ์„ธ ์กฐํšŒ") + @GetMapping("/{noticeId}") + @ApiErrorCodeExample({GetNoticeErrorCode.class, UserAuthErrorCode.class}) + public CommonResponse getNoticeDetail(@PathVariable Long noticeId){ + return CommonResponse.onSuccess(noticeService.getNoticeDetail(noticeId)); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java index 3d2bf663..9de4bdf4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java @@ -4,6 +4,7 @@ import com.example.matchapi.notice.dto.NoticeRes; import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.notice.entity.Notice; +import com.example.matchdomain.notice.entity.NoticeContent; import lombok.RequiredArgsConstructor; import java.util.ArrayList; @@ -34,4 +35,29 @@ private NoticeRes.NoticeList NoticeListDetail(Notice result) { .noticeDate(timeHelper.matchTimeFormat(result.getCreatedAt())) .build(); } + + public NoticeRes.NoticeDetail NoticeDetail(Notice notice) { + NoticeRes.NoticeList noticeInfo = NoticeListDetail(notice); + List noticeContents = new ArrayList<>(); + + notice.getNoticeContents().forEach( + result -> noticeContents.add( + NoticeContentsDetail(result) + ) + ); + return NoticeRes.NoticeDetail + .builder() + .noticeInfo(noticeInfo) + .noticeContents(noticeContents) + .build(); + } + + private NoticeRes.NoticeContents NoticeContentsDetail(NoticeContent result) { + return NoticeRes.NoticeContents + .builder() + .contentId(result.getId()) + .contentsType(result.getContentsType()) + .contents(result.getContents()) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java index c7805f87..d295367d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java @@ -1,7 +1,10 @@ package com.example.matchapi.notice.dto; +import com.example.matchdomain.common.model.ContentsType; import lombok.*; +import java.util.List; + public class NoticeRes { @Getter @Setter @@ -17,4 +20,28 @@ public static class NoticeList { private String noticeDate; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NoticeDetail { + private NoticeList noticeInfo; + + private List noticeContents; + } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NoticeContents{ + private Long contentId; + + private ContentsType contentsType; + + private String contents; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java index 6224908b..104253ab 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java @@ -21,4 +21,9 @@ public PageResponse> getNoticeList(int page, int size Page notices = noticeAdapter.getNoticeList(page, size); return new PageResponse<>(notices.isLast(), notices.getTotalElements(), noticeConvertor.NoticeList(notices.getContent())); } + + public NoticeRes.NoticeDetail getNoticeDetail(Long noticeId) { + Notice notice = noticeAdapter.findNoticeDetail(noticeId); + return noticeConvertor.NoticeDetail(notice); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java index 54ec6649..c43b61c6 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/adaptor/NoticeAdapter.java @@ -1,6 +1,7 @@ package com.example.matchdomain.notice.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; import com.example.matchdomain.notice.entity.Notice; import com.example.matchdomain.notice.repository.NoticeRepository; import lombok.RequiredArgsConstructor; @@ -8,6 +9,8 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import static com.example.matchdomain.notice.exception.GetNoticeErrorCode.NOT_EXIST_NOTICE; + @Adaptor @RequiredArgsConstructor public class NoticeAdapter { @@ -17,4 +20,8 @@ public Page getNoticeList(int page, int size) { Pageable pageable = PageRequest.of(page, size); return noticeRepository.findAllByOrderByCreatedAtDesc(pageable); } + + public Notice findNoticeDetail(Long noticeId) { + return noticeRepository.findById(noticeId).orElseThrow(() -> new BadRequestException(NOT_EXIST_NOTICE)); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/exception/GetNoticeErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/exception/GetNoticeErrorCode.java new file mode 100644 index 00000000..aa6432a9 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/exception/GetNoticeErrorCode.java @@ -0,0 +1,40 @@ +package com.example.matchdomain.notice.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.Objects; + +@Getter +@AllArgsConstructor +public enum GetNoticeErrorCode implements BaseErrorCode { + + @ExplainError("ํ•ด๋‹น ๊ณต์ง€์‚ฌํ•ญ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") + NOT_EXIST_NOTICE(HttpStatus.BAD_REQUEST,false,"NOTICE_001","ํ•ด๋‹น ๊ณต์ง€์‚ฌํ•ญ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.."); + + private final HttpStatus httpStatus; + private final boolean isSuccess; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().message(message).code(code).isSuccess(false).build(); + } + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} From 230f903b99f73153e19653d6219866da33cedf18 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:15:27 +0900 Subject: [PATCH 46/82] =?UTF-8?q?:recycle:=20:=20Content=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=99=94=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=EB=B3=80=EA=B2=BD=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/model/ContentsEntity.java | 19 +++++++++++++++++++ .../event/entity/EventContent.java | 7 ++----- .../notice/entity/NoticeContent.java | 5 +++-- 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java diff --git a/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java new file mode 100644 index 00000000..b350ba3c --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java @@ -0,0 +1,19 @@ +package com.example.matchdomain.common.model; + +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class ContentsEntity extends BaseEntity{ + @Enumerated(EnumType.STRING) + private ContentsType contentsType; + + private String contents; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java index d3dfe4e5..216c5679 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java @@ -1,6 +1,7 @@ package com.example.matchdomain.event.entity; import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.common.model.ContentsEntity; import com.example.matchdomain.common.model.ContentsType; import lombok.*; import org.hibernate.annotations.BatchSize; @@ -19,15 +20,12 @@ @DynamicUpdate @BatchSize(size = 100) @DynamicInsert -public class EventContent extends BaseEntity { +public class EventContent extends ContentsEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Enumerated(EnumType.STRING) - private ContentsType contentsType; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "eventId",nullable = false, insertable=false, updatable=false) private Event event; @@ -35,5 +33,4 @@ public class EventContent extends BaseEntity { @Column(name="eventId") private Long eventId; - private String contents; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java index 552e9cb0..d227c44e 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java @@ -1,6 +1,7 @@ package com.example.matchdomain.notice.entity; import com.example.matchdomain.common.model.BaseEntity; +import com.example.matchdomain.common.model.ContentsEntity; import com.example.matchdomain.common.model.ContentsType; import com.example.matchdomain.event.entity.Event; import lombok.*; @@ -18,9 +19,9 @@ @AllArgsConstructor @NoArgsConstructor @DynamicUpdate -@BatchSize(size = 100) +@BatchSize(size = 10) @DynamicInsert -public class NoticeContent extends BaseEntity { +public class NoticeContent extends ContentsEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) From 17858bb827e358353e162ef957f2c1b1c3db8cae Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:16:27 +0900 Subject: [PATCH 47/82] =?UTF-8?q?:recycle:=20:=20NoticeContent=20Batch=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=B6=94=EA=B0=80=20(#106)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/matchdomain/notice/entity/Notice.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java index 2734d5bc..93e69d0e 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/Notice.java @@ -29,6 +29,7 @@ public class Notice extends BaseEntity { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "noticeId") + @BatchSize(size = 20) private List noticeContents = new ArrayList<>(); @Enumerated(EnumType.STRING) From b5aa236286e24ce5886f4194efa3ce3becf93412 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:32:21 +0900 Subject: [PATCH 48/82] =?UTF-8?q?:zap:=20:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/controller/EventController.java | 16 +++++-- .../event/convetor/EventConvertor.java | 42 ++++++++++++++++++- .../example/matchapi/event/dto/EventRes.java | 42 +++++++++++++++++++ .../matchapi/event/service/EventService.java | 5 +++ .../event/adaptor/EventAdaptor.java | 7 ++++ .../matchdomain/event/entity/Event.java | 3 +- .../event/exception/GetEventErrorCode.java | 40 ++++++++++++++++++ 7 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/event/exception/GetEventErrorCode.java diff --git a/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java index 6eaf5a67..e3c8aaa7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java @@ -2,17 +2,17 @@ import com.example.matchapi.event.dto.EventRes; import com.example.matchapi.event.service.EventService; +import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.event.exception.GetEventErrorCode; +import com.example.matchdomain.user.exception.UserAuthErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -25,6 +25,7 @@ public class EventController { @GetMapping("") @Operation(summary = "12-01 ์ด๋ฒคํŠธ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") + @ApiErrorCodeExample(UserAuthErrorCode.class) public CommonResponse>> getEventLists( @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size @@ -32,4 +33,11 @@ public CommonResponse>> getEventLists( return CommonResponse.onSuccess(eventService.getEventList(page, size)); } + @GetMapping("/{eventId}") + @Operation(summary = "12-02 ์ด๋ฒคํŠธ ์ƒ์„ธ ์กฐํšŒ") + @ApiErrorCodeExample({GetEventErrorCode.class, UserAuthErrorCode.class}) + public CommonResponse getEventDetail(@PathVariable Long eventId){ + return CommonResponse.onSuccess(eventService.getEventDetail(eventId)); + } + } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java index 057066b8..8a33bf92 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java @@ -2,8 +2,10 @@ import com.example.matchapi.common.util.TimeHelper; import com.example.matchapi.event.dto.EventRes; +import com.example.matchapi.notice.dto.NoticeRes; import com.example.matchcommon.annotation.Convertor; import com.example.matchdomain.event.entity.Event; +import com.example.matchdomain.event.entity.EventContent; import lombok.RequiredArgsConstructor; import java.util.ArrayList; @@ -18,21 +20,57 @@ public List EventList(List content) { content.forEach( result -> { - eventLists.add(EventDetail(result)); + eventLists.add(EventListDetail(result)); } ); return eventLists; } - private EventRes.EventList EventDetail(Event result) { + private EventRes.EventList EventListDetail(Event result) { return EventRes.EventList .builder() .eventId(result.getId()) .title(result.getTitle()) + .thumbnail(result.getThumbnail()) .smallTitle(result.getSmallTitle()) .eventStatus(timeHelper.checkFinishStatus(result.getEventEndDate())) .startDate(result.getEventStartDate()) .endDate(result.getEventEndDate()) .build(); } + + public EventRes.EventDetail EventDetail(Event event) { + EventRes.EventInfo eventInfo = EventInfo(event); + List eventContents = new ArrayList<>(); + + event.getEventContents().forEach( + result -> eventContents.add(EventContents(result)) + ); + + return EventRes.EventDetail + .builder() + .eventInfo(eventInfo) + .eventContents(eventContents) + .build(); + } + + private EventRes.EventContents EventContents(EventContent result) { + return EventRes.EventContents + .builder() + .contentId(result.getId()) + .contentsType(result.getContentsType()) + .contents(result.getContents()) + .build(); + } + + private EventRes.EventInfo EventInfo(Event event) { + return EventRes.EventInfo + .builder() + .eventId(event.getId()) + .title(event.getTitle()) + .smallTitle(event.getSmallTitle()) + .startDate(event.getEventStartDate()) + .endDate(event.getEventEndDate()) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java index 7c845657..53c0109c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java @@ -1,8 +1,10 @@ package com.example.matchapi.event.dto; +import com.example.matchdomain.common.model.ContentsType; import lombok.*; import java.time.LocalDate; +import java.util.List; public class EventRes { @Getter @@ -13,6 +15,8 @@ public class EventRes { public static class EventList { private Long eventId; + private String thumbnail; + private String title; private String smallTitle; @@ -23,4 +27,42 @@ public static class EventList { private LocalDate endDate; } + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class EventDetail { + private EventInfo eventInfo; + + private List eventContents; + } + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class EventInfo{ + private Long eventId; + + private String title; + + private String smallTitle; + + private LocalDate startDate; + + private LocalDate endDate; + } + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class EventContents{ + private Long contentId; + + private ContentsType contentsType; + + private String contents; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java index 61f02df1..03104b2c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java @@ -21,4 +21,9 @@ public PageResponse> getEventList(int page, int size) { Page events = eventAdaptor.findEvent(page, size); return new PageResponse<>(events.isLast(), events.getTotalElements(), eventConvertor.EventList(events.getContent())); } + + public EventRes.EventDetail getEventDetail(Long eventId) { + Event event = eventAdaptor.findByEvent(eventId); + return eventConvertor.EventDetail(event); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java index 537f3318..42b54cff 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/adaptor/EventAdaptor.java @@ -1,6 +1,7 @@ package com.example.matchdomain.event.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; import com.example.matchdomain.event.entity.Event; import com.example.matchdomain.event.repository.EventRepository; import lombok.RequiredArgsConstructor; @@ -8,6 +9,8 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import static com.example.matchdomain.event.exception.GetEventErrorCode.NOT_EXIST_EVENT; + @Adaptor @RequiredArgsConstructor public class EventAdaptor { @@ -17,4 +20,8 @@ public Page findEvent(int page, int size) { Pageable pageable = PageRequest.of(page, size); return eventRepository.findAllByOrderByCreatedAtDesc(pageable); } + + public Event findByEvent(Long eventId) { + return eventRepository.findById(eventId).orElseThrow(() -> new BadRequestException(NOT_EXIST_EVENT)); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java index 90f64013..0956cb47 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java @@ -20,7 +20,7 @@ @AllArgsConstructor @NoArgsConstructor @DynamicUpdate -@BatchSize(size = 100) +@BatchSize(size = 20) @DynamicInsert public class Event extends BaseEntity { @Id @@ -30,6 +30,7 @@ public class Event extends BaseEntity { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "eventId") + @BatchSize(size = 20) private List eventContents = new ArrayList<>(); @Enumerated(EnumType.STRING) diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/exception/GetEventErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/event/exception/GetEventErrorCode.java new file mode 100644 index 00000000..8df18e23 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/exception/GetEventErrorCode.java @@ -0,0 +1,40 @@ +package com.example.matchdomain.event.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.Objects; + +@Getter +@AllArgsConstructor +public enum GetEventErrorCode implements BaseErrorCode { + + @ExplainError("ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") + NOT_EXIST_EVENT(HttpStatus.BAD_REQUEST,false,"EVENT_001","ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.."); + + private final HttpStatus httpStatus; + private final boolean isSuccess; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().message(message).code(code).isSuccess(false).build(); + } + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} From 5a55abaa0e6a2f9e9b422b952cc5f96d448ebc8a Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 14:32:13 +0900 Subject: [PATCH 49/82] =?UTF-8?q?:zap:=20:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EC=84=A4=EC=A0=95=20API=20&=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/model/AlarmType.java | 5 +++ .../user/controller/UserController.java | 15 ++++++++ .../user/convertor/UserConvertor.java | 17 ++++++++++ .../example/matchapi/user/dto/UserRes.java | 12 +++++++ .../matchapi/user/service/UserService.java | 34 +++++++++++++++++++ .../example/matchdomain/user/entity/User.java | 5 ++- 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/model/AlarmType.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/model/AlarmType.java b/Match-Api/src/main/java/com/example/matchapi/common/model/AlarmType.java new file mode 100644 index 00000000..db363b5b --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/model/AlarmType.java @@ -0,0 +1,5 @@ +package com.example.matchapi.common.model; + +public enum AlarmType { + SERVICE,EVENT +} diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java index 73c73f03..6c23750b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java @@ -1,5 +1,6 @@ package com.example.matchapi.user.controller; +import com.example.matchapi.common.model.AlarmType; import com.example.matchapi.common.security.JwtService; import com.example.matchapi.user.dto.UserRes; import com.example.matchapi.user.dto.UserReq; @@ -163,6 +164,20 @@ public CommonResponse modifyEmail( return CommonResponse.onSuccess("๋ณ€๊ฒฝ ์„ฑ๊ณต"); } + @Operation(summary = "02-09 ์•Œ๋žŒ ๋™์˜ ํ•ญ๋ชฉ ์กฐํšŒ ๐Ÿ‘ค",description = "์•Œ๋žŒ ๋™์˜ ํ•ญ๋ชฉ ์กฐํšŒ ์ž…๋‹ˆ๋‹ค ACTIVE ํ•„๋“œ์™€ INACTIVE ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.") + @GetMapping("/alarm") + @ApiErrorCodeExample({UserAuthErrorCode.class}) + public CommonResponse getAlarmAgreeList(@AuthenticationPrincipal User user){ + return CommonResponse.onSuccess(userService.getAlarmAgreeList(user)); + } + + @Operation(summary = "02-10 ์•Œ๋žŒ ๋™์˜ ํ•ญ๋ชฉ ์ˆ˜์ • ๐Ÿ‘ค" , description = "์•Œ๋žŒ ๋™์˜ ํ•ญ๋ชฉ ์ˆ˜์ •") + @PatchMapping("/alarm") + @ApiErrorCodeExample({UserAuthErrorCode.class}) + public CommonResponse patchAlarmAgree(@AuthenticationPrincipal User user, + @RequestParam AlarmType alarmType){ + return CommonResponse.onSuccess(userService.patchAlarm(user, alarmType)); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index ee9595cb..283a6197 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -25,6 +25,7 @@ import java.util.List; import static com.example.matchcommon.constants.MatchStatic.BASE_PROFILE; +import static com.example.matchdomain.user.entity.enums.Alarm.ACTIVE; @Convertor @RequiredArgsConstructor @@ -52,6 +53,8 @@ public User KakaoSignUpUser(KakaoUserInfoDto kakaoUserInfoDto, SocialType authTy .gender(authHelper.genderConversion(kakaoUserInfoDto.getGender())) .role(AuthorityEnum.ROLE_USER.getValue()) .nickname(userHelper.createRandomNickName()) + .serviceAlarm(ACTIVE) + .eventAlarm(ACTIVE) .build(); } @@ -79,6 +82,8 @@ public User NaverSignUpUser(NaverUserInfoDto naverUserInfoDto, SocialType authTy .gender(authHelper.genderConversion(naverUserInfoDto.getGender())) .role(AuthorityEnum.ROLE_USER.getValue()) .nickname(userHelper.createRandomNickName()) + .serviceAlarm(ACTIVE) + .eventAlarm(ACTIVE) .build(); } @@ -95,6 +100,8 @@ public User SignUpUser(UserReq.SignUpUser signUpUser, Authority authority) { .gender(signUpUser.getGender()) .role(AuthorityEnum.ROLE_USER.getValue()) .nickname(userHelper.createRandomNickName()) + .serviceAlarm(ACTIVE) + .eventAlarm(ACTIVE) .build(); } @@ -230,6 +237,16 @@ public User AppleUserSignUp(AppleUserRes appleUserRes) { .socialType(SocialType.APPLE) .role(AuthorityEnum.ROLE_USER.getValue()) .nickname(userHelper.createRandomNickName()) + .serviceAlarm(ACTIVE) + .eventAlarm(ACTIVE) + .build(); + } + + public UserRes.AlarmAgreeList AlarmAgree(User user) { + return UserRes.AlarmAgreeList + .builder() + .serviceAlarm(user.getServiceAlarm()) + .eventAlarm(user.getEventAlarm()) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java index bf5be996..b2a88dd8 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java @@ -1,5 +1,6 @@ package com.example.matchapi.user.dto; +import com.example.matchdomain.user.entity.enums.Alarm; import com.example.matchdomain.user.entity.enums.SocialType; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -199,4 +200,15 @@ public static class Profile { private String phone; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class AlarmAgreeList { + private Alarm serviceAlarm; + + private Alarm eventAlarm; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java index a8737115..a9d5d45e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java @@ -1,5 +1,6 @@ package com.example.matchapi.user.service; +import com.example.matchapi.common.model.AlarmType; import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.service.OrderService; import com.example.matchapi.project.convertor.ProjectConvertor; @@ -16,6 +17,7 @@ import com.example.matchdomain.project.repository.ProjectUserAttentionRepository; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.entity.UserAddress; +import com.example.matchdomain.user.entity.enums.Alarm; import com.example.matchdomain.user.entity.pk.UserFcmPk; import com.example.matchdomain.user.exception.ModifyEmailCode; import com.example.matchdomain.user.repository.UserAddressRepository; @@ -36,7 +38,10 @@ import java.util.List; import java.util.Optional; +import static com.example.matchapi.common.model.AlarmType.EVENT; import static com.example.matchcommon.constants.MatchStatic.*; +import static com.example.matchdomain.user.entity.enums.Alarm.ACTIVE; +import static com.example.matchdomain.user.entity.enums.Alarm.INACTIVE; import static com.example.matchdomain.user.exception.ModifyEmailCode.NOT_CORRECT_EMAIL; import static com.example.matchdomain.user.exception.ModifyPhoneErrorCode.NOT_CORRECT_PHONE; import static com.example.matchdomain.user.exception.UserNormalSignUpErrorCode.USERS_EXISTS_PHONE; @@ -184,4 +189,33 @@ public void modifyEmail(User user, UserReq.ModifyEmail email) { user.setEmail(email.getNewEmail()); userRepository.save(user); } + + public UserRes.AlarmAgreeList getAlarmAgreeList(User user) { + System.out.println(user.getName()); + return userConvertor.AlarmAgree(user); + } + + public UserRes.AlarmAgreeList patchAlarm(User user, AlarmType alarmType) { + if(alarmType.equals(EVENT)){ + Alarm alarm = user.getEventAlarm(); + if(alarm == ACTIVE){ + user.setEventAlarm(INACTIVE); + } + else{ + user.setEventAlarm(ACTIVE); + } + }else{ + Alarm alarm = user.getServiceAlarm(); + if(alarm == ACTIVE){ + user.setServiceAlarm(INACTIVE); + } + else{ + user.setServiceAlarm(ACTIVE); + } + } + + user = userRepository.save(user); + + return userConvertor.AlarmAgree(user); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java index 976d7957..b0b68fa8 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/entity/User.java @@ -88,15 +88,14 @@ public class User extends BaseEntity implements UserDetails { @Column(name = "logInAt") private LocalDateTime logInAt; - @Column(name = "role") private String role; @Enumerated(EnumType.STRING) - private Alarm serviceAlarm = Alarm.INACTIVE; + private Alarm serviceAlarm = Alarm.ACTIVE; @Enumerated(EnumType.STRING) - private Alarm eventAlarm = Alarm.INACTIVE; + private Alarm eventAlarm = Alarm.ACTIVE; @Override public Collection getAuthorities() { From 975e9082faaa82b11ceca016e56f573dabeab95c Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 14:32:42 +0900 Subject: [PATCH 50/82] =?UTF-8?q?:green=5Fheart:=20:=20PROD=20CI/CD=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=88=98=EC=A0=95=20(#1?= =?UTF-8?q?04)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/prod_api_ci_cd.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/prod_api_ci_cd.yml b/.github/workflows/prod_api_ci_cd.yml index fbb5075c..466dbf34 100644 --- a/.github/workflows/prod_api_ci_cd.yml +++ b/.github/workflows/prod_api_ci_cd.yml @@ -53,8 +53,6 @@ jobs: discord.webhook.error: ${{ secrets.DISCORD_WEBHOOK_ERROR}} discord.webhook.alert: ${{ secrets.DISCORD_WEBHOOK_ALERT }} web.return.url: ${{ secrets.PROD_RETURN_URL }} - aligo.username: ${{ secrets.ALIGO_USERNAME }} - aligo.key: ${{ secrets.ALIGO_KEY }} match.aligo.url: ${ secrets.MATCH_ALIGO_URL }} server.host: ${{ secrets.PROD_SERVER_HOST}} spring.password: ${{ secrets.APP_PASSWORD}} From 516f2029cf911400d0f5a43ad29fea4de2f7f6cf Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:34:33 +0900 Subject: [PATCH 51/82] =?UTF-8?q?:zap:=20:=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84=20(#1?= =?UTF-8?q?04)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NotificationController.java | 16 +++++--- .../convertor/NotificationConvertor.java | 11 +++++ .../notification/dto/NotificationRes.java | 20 +++++++++- .../service/NotificationService.java | 10 ++++- .../adaptor/NotificationAdaptor.java | 12 ++++++ .../exception/GetNotificationErrorCode.java | 40 +++++++++++++++++++ 6 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/notification/exception/GetNotificationErrorCode.java diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java index d434191e..a5109e6b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java @@ -5,6 +5,7 @@ import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.reponse.PageResponse; +import com.example.matchdomain.notification.exception.GetNotificationErrorCode; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.exception.UserAuthErrorCode; import io.swagger.v3.oas.annotations.Operation; @@ -12,10 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -28,11 +26,19 @@ public class NotificationController { @ApiErrorCodeExample(UserAuthErrorCode.class) @Operation(summary = "10-01 ์•Œ๋ฆผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ") @GetMapping("") - public CommonResponse> getNotificationList( + public CommonResponse> getNotificationList( @AuthenticationPrincipal User user, @Parameter(description = "ํŽ˜์ด์ง€", example = "0") @RequestParam(required = false, defaultValue = "0") int page, @Parameter(description = "ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ", example = "10") @RequestParam(required = false, defaultValue = "10") int size ){ return CommonResponse.onSuccess(notificationService.getNotificationList(user, page, size)); } + + @ApiErrorCodeExample({UserAuthErrorCode.class, GetNotificationErrorCode.class}) + @Operation(summary = "10-02 ์•Œ๋ฆผ ์ƒ์„ธ ์กฐํšŒ") + @GetMapping("/{notificationId}") + public CommonResponse getNotificationDetail(@PathVariable Long notificationId){ + return CommonResponse.onSuccess(notificationService.getNotificationDetail(notificationId)); + } + } diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java index 9831b09d..ce8d5bc6 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java @@ -51,4 +51,15 @@ public Notification NotificationTest(User user, FCMNotificationRequestDto fcmNot .title(fcmNotificationRequestDto.getTitle()) .build(); } + + public NotificationRes.NotificationDetail convertNotificationDetail(Notification notification) { + return NotificationRes.NotificationDetail + .builder() + .notificationId(notification.getId()) + .notificationType(notification.getNotificationType().getType()) + .title(notification.getTitle()) + .body(notification.getBody()) + .notificationDate(timeHelper.matchTimeFormat(notification.getCreatedAt())) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java b/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java index 03223ec6..14eae15f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/dto/NotificationRes.java @@ -11,7 +11,7 @@ public class NotificationRes { @Builder @AllArgsConstructor @NoArgsConstructor - public static class NotificationDetail { + public static class NotificationListInfo { private int unReadCount; private List notificationLists; @@ -33,4 +33,22 @@ public static class NotificationList{ private boolean isRead; } + + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NotificationDetail { + private Long notificationId; + + private String notificationType; + + private String title; + + private String body; + + private String notificationDate; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java index 4adba18b..79630f24 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java @@ -19,10 +19,10 @@ public class NotificationService { private final NotificationAdaptor notificationAdaptor; private final NotificationConvertor notificationConvertor; - public PageResponse getNotificationList(User user, int page, int size) { + public PageResponse getNotificationList(User user, int page, int size) { Page notifications = notificationAdaptor.findByUser(user, page, size); int notificationCount = notificationAdaptor.countByUnRead(user); - return new PageResponse<>(notifications.isLast(), notifications.getTotalElements(), new NotificationRes.NotificationDetail(notificationCount, notificationConvertor.NotificationList(notifications.getContent()))); + return new PageResponse<>(notifications.isLast(), notifications.getTotalElements(), new NotificationRes.NotificationListInfo(notificationCount, notificationConvertor.NotificationList(notifications.getContent()))); } public void saveTestNotification(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { @@ -30,4 +30,10 @@ public void saveTestNotification(User user, FCMNotificationRequestDto fcmNotific notificationAdaptor.saveNotification(notification); } + + public NotificationRes.NotificationDetail getNotificationDetail(Long notificationId) { + Notification notification = notificationAdaptor.findNotification(notificationId); + notificationAdaptor.readNotification(notification); + return notificationConvertor.convertNotificationDetail(notification); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java index 25226f29..c614a019 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/adaptor/NotificationAdaptor.java @@ -1,6 +1,7 @@ package com.example.matchdomain.notification.adaptor; import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.BadRequestException; import com.example.matchdomain.notification.entity.Notification; import com.example.matchdomain.notification.repository.NotificationRepository; import com.example.matchdomain.user.entity.User; @@ -9,6 +10,8 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import static com.example.matchdomain.notification.exception.GetNotificationErrorCode.NOT_EXITS_NOTIFICATION; + @Adaptor @RequiredArgsConstructor public class NotificationAdaptor { @@ -27,4 +30,13 @@ public int countByUnRead(User user) { public void saveNotification(Notification notification) { notificationRepository.save(notification); } + + public Notification findNotification(Long notificationId) { + return notificationRepository.findById(notificationId).orElseThrow(() -> new BadRequestException(NOT_EXITS_NOTIFICATION)); + } + + public void readNotification(Notification notification) { + notification.setRead(true); + notificationRepository.save(notification); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notification/exception/GetNotificationErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/notification/exception/GetNotificationErrorCode.java new file mode 100644 index 00000000..09db4965 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/notification/exception/GetNotificationErrorCode.java @@ -0,0 +1,40 @@ +package com.example.matchdomain.notification.exception; + +import com.example.matchcommon.annotation.ExplainError; +import com.example.matchcommon.dto.ErrorReason; +import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import java.lang.reflect.Field; +import java.util.Objects; + +@Getter +@AllArgsConstructor +public enum GetNotificationErrorCode implements BaseErrorCode { + + @ExplainError("ํ•ด๋‹น ์•Œ๋ฆผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") + NOT_EXITS_NOTIFICATION(HttpStatus.BAD_REQUEST,false,"NOTIFICATION_001","ํ•ด๋‹น ์•Œ๋ฆผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.."); + + private final HttpStatus httpStatus; + private final boolean isSuccess; + private final String code; + private final String message; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().message(message).code(code).isSuccess(false).build(); + } + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getMessage(); + } + + @Override + public ErrorReason getErrorReasonHttpStatus(){ + return ErrorReason.builder().message(message).code(code).isSuccess(false).httpStatus(httpStatus).build(); + } +} From b3267634deff770efa922e22b0d80803e0f1c213 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:00:02 +0900 Subject: [PATCH 52/82] =?UTF-8?q?:zap:=20:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminEventController.java | 32 +++++++++++ .../admin/event/dto/EventUploadReq.java | 46 +++++++++++++++ .../event/service/AdminEventService.java | 57 +++++++++++++++++++ .../controller/AdminNoticeController.java | 11 ++++ .../notice/service/AdminNoticeService.java | 9 +++ .../event/convetor/EventConvertor.java | 24 +++++++- .../example/matchapi/event/dto/EventRes.java | 6 ++ .../matchcommon/constants/MatchStatic.java | 5 ++ .../common/model/ContentsEntity.java | 19 ++++++- .../matchdomain/event/entity/Event.java | 3 + .../event/entity/EventContent.java | 8 +-- .../config/s3/S3UploadService.java | 46 +++++++++++++-- 12 files changed, 255 insertions(+), 11 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java new file mode 100644 index 00000000..619df192 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java @@ -0,0 +1,32 @@ +package com.example.matchapi.admin.event.controller; + +import com.example.matchapi.admin.event.dto.EventUploadReq; +import com.example.matchapi.admin.event.service.AdminEventService; +import com.example.matchapi.event.dto.EventRes; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchinfrastructure.config.s3.S3UploadService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/events") +public class AdminEventController { + private final AdminEventService adminEventService; + + @PostMapping("") + public CommonResponse> uploadEventList(@RequestBody EventUploadReq eventUploadReq){ + return CommonResponse.onSuccess(adminEventService.uploadEventList(eventUploadReq)); + } + + @PostMapping(value = "/img", + consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public CommonResponse imgUpload(@ModelAttribute MultipartFile imgFile){ + String url = adminEventService.uploadEventImg(imgFile); + return CommonResponse.onSuccess(url); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java new file mode 100644 index 00000000..dc9744cd --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java @@ -0,0 +1,46 @@ +package com.example.matchapi.admin.event.dto; + +import com.example.matchdomain.common.model.ContentsType; +import com.example.matchdomain.event.enums.EventType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDate; +import java.util.List; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EventUploadReq { + private String title; + + private String smallTitle; + + private String thumbnail; + + private EventType eventType; + + private List contentsList; + + private LocalDate eventStartDate; + + private LocalDate eventEndDate; + + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class ContentsList{ + @NotBlank(message = "Contents ํƒ€์ž…์„ ์ž…๋ ฅํ•ด์ฃผ์ƒˆ์š”") + private ContentsType contentsType; + + @Schema(description = "์ด๋ฏธ์ง€ url or Text", required = false) + private String contents; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java new file mode 100644 index 00000000..659d9772 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java @@ -0,0 +1,57 @@ +package com.example.matchapi.admin.event.service; + +import com.example.matchapi.admin.event.dto.EventUploadReq; +import com.example.matchapi.event.convetor.EventConvertor; +import com.example.matchapi.event.dto.EventRes; +import com.example.matchapi.event.service.EventService; +import com.example.matchcommon.annotation.RedissonLock; +import com.example.matchdomain.common.model.ContentsType; +import com.example.matchdomain.event.entity.Event; +import com.example.matchdomain.event.entity.EventContent; +import com.example.matchdomain.event.repository.EventContentRepository; +import com.example.matchdomain.event.repository.EventRepository; +import com.example.matchinfrastructure.config.s3.S3UploadService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; + +import static com.example.matchcommon.constants.MatchStatic.EVENT_S3_DIR; +import static com.example.matchdomain.common.model.ContentsType.IMG; +import static com.example.matchdomain.common.model.ContentsType.TEXT; + +@Service +@RequiredArgsConstructor +public class AdminEventService { + private final S3UploadService s3UploadService; + private final EventRepository eventRepository; + private final EventContentRepository eventContentRepository; + private final EventConvertor eventConvertor; + @RedissonLock(LockName = "์ด๋ฒคํŠธ ์—…๋กœ๋“œ", key = "#eventUploadReq") + public List uploadEventList(EventUploadReq eventUploadReq) { + + Event event = eventRepository.save(eventConvertor.convertToEventUpload(eventUploadReq, eventUploadReq.getThumbnail())); + + Long eventId = event.getId(); + + List eventContents = new ArrayList<>(); + for(EventUploadReq.ContentsList content : eventUploadReq.getContentsList()){ + if(content.getContentsType().equals(IMG)){ + eventContents.add(eventConvertor.convertToEventContents(eventId, content.getContents(), IMG)); + } + else{ + eventContents.add(eventConvertor.convertToEventContents(eventId, content.getContents(), TEXT)); + } + } + + eventContentRepository.saveAll(eventContents); + + return null; + } + + public String uploadEventImg(MultipartFile imgFile) { + return s3UploadService.uploadOneImg(EVENT_S3_DIR, imgFile); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java new file mode 100644 index 00000000..e23fb295 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java @@ -0,0 +1,11 @@ +package com.example.matchapi.admin.notice.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/notices") +public class AdminNoticeController { +} diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java new file mode 100644 index 00000000..b64255d6 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java @@ -0,0 +1,9 @@ +package com.example.matchapi.admin.notice.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AdminNoticeService { +} diff --git a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java index 8a33bf92..169f007a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java @@ -1,9 +1,10 @@ package com.example.matchapi.event.convetor; +import com.example.matchapi.admin.event.dto.EventUploadReq; import com.example.matchapi.common.util.TimeHelper; import com.example.matchapi.event.dto.EventRes; -import com.example.matchapi.notice.dto.NoticeRes; import com.example.matchcommon.annotation.Convertor; +import com.example.matchdomain.common.model.ContentsType; import com.example.matchdomain.event.entity.Event; import com.example.matchdomain.event.entity.EventContent; import lombok.RequiredArgsConstructor; @@ -73,4 +74,25 @@ private EventRes.EventInfo EventInfo(Event event) { .endDate(event.getEventEndDate()) .build(); } + + public Event convertToEventUpload(EventUploadReq eventUploadReq, String thumbnail) { + return Event + .builder() + .title(eventUploadReq.getTitle()) + .eventType(eventUploadReq.getEventType()) + .smallTitle(eventUploadReq.getSmallTitle()) + .thumbnail(thumbnail) + .eventStartDate(eventUploadReq.getEventStartDate()) + .eventEndDate(eventUploadReq.getEventEndDate()) + .build(); + } + + public EventContent convertToEventContents(Long eventId, String contents, ContentsType contentsType) { + return EventContent + .builder() + .eventId(eventId) + .contentsType(contentsType) + .contents(contents) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java index 53c0109c..5cdb07ef 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java @@ -1,7 +1,9 @@ package com.example.matchapi.event.dto; import com.example.matchdomain.common.model.ContentsType; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.util.List; @@ -23,8 +25,10 @@ public static class EventList { private String eventStatus; + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; } @Getter @@ -49,8 +53,10 @@ public static class EventInfo{ private String smallTitle; + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; } @Getter diff --git a/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java b/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java index e78b5afa..83dedf02 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java +++ b/Match-Common/src/main/java/com/example/matchcommon/constants/MatchStatic.java @@ -27,5 +27,10 @@ public class MatchStatic { public static final String PORT_ONE = "port_one"; + public static final String EVENT_S3_DIR = "event"; + + public static final String NOTICE_S3_DIR = "notice"; + + } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java index b350ba3c..7a1b7ed5 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/common/model/ContentsEntity.java @@ -1,6 +1,9 @@ package com.example.matchdomain.common.model; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -10,10 +13,24 @@ @Getter @MappedSuperclass +@NoArgsConstructor +@SuperBuilder @EntityListeners(AuditingEntityListener.class) -public abstract class ContentsEntity extends BaseEntity{ +public abstract class ContentsEntity { @Enumerated(EnumType.STRING) private ContentsType contentsType; private String contents; + + + @Column(name="createdAt",updatable = false) + @CreatedDate + private LocalDateTime createdAt; + + @Column(name="updatedAt") + @LastModifiedDate + private LocalDateTime updatedAt; + + @Enumerated(EnumType.STRING) + private Status status = Status.ACTIVE; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java index 0956cb47..b75cb555 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/Event.java @@ -6,6 +6,7 @@ import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.time.LocalDate; @@ -42,7 +43,9 @@ public class Event extends BaseEntity { private String thumbnail; + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate eventStartDate; + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate eventEndDate; } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java index 216c5679..9cefa4e8 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/event/entity/EventContent.java @@ -4,6 +4,7 @@ import com.example.matchdomain.common.model.ContentsEntity; import com.example.matchdomain.common.model.ContentsType; import lombok.*; +import lombok.experimental.SuperBuilder; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -14,7 +15,7 @@ @Table(name = "EventContent") @Getter @Setter -@Builder +@SuperBuilder @AllArgsConstructor @NoArgsConstructor @DynamicUpdate @@ -27,10 +28,9 @@ public class EventContent extends ContentsEntity { private Long id; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "eventId",nullable = false, insertable=false, updatable=false) + @JoinColumn(name = "eventId", nullable = false, insertable = false, updatable = false) private Event event; - @Column(name="eventId") + @Column(name = "eventId") private Long eventId; - } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java index 8bf26f2d..b8894263 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/config/s3/S3UploadService.java @@ -1,9 +1,7 @@ package com.example.matchinfrastructure.config.s3; -import com.amazonaws.HttpMethod; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.Headers; import com.amazonaws.services.s3.model.*; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.ForbiddenException; @@ -11,16 +9,15 @@ import com.example.matchcommon.properties.AwsS3Properties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.util.ArrayList; -import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.UUID; import static com.example.matchcommon.exception.errorcode.FileUploadException.*; @@ -191,4 +188,43 @@ private String getForBannerFileName(String fileExtension) { + UUID.randomUUID() + fileExtension; } + + public String uploadByteCode(String s3FileName, byte[] thumbnailBytes) { + ObjectMetadata metadata = new ObjectMetadata(); + + metadata.setContentLength(thumbnailBytes.length); + metadata.setContentType("image/jpeg"); + + amazonS3.putObject(new PutObjectRequest(awsS3Properties.getS3().getBucket(),s3FileName,new ByteArrayInputStream(thumbnailBytes),metadata)); + + return amazonS3.getUrl(awsS3Properties.getS3().getBucket(),s3FileName).toString(); + } + + + public String uploadByteCodeOne(String dirName, byte[] thumbnailBytes) { + String s3FileName=dirName+"/"+UUID.randomUUID().toString()+".jpg"; + + return uploadByteCode(s3FileName, thumbnailBytes); + } + + public String uploadOneImg(String dirName, MultipartFile imgFile) { + String fileName = getForOneFileName(dirName, getFileExtension(Objects.requireNonNull(imgFile.getOriginalFilename()))); + + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(imgFile.getSize()); + objectMetadata.setContentType(imgFile.getContentType()); + + try (InputStream inputStream = imgFile.getInputStream()) { + amazonS3.putObject(new PutObjectRequest(awsS3Properties.getS3().getBucket(), fileName, inputStream, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead)); + } catch (IOException e) { + throw new ForbiddenException(IMAGE_UPLOAD_ERROR); + } + return amazonS3.getUrl(awsS3Properties.getS3().getBucket(), fileName).toString(); + } + + private String getForOneFileName(String dirName, String fileExtension) { + return dirName+"/" + + UUID.randomUUID() + + fileExtension; + } } From 3a0a5f73f21ff7832d8c8bd4e9f3741ec7d7d975 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:38:15 +0900 Subject: [PATCH 53/82] =?UTF-8?q?:zap:=20:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=BA=90=EC=8B=9C=20=EC=A0=84=EC=B2=B4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/controller/AdminEventController.java | 11 +++-------- .../admin/event/service/AdminEventService.java | 13 ++++++------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java index 619df192..e86ee3b7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java @@ -19,14 +19,9 @@ public class AdminEventController { private final AdminEventService adminEventService; @PostMapping("") - public CommonResponse> uploadEventList(@RequestBody EventUploadReq eventUploadReq){ - return CommonResponse.onSuccess(adminEventService.uploadEventList(eventUploadReq)); + public CommonResponse uploadEventList(@RequestBody EventUploadReq eventUploadReq){ + adminEventService.uploadEventList(eventUploadReq); + return CommonResponse.onSuccess("์—…๋กœ๋“œ ์„ฑ๊ณต"); } - @PostMapping(value = "/img", - consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public CommonResponse imgUpload(@ModelAttribute MultipartFile imgFile){ - String url = adminEventService.uploadEventImg(imgFile); - return CommonResponse.onSuccess(url); - } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java index 659d9772..f168c035 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java @@ -12,6 +12,9 @@ import com.example.matchdomain.event.repository.EventRepository; import com.example.matchinfrastructure.config.s3.S3UploadService; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -25,12 +28,13 @@ @Service @RequiredArgsConstructor public class AdminEventService { - private final S3UploadService s3UploadService; private final EventRepository eventRepository; private final EventContentRepository eventContentRepository; private final EventConvertor eventConvertor; + private final EventService eventService; @RedissonLock(LockName = "์ด๋ฒคํŠธ ์—…๋กœ๋“œ", key = "#eventUploadReq") - public List uploadEventList(EventUploadReq eventUploadReq) { + @CacheEvict(value = "eventCache", allEntries = true) + public void uploadEventList(EventUploadReq eventUploadReq) { Event event = eventRepository.save(eventConvertor.convertToEventUpload(eventUploadReq, eventUploadReq.getThumbnail())); @@ -47,11 +51,6 @@ public List uploadEventList(EventUploadReq eventUploadReq) { } eventContentRepository.saveAll(eventContents); - - return null; } - public String uploadEventImg(MultipartFile imgFile) { - return s3UploadService.uploadOneImg(EVENT_S3_DIR, imgFile); - } } From 8d3acf4d8b1a3bddfa5a4d55a07eb2e7fe793d9f Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:38:47 +0900 Subject: [PATCH 54/82] =?UTF-8?q?:memo:=20:=20=EC=BA=90=EC=8B=9C=20?= =?UTF-8?q?=EB=A9=94=EB=AA=A8=EB=A6=AC=20down=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Match-Api/src/main/resources/ehcache.xml | 53 +++++++++++++++++------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/Match-Api/src/main/resources/ehcache.xml b/Match-Api/src/main/resources/ehcache.xml index 06134a08..5cd72f72 100644 --- a/Match-Api/src/main/resources/ehcache.xml +++ b/Match-Api/src/main/resources/ehcache.xml @@ -6,39 +6,62 @@ + + + + + + + From 941bc6d03e3a15993d784479c3e12d5433cfad04 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:39:02 +0900 Subject: [PATCH 55/82] =?UTF-8?q?:memo:=20:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80,=20=EC=82=AC=EC=9D=B4=EC=A6=88?= =?UTF-8?q?=20=EC=BA=90=EC=8B=B1=20=EC=B2=98=EB=A6=AC=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/matchapi/event/dto/EventRes.java | 3 ++- .../example/matchapi/event/service/EventService.java | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java index 5cdb07ef..327273e8 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/dto/EventRes.java @@ -5,6 +5,7 @@ import lombok.*; import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; import java.time.LocalDate; import java.util.List; @@ -14,7 +15,7 @@ public class EventRes { @Builder @AllArgsConstructor @NoArgsConstructor - public static class EventList { + public static class EventList implements Serializable { private Long eventId; private String thumbnail; diff --git a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java index 03104b2c..dee07e23 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java @@ -6,6 +6,8 @@ import com.example.matchdomain.event.adaptor.EventAdaptor; import com.example.matchdomain.event.entity.Event; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @@ -17,11 +19,18 @@ public class EventService { private final EventConvertor eventConvertor; private final EventAdaptor eventAdaptor; + @Cacheable(value = "eventCache", key = "{#page, #size}") public PageResponse> getEventList(int page, int size) { Page events = eventAdaptor.findEvent(page, size); - return new PageResponse<>(events.isLast(), events.getTotalElements(), eventConvertor.EventList(events.getContent())); + List eventLists = cachingEventLists(events.getContent()); + return new PageResponse<>(events.isLast(), events.getTotalElements(), eventLists); } + public List cachingEventLists(List content) { + return eventConvertor.EventList(content); + } + + public EventRes.EventDetail getEventDetail(Long eventId) { Event event = eventAdaptor.findByEvent(eventId); return eventConvertor.EventDetail(event); From f871447f1556a6341e519eb38c10c6228013896e Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:39:14 +0900 Subject: [PATCH 56/82] =?UTF-8?q?:recycle:=20:=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80,=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=A6=88=20=EC=BA=90=EC=8B=B1=20=EC=B2=98=EB=A6=AC=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/matchcommon/reponse/PageResponse.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java b/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java index 44d4763c..4ee8c405 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java +++ b/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java @@ -4,10 +4,12 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import java.io.Serializable; + @Getter @AllArgsConstructor @Schema(description = "ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ์‘๋‹ต") -public class PageResponse { +public class PageResponse implements Serializable { @Schema(description = "๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ์œ ๋ฌด", required = true, example = "true") private final Boolean isLast; @Schema(description = "์ด ์š”์†Œ ๊ฐฏ์ˆ˜", required = true, example = "10") From f98c242d7db76ce05f2a21988536f26ce35b6553 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:39:34 +0900 Subject: [PATCH 57/82] =?UTF-8?q?:zap:=20:=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/ImageController.java | 27 +++++++++++++++++++ .../matchapi/common/model/UploadFolder.java | 12 +++++++++ 2 files changed, 39 insertions(+) create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/ImageController.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/model/UploadFolder.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/ImageController.java b/Match-Api/src/main/java/com/example/matchapi/common/ImageController.java new file mode 100644 index 00000000..e79f3d12 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/ImageController.java @@ -0,0 +1,27 @@ +package com.example.matchapi.common; + +import com.example.matchapi.admin.event.service.AdminEventService; +import com.example.matchapi.common.model.UploadFolder; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchinfrastructure.config.s3.S3UploadService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "IMG ์ปจํŠธ๋กค๋Ÿฌ") +@RestController +@RequestMapping("/admin/img") +@RequiredArgsConstructor +public class ImageController { + private final S3UploadService s3UploadService; + @PostMapping(value = "", + consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public CommonResponse imgUpload( + @ModelAttribute UploadFolder uploadFolder, + @ModelAttribute MultipartFile imgFile){ + String url = s3UploadService.uploadOneImg(uploadFolder.getFolder(), imgFile); + return CommonResponse.onSuccess(url); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/common/model/UploadFolder.java b/Match-Api/src/main/java/com/example/matchapi/common/model/UploadFolder.java new file mode 100644 index 00000000..43345457 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/model/UploadFolder.java @@ -0,0 +1,12 @@ +package com.example.matchapi.common.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UploadFolder { + EVENT("event"), NOTICE("notice"); + + private final String folder; +} From 1ba6f7ef084425adb2b46b0008e9ad76443e7bf5 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:39:58 +0900 Subject: [PATCH 58/82] =?UTF-8?q?:zap:=20:=20Controller=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/user/controller/UserController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java index 6c23750b..720e003f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java @@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -123,8 +124,9 @@ public CommonResponse getProfile( } @Operation(summary = "02-06 ํ”„๋กœํ•„ ํŽธ์ง‘ ๐Ÿ‘ค FRAME MY",description = "์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ multipart ์— ๋„ฃ์–ด์ฃผ์‹œ๊ณ , ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์•ˆํ•  ์‹œ multipart null ๊ฐ’์œผ๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š” ์•„์ด๋””๋Š” ๊ธฐ์กด ์•„์ด๋””๊ฐ’+๋ณ€๊ฒฝํ•  ์•„์ด๋””๊ฐ’ ๋‘˜์ค‘ ํ•˜๋‚˜ ๋ณด๋‚ด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค") - @PatchMapping("/profile") - public CommonResponse modifyUserProfile(@ModelAttribute UserReq.ModifyProfile modifyProfile, @Parameter(hidden = true) @AuthenticationPrincipal User user) throws IOException { + @PatchMapping(value = "/profile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public CommonResponse modifyUserProfile(@ModelAttribute UserReq.ModifyProfile modifyProfile, + @AuthenticationPrincipal User user) throws IOException { System.out.println(modifyProfile.getName()); userService.modifyUserProfile(user, modifyProfile); return CommonResponse.onSuccess("๋ณ€๊ฒฝ ์„ฑ๊ณต"); From 64df2b1988e6719227f723a4f589d36a09a63652 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 14:43:19 +0900 Subject: [PATCH 59/82] =?UTF-8?q?:refactor:=20:=20ContentsList=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/event/dto/EventUploadReq.java | 16 ++------------- .../admin/notice/dto/NoticeUploadReq.java | 20 +++++++++++++++++++ .../matchapi/common/model/ContentsList.java | 20 +++++++++++++++++++ 3 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/notice/dto/NoticeUploadReq.java create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/model/ContentsList.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java index dc9744cd..fcd22bdf 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/dto/EventUploadReq.java @@ -1,5 +1,6 @@ package com.example.matchapi.admin.event.dto; +import com.example.matchapi.common.model.ContentsList; import com.example.matchdomain.common.model.ContentsType; import com.example.matchdomain.event.enums.EventType; import io.swagger.v3.oas.annotations.media.Schema; @@ -24,23 +25,10 @@ public class EventUploadReq { private EventType eventType; - private List contentsList; - private LocalDate eventStartDate; private LocalDate eventEndDate; + private List contentsList; - @Getter - @Setter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class ContentsList{ - @NotBlank(message = "Contents ํƒ€์ž…์„ ์ž…๋ ฅํ•ด์ฃผ์ƒˆ์š”") - private ContentsType contentsType; - - @Schema(description = "์ด๋ฏธ์ง€ url or Text", required = false) - private String contents; - } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/dto/NoticeUploadReq.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/dto/NoticeUploadReq.java new file mode 100644 index 00000000..63e74cad --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/dto/NoticeUploadReq.java @@ -0,0 +1,20 @@ +package com.example.matchapi.admin.notice.dto; + +import com.example.matchapi.common.model.ContentsList; +import com.example.matchdomain.notice.enums.NoticeType; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class NoticeUploadReq { + private String title; + + private NoticeType noticeType; + + private List contentsList; +} diff --git a/Match-Api/src/main/java/com/example/matchapi/common/model/ContentsList.java b/Match-Api/src/main/java/com/example/matchapi/common/model/ContentsList.java new file mode 100644 index 00000000..1c142f21 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/model/ContentsList.java @@ -0,0 +1,20 @@ +package com.example.matchapi.common.model; + +import com.example.matchdomain.common.model.ContentsType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ContentsList{ + @NotBlank(message = "Contents ํƒ€์ž…์„ ์ž…๋ ฅํ•ด์ฃผ์ƒˆ์š”") + private ContentsType contentsType; + + @Schema(description = "์ด๋ฏธ์ง€ url or Text", required = false) + private String contents; +} From a721b8f98edbd0a9ccc6f243ccc239e19e79a808 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 14:43:35 +0900 Subject: [PATCH 60/82] =?UTF-8?q?:refactor:=20:=20AdminNotice=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/mapper/AdminNoticeMapper.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Match-Api/src/main/java/com/example/matchapi/admin/notice/mapper/AdminNoticeMapper.java diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/mapper/AdminNoticeMapper.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/mapper/AdminNoticeMapper.java new file mode 100644 index 00000000..ae0793a0 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/mapper/AdminNoticeMapper.java @@ -0,0 +1,19 @@ +package com.example.matchapi.admin.notice.mapper; + +import com.example.matchapi.admin.notice.dto.NoticeUploadReq; +import com.example.matchapi.common.model.ContentsList; +import com.example.matchdomain.notice.entity.Notice; +import com.example.matchdomain.notice.entity.NoticeContent; +import org.mapstruct.*; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface AdminNoticeMapper { + AdminNoticeMapper INSTANCE = Mappers.getMapper(AdminNoticeMapper.class); + + List toEntityNoticeContents(List contentsList); + + Notice toEntityNotice(NoticeUploadReq noticeUploadReq); +} From 435433fc43f9910c87d0eeb8f6d1782f17b21a7e Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 14:44:10 +0900 Subject: [PATCH 61/82] =?UTF-8?q?:zap:=20:=20Notice=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84,=20=EC=BA=90=EC=8B=B1=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/service/AdminEventService.java | 3 ++- .../controller/AdminNoticeController.java | 20 +++++++++++++++++++ .../notice/service/AdminNoticeService.java | 20 +++++++++++++++++++ .../matchapi/notice/dto/NoticeRes.java | 3 ++- .../notice/service/NoticeService.java | 3 +++ .../notice/entity/NoticeContent.java | 3 ++- 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java index f168c035..c914f324 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/service/AdminEventService.java @@ -1,6 +1,7 @@ package com.example.matchapi.admin.event.service; import com.example.matchapi.admin.event.dto.EventUploadReq; +import com.example.matchapi.common.model.ContentsList; import com.example.matchapi.event.convetor.EventConvertor; import com.example.matchapi.event.dto.EventRes; import com.example.matchapi.event.service.EventService; @@ -41,7 +42,7 @@ public void uploadEventList(EventUploadReq eventUploadReq) { Long eventId = event.getId(); List eventContents = new ArrayList<>(); - for(EventUploadReq.ContentsList content : eventUploadReq.getContentsList()){ + for(ContentsList content : eventUploadReq.getContentsList()){ if(content.getContentsType().equals(IMG)){ eventContents.add(eventConvertor.convertToEventContents(eventId, content.getContents(), IMG)); } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java index e23fb295..445f46da 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java @@ -1,11 +1,31 @@ package com.example.matchapi.admin.notice.controller; +import com.example.matchapi.admin.event.dto.EventUploadReq; +import com.example.matchapi.admin.notice.dto.NoticeUploadReq; +import com.example.matchapi.admin.notice.mapper.AdminNoticeMapper; +import com.example.matchapi.admin.notice.service.AdminNoticeService; +import com.example.matchapi.common.model.ContentsList; +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchdomain.notice.entity.Notice; +import com.example.matchdomain.notice.entity.NoticeContent; import lombok.RequiredArgsConstructor; +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.RestController; +import javax.validation.Valid; +import java.util.List; + @RestController @RequiredArgsConstructor @RequestMapping("/admin/notices") public class AdminNoticeController { + private final AdminNoticeService adminNoticeService; + private final AdminNoticeMapper mapper = AdminNoticeMapper.INSTANCE; + @PostMapping("") + public CommonResponse uploadNoticeList(@Valid @RequestBody NoticeUploadReq noticeUploadReq){ + adminNoticeService.uploadNoticeList(mapper.toEntityNoticeContents(noticeUploadReq.getContentsList()), mapper.toEntityNotice(noticeUploadReq)); + return CommonResponse.onSuccess("์—…๋กœ๋“œ ์„ฑ๊ณต"); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java index b64255d6..b019f4bf 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/service/AdminNoticeService.java @@ -1,9 +1,29 @@ package com.example.matchapi.admin.notice.service; +import com.example.matchdomain.notice.entity.Notice; +import com.example.matchdomain.notice.entity.NoticeContent; +import com.example.matchdomain.notice.repository.NoticeContentRepository; +import com.example.matchdomain.notice.repository.NoticeRepository; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class AdminNoticeService { + private final NoticeRepository noticeRepository; + private final NoticeContentRepository noticeContentRepository; + + @CacheEvict(value = "noticeCache", allEntries = true) + public void uploadNoticeList(List noticeContents, Notice notice) { + notice = noticeRepository.save(notice); + + for(NoticeContent noticeContent : noticeContents){ + noticeContent.setNoticeId(notice.getId()); + } + + noticeContentRepository.saveAll(noticeContents); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java index d295367d..4ce90e66 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/dto/NoticeRes.java @@ -3,6 +3,7 @@ import com.example.matchdomain.common.model.ContentsType; import lombok.*; +import java.io.Serializable; import java.util.List; public class NoticeRes { @@ -11,7 +12,7 @@ public class NoticeRes { @Builder @AllArgsConstructor @NoArgsConstructor - public static class NoticeList { + public static class NoticeList implements Serializable { private Long noticeId; private String noticeType; diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java index 104253ab..07d1998a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java @@ -6,6 +6,7 @@ import com.example.matchdomain.notice.adaptor.NoticeAdapter; import com.example.matchdomain.notice.entity.Notice; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @@ -17,6 +18,8 @@ public class NoticeService { private final NoticeConvertor noticeConvertor; private final NoticeAdapter noticeAdapter; + + @Cacheable(value = "noticeCache", key = "{#page, #size}") public PageResponse> getNoticeList(int page, int size) { Page notices = noticeAdapter.getNoticeList(page, size); return new PageResponse<>(notices.isLast(), notices.getTotalElements(), noticeConvertor.NoticeList(notices.getContent())); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java index d227c44e..d0161a17 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/notice/entity/NoticeContent.java @@ -5,6 +5,7 @@ import com.example.matchdomain.common.model.ContentsType; import com.example.matchdomain.event.entity.Event; import lombok.*; +import lombok.experimental.SuperBuilder; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -15,7 +16,7 @@ @Table(name = "NoticeContent") @Getter @Setter -@Builder +@SuperBuilder @AllArgsConstructor @NoArgsConstructor @DynamicUpdate From 29c72f0ff65be74e2c3e0f02fa5a34fcb66c3d2c Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 14:44:48 +0900 Subject: [PATCH 62/82] :heavy_plus_sign: : MapStruct dependency add (#104) --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index e49ee220..dcfa8075 100644 --- a/build.gradle +++ b/build.gradle @@ -48,6 +48,10 @@ subprojects{ compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + //map struct + implementation 'org.mapstruct:mapstruct:1.5.3.Final' + annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final' + } tasks.named('test') { From c6f96e6d8f072604fd6094c4ec0d13eb593f911f Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:14:10 +0900 Subject: [PATCH 63/82] =?UTF-8?q?:recycle:=20:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20(#dev)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/matchapi/event/service/EventService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java index dc51d8d7..dee07e23 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java @@ -31,11 +31,6 @@ public List cachingEventLists(List content) { } - public EventRes.EventDetail getEventDetail(Long eventId) { - Event event = eventAdaptor.findByEvent(eventId); - return eventConvertor.EventDetail(event); - } - public EventRes.EventDetail getEventDetail(Long eventId) { Event event = eventAdaptor.findByEvent(eventId); return eventConvertor.EventDetail(event); From f400f48f8f0d331e9e36c31e9974a46fd93ca8db Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:43:53 +0900 Subject: [PATCH 64/82] =?UTF-8?q?:memo:=20:=20master-slave=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20yml=20=EC=9E=91=EC=84=B1=20(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/application-domain-dev.yml | 16 +++++++++--- .../resources/application-domain-localDev.yml | 16 +++++++++--- .../resources/application-domain-prod.yml | 15 ++++++++--- .../src/main/resources/application-domain.yml | 25 +++++++++++-------- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/Match-Domain/src/main/resources/application-domain-dev.yml b/Match-Domain/src/main/resources/application-domain-dev.yml index 978a0c0c..218d935c 100644 --- a/Match-Domain/src/main/resources/application-domain-dev.yml +++ b/Match-Domain/src/main/resources/application-domain-dev.yml @@ -9,10 +9,18 @@ spring: init: platform: mysql datasource: - url: ${DB_URL_HOST} - username: ${AWS_DB_USER_NAME} - password: ${AWS_DB_PASSWORD} - driver-class-name: com.mysql.cj.jdbc.Driver + master: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${DB_URL_HOST} + slave: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${DEV_SLAVE_URL_HOST} jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect # create, update, create-drop, none ๋“ฑ์˜ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. diff --git a/Match-Domain/src/main/resources/application-domain-localDev.yml b/Match-Domain/src/main/resources/application-domain-localDev.yml index f73348fd..1fe03d90 100644 --- a/Match-Domain/src/main/resources/application-domain-localDev.yml +++ b/Match-Domain/src/main/resources/application-domain-localDev.yml @@ -9,10 +9,18 @@ spring: init: platform: mysql datasource: - url: ${DB_URL_HOST} - username: ${AWS_DB_USER_NAME} - password: ${AWS_DB_PASSWORD} - driver-class-name: com.mysql.cj.jdbc.Driver + master: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${DB_URL_HOST} + slave: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${DEV_SLAVE_URL_HOST} jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect # create, update, create-drop, none ๋“ฑ์˜ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. diff --git a/Match-Domain/src/main/resources/application-domain-prod.yml b/Match-Domain/src/main/resources/application-domain-prod.yml index d511f5fa..4411b518 100644 --- a/Match-Domain/src/main/resources/application-domain-prod.yml +++ b/Match-Domain/src/main/resources/application-domain-prod.yml @@ -9,9 +9,18 @@ spring: init: platform: mysql datasource: - url: ${PROD_DB_URL_HOST} - username: ${AWS_DB_USER_NAME} - password: ${AWS_DB_PASSWORD} + master: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${PROD_DB_URL_HOST} + slave: + hikari: + username: ${AWS_DB_USER_NAME} + password: ${AWS_DB_PASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: ${PROD_SLAVE_URL_HOST} driver-class-name: com.mysql.cj.jdbc.Driver jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect diff --git a/Match-Domain/src/main/resources/application-domain.yml b/Match-Domain/src/main/resources/application-domain.yml index 8440a50f..731621c7 100644 --- a/Match-Domain/src/main/resources/application-domain.yml +++ b/Match-Domain/src/main/resources/application-domain.yml @@ -1,6 +1,6 @@ spring: redis: - host: ${REDIS_DEV_HOST} + host: localhost port: 6379 config: activate: @@ -9,19 +9,22 @@ spring: init: platform: mysql datasource: - url: ${LOCAL_DB_URL_HOST} - username: ${LOCAL_DB_USER_NAME} - password: ${LOCAL_DB_PASSWORD} - driver-class-name: com.mysql.cj.jdbc.Driver + master: + hikari: + username: root + password: 111 + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://localhost:4406/mydb + slave: + hikari: + username: root + password: 111 + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://localhost:5506/mydb jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - # create, update, create-drop, none ๋“ฑ์˜ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. - # create: ๊ธฐ์กดํ…Œ์ด๋ธ” ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ - # update: ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋ฐ˜์˜ - # create-drop: create์™€ ๊ฐ™์œผ๋‚˜ ์ข…๋ฃŒ ์‹œ์ ์— ํ…Œ์ด๋ธ” DROP - # none: ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ hibernate: - ddl-auto: create + ddl-auto: update naming: implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl From 2c73a97bcf1688e1c7bb9359f99390ae4f9c52a6 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:44:07 +0900 Subject: [PATCH 65/82] =?UTF-8?q?:zap:=20:=20master-slave=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20config=20=EC=9E=91=EC=84=B1=20(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchcommon/config/DataSourceConfig.java | 62 +++++++++++++++++++ .../matchcommon/config/RoutingDataSource.java | 12 ++++ 2 files changed, 74 insertions(+) create mode 100644 Match-Common/src/main/java/com/example/matchcommon/config/DataSourceConfig.java create mode 100644 Match-Common/src/main/java/com/example/matchcommon/config/RoutingDataSource.java diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/DataSourceConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/DataSourceConfig.java new file mode 100644 index 00000000..b34b493b --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/config/DataSourceConfig.java @@ -0,0 +1,62 @@ +package com.example.matchcommon.config; + +import com.zaxxer.hikari.HikariDataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +@Configuration +@Slf4j +public class DataSourceConfig { + public static final String MASTER_DATASOURCE = "masterDataSource"; + public static final String SLAVE_DATASOURCE = "slaveDataSource"; + + @Bean(MASTER_DATASOURCE) + @ConfigurationProperties(prefix = "spring.datasource.master.hikari") + public DataSource masterDataSource() { + log.info("master db active"); + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + @Bean(SLAVE_DATASOURCE) + @ConfigurationProperties(prefix = "spring.datasource.slave.hikari") + public DataSource slaveDataSource() { + log.info("slave db active"); + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + @Bean + @DependsOn({MASTER_DATASOURCE, SLAVE_DATASOURCE}) + public DataSource routingDataSource( + @Qualifier(MASTER_DATASOURCE) DataSource masterDataSource, + @Qualifier(SLAVE_DATASOURCE) DataSource slaveDataSource) { + RoutingDataSource routingDataSource = new RoutingDataSource(); + Map datasource = new HashMap<>(); + datasource.put("master", masterDataSource); + datasource.put("slave", slaveDataSource); + routingDataSource.setTargetDataSources(datasource); + routingDataSource.setDefaultTargetDataSource(masterDataSource); + return routingDataSource; + } + + @Primary + @Bean + @DependsOn("routingDataSource") + public LazyConnectionDataSourceProxy dataSource(DataSource routingDataSource){ + return new LazyConnectionDataSourceProxy(routingDataSource); + } +} diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/RoutingDataSource.java b/Match-Common/src/main/java/com/example/matchcommon/config/RoutingDataSource.java new file mode 100644 index 00000000..5b7c2527 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/config/RoutingDataSource.java @@ -0,0 +1,12 @@ +package com.example.matchcommon.config; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +public class RoutingDataSource extends AbstractRoutingDataSource { + + @Override + protected Object determineCurrentLookupKey() { + return (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) ? "slave" : "master"; + } +} \ No newline at end of file From 988fdf314f8a7e05121c9da370f43bede12d792d Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:44:32 +0900 Subject: [PATCH 66/82] :heavy_plus_sign: : jdbc dependency add (#122) --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index dcfa8075..8dd100c4 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,9 @@ subprojects{ implementation 'net.sf.ehcache:ehcache:2.10.3' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' From 6e62eee8f86f70e2b74afe170cd0ce9663698398 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:01:10 +0900 Subject: [PATCH 67/82] :green_heart: : CI Secret slave db add (#122) --- .github/workflows/dev_api_ci_cd.yml | 9 ++++++--- .github/workflows/prod_api_ci_cd.yml | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dev_api_ci_cd.yml b/.github/workflows/dev_api_ci_cd.yml index b2da3980..f2ffaaed 100644 --- a/.github/workflows/dev_api_ci_cd.yml +++ b/.github/workflows/dev_api_ci_cd.yml @@ -67,9 +67,12 @@ jobs: with: files: ./Match-Domain/src/main/resources/application-domain-dev.yml env: - spring.datasource.url: ${{ secrets.DB_URL_HOST }} - spring.datasource.username: ${{ secrets.AWS_DB_USER_NAME }} - spring.datasource.password: ${{ secrets.AWS_DB_PASSWORD }} + spring.datasource.master.hikari.jdbc-url: ${{ secrets.DB_URL_HOST }} + spring.datasource.master.hikari.username: ${{ secrets.AWS_DB_USER_NAME }} + spring.datasource.master.hikari.password: ${{ secrets.AWS_DB_PASSWORD }} + spring.datasource.slave.hikari.jdbc-url: ${{ secrets.DEV_SLAVE_URL_HOST }} + spring.datasource.slave.hikari.username: ${{ secrets.AWS_DB_USER_NAME }} + spring.datasource.slave.hikari.password: ${{ secrets.AWS_DB_PASSWORD }} spring.redis.host : ${{ secrets.REDIS_DEV_HOST }} - name: create-fcm-json diff --git a/.github/workflows/prod_api_ci_cd.yml b/.github/workflows/prod_api_ci_cd.yml index 466dbf34..96384444 100644 --- a/.github/workflows/prod_api_ci_cd.yml +++ b/.github/workflows/prod_api_ci_cd.yml @@ -70,9 +70,12 @@ jobs: with: files: ./Match-Domain/src/main/resources/application-domain-prod.yml env: - spring.datasource.url: ${{ secrets.PROD_DB_URL_HOST }} - spring.datasource.username: ${{ secrets.AWS_DB_USER_NAME }} - spring.datasource.password: ${{ secrets.AWS_DB_PASSWORD }} + spring.datasource.master.hikari.jdbc-url: ${{ secrets.PROD_DB_URL_HOST }} + spring.datasource.master.hikari.username: ${{ secrets.AWS_DB_USER_NAME }} + spring.datasource.master.hikari.password: ${{ secrets.AWS_DB_PASSWORD }} + spring.datasource.slave.hikari.jdbc-url: ${{ secrets.PROD_SLAVE_URL_HOST }} + spring.datasource.slave.hikari.username: ${{ secrets.AWS_DB_USER_NAME }} + spring.datasource.slave.hikari.password: ${{ secrets.AWS_DB_PASSWORD }} spring.redis.host : ${{ secrets.REDIS_PROD_HOST }} - name: create-fcm-json From ef3c8fa4c0c39b17cfd05b9849f1b7cfcc0fca19 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 14:34:31 +0900 Subject: [PATCH 68/82] =?UTF-8?q?:zap:=20:=20=EC=9D=B4=EC=9A=A9=EC=95=BD?= =?UTF-8?q?=EA=B4=80=20=EC=9E=91=EC=84=B1=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/HtmlController.java | 19 ++ .../matchapi/config/SecurityConfig.java | 1 + .../resources/templates/PrivacyPolicy.html | 164 ++++++++++++++++++ .../resources/templates/TermsConditions.html | 126 ++++++++++++++ 4 files changed, 310 insertions(+) create mode 100644 Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java create mode 100644 Match-Api/src/main/resources/templates/PrivacyPolicy.html create mode 100644 Match-Api/src/main/resources/templates/TermsConditions.html diff --git a/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java b/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java new file mode 100644 index 00000000..942f9086 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java @@ -0,0 +1,19 @@ +package com.example.matchapi.common; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/terms") +public class HtmlController { + @GetMapping("/policy") + public String showPrivacyPolicy(){ + return "PrivacyPolicy"; + } + + @GetMapping("/service") + public String showTermsConditions(){ + return "TermsConditions"; + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index 5ce9e62a..9b17c21b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -103,6 +103,7 @@ protected void configure(HttpSecurity httpSecurity) throws Exception { .antMatchers("/admin/order/**").hasAnyRole("ADMIN") .antMatchers("/admin/auth/logIn").permitAll() .antMatchers("/test/fcm/user").authenticated() + .antMatchers("/terms/**").permitAll() .anyRequest().authenticated() .and() diff --git a/Match-Api/src/main/resources/templates/PrivacyPolicy.html b/Match-Api/src/main/resources/templates/PrivacyPolicy.html new file mode 100644 index 00000000..6cd72242 --- /dev/null +++ b/Match-Api/src/main/resources/templates/PrivacyPolicy.html @@ -0,0 +1,164 @@ + + + + + + ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์ง€์นจ + + + +

๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์ง€์นจ

+ +

์ œ1์กฐ (๊ฐœ์ธ์ •๋ณด์˜ ์ฒ˜๋ฆฌ๋ชฉ์ )

+

ํšŒ์‚ฌ๋Š” ๋‹ค์Œ์˜ ๋ชฉ์ ์„ ์œ„ํ•˜์—ฌ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ์ธ์ •๋ณด๋Š” ๋‹ค์Œ์˜ ๋ชฉ์  ์ด์™ธ์˜ ์šฉ๋„๋กœ๋Š” ์ด์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด์šฉ ๋ชฉ์ ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ• ์ œ18์กฐ์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ๋™์˜๋ฅผ ๋ฐ›๋Š” ๋“ฑ ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ดํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

+ +
    +
  1. ํ™ˆํŽ˜์ด์ง€ ํšŒ์› ๊ฐ€์ž… ๋ฐ ๊ด€๋ฆฌ
    ํšŒ์› ๊ฐ€์ž… ์˜์‚ฌ ํ™•์ธ, ํšŒ์›์ œ ์„œ๋น„์Šค ์ œ๊ณต์— ๋”ฐ๋ฅธ ๋ณธ์ธ ์‹๋ณ„โ€ค์ธ์ฆ, ํšŒ์›์ž๊ฒฉ ์œ ์ง€โ€ค๊ด€๋ฆฌ, ์ œํ•œ์  ๋ณธ์ธํ™•์ธ์ œ ์‹œํ–‰์— ๋”ฐ๋ฅธ ๋ณธ์ธํ™•์ธ, ์„œ๋น„์Šค ๋ถ€์ • ์ด์šฉ ๋ฐฉ์ง€, ๋งŒ 14์„ธ ๋ฏธ๋งŒ ์•„๋™์˜ ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ ์‹œ ๋ฒ•์ •๋Œ€๋ฆฌ์ธ์˜ ๋™์˜ ์—ฌ๋ถ€ ํ™•์ธ, ๊ฐ์ข… ๊ณ ์ง€โ€คํ†ต์ง€, ๊ณ ์ถฉ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๋ชฉ์ ์œผ๋กœ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ์žฌํ™” ๋˜๋Š” ์„œ๋น„์Šค ์ œ๊ณต
    ๋ฌผํ’ˆ ๋ฐฐ์†ก, ์„œ๋น„์Šค ์ œ๊ณต, ๊ณ„์•ฝ์„œ ๋ฐ ์ฒญ๊ตฌ์„œ ๋ฐœ์†ก, ์ฝ˜ํ…์ธ  ์ œ๊ณต, ๋งž์ถค์„œ๋น„์Šค ์ œ๊ณต, ๋ณธ์ธ์ธ์ฆ, ์—ฐ๋ น์ธ์ฆ, ์š”๊ธˆ ๊ฒฐ์ œ ๋ฐ ์ •์‚ฐ, ์ฑ„๊ถŒ์ถ”์‹ฌ ๋“ฑ์„ ๋ชฉ์ ์œผ๋กœ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. +
  5. ๊ณ ์ถฉ ์ฒ˜๋ฆฌ
    ๋ฏผ์›์ธ์˜ ์‹ ์› ํ™•์ธ, ๋ฏผ์›์‚ฌํ•ญ ํ™•์ธ, ์‚ฌ์‹ค์กฐ์‚ฌ๋ฅผ ์œ„ํ•œ ์—ฐ๋ฝโ€คํ†ต์ง€, ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ํ†ต๋ณด ๋“ฑ์˜ ๋ชฉ์ ์œผ๋กœ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  6. +
+ +

์ œ2์กฐ (๊ฐœ์ธ์ •๋ณด์˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด์œ ๊ธฐ๊ฐ„)

+

โ‘  ํšŒ์‚ฌ๋Š” ๋ฒ•๋ น์— ๋”ฐ๋ฅธ ๊ฐœ์ธ์ •๋ณด ๋ณด์œ , ์ด์šฉ ๊ธฐ๊ฐ„ ๋˜๋Š” ์ •๋ณด์ฃผ์ฒด๋กœ๋ถ€ํ„ฐ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ ์‹œ์— ๋™์˜ ๋ฐ›์€ ๊ฐœ์ธ์ •๋ณด ๋ณด์œ , ์ด์šฉ ๊ธฐ๊ฐ„ ๋‚ด์—์„œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌ, ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ก ๊ฐ๊ฐ์˜ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐ ๋ณด์œ  ๊ธฐ๊ฐ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+
    +
  1. ํ™ˆํŽ˜์ด์ง€ ํšŒ์› ๊ฐ€์ž… ๋ฐ ๊ด€๋ฆฌ : ์‚ฌ์—…์ž/๋‹จ์ฒด ํ™ˆํŽ˜์ด์ง€ ํƒˆํ‡ด ์‹œ๊นŒ์ง€
    + ๋‹ค๋งŒ, ๋‹ค์Œ์˜ ์‚ฌ์œ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์‚ฌ์œ  ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ +
      +
    • ๊ด€๊ณ„ ๋ฒ•๋ น ์œ„๋ฐ˜์— ๋”ฐ๋ฅธ ์ˆ˜์‚ฌ, ์กฐ์‚ฌ ๋“ฑ์ด ์ง„ํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ˆ˜์‚ฌ, ์กฐ์‚ฌ ์ข…๋ฃŒ ์‹œ๊นŒ์ง€
    • +
    • ํ™ˆํŽ˜์ด์ง€ ์ด์šฉ์— ๋”ฐ๋ฅธ ์ฑ„๊ถŒ ๋ฐ ์ฑ„๋ฌด๊ด€๊ณ„ ์ž”์กด ์‹œ์—๋Š” ํ•ด๋‹น ์ฑ„๊ถŒ, ์ฑ„๋ฌด ๊ด€๊ณ„ ์ •์‚ฐ ์‹œ๊นŒ์ง€
    • +
    +
  2. +
+ +

์ œ3์กฐ (๊ฐœ์ธ์ •๋ณด์˜ ์ œ3์ž ์ œ๊ณต)

+

โ‘  ํšŒ์‚ฌ๋Š” ์ •๋ณด์ฃผ์ฒด์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ1์กฐ(๊ฐœ์ธ์ •๋ณด์˜ ์ฒ˜๋ฆฌ๋ชฉ์ )์—์„œ ๋ช…์‹œํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ •๋ณด์ฃผ์ฒด์˜ ๋™์˜, ๋ฒ•๋ฅ ์˜ ํŠน๋ณ„ํ•œ ๊ทœ์ • ๋“ฑ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ์ œ17์กฐ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ3์ž์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ก ํšŒ์‚ฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ3์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  • ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ๊ณต๋ฐ›๋Š” ์ž : (์ฃผ) OOO ์นด๋“œ
  • +
  • ์ œ๊ณต๋ฐ›๋Š” ์ž์˜ ๊ฐœ์ธ์ •๋ณด ์ด์šฉ๋ชฉ์  : ์ด๋ฒคํŠธ ๊ณต๋™๊ฐœ์ตœ ๋“ฑ ์—…๋ฌด์ œํœด ๋ฐ ์ œํœด ์‹ ์šฉ์นด๋“œ ๋ฐœ๊ธ‰
  • +
  • ์ œ๊ณตํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด ํ•ญ๋ชฉ : ์„ฑ๋ช…, ์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ์ฃผ์†Œ, ์นด๋“œ๊ฒฐ์ œ๊ณ„์ขŒ์ •๋ณด
  • +
  • ์ œ๊ณต๋ฐ›๋Š” ์ž์˜ ๋ณด์œ , ์ด์šฉ๊ธฐ๊ฐ„ : ์‹ ์šฉ์นด๋“œ ๋ฐœ๊ธ‰๊ณ„์•ฝ์— ๋”ฐ๋ฅธ ๊ฑฐ๋ž˜๊ธฐ๊ฐ„๋™์•ˆ
  • +
+ +

์ œ4์กฐ (๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ์˜ ์œ„ํƒ)

+

โ‘  ํšŒ์‚ฌ๋Š” ์›ํ™œํ•œ ๊ฐœ์ธ์ •๋ณด ์—…๋ฌด์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์—…๋ฌด๋ฅผ ์œ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  1. ์ „ํ™” ์ƒ๋‹ด ์„ผํ„ฐ ์šด์˜
    + - ์œ„ํƒ๋ฐ›๋Š” ์ž (์ˆ˜ํƒ์ž) : MATCH CS์„ผํ„ฐ
    + - ์œ„ํƒํ•˜๋Š” ์—…๋ฌด์˜ ๋‚ด์šฉ : ์ „ํ™”์ƒ๋‹ด ์‘๋Œ€, ๋ถ€์„œ ๋ฐ ์ง์› ์•ˆ๋‚ด ๋“ฑ
  2. +
+

โ‘ก ํšŒ์‚ฌ๋Š” ์œ„ํƒ๊ณ„์•ฝ ์ฒด๊ฒฐ ์‹œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ์ œ25์กฐ์— ๋”ฐ๋ผ ์œ„ํƒ์—…๋ฌด ์ˆ˜ํ–‰๋ชฉ์  ์™ธ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๊ธˆ์ง€, ๊ธฐ์ˆ ์ โ€ค๊ด€๋ฆฌ์  ๋ณดํ˜ธ์กฐ์น˜, ์žฌ์œ„ํƒ ์ œํ•œ, ์ˆ˜ํƒ์ž์— ๋Œ€ํ•œ ๊ด€๋ฆฌโ€ค๊ฐ๋…, ์†ํ•ด๋ฐฐ์ƒ ๋“ฑ ์ฑ…์ž„์— ๊ด€ํ•œ ์‚ฌํ•ญ์„ ๊ณ„์•ฝ์„œ ๋“ฑ ๋ฌธ์„œ์— ๋ช…์‹œํ•˜๊ณ , ์ˆ˜ํƒ์ž๊ฐ€ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๊ฐ๋…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+

โ‘ข ์œ„ํƒ์—…๋ฌด์˜ ๋‚ด์šฉ์ด๋‚˜ ์ˆ˜ํƒ์ž๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ์—๋Š” ์ง€์ฒด์—†์ด ๋ณธ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์„ ํ†ตํ•˜์—ฌ ๊ณต๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

+ +

์ œ5์กฐ (์ด์šฉ์ž ๋ฐ ๋ฒ•์ •๋Œ€๋ฆฌ์ธ์˜ ๊ถŒ๋ฆฌ์™€ ๊ทธ ํ–‰์‚ฌ ๋ฐฉ๋ฒ•)

+

โ‘  ์ •๋ณด์ฃผ์ฒด๋Š” ํšŒ์‚ฌ์— ๋Œ€ํ•ด ์–ธ์ œ๋“ ์ง€ ๋‹ค์Œ ๊ฐ ํ˜ธ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ด€๋ จ ๊ถŒ๋ฆฌ๋ฅผ ํ–‰์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  1. ๊ฐœ์ธ์ •๋ณด ์—ด๋žŒ ์š”๊ตฌ
  2. +
  3. ์˜ค๋ฅ˜ ๋“ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ •์ • ์š”๊ตฌ
  4. +
  5. ์‚ญ์ œ์š”๊ตฌ
  6. +
  7. ์ฒ˜๋ฆฌ์ •์ง€ ์š”๊ตฌ
  8. +
+

โ‘ก ์ œ1ํ•ญ์— ๋”ฐ๋ฅธ ๊ถŒ๋ฆฌ ํ–‰์‚ฌ๋Š” ํšŒ์‚ฌ์— ๋Œ€ํ•ด ์„œ๋ฉด, ์ „ํ™”, ์ „์ž์šฐํŽธ, ๋ชจ์‚ฌ์ „์†ก(FAX) ๋“ฑ์„ ํ†ตํ•˜์—ฌ ํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ํšŒ์‚ฌ๋Š” ์ด์— ๋Œ€ํ•ด ์ง€์ฒด์—†์ด ์กฐ์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

+

โ‘ข ์ •๋ณด์ฃผ์ฒด๊ฐ€ ๊ฐœ์ธ์ •๋ณด์˜ ์˜ค๋ฅ˜ ๋“ฑ์— ๋Œ€ํ•œ ์ •์ • ๋˜๋Š” ์‚ญ์ œ๋ฅผ ์š”๊ตฌํ•œ ๊ฒฝ์šฐ์—๋Š” ํšŒ์‚ฌ๋Š” ์ •์ • ๋˜๋Š” ์‚ญ์ œ๋ฅผ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋‹นํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+

โ‘ฃ ์ œ1ํ•ญ์— ๋”ฐ๋ฅธ ๊ถŒ๋ฆฌ ํ–‰์‚ฌ๋Š” ์ •๋ณด์ฃผ์ฒด์˜ ๋ฒ•์ •๋Œ€๋ฆฌ์ธ์ด๋‚˜ ์œ„์ž„์„ ๋ฐ›์€ ์ž ๋“ฑ ๋Œ€๋ฆฌ์ธ์„ ํ†ตํ•˜์—ฌ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ์‹œํ–‰๊ทœ์น™ ๋ณ„์ง€ ์ œ11ํ˜ธ ์„œ์‹์— ๋”ฐ๋ฅธ ์œ„์ž„์žฅ์„ ์ œ์ถœํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ค ์ •๋ณด์ฃผ์ฒด๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ๋“ฑ ๊ด€๊ณ„ ๋ฒ•๋ น์„ ์œ„๋ฐ˜ํ•˜์—ฌ ํšŒ์‚ฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์ •๋ณด์ฃผ์ฒด ๋ณธ์ธ์ด๋‚˜ ํƒ€์ธ์˜ ๊ฐœ์ธ์ •๋ณด ๋ฐ ์‚ฌ์ƒํ™œ์„ ์นจํ•ดํ•˜์—ฌ์„œ๋Š” ์•„๋‹ˆ ๋ฉ๋‹ˆ๋‹ค.

+ +

์ œ6์กฐ (์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด ํ•ญ๋ชฉ)

+

ํšŒ์‚ฌ๋Š” ๋‹ค์Œ์˜ ๊ฐœ์ธ์ •๋ณด ํ•ญ๋ชฉ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  1. ํ™ˆํŽ˜์ด์ง€ ํšŒ์› ๊ฐ€์ž… ๋ฐ ๊ด€๋ฆฌ
    + ํ•„์ˆ˜ํ•ญ๋ชฉ : ์„ฑ๋ช…, ์ƒ๋…„์›”์ผ, ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ, ์„ฑ๋ณ„, ์ด๋ฉ”์ผ์ฃผ์†Œ, ์•„์ดํ•€๋ฒˆํ˜ธ
    + ์„ ํƒํ•ญ๋ชฉ : ๊ฒฐํ˜ผ ์—ฌ๋ถ€, ๊ด€์‹ฌ ๋ถ„์•ผ
  2. +
  3. ์žฌํ™” ๋˜๋Š” ์„œ๋น„์Šค ์ œ๊ณต
    + ํ•„์ˆ˜ํ•ญ๋ชฉ : ์„ฑ๋ช…, ์ƒ๋…„์›”์ผ, ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ์ฃผ์†Œ, ์•„์ดํ•€๋ฒˆํ˜ธ, ์‹ ์šฉ์นด๋“œ๋ฒˆํ˜ธ, ์€ํ–‰๊ณ„์ขŒ์ •๋ณด ๋“ฑ ๊ฒฐ์ œ์ •๋ณด
    + ์„ ํƒํ•ญ๋ชฉ : ๊ด€์‹ฌ๋ถ„์•ผ, ๊ณผ๊ฑฐ ๊ตฌ๋งค๋‚ด์—ญ
  4. +
  5. ์ธํ„ฐ๋„ท ์„œ๋น„์Šค ์ด์šฉ๊ณผ์ •์—์„œ ์•„๋ž˜ ๊ฐœ์ธ์ •๋ณด ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์ˆ˜์ง‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    + IP์ฃผ์†Œ, ์ฟ ํ‚ค, MAC์ฃผ์†Œ, ์„œ๋น„์Šค ์ด์šฉ๊ธฐ๋ก, ๋ฐฉ๋ฌธ๊ธฐ๋ก, ๋ถˆ๋Ÿ‰ ์ด์šฉ๊ธฐ๋ก ๋“ฑ
  6. +
+ +

์ œ7์กฐ (๊ฐœ์ธ์ •๋ณด์˜ ํŒŒ๊ธฐ)

+

โ‘  ํšŒ์‚ฌ๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณด์œ  ๊ธฐ๊ฐ„์˜ ๊ฒฝ๊ณผ, ์ฒ˜๋ฆฌ๋ชฉ์  ๋‹ฌ์„ฑ ๋“ฑ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ์—๋Š” ์ง€์ฒด์—†์ด ํ•ด๋‹น ๊ฐœ์ธ์ •๋ณด๋ฅผ ํŒŒ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ก ์ •๋ณด์ฃผ์ฒด๋กœ๋ถ€ํ„ฐ ๋™์˜๋ฐ›์€ ๊ฐœ์ธ์ •๋ณด ๋ณด์œ  ๊ธฐ๊ฐ„์ด ๊ฒฝ๊ณผํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋ชฉ์ ์ด ๋‹ฌ์„ฑ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฒ•๋ น์— ๋”ฐ๋ผ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๊ณ„์† ๋ณด์กดํ•˜์—ฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ํ•ด๋‹น ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋ณด๊ด€์žฅ์†Œ๋ฅผ ๋‹ฌ๋ฆฌํ•˜์—ฌ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ข ๊ฐœ์ธ์ •๋ณด ํŒŒ๊ธฐ์˜ ์ ˆ์ฐจ ๋ฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+
    +
  1. ํŒŒ๊ธฐ ์ ˆ์ฐจ
    + ํšŒ์‚ฌ๋Š” ํŒŒ๊ธฐ ์‚ฌ์œ ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์„ ์ •ํ•˜๊ณ , ํšŒ์‚ฌ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์ฑ…์ž„์ž์˜ ์Šน์ธ์„ ๋ฐ›์•„ ๊ฐœ์ธ์ •๋ณด๋ฅผ ํŒŒ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ํŒŒ๊ธฐ ๋ฐฉ๋ฒ•
    + ํšŒ์‚ฌ๋Š” ์ „์ž์  ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๊ธฐ๋กโ€ค์ €์žฅ๋œ ๊ฐœ์ธ์ •๋ณด๋Š” ๊ธฐ๋ก์„ ์žฌ์ƒํ•  ์ˆ˜ ์—†๋„๋ก ๋กœ์šฐ๋ ˆ๋ฒจํฌ๋งท(Low Level Format) ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ํŒŒ๊ธฐํ•˜๋ฉฐ, ์ข…์ด ๋ฌธ์„œ์— ๊ธฐ๋กโ€ค์ €์žฅ๋œ ๊ฐœ์ธ์ •๋ณด๋Š” ๋ถ„์‡„๊ธฐ๋กœ ๋ถ„์‡„ํ•˜๊ฑฐ๋‚˜ ์†Œ๊ฐํ•˜์—ฌ ํŒŒ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  4. +
+ +

์ œ8์กฐ (๊ฐœ์ธ์ •๋ณด์˜ ์•ˆ์ „์„ฑ ํ™•๋ณด์กฐ์น˜)

+

ํšŒ์‚ฌ๋Š” ๊ฐœ์ธ์ •๋ณด์˜ ์•ˆ์ „์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์น˜๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  1. ๊ด€๋ฆฌ์  ์กฐ์น˜ : ๋‚ด๋ถ€๊ด€๋ฆฌ๊ณ„ํš ์ˆ˜๋ฆฝ ๋ฐ ์‹œํ–‰, ์ •๊ธฐ์  ์ง์› ๊ต์œก ๋“ฑ
  2. +
  3. ๊ธฐ์ˆ ์  ์กฐ์น˜ : ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ์‹œ์Šคํ…œ ๋“ฑ์˜ ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ, ์ ‘๊ทผํ†ต์ œ์‹œ์Šคํ…œ ์„ค์น˜, ๊ณ ์œ  ์‹๋ณ„์ •๋ณด ๋“ฑ์˜ ์•”ํ˜ธํ™”, ๋ณด์•ˆํ”„๋กœ๊ทธ๋žจ ์„ค์น˜
  4. +
  5. ๋ฌผ๋ฆฌ์  ์กฐ์น˜ : ์ „์‚ฐ์‹ค, ์ž๋ฃŒ๋ณด๊ด€์‹ค ๋“ฑ์˜ ์ ‘๊ทผํ†ต์ œ
  6. +
+ +

์ œ9์กฐ (๊ฐœ์ธ์ •๋ณด ์ž๋™ ์ˆ˜์ง‘ ์žฅ์น˜์˜ ์„ค์น˜โˆ™์šด์˜ ๋ฐ ๊ฑฐ๋ถ€์— ๊ด€ํ•œ ์‚ฌํ•ญ)

+

โ‘  ํšŒ์‚ฌ๋Š” ์ด์šฉ์ž์—๊ฒŒ ๊ฐœ๋ณ„์ ์ธ ๋งž์ถค ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ด์šฉ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ˆ˜์‹œ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” โ€˜์ฟ ํ‚ค(cookie)โ€™๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

+

โ‘ก ์ฟ ํ‚ค๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๋Š”๋ฐ ์ด์šฉ๋˜๋Š” ์„œ๋ฒ„(http)๊ฐ€ ์ด์šฉ์ž์˜ ์ปดํ“จํ„ฐ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด๋‚ด๋Š” ์†Œ๋Ÿ‰์˜ ์ •๋ณด์ด๋ฉฐ ์ด์šฉ์ž๋“ค์˜ ์ปดํ“จํ„ฐ ๋‚ด์˜ ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

+
    +
  1. ์ฟ ํ‚ค์˜ ์‚ฌ์šฉ ๋ชฉ์ : ์ด์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ๊ฐ ์„œ๋น„์Šค์™€ ์›น ์‚ฌ์ดํŠธ๋“ค์— ๋Œ€ํ•œ ๋ฐฉ๋ฌธ ๋ฐ ์ด์šฉํ˜•ํƒœ, ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด, ๋ณด์•ˆ์ ‘์† ์—ฌ๋ถ€, ๋“ฑ์„ ํŒŒ์•…ํ•˜์—ฌ ์ด์šฉ์ž์—๊ฒŒ ์ตœ์ ํ™”๋œ ์ •๋ณด ์ œ๊ณต์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. +
  3. ์ฟ ํ‚ค์˜ ์„ค์น˜โˆ™์šด์˜ ๋ฐ ๊ฑฐ๋ถ€ : ์›น๋ธŒ๋ผ์šฐ์ € ์ƒ๋‹จ์˜ ๋„๊ตฌ>์ธํ„ฐ๋„ท ์˜ต์…˜>๊ฐœ์ธ์ •๋ณด ๋ฉ”๋‰ด์˜ ์˜ต์…˜ ์„ค์ •์„ ํ†ตํ•ด ์ฟ ํ‚ค ์ €์žฅ์„ ๊ฑฐ๋ถ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. +
  5. ์ฟ ํ‚ค ์ €์žฅ์„ ๊ฑฐ๋ถ€ํ•  ๊ฒฝ์šฐ ๋งž์ถคํ˜• ์„œ๋น„์Šค ์ด์šฉ์— ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. +
+ +

์ œ10์กฐ (๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์ฑ…์ž„์ž)

+

โ‘  ํšŒ์‚ฌ๋Š” ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ์—…๋ฌด๋ฅผ ์ด๊ด„ํ•ด์„œ ์ฑ…์ž„์ง€๊ณ , ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•œ ์ •๋ณด์ฃผ์ฒด์˜ ๋ถˆ๋งŒ ์ฒ˜๋ฆฌ ๋ฐ ํ”ผํ•ด๊ตฌ์ œ ๋“ฑ์„ ์œ„ํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์ฑ…์ž„์ž๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+

โ–ถ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์ฑ…์ž„์ž

+ +

โ€ป ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋‹ด๋‹น๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

+

โ–ถ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋‹ด๋‹น๋ถ€์„œ

+
    +
  • ๋ถ€์„œ๋ช… : ์šด์˜ํŒ€
  • +
  • ๋‹ด๋‹น์ž : ํ•œ์Šน๊ธฐ
  • +
  • ์—ฐ๋ฝ์ฒ˜ : 070-7954-4123, krhan32@naver.com
  • +
+

โ‘ก ์ •๋ณด์ฃผ์ฒด๊ป˜์„œ๋Š” ํšŒ์‚ฌ์˜ ์„œ๋น„์Šค(๋˜๋Š” ์‚ฌ์—…)์„ ์ด์šฉํ•˜์‹œ๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ด€๋ จ ๋ฌธ์˜, ๋ถˆ๋งŒ ์ฒ˜๋ฆฌ, ํ”ผํ•ด๊ตฌ์ œ ๋“ฑ์— ๊ด€ํ•œ ์‚ฌํ•ญ์„ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์ฑ…์ž„์ž ๋ฐ ๋‹ด๋‹น๋ถ€์„œ๋กœ ๋ฌธ์˜ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋Š” ์ •๋ณด์ฃผ์ฒด์˜ ๋ฌธ์˜์— ๋Œ€ํ•ด ์ง€์ฒด์—†์ด ๋‹ต๋ณ€ ๋ฐ ์ฒ˜๋ฆฌํ•ด๋“œ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+ +

์ œ11์กฐ (๊ฐœ์ธ์ •๋ณด ์—ด๋žŒ์ฒญ๊ตฌ)

+

์ •๋ณด์ฃผ์ฒด๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ์ œ35์กฐ์— ๋”ฐ๋ฅธ ๊ฐœ์ธ์ •๋ณด์˜ ์—ด๋žŒ ์ฒญ๊ตฌ๋ฅผ ์•„๋ž˜์˜ ๋ถ€์„œ์— ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋Š” ์ •๋ณด์ฃผ์ฒด์˜ ๊ฐœ์ธ์ •๋ณด ์—ด๋žŒ ์ฒญ๊ตฌ๊ฐ€ ์‹ ์†ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

+

โ–ถ ๊ฐœ์ธ์ •๋ณด ์—ด๋žŒ์ฒญ๊ตฌ ์ ‘์ˆ˜โ€ค์ฒ˜๋ฆฌ ๋ถ€์„œ

+ + +

์ œ12์กฐ (๊ถŒ์ต์นจํ•ด ๊ตฌ์ œ ๋ฐฉ๋ฒ•)

+

์ •๋ณด์ฃผ์ฒด๋Š” ์•„๋ž˜์˜ ๊ธฐ๊ด€์— ๋Œ€ํ•ด ๊ฐœ์ธ์ •๋ณด ์นจํ•ด์— ๋Œ€ํ•œ ํ”ผํ•ด๊ตฌ์ œ, ์ƒ๋‹ด ๋“ฑ์„ ๋ฌธ์˜ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+

โ–ถ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด์‹ ๊ณ ์„ผํ„ฐ (ํ•œ๊ตญ์ธํ„ฐ๋„ท์ง„ํฅ์› ์šด์˜)

+
    +
  • ์†Œ๊ด€ ์—…๋ฌด : ๊ฐœ์ธ์ •๋ณด ์นจํ•ด์‚ฌ์‹ค ์‹ ๊ณ , ์ƒ๋‹ด ์‹ ์ฒญ
  • +
  • ํ™ˆํŽ˜์ด์ง€ : privacy.kisa.or.kr
  • +
  • ์ „ํ™” : (๊ตญ๋ฒˆ์—†์ด) 118
  • +
  • ์ฃผ์†Œ : (58324) ์ „๋‚จ ๋‚˜์ฃผ์‹œ ์ง„ํฅ๊ธธ 9(๋น›๊ฐ€๋žŒ๋™ 301-2) 3์ธต ๊ฐœ์ธ์ •๋ณด์นจํ•ด์‹ ๊ณ ์„ผํ„ฐ
  • +
+

โ–ถ ๊ฐœ์ธ์ •๋ณด ๋ถ„์Ÿ์กฐ์ •์œ„์›ํšŒ

+
    +
  • ์†Œ๊ด€ ์—…๋ฌด : ๊ฐœ์ธ์ •๋ณด ๋ถ„์Ÿ์กฐ์ • ์‹ ์ฒญ, ์ง‘๋‹จ๋ถ„์Ÿ์กฐ์ • (๋ฏผ์‚ฌ์  ํ•ด๊ฒฐ)
  • +
  • ํ™ˆํŽ˜์ด์ง€ : www.kopico.go.kr
  • +
  • ์ „ํ™” : (๊ตญ๋ฒˆ์—†์ด) 1833-6972
  • +
  • ์ฃผ์†Œ : (03171) ์„œ์šธํŠน๋ณ„์‹œ ์ข…๋กœ๊ตฌ ์„ธ์ข…๋Œ€๋กœ 209 ์ •๋ถ€์„œ์šธ์ฒญ์‚ฌ 4์ธต
  • +
+

โ–ถ ๋Œ€๊ฒ€์ฐฐ์ฒญ ๊ณผํ•™์ˆ˜์‚ฌ๋ถ€ (์‚ฌ์ด๋ฒ„์ˆ˜์‚ฌ๊ณผ)

+
    +
  • ์†Œ๊ด€ ์—…๋ฌด : ๊ฐœ์ธ์ •๋ณด ์นจํ•ด์‚ฌ์‹ค ์‹ ๊ณ , ์ˆ˜์‚ฌ ์˜๋ขฐ
  • +
  • ํ™ˆํŽ˜์ด์ง€ : www.spo.go.kr
  • +
  • ์ „ํ™” : (๊ตญ๋ฒˆ์—†์ด) 1301
  • +
  • ์ฃผ์†Œ : (335-804) ๋Œ€์ „๊ด‘์—ญ์‹œ ์œ ์„ฑ๊ตฌ ๋Œ€ํ•™๋กœ 101 ๋Œ€๊ฒ€์ฐฐ์ฒญ ๊ณผํ•™์ˆ˜์‚ฌ๋ถ€ (์‚ฌ์ด๋ฒ„์ˆ˜์‚ฌ๊ณผ)
  • +
+ +

์ œ13์กฐ (๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋ณ€๊ฒฝ)

+

โ‘  ์ด ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์€ ์‹œํ–‰์ผ๋กœ๋ถ€ํ„ฐ ์ ์šฉ๋˜๋ฉฐ, ๋ฒ•๋ น ๋ฐ ๋ฐฉ์นจ์— ๋”ฐ๋ฅธ ๋ณ€๊ฒฝ๋‚ด์šฉ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ ๋ฐ ์ •์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์‹œํ–‰ 7์ผ ์ „๋ถ€ํ„ฐ ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•˜์—ฌ ๊ณ ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+

โ‘ก ์ด ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์€ 2022๋…„ 1์›” 1์ผ๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

+ + + + diff --git a/Match-Api/src/main/resources/templates/TermsConditions.html b/Match-Api/src/main/resources/templates/TermsConditions.html new file mode 100644 index 00000000..30034e6b --- /dev/null +++ b/Match-Api/src/main/resources/templates/TermsConditions.html @@ -0,0 +1,126 @@ + + + + + ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ + + +

์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€

+ +

์ œ1์กฐ ๋ชฉ์ 

+

๋ณธ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์€ โ€œ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ์˜จ ํˆฌ๋ช…ํ•œ ๊ธฐ๋ถ€ ํ”Œ๋žซํผ MATCH | ๋งค์น˜ ํ”Œ๋žซํผ ๊ณต์‹์‚ฌ์ดํŠธโ€(์ดํ•˜ "์‚ฌ์ดํŠธ")์˜ ์„œ๋น„์Šค์˜ ์ด์šฉ์กฐ๊ฑด๊ณผ ์šด์˜์— ๊ด€ํ•œ ์ œ๋ฐ˜ ์‚ฌํ•ญ ๊ทœ์ •์„ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

+ +

์ œ2์กฐ ์šฉ์–ด์˜ ์ •์˜

+

๋ณธ ์•ฝ๊ด€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š”ํ•œ ์šฉ์–ด์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+
    +
  1. ํšŒ์›: ์‚ฌ์ดํŠธ์˜ ์•ฝ๊ด€์— ๋™์˜ํ•˜๊ณ  ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํšŒ์›๋“ฑ๋ก์„ ํ•œ ์ž๋กœ์„œ, ์‚ฌ์ดํŠธ์™€์˜ ์ด์šฉ๊ณ„์•ฝ์„ ์ฒด๊ฒฐํ•˜๊ณ  ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ์ด์šฉ์ž๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ์ด์šฉ๊ณ„์•ฝ: ์‚ฌ์ดํŠธ ์ด์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์‚ฌ์ดํŠธ์™€ ํšŒ์›๊ฐ„์— ์ฒด๊ฒฐํ•˜๋Š” ๊ณ„์•ฝ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  4. +
  5. ํšŒ์› ์•„์ด๋””(์ดํ•˜ "ID"): ํšŒ์›์˜ ์‹๋ณ„๊ณผ ํšŒ์›์˜ ์„œ๋น„์Šค ์ด์šฉ์„ ์œ„ํ•˜์—ฌ ํšŒ์›๋ณ„๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ž์™€ ์ˆซ์ž์˜ ์กฐํ•ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  6. +
  7. ๋น„๋ฐ€๋ฒˆํ˜ธ: ํšŒ์›์ด ๋ถ€์—ฌ๋ฐ›์€ ID์™€ ์ผ์น˜๋œ ํšŒ์›์ž„์„ ํ™•์ธํ•˜๊ณ  ํšŒ์›์˜ ๊ถŒ์ต ๋ณดํ˜ธ๋ฅผ ์œ„ํ•˜์—ฌ ํšŒ์›์ด ์„ ์ •ํ•œ ๋ฌธ์ž์™€ ์ˆซ์ž์˜ ์กฐํ•ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  8. +
  9. ์šด์˜์ž: ์„œ๋น„์Šค์— ํ™ˆํŽ˜์ด์ง€๋ฅผ ๊ฐœ์„คํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ์šด์˜์ž๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  10. +
  11. ํ•ด์ง€: ํšŒ์›์ด ์ด์šฉ๊ณ„์•ฝ์„ ํ•ด์•ฝํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  12. +
+ +

์ œ3์กฐ ์•ฝ๊ด€ ์™ธ ์ค€์น™

+

์šด์˜์ž๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ์šด์˜์ •์ฑ…์„ ๊ณต์ง€ ์•ˆ๋‚ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณธ ์•ฝ๊ด€๊ณผ ์šด์˜์ •์ฑ…์ด ์ค‘์ฒฉ๋  ๊ฒฝ์šฐ ์šด์˜์ •์ฑ…์ด ์šฐ์„  ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

+ +

์ œ4์กฐ ์ด์šฉ๊ณ„์•ฝ ์ฒด๊ฒฐ

+

์ด์šฉ๊ณ„์•ฝ์€ ํšŒ์›์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋ ค๋Š” ์ž์˜ ๋ณธ ์•ฝ๊ด€ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๋™์˜์™€ ๊ฐ€์ž…์‹ ์ฒญ์— ๋Œ€ํ•˜์—ฌ ์šด์˜์ž์˜ ์ด์šฉ์Šน๋‚™์œผ๋กœ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.

+ +

์ œ5์กฐ ์„œ๋น„์Šค ์ด์šฉ ์‹ ์ฒญ

+
    +
  1. ํšŒ์›์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋ ค๋Š” ์ด์šฉ์ž๋Š” ์‚ฌ์ดํŠธ์—์„œ ์š”์ฒญํ•˜๋Š” ์ œ๋ฐ˜์ •๋ณด(์ด์šฉ์žID,๋น„๋ฐ€๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ํƒ€์ธ์˜ ์ •๋ณด๋ฅผ ๋„์šฉํ•˜๊ฑฐ๋‚˜ ํ—ˆ์œ„์˜ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋“ฑ ๋ณธ์ธ์˜ ์ง„์ •ํ•œ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์€ ํšŒ์›์€ ์‚ฌ์ดํŠธ ์ด์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์•„๋ฌด๋Ÿฐ ๊ถŒ๋ฆฌ๋ฅผ ์ฃผ์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ด€๊ณ„ ๋ฒ•๋ น์— ๋”ฐ๋ผ ์ฒ˜๋ฒŒ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. +
+ +

์ œ6์กฐ ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ

+

์‚ฌ์ดํŠธ ๋ฐ ์šด์˜์ž๋Š” ํšŒ์›๊ฐ€์ž… ์‹œ ์ œ๊ณตํ•œ ๊ฐœ์ธ์ •๋ณด ์ค‘ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์ด์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์‚ฌ์ดํŠธ์˜ ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

+

์šด์˜์ž๋Š” ๊ด€๊ณ„ ๋ฒ•๋ น์ด ์ •ํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ ํšŒ์›๋“ฑ๋ก์ •๋ณด๋ฅผ ํฌํ•จํ•œ ํšŒ์›์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

+

ํšŒ์›์˜ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ์— ๊ด€ํ•˜์—ฌ ๊ด€๊ณ„๋ฒ•๋ น ๋ฐ ์‚ฌ์ดํŠธ๊ฐ€ ์ •ํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ์— ์ •ํ•œ ๋ฐ”์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

+

๋‹จ, ํšŒ์›์˜ ๊ท€์ฑ… ์‚ฌ์œ ๋กœ ์ธํ•ด ๋…ธ์ถœ๋œ ์ •๋ณด์— ๋Œ€ํ•ด ์šด์˜์ž๋Š” ์ผ์ฒด์˜ ์ฑ…์ž„์„ ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+

์šด์˜์ž๋Š” ํšŒ์›์ด ๋ฏธํ’์–‘์†์— ์ €ํ•ด๋˜๊ฑฐ๋‚˜ ๊ตญ๊ฐ€์•ˆ๋ณด์— ์œ„๋ฐฐ๋˜๋Š” ๊ฒŒ์‹œ๋ฌผ ๋“ฑ ์œ„๋ฒ•ํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ๋“ฑ๋ก ยท ๋ฐฐํฌํ•  ๊ฒฝ์šฐ ๊ด€๋ จ ๊ธฐ๊ด€์˜ ์š”์ฒญ์ด ์žˆ์„ ์‹œ ํšŒ์›์˜ ์ž๋ฃŒ๋ฅผ ์—ด๋žŒ ๋ฐ ํ•ด๋‹น ์ž๋ฃŒ๋ฅผ ๊ด€๋ จ ๊ธฐ๊ด€์— ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+ +

์ œ7์กฐ ์šด์˜์ž์˜ ์˜๋ฌด

+
    +
  1. ์šด์˜์ž๋Š” ์ด์šฉํšŒ์›์œผ๋กœ๋ถ€ํ„ฐ ์ œ๊ธฐ๋˜๋Š” ์˜๊ฒฌ์ด๋‚˜ ๋ถˆ๋งŒ์ด ์ •๋‹นํ•˜๋‹ค๊ณ  ์ธ์ •ํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๊ธ‰์  ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๊ฐœ์ธ์ ์ธ ์‚ฌ์ •์œผ๋กœ ์‹ ์†ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌํ›„์— ๊ณต์ง€ ๋˜๋Š” ์ด์šฉํšŒ์›์—๊ฒŒ ์ชฝ์ง€, ์ „์ž์šฐํŽธ ๋“ฑ์„ ๋ณด๋‚ด๋Š” ๋“ฑ ์ตœ์„ ์„ ๋‹คํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ์šด์˜์ž๋Š” ๊ณ„์†์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์‚ฌ์ดํŠธ ์ œ๊ณต์„ ์œ„ํ•˜์—ฌ ์„ค๋น„์— ์žฅ์• ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์œ ์‹ค๋œ ๋•Œ์—๋Š” ์ด๋ฅผ ์ง€์ฒด ์—†์ด ์ˆ˜๋ฆฌ ๋˜๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์ดํŠธ์— ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ฒœ์žฌ์ง€๋ณ€ ๋˜๋Š” ์‚ฌ์ดํŠธ๋‚˜ ์šด์˜์ž์— ๋ถ€๋“์ดํ•œ ์‚ฌ์œ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์‚ฌ์ดํŠธ ์šด์˜์„ ์ผ์‹œ ์ •์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. +
+ +

์ œ8์กฐ ํšŒ์›์˜ ์˜๋ฌด

+
    +
  1. ํšŒ์›์€ ๋ณธ ์•ฝ๊ด€์—์„œ ๊ทœ์ •ํ•˜๋Š” ์‚ฌํ•ญ๊ณผ ์šด์˜์ž๊ฐ€ ์ •ํ•œ ์ œ๋ฐ˜ ๊ทœ์ •, ๊ณต์ง€์‚ฌํ•ญ ๋ฐ ์šด์˜์ •์ฑ… ๋“ฑ ์‚ฌ์ดํŠธ๊ฐ€ ๊ณต์ง€ํ•˜๋Š” ์‚ฌํ•ญ ๋ฐ ๊ด€๊ณ„ ๋ฒ•๋ น์„ ์ค€์ˆ˜ํ•˜์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ธฐํƒ€ ์‚ฌ์ดํŠธ์˜ ์—…๋ฌด์— ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ํ–‰์œ„, ์‚ฌ์ดํŠธ์˜ ๋ช…์˜ˆ๋ฅผ ์†์ƒํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  2. +
  3. ํšŒ์›์€ ์‚ฌ์ดํŠธ์˜ ๋ช…์‹œ์  ๋™์˜๊ฐ€ ์—†๋Š” ํ•œ ์„œ๋น„์Šค์˜ ์ด์šฉ ๊ถŒํ•œ, ๊ธฐํƒ€ ์ด์šฉ๊ณ„์•ฝ์ƒ ์ง€์œ„๋ฅผ ํƒ€์ธ์—๊ฒŒ ์–‘๋„, ์ฆ์—ฌํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋ฅผ ๋‹ด๋ณด๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. +
  5. ์ด์šฉ๊ณ ๊ฐ์€ ์•„์ด๋”” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ฆฌ์— ์ƒ๋‹นํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๋ฉฐ, ์šด์˜์ž๋‚˜ ์‚ฌ์ดํŠธ์˜ ๋™์˜ ์—†์ด ์ œ3์ž์—๊ฒŒ ์•„์ด๋””๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ด์šฉํ•˜๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  6. +
  7. ํšŒ์›์€ ์šด์˜์ž์™€ ์‚ฌ์ดํŠธ ๋ฐ ์ œ3์ž์˜ ์ง€์  ์žฌ์‚ฐ๊ถŒ์„ ์นจํ•ดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  8. +
+ +

์ œ9์กฐ ์„œ๋น„์Šค ์ด์šฉ ์‹œ๊ฐ„

+
    +
  1. ์„œ๋น„์Šค ์ด์šฉ ์‹œ๊ฐ„์€ ์—…๋ฌด์ƒ ๋˜๋Š” ๊ธฐ์ˆ ์ƒ ํŠน๋ณ„ํ•œ ์ง€์žฅ์ด ์—†๋Š” ํ•œ ์—ฐ์ค‘๋ฌดํœด 1์ผ 24์‹œ๊ฐ„์„ ์›์น™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์‚ฌ์ดํŠธ๋Š” ์‹œ์Šคํ…œ ์ •๊ธฐ์ ๊ฒ€, ์ฆ์„ค ๋ฐ ๊ต์ฒด๋ฅผ ์œ„ํ•ด ์‚ฌ์ดํŠธ๊ฐ€ ์ •ํ•œ ๋‚ ์ด๋‚˜ ์‹œ๊ฐ„์— ์„œ๋น„์Šค๋ฅผ ์ผ์‹œ์ค‘๋‹จ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ˆ์ •๋œ ์ž‘์—…์œผ๋กœ ์ธํ•œ ์„œ๋น„์Šค ์ผ์‹œ ์ค‘๋‹จ์€ ์‚ฌ์ดํŠธ์˜ ํ™ˆํŽ˜์ด์ง€์— ์‚ฌ์ „์— ๊ณต์ง€ํ•˜์˜ค๋‹ˆ ์ˆ˜์‹œ๋กœ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  2. +
  3. ๋‹จ, ์‚ฌ์ดํŠธ๋Š” ๋‹ค์Œ ๊ฒฝ์šฐ์— ๋Œ€ํ•˜์—ฌ ์‚ฌ์ „ ๊ณต์ง€๋‚˜ ์˜ˆ๊ณ  ์—†์ด ์„œ๋น„์Šค๋ฅผ ์ผ์‹œ์  ํ˜น์€ ์˜๊ตฌ์ ์œผ๋กœ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. +
+ +

์ œ10์กฐ ์„œ๋น„์Šค ์ด์šฉ ํ•ด์ง€

+
    +
  1. ํšŒ์›์ด ์‚ฌ์ดํŠธ์™€์˜ ์ด์šฉ๊ณ„์•ฝ์„ ํ•ด์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํšŒ์› ๋ณธ์ธ์ด ์˜จ๋ผ์ธ์„ ํ†ตํ•˜์—ฌ ๋“ฑ๋กํ•ด์ง€ ์‹ ์ฒญ์„ ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, ์‚ฌ์ดํŠธ ์ด์šฉ ํ•ด์ง€์™€ ๋ณ„๋„๋กœ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ด์šฉ๊ณ„์•ฝ ํ•ด์ง€๋Š” ๋ณ„๋„๋กœ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ํ•ด์ง€ ์‹ ์ฒญ๊ณผ ๋™์‹œ์— ์‚ฌ์ดํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ดํŠธ ๊ด€๋ จ ํ”„๋กœ๊ทธ๋žจ์ด ํšŒ์› ๊ด€๋ฆฌ ํ™”๋ฉด์—์„œ ์ž๋™์ ์œผ๋กœ ์‚ญ์ œ๋จ์œผ๋กœ ์šด์˜์ž๋Š” ๋” ์ด์ƒ ํ•ด์ง€์‹ ์ฒญ์ž์˜ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. +
+ +

์ œ11์กฐ ์„œ๋น„์Šค ์ด์šฉ ์ œํ•œ

+

ํšŒ์›์€ ๋‹ค์Œ ๊ฐํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•˜์—ฌ์„œ๋Š” ์•„๋‹ˆ ๋˜๋ฉฐ ํ•ด๋‹น ํ–‰์œ„๋ฅผ ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์ดํŠธ๋Š” ํšŒ์›์˜ ์„œ๋น„์Šค ์ด์šฉ ์ œํ•œ ๋ฐ ์ ๋ฒ•ํ•œ ์กฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด์šฉ๊ณ„์•ฝ์„ ํ•ด์ง€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๊ฐ„์„ ์ •ํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+
    +
  1. ํšŒ์› ๊ฐ€์ž…์‹œ ํ˜น์€ ๊ฐ€์ž… ํ›„ ์ •๋ณด ๋ณ€๊ฒฝ ์‹œ ํ—ˆ์œ„ ๋‚ด์šฉ์„ ๋“ฑ๋กํ•˜๋Š” ํ–‰์œ„
  2. +
  3. ํƒ€์ธ์˜ ์‚ฌ์ดํŠธ ์ด์šฉ์„ ๋ฐฉํ•ดํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ๋„์šฉํ•˜๋Š” ํ–‰์œ„
  4. +
  5. ์‚ฌ์ดํŠธ์˜ ์šด์˜์ง„, ์ง์› ๋˜๋Š” ๊ด€๊ณ„์ž๋ฅผ ์‚ฌ์นญํ•˜๋Š” ํ–‰์œ„
  6. +
  7. ์‚ฌ์ดํŠธ, ๊ธฐํƒ€ ์ œ3์ž์˜ ์ธ๊ฒฉ๊ถŒ ๋˜๋Š” ์ง€์ ์žฌ์‚ฐ๊ถŒ์„ ์นจํ•ดํ•˜๊ฑฐ๋‚˜ ์—…๋ฌด๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ํ–‰์œ„
  8. +
  9. ๋‹ค๋ฅธ ํšŒ์›์˜ ID๋ฅผ ๋ถ€์ •ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ–‰์œ„
  10. +
  11. ๋‹ค๋ฅธ ํšŒ์›์— ๋Œ€ํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๊ทธ ๋™์˜ ์—†์ด ์ˆ˜์ง‘, ์ €์žฅ, ๊ณต๊ฐœํ•˜๋Š” ํ–‰์œ„
  12. +
  13. ๋ฒ”์ฃ„์™€ ๊ฒฐ๋ถ€๋œ๋‹ค๊ณ  ๊ฐ๊ด€์ ์œผ๋กœ ํŒ๋‹จ๋˜๋Š” ํ–‰์œ„
  14. +
  15. ๊ธฐํƒ€ ๊ด€๋ จ ๋ฒ•๋ น์— ์œ„๋ฐฐ๋˜๋Š” ํ–‰์œ„
  16. +
+ +

์ œ12์กฐ ๊ฒŒ์‹œ๋ฌผ์˜ ๊ด€๋ฆฌ

+
    +
  1. ์‚ฌ์ดํŠธ์˜ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ž๋ฃŒ์˜ ๊ด€๋ฆฌ ๋ฐ ์šด์˜์˜ ์ฑ…์ž„์€ ์šด์˜์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž๋Š” ํ•ญ์ƒ ๋ถˆ๋Ÿ‰ ๊ฒŒ์‹œ๋ฌผ ๋ฐ ์ž๋ฃŒ์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜์—ฌ์•ผ ํ•˜๋ฉฐ, ๋ถˆ๋Ÿ‰ ๊ฒŒ์‹œ๋ฌผ ๋ฐ ์ž๋ฃŒ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฑฐ๋‚˜ ์‹ ๊ณ ๋ฅผ ๋ฐ›์œผ๋ฉด ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ ๋ฐ ์ž๋ฃŒ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ด๋ฅผ ๋“ฑ๋กํ•œ ํšŒ์›์—๊ฒŒ ์ฃผ์˜๋ฅผ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. +
  3. ํ•œํŽธ, ์ด์šฉํšŒ์›์ด ์˜ฌ๋ฆฐ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฒŒ์‹œ์ž ๋ณธ์ธ์—๊ฒŒ ์ฑ…์ž„์ด ์žˆ์œผ๋‹ˆ ํšŒ์› ์Šค์Šค๋กœ ๋ณธ ์ด์šฉ์•ฝ๊ด€์—์„œ ์œ„๋ฐฐ๋˜๋Š” ๊ฒŒ์‹œ๋ฌผ์€ ๊ฒŒ์žฌํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  4. +
  5. ์ •๋ณดํ†ต์‹ ์œค๋ฆฌ์œ„์›ํšŒ ๋“ฑ ๊ณต๊ณต๊ธฐ๊ด€์˜ ์‹œ์ •์š”๊ตฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์šด์˜์ž๋Š” ํšŒ์›์˜ ์‚ฌ์ „๋™์˜ ์—†์ด ๊ฒŒ์‹œ๋ฌผ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ด๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. +
  7. ๋ถˆ๋Ÿ‰๊ฒŒ์‹œ๋ฌผ์˜ ํŒ๋‹จ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. +
      +
    • ๋‹ค๋ฅธ ํšŒ์› ๋˜๋Š” ์ œ3์ž์—๊ฒŒ ์‹ฌํ•œ ๋ชจ์š•์„ ์ฃผ๊ฑฐ๋‚˜ ๋ช…์˜ˆ๋ฅผ ์†์ƒํ•˜๋Š” ๋‚ด์šฉ์ธ ๊ฒฝ์šฐ
    • +
    • ๊ณต๊ณต์งˆ์„œ ๋ฐ ๋ฏธํ’์–‘์†์— ์œ„๋ฐ˜๋˜๋Š” ๋‚ด์šฉ์„ ์œ ํฌํ•˜๊ฑฐ๋‚˜ ๋งํฌ ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ
    • +
    • ๋ถˆ๋ฒ• ๋ณต์ œ ๋˜๋Š” ํ•ดํ‚น์„ ์กฐ์žฅํ•˜๋Š” ๋‚ด์šฉ์ธ ๊ฒฝ์šฐ
    • +
    • ์˜๋ฆฌ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๊ด‘๊ณ ์ผ ๊ฒฝ์šฐ
    • +
    • ๋ฒ”์ฃ„์™€ ๊ฒฐ๋ถ€๋œ๋‹ค๊ณ  ๊ฐ๊ด€์ ์œผ๋กœ ์ธ์ •๋˜๋Š” ๋‚ด์šฉ์ผ ๊ฒฝ์šฐ
    • +
    • ๋‹ค๋ฅธ ์ด์šฉ์ž ๋˜๋Š” ์ œ3์ž์™€ ์ €์ž‘๊ถŒ ๋“ฑ ๊ธฐํƒ€ ๊ถŒ๋ฆฌ๋ฅผ ์นจํ•ดํ•˜๋Š” ๊ฒฝ์šฐ
    • +
    • ๊ธฐํƒ€ ๊ด€๊ณ„ ๋ฒ•๋ น์— ์œ„๋ฐฐ๋œ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ
    • +
    +
  8. +
  9. ์‚ฌ์ดํŠธ ๋ฐ ์šด์˜์ž๋Š” ๊ฒŒ์‹œ๋ฌผ ๋“ฑ์— ๋Œ€ํ•˜์—ฌ ์ œ3์ž๋กœ๋ถ€ํ„ฐ ๋ช…์˜ˆํ›ผ์†, ์ง€์ ์žฌ์‚ฐ๊ถŒ ๋“ฑ์˜ ๊ถŒ๋ฆฌ ์นจํ•ด๋ฅผ ์ด์œ ๋กœ ๊ฒŒ์‹œ์ค‘๋‹จ ์š”์ฒญ์„ ๋ฐ›์€ ๊ฒฝ์šฐ ์ด๋ฅผ ์ž„์‹œ๋กœ ๊ฒŒ์‹œ์ค‘๋‹จ(์ „์†ก์ค‘๋‹จ)ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒŒ์‹œ์ค‘๋‹จ ์š”์ฒญ์ž์™€ ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก์ž ๊ฐ„์— ์†Œ์†ก, ํ•ฉ์˜ ๊ธฐํƒ€ ์ด์— ์ค€ํ•˜๋Š” ๊ด€๋ จ ๊ธฐ๊ด€์˜ ๊ฒฐ์ • ๋“ฑ์ด ์ด๋ฃจ์–ด์ ธ ์‚ฌ์ดํŠธ์— ์ ‘์ˆ˜๋œ ๊ฒฝ์šฐ ์ด์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  10. +
+ +

์ œ13์กฐ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ณด๊ด€

+

์‚ฌ์ดํŠธ ์šด์˜์ž๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•œ ์‚ฌ์ •์œผ๋กœ ๋ณธ ์‚ฌ์ดํŠธ๋ฅผ ์ค‘๋‹จํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, ํšŒ์›์—๊ฒŒ ์‚ฌ์ „ ๊ณต์ง€๋ฅผ ํ•˜๊ณ  ๊ฒŒ์‹œ๋ฌผ์˜ ์ด์ „์ด ์‰ฝ๋„๋ก ๋ชจ๋“  ์กฐ์น˜๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

+ +

์ œ14์กฐ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ €์ž‘๊ถŒ

+
    +
  1. ํšŒ์›์ด ์‚ฌ์ดํŠธ ๋‚ด์— ๊ฒŒ์‹œํ•œ ๊ฒŒ์‹œ๋ฌผ์˜ ์ €์ž‘๊ถŒ์€ ๊ฒŒ์‹œํ•œ ํšŒ์›์—๊ฒŒ ๊ท€์†๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์ดํŠธ๋Š” ๊ฒŒ์‹œ์ž์˜ ๋™์˜ ์—†์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ƒ์—…์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋น„์˜๋ฆฌ ๋ชฉ์ ์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ๋Ÿฌํ•˜์ง€ ์•„๋‹ˆํ•˜๋ฉฐ, ๋˜ํ•œ ์„œ๋น„์Šค ๋‚ด์˜ ๊ฒŒ์žฌ๊ถŒ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  2. +
  3. ํšŒ์›์€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ทจ๋“ํ•œ ์ •๋ณด๋ฅผ ์ž„์˜ ๊ฐ€๊ณต, ํŒ๋งคํ•˜๋Š” ํ–‰์œ„ ๋“ฑ ์„œ๋น„์Šค์— ๊ฒŒ์žฌ๋œ ์ž๋ฃŒ๋ฅผ ์ƒ์—…์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. +
  5. ์šด์˜์ž๋Š” ํšŒ์›์ด ๊ฒŒ์‹œํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋กํ•˜๋Š” ์‚ฌ์ดํŠธ ๋‚ด์˜ ๋‚ด์šฉ๋ฌผ, ๊ฒŒ์‹œ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ œ12์กฐ ๊ฐํ˜ธ์— ํ•ด๋‹นํ•œ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์ „ํ†ต์ง€ ์—†์ด ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ด๋™ ๋˜๋Š” ๋“ฑ๋ก ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. +
+ +

์ œ15์กฐ ์†ํ•ด๋ฐฐ์ƒ

+
    +
  1. ๋ณธ ์‚ฌ์ดํŠธ์˜ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ฏผ, ํ˜•๋ฒ•์ƒ ์ฑ…์ž„์€ ํšŒ์› ๋ณธ์ธ์—๊ฒŒ 1์ฐจ์ ์œผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. +
  3. ๋ณธ ์‚ฌ์ดํŠธ๋กœ๋ถ€ํ„ฐ ํšŒ์›์ด ๋ฐ›์€ ์†ํ•ด๊ฐ€ ์ฒœ์žฌ์ง€๋ณ€, ์ „์Ÿ, ๊ธฐ๊ฐ„ํ†ต์‹  ์‚ฌ๊ณ , ํ•ด๊ฒฐ์ด ๊ณค๋ž€ํ•œ ๊ธฐ์ˆ ์  ๊ฒฐํ•จ ๊ธฐํƒ€ ๋น„์ƒ์‚ฌํƒœ ๋“ฑ ๋ถˆ๊ฐ€ํ•ญ๋ ฅ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ฑ…์ž„์ด ๋ฉด์ œ๋ฉ๋‹ˆ๋‹ค.
  4. +
+ +

์ œ16์กฐ ๋ฉด์ฑ… ์กฐํ•ญ

+

์šด์˜์ž๋Š” ํšŒ์›์˜ ๋…ธ๋ ฅ๊ณผ ์šด์˜์ž์˜ ์ง€์‹๊ณผ ๊ฒฝํ—˜์— ๋”ฐ๋ผ ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ํ•˜์ž๊ฐ€ ์—†๋Š” ์ด์ƒ, ์‹ ๋ขฐ์„ฑ์ด๋‚˜ ์•ˆ์ •์„ฑ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ฌ์ดํŠธ ๋ฐ ์šด์˜์ž๋Š” ๋ฉด์ฑ…๋ฉ๋‹ˆ๋‹ค.

+ +

์ œ17์กฐ ๊ด€ํ•  ๋ฒ•์›

+

์‚ฌ์ดํŠธ ์ด์šฉ ์ค‘ ๋ฐœ์ƒํ•œ ๋ถ„์Ÿ์— ๋Œ€ํ•ด ์†Œ์†ก์ด ์ œ๊ธฐ๋  ๊ฒฝ์šฐ ๊ด€ํ•  ๋ฒ•์›์€ ์šด์˜์ž ์†Œ์žฌ์ง€์˜ ๋ฒ•์›์„ ํ•ฉ๋‹ˆ๋‹ค.

+ +

์ด์ƒ์œผ๋กœ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ๊ณผ ์ด์šฉ์•ฝ๊ด€์„ HTML ํ˜•์‹์œผ๋กœ ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€, ์‚ญ์ œ ๋˜๋Š” ์ˆ˜์ •ํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ์— ๊ฒŒ์‹œํ•˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ๊ณผ ์ด์šฉ์•ฝ๊ด€์€ ๋ฒ•๋ฅ ์ ์ธ ์š”๊ตฌ๋ฅผ ์ค€์ˆ˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์™€ ์›น์‚ฌ์ดํŠธ์˜ ์šด์˜์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

+ + + \ No newline at end of file From 27587b2fdf0e4e97068afa5fab31096f2258faaa Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Wed, 25 Oct 2023 15:00:41 +0900 Subject: [PATCH 69/82] =?UTF-8?q?:memo:=20:=20Swagger=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=ED=83=9C=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/banner/controller/AdminBannerController.java | 4 ++++ .../matchapi/admin/event/controller/AdminEventController.java | 4 ++++ .../admin/notice/controller/AdminNoticeController.java | 4 ++++ .../java/com/example/matchapi/common/HealthController.java | 2 ++ .../example/matchapi/event/controller/EventController.java | 2 +- .../example/matchapi/notice/controller/NoticeController.java | 2 +- .../notification/controller/NotificationController.java | 2 +- Match-Api/src/main/resources/application.yml | 1 + 8 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java b/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java index 1c185531..1cb03655 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/banner/controller/AdminBannerController.java @@ -5,6 +5,8 @@ import com.example.matchapi.banner.dto.BannerRes; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchdomain.banner.enums.BannerType; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -16,9 +18,11 @@ @RequiredArgsConstructor @Slf4j @RequestMapping("/admin/banners") +@Tag(name = "ADMIN-08-Banner๐Ÿ’ณ ๊ด€๋ฆฌ์ž ๋ฐฐ๋„ˆ ๊ด€๋ฆฌ API") public class AdminBannerController { private final AdminBannerService adminBannerService; @PostMapping("") + @Operation(summary = "ADMIN-08-01 ๋ฐฐ๋„ˆ ์—…๋กœ๋“œ") public CommonResponse> uploadBanner( @RequestParam BannerType bannerType, @RequestPart MultipartFile bannerImage, diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java index e86ee3b7..e7eb9a14 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/event/controller/AdminEventController.java @@ -5,6 +5,8 @@ import com.example.matchapi.event.dto.EventRes; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchinfrastructure.config.s3.S3UploadService; +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.web.bind.annotation.*; @@ -15,10 +17,12 @@ @RestController @RequiredArgsConstructor @RequestMapping("/admin/events") +@Tag(name = "ADMIN-09-Event๐ŸŽ‰ ๊ด€๋ฆฌ์ž ์ด๋ฒคํŠธ ๊ด€๋ฆฌ API") public class AdminEventController { private final AdminEventService adminEventService; @PostMapping("") + @Operation(summary = "ADMIN-09-01 ์ด๋ฒคํŠธ ์—…๋กœ๋“œ") public CommonResponse uploadEventList(@RequestBody EventUploadReq eventUploadReq){ adminEventService.uploadEventList(eventUploadReq); return CommonResponse.onSuccess("์—…๋กœ๋“œ ์„ฑ๊ณต"); diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java index 445f46da..74f9f52d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/notice/controller/AdminNoticeController.java @@ -8,6 +8,8 @@ import com.example.matchcommon.reponse.CommonResponse; import com.example.matchdomain.notice.entity.Notice; import com.example.matchdomain.notice.entity.NoticeContent; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -20,10 +22,12 @@ @RestController @RequiredArgsConstructor @RequestMapping("/admin/notices") +@Tag(name = "ADMIN-10-Notice๐Ÿ“ ๊ด€๋ฆฌ์ž ๊ณต์ง€์‚ฌํ•ญ ๊ด€๋ฆฌ API") public class AdminNoticeController { private final AdminNoticeService adminNoticeService; private final AdminNoticeMapper mapper = AdminNoticeMapper.INSTANCE; @PostMapping("") + @Operation(summary = "ADMIN-10-01 ๊ณต์ง€์‚ฌํ•ญ ์—…๋กœ๋“œ") public CommonResponse uploadNoticeList(@Valid @RequestBody NoticeUploadReq noticeUploadReq){ adminNoticeService.uploadNoticeList(mapper.toEntityNoticeContents(noticeUploadReq.getContentsList()), mapper.toEntityNotice(noticeUploadReq)); return CommonResponse.onSuccess("์—…๋กœ๋“œ ์„ฑ๊ณต"); diff --git a/Match-Api/src/main/java/com/example/matchapi/common/HealthController.java b/Match-Api/src/main/java/com/example/matchapi/common/HealthController.java index d1c4f741..2ddfa90b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/HealthController.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/HealthController.java @@ -1,11 +1,13 @@ package com.example.matchapi.common; +import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/health") +@Tag(name = "Health Check ๐Ÿ‘‹") public class HealthController { @GetMapping("") public String healthCheck(){ diff --git a/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java index e3c8aaa7..b4a3f2cb 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/controller/EventController.java @@ -19,7 +19,7 @@ @RestController @RequestMapping("/events") @RequiredArgsConstructor -@Tag(name = "12-Event ๐ŸŽ‰ ์ด๋ฒคํŠธ ๊ด€๋ จ API") +@Tag(name = "12-Event ๐ŸŽ‰ ์ด๋ฒคํŠธ ๊ด€๋ จ API", description = "์ด๋ฒคํŠธ ๊ด€๋ จ API ์ž…๋‹ˆ๋‹ค.") public class EventController { private final EventService eventService; diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java index d8d1cf52..dfd43190 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/controller/NoticeController.java @@ -21,7 +21,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/notices") -@Tag(name = "11-Notice๐Ÿ“ ๊ณต์ง€์‚ฌํ•ญ API") +@Tag(name = "11-Notice๐Ÿ“ ๊ณต์ง€์‚ฌํ•ญ API", description = "๊ณต์ง€์‚ฌํ•ญ ๊ด€๋ จ API ์ž…๋‹ˆ๋‹ค.") public class NoticeController { private final NoticeService noticeService; diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java index a5109e6b..5bb59e11 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/controller/NotificationController.java @@ -20,7 +20,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/notifications") -@Tag(name = "10-Notification๐Ÿ”” ์•Œ๋ฆผ") +@Tag(name = "10-Notification๐Ÿ”” ์•Œ๋ฆผ", description = "์•Œ๋ฆผ ๊ด€๋ จ API ์ž…๋‹ˆ๋‹ค.") public class NotificationController { private final NotificationService notificationService; @ApiErrorCodeExample(UserAuthErrorCode.class) diff --git a/Match-Api/src/main/resources/application.yml b/Match-Api/src/main/resources/application.yml index 60ebeabb..54412c78 100644 --- a/Match-Api/src/main/resources/application.yml +++ b/Match-Api/src/main/resources/application.yml @@ -35,6 +35,7 @@ springdoc: path: demo-ui.html # Swagger UI ๊ฒฝ๋กœ => localhost:8000/demo-ui.html tags-sorter: alpha # alpha: ์•ŒํŒŒ๋ฒณ ์ˆœ ํƒœ๊ทธ ์ •๋ ฌ, method: HTTP Method ์ˆœ ์ •๋ ฌ operations-sorter: alpha # alpha: ์•ŒํŒŒ๋ฒณ ์ˆœ ํƒœ๊ทธ ์ •๋ ฌ, method: HTTP Method ์ˆœ ์ •๋ ฌ + doc-expansion: none api-docs: path: /api-docs/json groups: From e9dce1117cbb0f1c34255847db2547c17ffc19d6 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 26 Oct 2023 13:24:35 +0900 Subject: [PATCH 70/82] =?UTF-8?q?:recycle:=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=ED=8E=B8=EC=A7=91=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/user/controller/UserController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java index 720e003f..51dd9cf8 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/controller/UserController.java @@ -25,6 +25,7 @@ import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -125,10 +126,11 @@ public CommonResponse getProfile( @Operation(summary = "02-06 ํ”„๋กœํ•„ ํŽธ์ง‘ ๐Ÿ‘ค FRAME MY",description = "์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ multipart ์— ๋„ฃ์–ด์ฃผ์‹œ๊ณ , ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์•ˆํ•  ์‹œ multipart null ๊ฐ’์œผ๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š” ์•„์ด๋””๋Š” ๊ธฐ์กด ์•„์ด๋””๊ฐ’+๋ณ€๊ฒฝํ•  ์•„์ด๋””๊ฐ’ ๋‘˜์ค‘ ํ•˜๋‚˜ ๋ณด๋‚ด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค") @PatchMapping(value = "/profile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public CommonResponse modifyUserProfile(@ModelAttribute UserReq.ModifyProfile modifyProfile, - @AuthenticationPrincipal User user) throws IOException { - System.out.println(modifyProfile.getName()); - userService.modifyUserProfile(user, modifyProfile); + public CommonResponse modifyUserProfile( + @RequestParam(value = "name", required = false) String name, + @RequestPart(value = "multipartFile", required = false) MultipartFile multipartFile, + @AuthenticationPrincipal User user){ + userService.modifyUserProfile(user, new UserReq.ModifyProfile(name, multipartFile)); return CommonResponse.onSuccess("๋ณ€๊ฒฝ ์„ฑ๊ณต"); } From 18ed16cd6159b2638f16e9dc3f5d216648b8b46b Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:16:02 +0900 Subject: [PATCH 71/82] =?UTF-8?q?:recycle:=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../donation/convertor/DonationConvertor.java | 1 + .../convertor/RegularPaymentConvertor.java | 2 +- .../matchapi/donation/dto/DonationRes.java | 3 + .../donation/helper/DonationHelper.java | 3 +- .../service/DonationHistoryService.java | 31 +++++++ .../order/convertor/OrderConvertor.java | 24 ++++- .../matchapi/order/helper/OrderHelper.java | 22 ++++- .../matchapi/order/service/OrderService.java | 88 ++++++++----------- .../portone/service/PaymentService.java | 6 +- .../donation/adaptor/DonationAdaptor.java | 4 + .../adaptor/DonationHistoryAdaptor.java | 4 + .../repository/DonationUserRepository.java | 2 + .../user/adaptor/UserCardAdaptor.java | 26 ++++++ .../pay/portone/service/PortOneService.java | 23 +++++ 14 files changed, 182 insertions(+), 57 deletions(-) create mode 100644 Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserCardAdaptor.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index cd8fa7e2..b728250f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -196,6 +196,7 @@ public DonationRes.DonationFlame DonationFlame(int sequence, DonationUser donati .usages(donationUser.getProject().getUsages()) .amount(Math.toIntExact(donationUser.getPrice())) .sequence(sequence) + .randomMessage(donationHelper.createRandomMessage(donationUser.getDonationStatus())) .build(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java index dca39a1f..100f5f02 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java @@ -58,7 +58,7 @@ private DonationRes.BurningFlameDto BurningFlame(DonationUser donationUser) { .usages(donationUser.getProject().getUsages()) .image(donationUser.getFlameImage()) .inherenceName(donationUser.getInherenceName()) - .randomMessage(donationHelper.createRandomMessage()) + .randomMessage(donationHelper.createRandomMessage(donationUser.getDonationStatus())) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index b0b24975..a3b1494c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -179,6 +179,9 @@ public static class DonationFlame { @Schema(description = "์ƒ์„ฑ ์ˆœ์„œ 0์ผ์‹œ ๋‹จ์ผ ๊ธฐ๋ถ€(์ฆ‰ 1ํšŒ์„ฑ ๊ธฐ๋ถ€์ž…๋‹ˆ๋‹ค) ์ƒ์„ฑ ์ˆœ์„œ ํ‘œ์‹œ x", required = true, example = "2") private int sequence; + + + private String randomMessage; } @Getter diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java index 30b29692..a35715d2 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java @@ -2,6 +2,7 @@ import com.example.matchcommon.annotation.Helper; import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.donation.entity.enums.DonationStatus; import lombok.RequiredArgsConstructor; import java.text.DecimalFormat; @@ -19,7 +20,7 @@ public String parsePriceComma(int amount){ return decimalFormat.format(amount)+"์›"; } - public String createRandomMessage() { + public String createRandomMessage(DonationStatus donationStatus) { return "ํ•˜์ด"; } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java new file mode 100644 index 00000000..2b799496 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java @@ -0,0 +1,31 @@ +package com.example.matchapi.donation.service; + +import com.example.matchapi.donation.convertor.DonationConvertor; +import com.example.matchdomain.donation.adaptor.DonationHistoryAdaptor; +import com.example.matchdomain.donation.entity.DonationHistory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; +import static com.example.matchdomain.donation.entity.enums.HistoryStatus.TURN_ON; + +@Service +@RequiredArgsConstructor +public class DonationHistoryService { + private final DonationHistoryAdaptor donationHistoryAdaptor; + private final DonationConvertor donationConvertor; + + public void postRegularDonationHistory(Long regularPaymentId, Long donationId) { + saveDonationHistory(donationConvertor.DonationHistoryTurnOn(regularPaymentId, TURN_ON)); + + saveDonationHistory(donationConvertor.DonationHistory(donationId, CREATE)); + } + + public void saveDonationHistory(DonationHistory donationHistory){ + donationHistoryAdaptor.saveDonationHistory(donationHistory); + } + + public void oneTimeDonationHistory(Long donationId){ + saveDonationHistory(donationConvertor.DonationHistory(donationId, CREATE)); + } +} diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 3ac03b3e..671058f4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -18,6 +18,9 @@ import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; +import java.util.ArrayList; +import java.util.List; + import static java.lang.Integer.parseInt; @Convertor @@ -114,7 +117,7 @@ public OrderRequest CreateRequest(Long userId, Long projectId, String orderId) { .userId(String.valueOf(userId)) .projectId(String.valueOf(projectId)) .orderId(orderId) - .ttl(2000L) + .ttl(480L) .build(); } @@ -205,4 +208,23 @@ public OrderRes.CompleteDonation CompleteDonation(String name, Project project, .regularStatus(project.getRegularStatus().getName()) .build(); } + + public List convertToUserCardLists(List userCards) { + List userBillCards = new ArrayList<>(); + + userCards.forEach( + result -> { + userBillCards.add( + new OrderRes.UserBillCard( + result.getId(), + result.getCardCode().getName(), + result.getCardName(), + orderHelper.maskMiddleNum(result.getCardNo()), + result.getCardAbleStatus().getName() + ) + ); + } + ); + return userBillCards; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java index 48138d77..4dff7d41 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java @@ -3,17 +3,22 @@ import com.example.matchcommon.annotation.Helper; import com.example.matchcommon.exception.BaseException; import com.example.matchcommon.properties.NicePayProperties; +import com.example.matchdomain.donation.adaptor.DonationAdaptor; +import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.PayMethod; import com.example.matchdomain.donation.entity.flameEnum.Adjective; import com.example.matchdomain.donation.entity.flameEnum.AdjectiveFlame; import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.user.entity.User; import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; import com.example.matchinfrastructure.pay.nice.dto.NicePayCancelRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import java.util.Base64; +import java.util.List; import java.util.Random; +import java.util.stream.Collectors; import static com.example.matchcommon.constants.MatchStatic.BASIC; @@ -22,7 +27,7 @@ public class OrderHelper { private final NicePayProperties nicePayProperties; private final NiceAuthFeignClient niceAuthFeignClient; - private final DonationUserRepository donationUserRepository; + private final DonationAdaptor donationAdaptor; public PayMethod getPayMethod(String value) { for (PayMethod payMethod : PayMethod.values()) { @@ -49,11 +54,20 @@ public void checkNicePaymentsResult(String resultCode, String resultMessage) { } } - public String createFlameName(String name) { + public List getInherenceName(List donationUsers){ + return donationUsers.stream() + .map(DonationUser :: getInherenceName).collect(Collectors.toList()); + } + + public String createFlameName(User user) { + List donationUsers = donationAdaptor.findDonationListsByUser(user); + + List inherenceNames = getInherenceName(donationUsers); + String randomName; do { - randomName = name + "๋‹˜์˜ " + getRandomEnumValue(AdjectiveFlame.class).getValue() + " " + getRandomEnumValue(Adjective.class).getValue() + " ๋ถˆ๊ฝƒ์ด"; - } while (donationUserRepository.existsByInherenceName(randomName)); + randomName = user.getName() + "๋‹˜์˜ " + getRandomEnumValue(AdjectiveFlame.class).getValue() + " " + getRandomEnumValue(Adjective.class).getValue() + " ๋ถˆ๊ฝƒ์ด"; + } while (inherenceNames.contains(randomName)); return randomName; } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index 8106d489..c14be682 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -1,6 +1,6 @@ package com.example.matchapi.order.service; -import com.example.matchapi.donation.convertor.DonationConvertor; +import com.example.matchapi.donation.service.DonationHistoryService; import com.example.matchapi.order.convertor.OrderConvertor; import com.example.matchapi.order.dto.OrderReq; import com.example.matchapi.order.dto.OrderRes; @@ -10,9 +10,7 @@ import com.example.matchcommon.annotation.RedissonLock; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.exception.BaseException; -import com.example.matchcommon.exception.NotFoundException; import com.example.matchdomain.common.model.Status; -import com.example.matchdomain.donation.adaptor.DonationAdaptor; import com.example.matchdomain.donation.adaptor.RegularPaymentAdaptor; import com.example.matchdomain.donation.entity.*; import com.example.matchdomain.donation.entity.enums.CardAbleStatus; @@ -22,6 +20,7 @@ import com.example.matchdomain.donation.repository.*; import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.redis.repository.OrderRequestRepository; +import com.example.matchdomain.user.adaptor.UserCardAdaptor; import com.example.matchdomain.user.entity.User; import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; @@ -29,9 +28,9 @@ import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; +import com.example.matchinfrastructure.pay.portone.service.PortOneService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.RandomStringUtils; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.time.LocalDateTime; @@ -39,10 +38,9 @@ import java.util.*; import static com.example.matchcommon.constants.MatchStatic.*; -import static com.example.matchdomain.donation.entity.enums.HistoryStatus.CREATE; -import static com.example.matchdomain.donation.entity.enums.HistoryStatus.TURN_ON; import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.*; import static com.example.matchdomain.donation.exception.DonationGerErrorCode.DONATION_NOT_EXIST; +import static org.springframework.http.HttpStatus.BAD_REQUEST; @RequiredArgsConstructor @Service @@ -53,48 +51,30 @@ public class OrderService { private final RegularPaymentRepository regularPaymentRepository; private final UserCardRepository userCardRepository; private final OrderRequestRepository orderRequestRepository; - private final DonationHistoryRepository donationHistoryRepository; - private final DonationConvertor donationConvertor; private final PortOneFeignClient portOneFeignClient; private final PortOneAuthService portOneAuthService; private final PortOneConvertor portOneConvertor; private final PaymentService paymentService; private final ProjectService projectService; - private final DonationAdaptor donationAdaptor; private final RegularPaymentAdaptor regularPaymentAdaptor; + private final UserCardAdaptor userCardAdaptor; + private final PortOneService portOneService; + private final DonationHistoryService donationHistoryService; @Transactional public List getUserBillCard(Long userId) { - List userCards = userCardRepository.findByUserIdAndStatus(userId,Status.ACTIVE); - List userBillCards = new ArrayList<>(); - - userCards.forEach( - result -> { - userBillCards.add( - new OrderRes.UserBillCard( - result.getId(), - result.getCardCode().getName(), - result.getCardName(), - orderHelper.maskMiddleNum(result.getCardNo()), - result.getCardAbleStatus().getName() - ) - ); - } - ); - return userBillCards; + List userCards = userCardAdaptor.findCardLists(userId); + + return orderConvertor.convertToUserCardLists(userCards); } @RedissonLock(LockName = "์นด๋“œ-์‚ญ์ œ", key = "#cardId") public void deleteBillCard(Long cardId) { - UserCard userCard = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + UserCard userCard = userCardAdaptor.findCardByCardId(cardId); List regularPayments = regularPaymentAdaptor.findByCardId(cardId); - for(RegularPayment regularPayment : regularPayments){ - regularPayment.setRegularPayStatus(RegularPayStatus.USER_CANCEL); - } - - regularPaymentRepository.saveAll(regularPayments); + cancelRegularPayment(regularPayments); String accessToken = portOneAuthService.getToken(); @@ -105,21 +85,17 @@ public void deleteBillCard(Long cardId) { userCardRepository.save(userCard); } - @RedissonLock(LockName = "์ •๊ธฐ-๊ธฐ๋ถ€-์‹ ์ฒญ", key = "#cardId") public OrderRes.CompleteDonation regularDonation(User user, OrderReq.RegularDonation regularDonation, Long cardId, Long projectId) { - UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); - - if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); + UserCard card = userCardAdaptor.findCardByCardId(cardId); - if(!card.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); + validateCard(card, user); Project project = projectService.checkProjectExists(projectId, RegularStatus.REGULAR); - String accessToken = portOneAuthService.getToken(); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + PortOneResponse portOneResponse = portOneService.payBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId()); - String flameName = orderHelper.createFlameName(user.getName()); + String flameName = orderHelper.createFlameName(user); String inherenceNumber = createRandomUUID(); @@ -127,16 +103,23 @@ public OrderRes.CompleteDonation regularDonation(User user, OrderReq.RegularDona DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); - donationHistoryRepository.save(donationConvertor.DonationHistoryTurnOn(regularPayment.getId(), TURN_ON)); - - donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); + donationHistoryService.postRegularDonationHistory(regularPayment.getId(), donationUser.getId()); return orderConvertor.CompleteDonation(user.getName(), project, regularDonation.getAmount()); } + + private void validateCard(UserCard card, User user) { + if(!card.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); + + if(!card.getCardAbleStatus().equals(CardAbleStatus.ABLE)) throw new BadRequestException(CARD_NOT_ABLE); + } + @RedissonLock(LockName = "๋นŒํ‚ค-๋‹จ๊ธฐ-๊ธฐ๋ถ€", key = "#cardId") public OrderRes.CompleteDonation oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { - UserCard card = userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + UserCard card = userCardAdaptor.findCardByCardId(cardId); + + validateCard(card, user); Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); @@ -144,13 +127,13 @@ public OrderRes.CompleteDonation oneTimeDonationCard(User user, OrderReq.OneTime PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(ONE_TIME), oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); - String flameName = orderHelper.createFlameName(user.getName()); + String flameName = orderHelper.createFlameName(user); String inherenceNumber = createRandomUUID(); DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); - donationHistoryRepository.save(donationConvertor.DonationHistory(donationUser.getId(), CREATE)); + donationHistoryService.oneTimeDonationHistory(donationUser.getId()); return orderConvertor.CompleteDonation(user.getName(), project, oneTimeDonation.getAmount()); } @@ -181,7 +164,7 @@ public void modifyDonationStatus(Long donationUserId, DonationStatus donationSta @Transactional public void revokePay(User user, Long cardId) { - UserCard userCard = userCardRepository.findByIdAndStatus(cardId, Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + UserCard userCard = userCardAdaptor.findCardByCardId(cardId); if(!userCard.getUserId().equals(user.getId())) throw new BadRequestException(CARD_NOT_CORRECT_USER); List regularPayments = regularPaymentRepository.findByUserCardId(cardId); @@ -192,7 +175,7 @@ public void revokePay(User user, Long cardId) { regularPaymentRepository.saveAll(regularPayments); } - @RedissonLock(LockName = "์œ ์ €-์นด๋“œ-๋“ฑ๋ก", key = "user") + @RedissonLock(LockName = "์œ ์ €-์นด๋“œ-๋“ฑ๋ก", key = "#user") public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registrationCard) { String accessToken = portOneAuthService.getToken(); String cardNo = formatString(registrationCard.getCardNo(), 4); @@ -203,7 +186,7 @@ public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registr portOneConvertor.PortOneBill(cardNo, expiry, registrationCard.getIdNo(), registrationCard.getCardPw()) ); if(portOneResponse.getCode()!=0){ - throw new BaseException(HttpStatus.BAD_REQUEST, false, "PORT_ONE_BILL_AUTH_001", portOneResponse.getMessage()); + throw new BaseException(BAD_REQUEST, false, "PORT_ONE_BILL_AUTH_001", portOneResponse.getMessage()); } userCardRepository.save(orderConvertor.UserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); @@ -233,4 +216,11 @@ public String createOrderId(String type){ String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); return type + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; } + + private void cancelRegularPayment(List regularPayments) { + for(RegularPayment regularPayment : regularPayments){ + regularPayment.setRegularPayStatus(RegularPayStatus.USER_CANCEL); + } + regularPaymentRepository.saveAll(regularPayments); + } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 6960a11b..06e5446b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -66,8 +66,11 @@ public PaymentService(PortOneProperties portOneProperties, public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validatePayment){ try { OrderRequest orderRequest = orderRequestRepository.findById(validatePayment.getOrderId()).orElseThrow(()->new BadRequestException(NOT_EXIST_ORDER_ID)); + IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); + Optional user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE); + Optional project = projectAdaptor.findByProjectId(Long.valueOf(orderRequest.getProjectId())); if(payment.getResponse().getAmount().intValue()!=validatePayment.getAmount()){ @@ -75,10 +78,11 @@ public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validat iamportClient.cancelPaymentByImpUid(cancelData); throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); }else{ - String flameName = orderHelper.createFlameName(user.get().getName()); + String flameName = orderHelper.createFlameName(user.get()); String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); donationUserRepository.save(orderConvertor.donationUserPortone(payment.getResponse(), user.get().getId(), validatePayment, Long.valueOf(orderRequest.getProjectId()), flameName, inherenceNumber)); } + orderRequestRepository.deleteById(validatePayment.getOrderId()); return orderConvertor.CompleteDonation(user.get().getName(), project.get(), (long) validatePayment.getAmount()); } catch (IamportResponseException | IOException e) { System.out.println(e.getMessage()); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java index 1d47bdc6..e72d6d03 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationAdaptor.java @@ -82,4 +82,8 @@ public Page findByUser(User user, int page, int size) { return donationUserRepository.findByUserAndDonationStatusNotOrderByCreatedAtDesc(user, EXECUTION_REFUND, pageable); } + + public List findDonationListsByUser(User user) { + return donationUserRepository.findByUser(user); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java index 51301128..ab5db77a 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/adaptor/DonationHistoryAdaptor.java @@ -31,4 +31,8 @@ public Page findDonationHistory(DonationUser donationUser, Long Pageable pageable = PageRequest.of(page, size); return donationHistoryRepository.getDonationHistoryCustom(donationUser.getRegularPaymentId(), donationId, CREATE, pageable, donationUser.getProjectId()); } + + public void saveDonationHistory(DonationHistory donationHistory) { + donationHistoryRepository.save(donationHistory); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java index 7b984f5d..727f02f5 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/repository/DonationUserRepository.java @@ -115,6 +115,8 @@ public interface DonationUserRepository extends JpaRepository countQuery = "select count(du) from DonationUser du where du.user = :user and du.donationStatus != :donationStatus") Page findByUserAndDonationStatusNotOrderByCreatedAtDesc(@Param("user") User user, @Param("donationStatus") DonationStatus donationStatus, Pageable pageable); + List findByUser(User user); + interface flameList { Long getRegularPayId(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserCardAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserCardAdaptor.java new file mode 100644 index 00000000..94f07e3b --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserCardAdaptor.java @@ -0,0 +1,26 @@ +package com.example.matchdomain.user.adaptor; + +import com.example.matchcommon.annotation.Adaptor; +import com.example.matchcommon.exception.NotFoundException; +import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.UserCard; +import com.example.matchdomain.donation.repository.UserCardRepository; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +import static com.example.matchdomain.donation.exception.DeleteCardErrorCode.CARD_NOT_EXIST; + +@Adaptor +@RequiredArgsConstructor +public class UserCardAdaptor { + private final UserCardRepository userCardRepository; + + public List findCardLists(Long userId) { + return userCardRepository.findByUserIdAndStatus(userId, Status.ACTIVE); + } + + public UserCard findCardByCardId(Long cardId) { + return userCardRepository.findByIdAndStatus(cardId,Status.ACTIVE).orElseThrow(() -> new NotFoundException(CARD_NOT_EXIST)); + } +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java new file mode 100644 index 00000000..1c718897 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java @@ -0,0 +1,23 @@ +package com.example.matchinfrastructure.pay.portone.service; + +import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; +import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static com.example.matchcommon.constants.MatchStatic.REGULAR; + +@Service +@RequiredArgsConstructor +public class PortOneService { + private final PortOneFeignClient portOneFeignClient; + private final PortOneAuthService portOneAuthService; + private final PortOneConvertor portOneConvertor; + + public PortOneResponse payBillKey(String bid, String orderId, Long amount, String projectName, String customerId){ + String accessToken = portOneAuthService.getToken(); + return portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(bid, orderId, amount, projectName, customerId)); + } +} From 88f86d49db1a02590730696817033e568ef34fdb Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:31:01 +0900 Subject: [PATCH 72/82] =?UTF-8?q?:zap:=20:=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B5=AC=ED=98=84=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../donation/convertor/DonationConvertor.java | 2 +- .../convertor/RegularPaymentConvertor.java | 2 +- .../donation/helper/DonationHelper.java | 37 ++++++++++++++++++- .../matchdomain/common/model/MessageType.java | 15 ++++++++ .../common/model/RandomMessage.java | 27 ++++++++++++++ 5 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/common/model/MessageType.java create mode 100644 Match-Domain/src/main/java/com/example/matchdomain/common/model/RandomMessage.java diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index b728250f..fd0c5616 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -196,7 +196,7 @@ public DonationRes.DonationFlame DonationFlame(int sequence, DonationUser donati .usages(donationUser.getProject().getUsages()) .amount(Math.toIntExact(donationUser.getPrice())) .sequence(sequence) - .randomMessage(donationHelper.createRandomMessage(donationUser.getDonationStatus())) + .randomMessage(donationHelper.createRandomMessage(donationUser)) .build(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java index 100f5f02..f19d5398 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java @@ -58,7 +58,7 @@ private DonationRes.BurningFlameDto BurningFlame(DonationUser donationUser) { .usages(donationUser.getProject().getUsages()) .image(donationUser.getFlameImage()) .inherenceName(donationUser.getInherenceName()) - .randomMessage(donationHelper.createRandomMessage(donationUser.getDonationStatus())) + .randomMessage(donationHelper.createRandomMessage(donationUser)) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java index a35715d2..f461824b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java @@ -1,14 +1,21 @@ package com.example.matchapi.donation.helper; import com.example.matchcommon.annotation.Helper; +import com.example.matchdomain.common.model.MessageType; +import com.example.matchdomain.common.model.RandomMessage; import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.DonationStatus; import lombok.RequiredArgsConstructor; import java.text.DecimalFormat; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; +import static com.example.matchdomain.common.model.MessageType.*; import static com.example.matchdomain.donation.entity.enums.RegularStatus.ONE_TIME; @Helper @@ -19,8 +26,20 @@ public String parsePriceComma(int amount){ return decimalFormat.format(amount)+"์›"; } - - public String createRandomMessage(DonationStatus donationStatus) { + public String createRandomMessage(DonationUser donationUser) { + switch(donationUser.getDonationStatus()){ + case EXECUTION_BEFORE: + if(!isOneDayPassed(donationUser.getCreatedAt())){ + return getRandomMessageType(PAY_SUCCESS); + } + else{ + return getRandomMessageType(PAY_ONE_DAY); + } + case EXECUTION_UNDER: + return getRandomMessageType(UNDER); + case EXECUTION_SUCCESS: + return getRandomMessageType(COMPLETE); + } return "ํ•˜์ด"; } @@ -37,4 +56,18 @@ public int getDonationSequence(DonationUser donationUser, Long donationId) { public List donationIdLists(List donationUser) { return donationUser.stream().map(DonationUser::getId).collect(Collectors.toList()); } + + + public String getRandomMessageType(MessageType messageType) { + List paySuccessMessages = Arrays.stream(RandomMessage.values()) + .filter(rm -> rm.getMessageType() == messageType) + .collect(Collectors.toList()); + + Random random = new Random(); + return paySuccessMessages.get(random.nextInt(paySuccessMessages.size())).getMessage(); + } + + public boolean isOneDayPassed(LocalDateTime dateTime) { + return Duration.between(dateTime, LocalDateTime.now()).toDays() >= 1; + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/common/model/MessageType.java b/Match-Domain/src/main/java/com/example/matchdomain/common/model/MessageType.java new file mode 100644 index 00000000..c103d8ec --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/common/model/MessageType.java @@ -0,0 +1,15 @@ +package com.example.matchdomain.common.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MessageType { + PAY_SUCCESS("๊ฒฐ์ œ ์™„๋ฃŒ ํ›„"), + PAY_ONE_DAY("๊ฒฐ์ œ ์™„๋ฃŒ ํ•˜๋ฃจ ์ดํ›„"), + UNDER("์ง‘ํ–‰ ์ค‘์ผ ๋•Œ"), + COMPLETE("์ „๋‹ฌ ์™„๋ฃŒ์ผ ๋•Œ"); + + private final String description; +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/common/model/RandomMessage.java b/Match-Domain/src/main/java/com/example/matchdomain/common/model/RandomMessage.java new file mode 100644 index 00000000..856a8ef1 --- /dev/null +++ b/Match-Domain/src/main/java/com/example/matchdomain/common/model/RandomMessage.java @@ -0,0 +1,27 @@ +package com.example.matchdomain.common.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static com.example.matchdomain.common.model.MessageType.*; + +@Getter +@AllArgsConstructor +public enum RandomMessage { + WARM(PAY_SUCCESS, "๋„์›€์ด ํ•„์š”ํ•œ ๊ณณ์— ๋ˆ„๊ตฌ๋ณด๋‹ค ๋”ฐ๋œปํ•œ ์˜จ๊ธฐ๋ฅผ ์ „ํ• ๊ฒŒ์š”."), + THANK_YOU(PAY_SUCCESS, "ํƒœ์–ด๋‚˜๊ฒŒ ํ•ด์ค˜์„œ ๊ฐ์‚ฌํ•ด์š”! ์‹์‚ฌ ๋ง›์žˆ๊ฒŒ ๋“œ์„ธ์š” :)"), + WARM_MIND(PAY_SUCCESS,"๊ธฐ๋ถ€์ž๋‹˜์˜ ๋”ฐ๋œปํ•œ ๋งˆ์Œ์œผ๋กœ ์ œ๊ฐ€ ํƒœ์–ด๋‚ฌ์–ด์š”."), + + WAITING(PAY_ONE_DAY, "์ €๋Š” ์ง€๊ธˆ ์นœ๊ตฌ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์š”"), + WAITING2(PAY_ONE_DAY, "์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”! ๋ถˆ๊ฝƒ๋“ค์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค. ๐Ÿ”ฅ"), + WAITING3(PAY_ONE_DAY, "๋ถˆ๊ฝƒ์ด ๊ณง ํƒ€์˜ค๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Œ€ํ•ด์ฃผ์„ธ์š”! โœจ"), + WAITING4(PAY_ONE_DAY, "์ž ์‹œ๋งŒ์š”! ๋” ๋ฉ‹์ง„ ๋ถˆ๊ฝƒ์„ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ ํ„ฐ์น˜๋ฅผ ํ•˜๊ณ  ์žˆ์–ด์š”. ๐Ÿ’ฅ"), + WAITING5(PAY_ONE_DAY, "๋‹น์‹ ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ถˆ๊ฝƒ์ด ๋” ๋น›๋‚˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค! ๐ŸŒŸ"), + + MOVING(UNDER,"์ €๋Š” ์ง€๊ธˆ ๋‹ค๋ฅธ ๋ถˆ๊ฝƒ์ด ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ํ›„์›์ฒ˜๋กœ ์ด๋™ํ•˜๊ณ ์žˆ์–ด์š”"), + COMPLETED(COMPLETE,"์ €๋Š” ์ง€๊ธˆ ํ›„์›์ฒ˜์— ์ „๋‹ฌ๋˜์—ˆ์–ด์š”"); + + private final MessageType messageType; + private final String message; +} + From e1a97a47a93b8aef2cec175a7cb2073ac40e09d1 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:31:16 +0900 Subject: [PATCH 73/82] =?UTF-8?q?:zap:=20:=20=ED=99=88=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EC=BA=90=EC=8B=B1=EC=B2=98=EB=A6=AC=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/matchapi/donation/dto/DonationRes.java | 3 ++- .../matchapi/donation/service/DonationService.java | 2 ++ Match-Api/src/main/resources/ehcache.xml | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index a3b1494c..818570b7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.io.Serializable; import java.util.List; public class DonationRes { @@ -290,7 +291,7 @@ public static class MatchList { @Builder @AllArgsConstructor @NoArgsConstructor - public static class BurningFlameDto { + public static class BurningFlameDto implements Serializable { @Schema(description = "๋ถˆ๊ฝƒ์ด id ์ƒ์„ธ์กฐํšŒ์‹œ ํ•„์š”", required = true, example = "2") private Long donationId; diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index 8f81ca7c..48cfb779 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -17,6 +17,7 @@ import com.example.matchdomain.donation.repository.RegularPaymentRepository; import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @@ -138,6 +139,7 @@ public PageResponse> getUserMatchList(User user, int return new PageResponse<>(regularPayments.isLast(), regularPayments.getTotalElements(), regularPaymentConvertor.MatchList(regularPayments.getContent())); } + @Cacheable(value = "flameCache", key = "{#user.id, #page, #size}") public PageResponse> getBurningFlameList(User user, int page, int size) { Page donationUsers = donationAdaptor.findByUser(user, page, size); return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), regularPaymentConvertor.BurningFlameList(donationUsers.getContent())); diff --git a/Match-Api/src/main/resources/ehcache.xml b/Match-Api/src/main/resources/ehcache.xml index 5cd72f72..682e1c0f 100644 --- a/Match-Api/src/main/resources/ehcache.xml +++ b/Match-Api/src/main/resources/ehcache.xml @@ -64,4 +64,16 @@ transactionalMode="off"> + + + + From 15faf33874aa6499380ac743cfdedec270cafe09 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:25:00 +0900 Subject: [PATCH 74/82] =?UTF-8?q?:zap:=20:=20=EB=A7=88=EC=BC=80=ED=8C=85?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A7=91=20=EB=B0=8F=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=EB=8F=99=EC=9D=98=20=EC=9E=91=EC=84=B1=20(#1?= =?UTF-8?q?04)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Match-Api/src/main/resources/templates/Marketing.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Match-Api/src/main/resources/templates/Marketing.html diff --git a/Match-Api/src/main/resources/templates/Marketing.html b/Match-Api/src/main/resources/templates/Marketing.html new file mode 100644 index 00000000..842fe848 --- /dev/null +++ b/Match-Api/src/main/resources/templates/Marketing.html @@ -0,0 +1,10 @@ + + + + + ๋งˆ์ผ€ํŒ… ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ˆ˜์‹  ๋™์˜ + + +

๋งˆ์ผ€ํŒ… ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ˆ˜์‹  ๋™์˜

+ + \ No newline at end of file From 8bfde76bde21e2e8ae893b06f54f529fcbbea524 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:28:01 +0900 Subject: [PATCH 75/82] =?UTF-8?q?:zap:=20:=20=EB=A7=88=EC=BC=80=ED=8C=85?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A7=91=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EC=9E=91=EC=84=B1=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/matchapi/common/HtmlController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java b/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java index 942f9086..d57ca4d3 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/HtmlController.java @@ -16,4 +16,7 @@ public String showPrivacyPolicy(){ public String showTermsConditions(){ return "TermsConditions"; } + + @GetMapping("/marketing") + public String showMarketing(){ return "Marketing";} } From 5e491e5fb2f4d614061cacf0ec12bac1b1367bf6 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:14:01 +0900 Subject: [PATCH 76/82] =?UTF-8?q?:recycle:=20:=20=EA=B2=B0=EC=A0=9C=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=A0=84=20=EA=B2=80=EC=A6=9D=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../donation/service/DonationService.java | 6 ++ .../order/controller/OrderController.java | 16 +++++- .../order/convertor/OrderConvertor.java | 24 +++++--- .../matchapi/order/helper/OrderHelper.java | 5 ++ .../matchapi/order/service/OrderService.java | 13 +++++ .../portone/service/PaymentService.java | 55 +++++++++++++------ .../order/exception/PortOneAuthErrorCode.java | 2 +- .../redis/entity/OrderRequest.java | 5 +- .../portone/client/PortOneFeignClient.java | 7 +++ .../portone/convertor/PortOneConvertor.java | 9 +++ .../pay/portone/dto/PortOnePrepareRes.java | 14 +++++ .../portone/dto/req/PortOnePrepareReq.java | 14 +++++ 12 files changed, 143 insertions(+), 27 deletions(-) create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOnePrepareRes.java create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOnePrepareReq.java diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index 48cfb779..42b2c4d3 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -4,6 +4,7 @@ import com.example.matchapi.donation.convertor.RegularPaymentConvertor; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; +import com.example.matchapi.portone.dto.PaymentReq; import com.example.matchapi.portone.service.PaymentService; import com.example.matchapi.project.dto.ProjectRes; import com.example.matchcommon.exception.BadRequestException; @@ -15,13 +16,17 @@ import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.donation.repository.RegularPaymentRepository; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; +import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import static com.example.matchdomain.common.model.Status.ACTIVE; @@ -144,4 +149,5 @@ public PageResponse> getBurningFlameList(User Page donationUsers = donationAdaptor.findByUser(user, page, size); return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), regularPaymentConvertor.BurningFlameList(donationUsers.getContent())); } + } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java index 86084c8b..daeb4ad3 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java @@ -50,7 +50,7 @@ public class OrderController { @PostMapping("/{projectId}") @ApiErrorCodeExample(UserAuthErrorCode.class) - @Operation(summary= "04-00 Order๐Ÿ’ธ ๊ฒฐ์ œ ์š”์ฒญ์šฉ ์ฒ˜์Œ ๊ฒฐ์ œํ•  ๋•Œ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ",description = "๊ฒฐ์ œ ์š”์ฒญ์šฉ API ์ž…๋‹ˆ๋‹ค") + @Operation(summary= "04-00 Order๐Ÿ’ธ ๊ฒฐ์ œ ์š”์ฒญ์šฉ ์ฒ˜์Œ ๊ฒฐ์ œํ•  ๋•Œ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ Web Version",description = "๊ฒฐ์ œ ์š”์ฒญ์šฉ API ์ž…๋‹ˆ๋‹ค") @CheckIdExist public CommonResponse requestPay( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -60,6 +60,20 @@ public CommonResponse requestPay( return CommonResponse.onSuccess(orderId); } + @PostMapping("/v2/{projectId}") + @ApiErrorCodeExample(UserAuthErrorCode.class) + @Operation(summary= "04-00 Order๐Ÿ’ธ ๊ฒฐ์ œ ์š”์ฒญ์šฉ ์ฒ˜์Œ ๊ฒฐ์ œํ•  ๋•Œ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ V2 flutter ์ธ ๊ฒฝ์šฐ ์—ฌ๊ธฐ๋กœ ์š”์ฒญ ๋ณด๋‚ด์ฃผ์„ธ์š”",description = "๊ฒฐ์ œ ์š”์ฒญ์šฉ API ์ž…๋‹ˆ๋‹ค") + @CheckIdExist + public CommonResponse requestPayPrepare( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "ํ”„๋กœ์ ํŠธ ID", example = "1") @PathVariable("projectId") Long projectId, + @RequestParam int amount + ){ + log.info("๊ฒฐ์ œ ์ค€๋น„ ์š”์ฒญ v2"); + String orderId = orderService.saveRequestPrepare(user, projectId, amount); + return CommonResponse.onSuccess(orderId); + } + /* @PostMapping("/pay/{projectId}") @ApiErrorCodeExample({OtherServerErrorCode.class, UserAuthErrorCode.class, RequestErrorCode.class, ProjectOneTimeErrorCode.class}) diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 671058f4..32b5848d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -15,7 +15,6 @@ import com.example.matchinfrastructure.pay.nice.dto.*; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; -import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import java.util.ArrayList; @@ -70,7 +69,7 @@ public String createPlainText(OrderReq.RegistrationCard registrationCard) { public NiceBillOkRequest niceBillOk(NicePayBillkeyResponse nicePayBillkeyResponse, String orderId) { return NiceBillOkRequest.builder() .cardQuota(0) - .amount(10L) + .amount(480L) .goodsName("์นด๋“œ ํ™•์ธ ์šฉ ๊ฒฐ์ œ") .useShopInterest(false) .orderId(orderId) @@ -117,7 +116,7 @@ public OrderRequest CreateRequest(Long userId, Long projectId, String orderId) { .userId(String.valueOf(userId)) .projectId(String.valueOf(projectId)) .orderId(orderId) - .ttl(480L) + .ttl(10L) .build(); } @@ -147,16 +146,16 @@ public DonationUser donationBillUser(NiceBillOkResponse niceBillOkResponse, Long .build(); } - public DonationUser donationUserPortone(Payment payment, Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { + public DonationUser donationUserPortone(Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { return DonationUser.builder() .userId(userId) .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) .projectId(projectId) .price((long) validatePayment.getAmount()) - .tid(payment.getImpUid()) - .orderId(payment.getMerchantUid()) + .tid(validatePayment.getImpUid()) + .orderId(validatePayment.getOrderId()) .donationStatus(DonationStatus.EXECUTION_BEFORE) - .payMethod(orderHelper.getPayMethod(payment.getPayMethod())) + .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) .inherenceName(flameName) .inherenceNumber(inherenceNumber) .regularStatus(RegularStatus.ONE_TIME) @@ -227,4 +226,15 @@ public List convertToUserCardLists(List userCar ); return userBillCards; } + + public OrderRequest convertToRequestPrepare(Long userId, Long projectId, int amount, String orderId) { + return OrderRequest + .builder() + .orderId(orderId) + .userId(String.valueOf(userId)) + .projectId(String.valueOf(projectId)) + .amount(amount) + .ttl(480L) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java index 4dff7d41..b30f935e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java @@ -1,5 +1,6 @@ package com.example.matchapi.order.helper; +import com.example.matchapi.portone.dto.PaymentReq; import com.example.matchcommon.annotation.Helper; import com.example.matchcommon.exception.BaseException; import com.example.matchcommon.properties.NicePayProperties; @@ -9,12 +10,16 @@ import com.example.matchdomain.donation.entity.flameEnum.Adjective; import com.example.matchdomain.donation.entity.flameEnum.AdjectiveFlame; import com.example.matchdomain.donation.repository.DonationUserRepository; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; import com.example.matchinfrastructure.pay.nice.dto.NicePayCancelRequest; +import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Base64; import java.util.List; import java.util.Random; diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index c14be682..9bdaae1a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -27,6 +27,7 @@ import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; import com.example.matchinfrastructure.pay.portone.dto.PortOneBillResponse; import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOnePrepareReq; import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; import com.example.matchinfrastructure.pay.portone.service.PortOneService; import lombok.RequiredArgsConstructor; @@ -223,4 +224,16 @@ private void cancelRegularPayment(List regularPayments) { } regularPaymentRepository.saveAll(regularPayments); } + + public String saveRequestPrepare(User user, Long projectId, int amount) { + String orderId = createOrderId(ONE_TIME); + + orderRequestRepository.save(orderConvertor.convertToRequestPrepare(user.getId(), projectId, amount, orderId)); + + PortOnePrepareReq portOnePrepareReq = portOneConvertor.convertToRequestPrepare(orderId, amount); + + portOneFeignClient.preparePayments(portOneAuthService.getToken(), portOnePrepareReq); + + return orderId; + } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 06e5446b..37695772 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -1,5 +1,6 @@ package com.example.matchapi.portone.service; +import com.example.matchapi.donation.service.DonationHistoryService; import com.example.matchapi.order.convertor.OrderConvertor; import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.order.helper.OrderHelper; @@ -8,6 +9,7 @@ import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.properties.PortOneProperties; import com.example.matchdomain.common.model.Status; +import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.project.adaptor.ProjectAdaptor; import com.example.matchdomain.project.entity.Project; @@ -21,6 +23,7 @@ import com.siot.IamportRestClient.response.IamportResponse; import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,15 +31,16 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Optional; import java.util.UUID; import static com.example.matchdomain.order.exception.PortOneAuthErrorCode.*; +import static com.example.matchdomain.project.exception.ProjectOneTimeErrorCode.PROJECT_NOT_EXIST; +import static com.example.matchdomain.user.exception.UserLoginErrorCode.NOT_EXIST_USER; @Service +@Slf4j @RequiredArgsConstructor public class PaymentService { - private final PortOneProperties portOneProperties; private final OrderRequestRepository orderRequestRepository; private final UserRepository userRepository; private final OrderHelper orderHelper; @@ -44,6 +48,8 @@ public class PaymentService { private final OrderConvertor orderConvertor; private final IamportClient iamportClient; private final ProjectAdaptor projectAdaptor; + private final DonationHistoryService donationHistoryService; + private final PortOneProperties portOneProperties; @Autowired public PaymentService(PortOneProperties portOneProperties, @@ -51,7 +57,7 @@ public PaymentService(PortOneProperties portOneProperties, UserRepository userRepository, OrderHelper orderHelper, DonationUserRepository donationUserRepository, - OrderConvertor orderConvertor, ProjectAdaptor projectAdaptor) { + OrderConvertor orderConvertor, ProjectAdaptor projectAdaptor, DonationHistoryService donationHistoryService) { this.portOneProperties = portOneProperties; this.orderRequestRepository = orderRequestRepository; this.userRepository = userRepository; @@ -60,32 +66,40 @@ public PaymentService(PortOneProperties portOneProperties, this.orderConvertor = orderConvertor; this.iamportClient = new IamportClient(portOneProperties.getKey(), portOneProperties.getSecret()); this.projectAdaptor = projectAdaptor; + this.donationHistoryService = donationHistoryService; } - @RedissonLock(LockName = "๊ฒฐ์ œ-๊ฒ€์ฆ", key = "#validatePayment") + @RedissonLock(LockName = "๊ฒฐ์ œ-๊ฒ€์ฆ", key = "#validatePayment.orderId") public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validatePayment){ try { OrderRequest orderRequest = orderRequestRepository.findById(validatePayment.getOrderId()).orElseThrow(()->new BadRequestException(NOT_EXIST_ORDER_ID)); - IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); - - Optional user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE); + log.info(orderRequest.getOrderId()); - Optional project = projectAdaptor.findByProjectId(Long.valueOf(orderRequest.getProjectId())); + IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); if(payment.getResponse().getAmount().intValue()!=validatePayment.getAmount()){ - CancelData cancelData = createCancelData(payment, 0); - iamportClient.cancelPaymentByImpUid(cancelData); throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); - }else{ - String flameName = orderHelper.createFlameName(user.get()); - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - donationUserRepository.save(orderConvertor.donationUserPortone(payment.getResponse(), user.get().getId(), validatePayment, Long.valueOf(orderRequest.getProjectId()), flameName, inherenceNumber)); } + + User user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE).orElseThrow(()->new BadRequestException(NOT_EXIST_USER)); + + Project project = projectAdaptor.findByProjectId(Long.valueOf(orderRequest.getProjectId())).orElseThrow(()->new BadRequestException(PROJECT_NOT_EXIST)); + + saveDonationUser(user, validatePayment, project); + orderRequestRepository.deleteById(validatePayment.getOrderId()); - return orderConvertor.CompleteDonation(user.get().getName(), project.get(), (long) validatePayment.getAmount()); - } catch (IamportResponseException | IOException e) { - System.out.println(e.getMessage()); + + return orderConvertor.CompleteDonation(user.getName(), project, (long) validatePayment.getAmount()); + } catch (BadRequestException | IamportResponseException | IOException e) { + try { + log.info(e.getMessage()); + log.info(e.getLocalizedMessage()); + log.info(String.valueOf(e)); + refundPayment(validatePayment.getImpUid()); + } catch(Exception ex) { + System.out.println(ex.getMessage()); + } throw new BadRequestException(FAILED_ERROR_AUTH); } } @@ -108,4 +122,11 @@ public void refundPayment(String impUid) { throw new RuntimeException(e); } } + + public void saveDonationUser(User user, PaymentReq.ValidatePayment validatePayment, Project project) { + String flameName = orderHelper.createFlameName(user); + String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationUserPortone(user.getId(), validatePayment, project.getId(), flameName, inherenceNumber)); + donationHistoryService.oneTimeDonationHistory(donationUser.getId()); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java b/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java index 8dff2328..74b5e887 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/order/exception/PortOneAuthErrorCode.java @@ -18,7 +18,7 @@ public enum PortOneAuthErrorCode implements BaseErrorCode { FAILED_ERROR_AUTH_AMOUNT(BAD_REQUEST,"ORDER_001", "์ฃผ๋ฌธ ๊ฐ€๊ฒฉ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), NOT_EXIST_ORDER_ID(BAD_REQUEST,"ORDER_002", "์ฃผ๋ฌธ ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), - FAILED_ERROR_AUTH(INTERNAL_SERVER_ERROR,"ORDER_003", "๊ฒฐ์ œ์š”์ฒญ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + FAILED_ERROR_AUTH(INTERNAL_SERVER_ERROR,"ORDER_003", "๊ฒฐ์ œ์š”์ฒญ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); private final HttpStatus httpStatus; diff --git a/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java b/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java index bd2c2a4d..06a5e610 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/redis/entity/OrderRequest.java @@ -18,16 +18,19 @@ public class OrderRequest { private String projectId; + private int amount; + @TimeToLive private long ttl; - public OrderRequest update(String orderId,String projectId, String userId, long ttl) { + public OrderRequest update(String orderId,String projectId, String userId, int amount, long ttl) { this.orderId = orderId; this.projectId = projectId; this.userId = userId; this.ttl = ttl; + this.amount = amount; return this; } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java index 5baf6648..5130c153 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/client/PortOneFeignClient.java @@ -9,6 +9,7 @@ import com.example.matchinfrastructure.pay.portone.dto.req.PayWithBillKeyReq; import com.example.matchinfrastructure.pay.portone.dto.req.PortOneAuthReq; import com.example.matchinfrastructure.pay.portone.dto.req.PortOneBillReq; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOnePrepareReq; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; @@ -39,4 +40,10 @@ public PortOneResponse deleteBillKey( @RequestHeader("Authorization") String accessToken, @PathVariable("customer_uid") String customer_uid ); + + @PostMapping("/payments/prepare") + public PortOneResponse preparePayments( + @RequestHeader("Authorization") String accessToken, + @RequestBody PortOnePrepareReq portOnePrepareReq + ); } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java index a4f3bef6..a574a6ea 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java @@ -4,6 +4,7 @@ import com.example.matchcommon.properties.PortOneProperties; import com.example.matchinfrastructure.pay.portone.dto.req.PayWithBillKeyReq; import com.example.matchinfrastructure.pay.portone.dto.req.PortOneBillReq; +import com.example.matchinfrastructure.pay.portone.dto.req.PortOnePrepareReq; import lombok.RequiredArgsConstructor; @Convertor @@ -30,4 +31,12 @@ public PayWithBillKeyReq PayWithBillKey(String bid, String orderId, Long amount, .name(projectName) .build(); } + + public PortOnePrepareReq convertToRequestPrepare(String orderId, int amount) { + return PortOnePrepareReq + .builder() + .merchant_uid(orderId) + .amount(amount) + .build(); + } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOnePrepareRes.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOnePrepareRes.java new file mode 100644 index 00000000..22700de7 --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/PortOnePrepareRes.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.pay.portone.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOnePrepareRes { + private String merchant_uid; + + private double amount; +} diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOnePrepareReq.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOnePrepareReq.java new file mode 100644 index 00000000..68cb10dc --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/dto/req/PortOnePrepareReq.java @@ -0,0 +1,14 @@ +package com.example.matchinfrastructure.pay.portone.dto.req; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PortOnePrepareReq { + private String merchant_uid; + + private double amount; +} From 6ca241cbd2408e36bed86ffbbf5ec1c1defececf Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:11:41 +0900 Subject: [PATCH 77/82] =?UTF-8?q?:recycle:=20:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=20=EC=B2=98=EB=A6=AC=20Discord=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=B2=98=EB=A6=AC(#1?= =?UTF-8?q?04)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchapi/common/ExceptionAdvice.java | 81 +++++++++++-------- .../order/controller/OrderController.java | 13 --- .../portone/service/PaymentService.java | 7 +- .../matchcommon/config/AsyncConfig.java | 11 +++ .../discord/client/DiscordFeignClient.java | 1 + .../discord/convertor/DiscordConvertor.java | 20 +++-- .../discord/service/DiscordService.java | 26 ++++++ 7 files changed, 101 insertions(+), 58 deletions(-) create mode 100644 Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java diff --git a/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java b/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java index 2db6797e..ec013354 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java @@ -3,14 +3,13 @@ import com.example.matchcommon.exception.BaseDynamicException; import com.example.matchcommon.exception.BaseException; import com.example.matchcommon.reponse.CommonResponse; -import com.example.matchinfrastructure.discord.client.DiscordFeignClient; -import com.example.matchinfrastructure.discord.convertor.DiscordConvertor; +import com.example.matchdomain.user.entity.User; +import com.example.matchinfrastructure.discord.service.DiscordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.userdetails.User; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -32,31 +31,31 @@ @RestControllerAdvice @RequiredArgsConstructor public class ExceptionAdvice { - private final DiscordFeignClient discordFeignClient; - private final DiscordConvertor discordConvertor; + private final DiscordService discordService; @ExceptionHandler(ConstraintViolationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) - public ResponseEntity onConstraintValidationException(ConstraintViolationException e) { - Map errors = e.getConstraintViolations().stream() + public ResponseEntity onConstraintValidationException(ConstraintViolationException exception, @AuthenticationPrincipal User user, HttpServletRequest request) { + Map errors = exception.getConstraintViolations().stream() .collect(Collectors.toMap( violation -> StreamSupport.stream(violation.getPropertyPath().spliterator(), false) .reduce((first, second) -> second) .get().toString(), ConstraintViolation::getMessage )); + getExceptionStackTrace(exception, user, request, errors); return new ResponseEntity<>(CommonResponse.onFailure("REQUEST_ERROR", "์š”์ฒญ ํ˜•์‹ ์—๋Ÿฌ result ํ™•์ธํ•ด์ฃผ์„ธ์š”", errors), null, HttpStatus.BAD_REQUEST); } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) - public ResponseEntity onMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public ResponseEntity onMethodArgumentNotValidException(MethodArgumentNotValidException exception, @AuthenticationPrincipal User user, HttpServletRequest request) { Map errors = new LinkedHashMap<>(); - for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { + for (FieldError fieldError : exception.getBindingResult().getFieldErrors()) { String fieldName = fieldError.getField(); String errorMessage = Optional.ofNullable(fieldError.getDefaultMessage()).orElse(""); @@ -68,31 +67,16 @@ public ResponseEntity onMethodArgumentNotValidException(MethodArgumentNotValidEx errors.put(fieldName, errorMessage); } - return new ResponseEntity<>(CommonResponse.onFailure("REQUEST_ERROR", "์š”์ฒญ ํ˜•์‹ ์—๋Ÿฌ result ํ™•์ธํ•ด์ฃผ์„ธ์š”", errors), null, HttpStatus.BAD_REQUEST); - } - - - - private void getExceptionStackTrace(Exception e, @AuthenticationPrincipal User user, - HttpServletRequest request) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); + getExceptionStackTrace(exception, user, request, errors); - pw.append("\n==========================!!!ERROR TRACE!!!==========================\n"); - pw.append("uri: " + request.getRequestURI() + " " + request.getMethod() + "\n"); - if (user != null) { - pw.append("uid: " + user.getUsername() + "\n"); - } - pw.append(e.getMessage()); - pw.append("\n====================================================================="); - log.error(sw.toString()); + return new ResponseEntity<>(CommonResponse.onFailure("REQUEST_ERROR", "์š”์ฒญ ํ˜•์‹ ์—๋Ÿฌ result ํ™•์ธํ•ด์ฃผ์„ธ์š”", errors), null, HttpStatus.BAD_REQUEST); } @ExceptionHandler(value = BaseException.class) public ResponseEntity onKnownException(BaseException baseException, @AuthenticationPrincipal User user, HttpServletRequest request) { - getExceptionStackTrace(baseException, user, request); + getExceptionStackTrace(baseException, user, request, null); return new ResponseEntity<>(CommonResponse.onFailure(baseException.getErrorReasonHttpStatus().getCode(), baseException.getErrorReasonHttpStatus().getMessage(), baseException.getErrorReasonHttpStatus().getResult()), null, baseException.getErrorReasonHttpStatus().getHttpStatus()); @@ -101,24 +85,55 @@ public ResponseEntity onKnownException(BaseException baseException, @ExceptionHandler(value = BaseDynamicException.class) public ResponseEntity onKnownDynamicException(BaseDynamicException baseDynamicException, @AuthenticationPrincipal User user, HttpServletRequest request) { - getExceptionStackTrace(baseDynamicException, user, request); + getExceptionStackTrace(baseDynamicException, user, request, null); return new ResponseEntity<>(CommonResponse.onFailure(baseDynamicException.getStatus().getErrorReason().getCode(), baseDynamicException.getStatus().getErrorReason().getMessage(), baseDynamicException.getData()), null, baseDynamicException.getStatus().getErrorReasonHttpStatus().getHttpStatus()); } - - /* @ExceptionHandler(value = Exception.class) public ResponseEntity onException(Exception exception, @AuthenticationPrincipal User user, HttpServletRequest request) { - getExceptionStackTrace(exception, user, request); - String returnMessage = discordFeignClient.errorMessage(discordConvertor.Message(user, exception, request)); + getExceptionStackTrace(exception, user, request, null); + if(user==null){ + discordService.sendUnKnownMessage("๋กœ๊ทธ์ธ ๋˜์ง€ ์•Š์€ ์œ ์ €", exception, request); + } + else{ + discordService.sendUnKnownMessage(user.getUsername(), exception, request); + } + return new ResponseEntity<>(CommonResponse.onFailure("500", exception.getMessage(), null), null, HttpStatus.INTERNAL_SERVER_ERROR); } - */ + private void getExceptionStackTrace(Exception e, User user, HttpServletRequest request, Map errors) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + + pw.append("\n==========================!!!ERROR TRACE!!!==========================\n"); + if(user != null) { + pw.append("USER_ID : " + user.getId()).append("\n"); + } + pw.append("REQUEST_URI : ").append(request.getRequestURI()).append(" ").append(request.getMethod()).append("\n"); + if (e instanceof BaseException) { + pw.append("ERROR_CODE : ").append(((BaseException) e).getErrorReason().getCode()).append("\n"); + pw.append("ERROR_MESSAGE : ").append(((BaseException) e).getErrorReason().getMessage()).append("\n"); + } else if (e instanceof BaseDynamicException) { + pw.append("ERROR_CODE : ").append(((BaseDynamicException) e).getStatus().getErrorReason().getCode()).append("\n"); + pw.append("ERROR_MESSAGE : ").append(((BaseDynamicException) e).getStatus().getErrorReason().getMessage()).append("\n"); + } else if(e instanceof MethodArgumentNotValidException | e instanceof ConstraintViolationException){ + pw.append("ERROR_CODE : ").append("REQUEST_ERROR").append("\n"); + pw.append("ERROR_MESSAGE : ").append(errors.toString()).append("\n"); + } + else { + pw.append("ERROR_MESSAGE : ").append(e.getMessage()).append("\n"); + pw.append("ERROR_MESSAGE : ").append(e.getLocalizedMessage()).append("\n"); + } + pw.append("====================================================================="); + log.error(sw.toString()); + } + + } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java index daeb4ad3..b41232dc 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/controller/OrderController.java @@ -74,19 +74,6 @@ public CommonResponse requestPayPrepare( return CommonResponse.onSuccess(orderId); } - -/* @PostMapping("/pay/{projectId}") - @ApiErrorCodeExample({OtherServerErrorCode.class, UserAuthErrorCode.class, RequestErrorCode.class, ProjectOneTimeErrorCode.class}) - @Operation(summary= "04-01 Order๐Ÿ’ธ ๋‹จ๊ธฐ ๊ฒฐ์ œ API",description = "๊ฒฐ์ œ API ์ž…๋‹ˆ๋‹ค") - @CheckRegularProject - public CommonResponse requestPayment( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "ํ”„๋กœ์ ํŠธ ID", example = "1") @PathVariable("projectId") Long projectId, - @Valid @RequestBody OrderReq.OrderDetail orderDetail){ - log.info("04-03 Order ๊ฒฐ์ œ ์ธ์ฆ์šฉ API ๊ฒฐ์ œ ID: " + orderDetail.getTid() + " ๊ฒฐ์ œ ๊ธˆ์•ก " + orderDetail.getAmount() +" ๊ธฐ๋ถ€ ํ”„๋กœ์ ํŠธ ID : " + projectId); - return CommonResponse.onSuccess(orderService.requestPayment(user , orderDetail, projectId)); - }*/ - @PostMapping("/pay/card") @ApiErrorCodeExample({UserAuthErrorCode.class, OtherServerErrorCode.class, RegistrationCardErrorCode.class, NicePayErrorCode.class}) @Operation(summary = "04-02 Order๐Ÿ’ธ ์ •๊ธฐ ๊ฒฐ์ œ์šฉ ์นด๋“œ ๋“ฑ๋ก api",description = "์ •๊ธฐ ๊ฒฐ์ œ๋ฅผ ์œ„ํ•œ ์นด๋“œ ๋“ฑ๋ก API ์ž…๋‹ˆ๋‹ค.") diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 37695772..98e27c0e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -78,9 +78,7 @@ public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validat IamportResponse payment = iamportClient.paymentByImpUid(validatePayment.getImpUid()); - if(payment.getResponse().getAmount().intValue()!=validatePayment.getAmount()){ - throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); - } + if(payment.getResponse().getAmount().intValue()!=validatePayment.getAmount()) throw new BadRequestException(FAILED_ERROR_AUTH_AMOUNT); User user = userRepository.findByIdAndStatus(Long.valueOf(orderRequest.getUserId()), Status.ACTIVE).orElseThrow(()->new BadRequestException(NOT_EXIST_USER)); @@ -93,9 +91,6 @@ public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validat return orderConvertor.CompleteDonation(user.getName(), project, (long) validatePayment.getAmount()); } catch (BadRequestException | IamportResponseException | IOException e) { try { - log.info(e.getMessage()); - log.info(e.getLocalizedMessage()); - log.info(String.valueOf(e)); refundPayment(validatePayment.getImpUid()); } catch(Exception ex) { System.out.println(ex.getMessage()); diff --git a/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java b/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java index 2715dde6..38137fb1 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java +++ b/Match-Common/src/main/java/com/example/matchcommon/config/AsyncConfig.java @@ -32,4 +32,15 @@ public Executor fcmThreadAsync() { executor.initialize(); return executor; } + + @Bean(name = "discord-message") + public Executor discordMessageThreadAsync() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); // ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ Thread ๊ฐœ์ˆ˜ + executor.setMaxPoolSize(10); // ๋™์‹œ์— ๋™์ž‘ํ•˜๋Š” ์ตœ๋Œ€ Thread ๊ฐœ์ˆ˜ + executor.setQueueCapacity(500); // CorePool์ด ์ดˆ๊ณผ๋ ๋•Œ Queue์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๊บผ๋‚ด์„œ ์‹คํ–‰๋œ๋‹ค. (500๊ฐœ๊นŒ์ง€ ์ €์žฅํ•จ) + executor.setThreadNamePrefix("discord-message-thread"); // Spring์—์„œ ์ƒ์„ฑํ•˜๋Š” Thread ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ + executor.initialize(); + return executor; + } } \ No newline at end of file diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/client/DiscordFeignClient.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/client/DiscordFeignClient.java index 3ff57d7d..07367712 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/client/DiscordFeignClient.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/client/DiscordFeignClient.java @@ -4,6 +4,7 @@ import com.example.matchinfrastructure.discord.config.DiscordInfoConfig; import com.example.matchinfrastructure.discord.dto.Message; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.PostMapping; diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java index a6cb8bbf..f3a8b389 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java @@ -4,7 +4,6 @@ import com.example.matchinfrastructure.discord.dto.Message; import lombok.RequiredArgsConstructor; import org.springframework.core.env.Environment; -import org.springframework.security.core.userdetails.User; import javax.servlet.http.HttpServletRequest; import java.text.DecimalFormat; @@ -19,12 +18,8 @@ public class DiscordConvertor { private final Environment environment; - public Message Message(User user, Exception exception, HttpServletRequest request) { + public Message toConvertUnknownMessage(String username, Exception exception, HttpServletRequest request) { List embedsList = new ArrayList<>(); - String username = "๋กœ๊ทธ์ธ ๋˜์ง€ ์•Š์€ ์œ ์ €"; - if(user!=null){ - username = user.getUsername(); - } embedsList.add(Message.Embeds.builder().title("์‹คํ–‰์ค‘์ธ ํ™˜๊ฒฝ").description(Arrays.toString(environment.getActiveProfiles())).build()); embedsList.add(Message.Embeds.builder().title("์—๋Ÿฌ ๋‚ด์šฉ").description(exception.getMessage()).build()); @@ -109,4 +104,17 @@ public Message ErrorBatchServer(String title, String message) { .embeds(embedsList) .build(); } + + public Message toConverKnownMessage(String message) { + List embedsList = new ArrayList<>(); + + embedsList.add(Message.Embeds.builder().title("์‹คํ–‰์ค‘์ธ ํ™˜๊ฒฝ").description(Arrays.toString(environment.getActiveProfiles())).build()); + + return Message + .builder() + .content(message) + .tts(false) + .embeds(embedsList) + .build(); + } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java new file mode 100644 index 00000000..b5f2177b --- /dev/null +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java @@ -0,0 +1,26 @@ +package com.example.matchinfrastructure.discord.service; + +import com.example.matchinfrastructure.discord.client.DiscordFeignClient; +import com.example.matchinfrastructure.discord.convertor.DiscordConvertor; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; + +@Service +@RequiredArgsConstructor +public class DiscordService { + private final DiscordFeignClient discordFeignClient; + private final DiscordConvertor discordConvertor; + @Async("discord-message") + public void sendUnKnownMessage(String username, Exception exception, HttpServletRequest request) { + discordFeignClient.errorMessage(discordConvertor.toConvertUnknownMessage(username, exception, request)); + + } + + @Async("discord-message") + public void sendKnownErrorMessage(String message) { + discordFeignClient.errorMessage(discordConvertor.toConverKnownMessage(message)); + } +} From 5ab0092b170539b400330fd121b1ce474b2bbb9d Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:45:49 +0900 Subject: [PATCH 78/82] =?UTF-8?q?:recycle:=20:=20Jwt=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EB=A1=9C=EA=B9=85=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/JwtAuthenticationEntryPoint.java | 75 +++++++++++-------- .../matchapi/common/security/JwtFilter.java | 3 +- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java index b4ca8d9c..121b8e89 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtAuthenticationEntryPoint.java @@ -1,6 +1,7 @@ package com.example.matchapi.common.security; import com.example.matchdomain.user.exception.UserAuthErrorCode; +import lombok.extern.slf4j.Slf4j; import org.json.JSONException; import org.json.JSONObject; import org.springframework.security.core.AuthenticationException; @@ -10,9 +11,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.rmi.ServerException; +import static com.example.matchdomain.user.exception.UserAuthErrorCode.*; + @Component +@Slf4j public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override @@ -24,46 +30,37 @@ public void commence(HttpServletRequest request, UserAuthErrorCode errorCode; - - /** - * ํ† ํฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ - */ if(exception == null) { - errorCode = UserAuthErrorCode.UNAUTHORIZED_EXCEPTION; - setResponse(response, errorCode); + errorCode = UNAUTHORIZED_EXCEPTION; + setResponse(response, errorCode, request); return; } - /** - * ํ† ํฐ์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ - */ - if(exception.equals("NotExistUser")){ - errorCode = UserAuthErrorCode.NOT_EXIST_USER; - setResponse(response, errorCode); - return; - } - else if(exception.equals("ExpiredJwtException")) { - errorCode = UserAuthErrorCode.EXPIRED_JWT_EXCEPTION; - setResponse(response, errorCode); - return; - } - else if (exception.equals("MalformedJwtException")){ - errorCode= UserAuthErrorCode.INVALID_TOKEN_EXCEPTION; - setResponse(response,errorCode); - return; - } - else if(exception.equals("HijackException")){ - errorCode =UserAuthErrorCode.HIJACK_JWT_TOKEN_EXCEPTION; - setResponse(response,errorCode); - return; - } - else if(exception.equals("NoSuchElementException")){ - errorCode = UserAuthErrorCode.NOT_EXISTS_USER_HAVE_TOKEN; - setResponse(response,errorCode); + switch (exception) { + case "NotExistUser": + errorCode = NOT_EXIST_USER; + setResponse(response, errorCode, request); + return; + case "ExpiredJwtException": + errorCode = EXPIRED_JWT_EXCEPTION; + setResponse(response, errorCode, request); + return; + case "MalformedJwtException": + errorCode = INVALID_TOKEN_EXCEPTION; + setResponse(response, errorCode, request); + return; + case "HijackException": + errorCode = HIJACK_JWT_TOKEN_EXCEPTION; + setResponse(response, errorCode, request); + return; + case "NoSuchElementException": + errorCode = NOT_EXISTS_USER_HAVE_TOKEN; + setResponse(response, errorCode, request); + return; } } - private void setResponse(HttpServletResponse response, UserAuthErrorCode errorCode) throws IOException { + private void setResponse(HttpServletResponse response, UserAuthErrorCode errorCode, HttpServletRequest request) throws IOException { JSONObject json = new JSONObject(); response.setContentType("application/json;charset=UTF-8"); response.setCharacterEncoding("utf-8"); @@ -77,6 +74,18 @@ private void setResponse(HttpServletResponse response, UserAuthErrorCode errorCo e.printStackTrace(); } + + String requestUri = request.getRequestURI(); + if(!requestUri.equals("/error")) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + pw.append("\n==========================!!!JWT ERROR TRACE!!!==========================\n"); + pw.append("REQUEST_URI : ").append(request.getRequestURI()).append(" ").append(request.getMethod()).append("\n"); + pw.append("ERROR_CODE : ").append(errorCode.getCode()).append("\n"); + pw.append("ERROR_MESSAGE : ").append(errorCode.getMessage()).append("\n"); + pw.append("========================================================================="); + log.error(sw.toString()); + } response.getWriter().print(json); } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java index f134c614..316971f9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/security/JwtFilter.java @@ -40,11 +40,10 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo Authentication authentication = jwtService.getAuthentication(jwt,servletRequest); SecurityContextHolder.getContext().setAuthentication(authentication); if(authentication !=null) { - logger.info("Security Context์— '{}' ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค, uri: {} method: {}", authentication.getName(), requestURI, httpServletRequest.getMethod()); + logger.info("Security Context '{}' ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค, uri: {} method: {}", authentication.getName(), requestURI, httpServletRequest.getMethod()); }else{ logger.info("ํ•ด๋‹น ํ† ํฐ์„ ๊ฐ€์ง„ ์œ ์ €๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค, uri: {}", requestURI); } - } else { logger.info("์œ ํšจํ•œ JWT ํ† ํฐ์ด ์—†์Šต๋‹ˆ๋‹ค, uri: {}", requestURI); } From 963d030b819201c7e54a198fad1f494d94deb0fe Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 16:47:28 +0900 Subject: [PATCH 79/82] =?UTF-8?q?:recycle:=20:=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../banner/service/AdminBannerService.java | 4 +- .../convertor/AdminDonationConvertor.java | 6 +- .../service/AdminDonationService.java | 6 +- .../convertor/AdminKeywordConvertor.java | 2 +- .../keyword/service/AdminKeywordService.java | 4 +- .../banner/convertor/BannerConvertor.java | 8 +- .../banner/service/BannerService.java | 2 +- .../donation/convertor/DonationConvertor.java | 62 ++++------ .../convertor/DonationTemporaryConvertor.java | 22 ++-- .../convertor/RegularPaymentConvertor.java | 12 +- .../service/DonationHistoryService.java | 6 +- .../donation/service/DonationService.java | 22 ++-- .../service/DonationTemporaryService.java | 14 +-- .../event/convetor/EventConvertor.java | 16 +-- .../matchapi/event/service/EventService.java | 4 +- .../keword/convertor/KeywordConvertor.java | 2 +- .../keword/service/KeywordService.java | 2 +- .../notice/convertor/NoticeConvertor.java | 14 +-- .../notice/service/NoticeService.java | 4 +- .../convertor/NotificationConvertor.java | 8 +- .../service/NotificationService.java | 4 +- .../order/convertor/OrderConvertor.java | 107 +----------------- .../matchapi/order/helper/OrderHelper.java | 34 ++---- .../matchapi/order/service/OrderService.java | 48 ++++---- .../portone/service/PaymentService.java | 31 ++++- .../project/convertor/ProjectConvertor.java | 61 +++------- .../project/service/ProjectService.java | 30 ++--- .../user/convertor/UserConvertor.java | 30 ++--- .../matchapi/user/service/AuthService.java | 16 +-- .../matchapi/user/service/UserService.java | 21 ++-- .../scheduler/PaymentScheduler.java | 4 +- .../matchbatch/service/OrderService.java | 12 +- .../discord/convertor/DiscordConvertor.java | 10 +- .../discord/service/DiscordService.java | 4 +- .../portone/convertor/PortOneConvertor.java | 4 +- .../pay/portone/service/PortOneService.java | 8 -- 36 files changed, 246 insertions(+), 398 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java b/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java index e0c9a63d..600c7307 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/banner/service/AdminBannerService.java @@ -31,7 +31,7 @@ public List uploadBanner(BannerType bannerType, MultipartFile bannerImage, BannerReq.BannerUpload bannerUploadDto) { String bannerImg = s3UploadService.uploadBannerImage(bannerImage); - bannerRepository.save(bannerConvertor.BannerUpload(bannerType, bannerImg, bannerUploadDto)); + bannerRepository.save(bannerConvertor.convertToBannerUpload(bannerType, bannerImg, bannerUploadDto)); return cachingBannerList(); } @@ -39,6 +39,6 @@ public List uploadBanner(BannerType bannerType, public List cachingBannerList() { List banners = bannerAdaptor.getBannerList(); - return bannerConvertor.BannerList(banners); + return bannerConvertor.convertToBannerList(banners); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java index 5c5cf2ae..eb5dd3a2 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/donation/convertor/AdminDonationConvertor.java @@ -30,7 +30,7 @@ public DonationRes.DonationDetail getDonationDetail(DonationUser donationUser) { .build(); } - public DonationHistory DonationHistoryComplete(Long projectId, List donationUserLists) { + public DonationHistory convertToDonationHistoryComplete(Long projectId, List donationUserLists) { return DonationHistory .builder() .projectId(projectId) @@ -39,7 +39,7 @@ public DonationHistory DonationHistoryComplete(Long projectId, List donati .build(); } - public HistoryImage HistoryImage(String image, Long id) { + public HistoryImage convertToHistoryImage(String image, Long id) { return HistoryImage .builder() .imgUrl(image) @@ -47,7 +47,7 @@ public HistoryImage HistoryImage(String image, Long id) { .build(); } - public DonationHistory DonationHistoryChange(DonationReq.EnforceDonation enforceDonation) { + public DonationHistory convertToDonationHistoryChange(DonationReq.EnforceDonation enforceDonation) { return DonationHistory .builder() .projectId(enforceDonation.getProjectId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java b/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java index 0f1b5350..69349589 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/donation/service/AdminDonationService.java @@ -72,9 +72,9 @@ public DonationRes.DonationDetail getDonationDetail(Long donationId) { @Transactional public void enforceDonation(List imageLists, DonationReq.EnforceDonation enforceDonation) { - donationHistoryRepository.save(adminDonationConvertor.DonationHistoryChange(enforceDonation)); + donationHistoryRepository.save(adminDonationConvertor.convertToDonationHistoryChange(enforceDonation)); - DonationHistory donationHistory = donationHistoryRepository.save(adminDonationConvertor.DonationHistoryComplete(enforceDonation.getProjectId(), enforceDonation.getDonationUserLists())); + DonationHistory donationHistory = donationHistoryRepository.save(adminDonationConvertor.convertToDonationHistoryComplete(enforceDonation.getProjectId(), enforceDonation.getDonationUserLists())); saveDonationHistoryImages(imageLists, donationHistory.getId()); @@ -96,7 +96,7 @@ private void saveDonationHistoryImages(List imageLists, Long hist List historyImages = new ArrayList<>(); for(String image : images){ - historyImages.add(adminDonationConvertor.HistoryImage(image, historyId)); + historyImages.add(adminDonationConvertor.convertToHistoryImage(image, historyId)); } historyImageRepository.saveAll(historyImages); } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java index 8bcdeb4f..2d54d49d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/convertor/AdminKeywordConvertor.java @@ -6,7 +6,7 @@ @Convertor public class AdminKeywordConvertor { - public SearchKeyword Keyword(AdminKeywordReq.KeywordUpload keyword) { + public SearchKeyword convertToKeyword(AdminKeywordReq.KeywordUpload keyword) { return SearchKeyword.builder().keyword(keyword.getSearchKeyword()).priority(keyword.getPriority()).build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java index b0cbe923..399a0543 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/keyword/service/AdminKeywordService.java @@ -26,7 +26,7 @@ public class AdminKeywordService { @Transactional @CachePut(cacheNames = "keywordList", key = "'all'") public List postKeyword(AdminKeywordReq.KeywordUpload keyword) { - searchKeywordRepository.save(adminKeywordConvertor.Keyword(keyword)); + searchKeywordRepository.save(adminKeywordConvertor.convertToKeyword(keyword)); return cachingKeywordList(); } @@ -36,7 +36,7 @@ public List cachingKeywordList(){ List keywordLists = new ArrayList<>(); searchKeywords.forEach( - result -> keywordLists.add(keywordConvertor.KeywordList(result)) + result -> keywordLists.add(keywordConvertor.convertToKeywordList(result)) ); return keywordLists; } diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java b/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java index e11302fb..8e2f46d4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/convertor/BannerConvertor.java @@ -12,7 +12,7 @@ @Convertor public class BannerConvertor { - public Banner BannerUpload(BannerType bannerType, String bannerImg, BannerReq.BannerUpload bannerUploadDto) { + public Banner convertToBannerUpload(BannerType bannerType, String bannerImg, BannerReq.BannerUpload bannerUploadDto) { if(bannerType.equals(BannerType.EVENT)){ return Banner .builder() @@ -31,20 +31,20 @@ public Banner BannerUpload(BannerType bannerType, String bannerImg, BannerReq.Ba } } - public List BannerList(List banners) { + public List convertToBannerList(List banners) { List bannerLists = new ArrayList<>(); banners.forEach( result -> bannerLists.add( - BannerInfo(result) + convertToBannerInfo(result) ) ); return bannerLists; } - private BannerRes.BannerList BannerInfo(Banner result) { + private BannerRes.BannerList convertToBannerInfo(Banner result) { return BannerRes.BannerList .builder() .bannerId(result.getId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java b/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java index da99f9b7..cd87d741 100644 --- a/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java +++ b/Match-Api/src/main/java/com/example/matchapi/banner/service/BannerService.java @@ -19,6 +19,6 @@ public class BannerService { @Cacheable(cacheNames = "bannerCache", key = "'all'") public List getBannerList() { List banners = bannerAdaptor.getBannerList(); - return bannerConvertor.BannerList(banners); + return bannerConvertor.convertToBannerList(banners); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java index fd0c5616..6847b7e4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationConvertor.java @@ -26,22 +26,8 @@ public class DonationConvertor { private final DonationHelper donationHelper; private final TimeHelper timeHelper; - private final HistoryImageRepository historyImageRepository; - public DonationRes.FlameList Flame(DonationUser result) { - return DonationRes.FlameList.builder() - .donationId(result.getId()) - .amount(result.getPrice()) - .donationStatus(result.getDonationStatus().getName()) - .flameName(result.getInherenceName()) - .createdAt(result.getCreatedAt().getYear()+"๋…„ " - +result.getCreatedAt().getMonthValue()+"์›” " - +result.getCreatedAt().getDayOfMonth()+"์ผ " - +result.getCreatedAt().getHour()+"์‹œ " - +result.getCreatedAt().getMinute()+"๋ถ„") - .build(); - } - public DonationRes.DonationCount DonationCount(List donationUserList) { int beforeCnt=0; + public DonationRes.DonationCount convertToDonationCount(List donationUserList) { int beforeCnt=0; int underCnt=0; int successCnt=0; @@ -63,7 +49,7 @@ public DonationRes.FlameList Flame(DonationUser result) { } - public DonationRes.DonationList DonationListDetail(DonationUser result) { + public DonationRes.DonationList convertToDonationListDetail(DonationUser result) { String payDate=""; if(result.getRegularPayment()!=null) { payDate = "๋งค์›” " + result.getRegularPayment().getPayDate() + "์ผ " + donationHelper.parsePriceComma(Math.toIntExact(result.getRegularPayment().getAmount())); @@ -82,14 +68,14 @@ public DonationRes.DonationList DonationListDetail(DonationUser result) { } - public DonationHistory DonationHistory(Long id, HistoryStatus historyStatus) { + public DonationHistory convertToDonationHistory(Long id, HistoryStatus historyStatus) { return DonationHistory.builder() .donationUserId(id) .historyStatus(historyStatus) .build(); } - public DonationRes.DonationRegular DonationRegular(RegularPayment regularPayment) { + public DonationRes.DonationRegular convertToDonationRegular(RegularPayment regularPayment) { return DonationRes.DonationRegular .builder() .projectTitle(regularPayment.getProject().getProjectName()) @@ -100,7 +86,7 @@ public DonationRes.DonationRegular DonationRegular(RegularPayment regularPayment .build(); } - public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory result, String inherenceName) { + public DonationRes.DonationRegularList convertToDonationRegularListDetail(DonationHistory result, String inherenceName) { String histories = ""; String flameImage = null; List donationHistoryImages = new ArrayList<>(); @@ -112,7 +98,7 @@ public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory }else if(result.getHistoryStatus() == HistoryStatus.COMPLETE) { System.out.println("COMPLETE"); histories = "'ํ›„์›ํ’ˆ'์„ 'ํ›„์›์ฒ˜'์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค."; - donationHistoryImages = DonationHistoryImage(result.getHistoryImages()); + donationHistoryImages = convertToDonationHistoryImage(result.getHistoryImages()); }else{ histories = inherenceName + " ์™ธ " + (result.getCnt()-1) + "๋งˆ๋ฆฌ์˜ ๋ถˆ๊ฝƒ์ด๋“ค์ด 'ํ›„์›ํ’ˆ'์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค."; } @@ -128,7 +114,7 @@ public DonationRes.DonationRegularList DonationRegularListDetail(DonationHistory .build(); } - private List DonationHistoryImage(List historyImages) { + private List convertToDonationHistoryImage(List historyImages) { List donationHistoryImages = new ArrayList<>(); System.out.println(historyImages.size()); @@ -145,7 +131,7 @@ private List DonationHistoryImage(List imgUrlList = null; if(result.getImgUrlList()!=null){ imgUrlList = Stream.of(result.getImgUrlList().split(",")).collect(Collectors.toList()); @@ -176,7 +162,7 @@ public DonationRes.BurningMatchRes BurningMatchDetail(DonationUserRepository.fla .build(); } - public DonationRes.FlameProjectList FlameProject(DonationUser result) { + public DonationRes.FlameProjectList convertToFlameProject(DonationUser result) { return DonationRes.FlameProjectList .builder() .donationId(result.getId()) @@ -187,7 +173,7 @@ public DonationRes.FlameProjectList FlameProject(DonationUser result) { .build(); } - public DonationRes.DonationFlame DonationFlame(int sequence, DonationUser donationUser) { + public DonationRes.DonationFlame convertToDonationFlame(int sequence, DonationUser donationUser) { return DonationRes.DonationFlame .builder() .imgUrl(donationUser.getFlameImage()) @@ -200,7 +186,7 @@ public DonationRes.DonationFlame DonationFlame(int sequence, DonationUser donati .build(); } - public ProjectRes.MatchHistory MatchHistoryDetail(DonationHistory result) { + public ProjectRes.MatchHistory convertToMatchHistoryDetail(DonationHistory result) { String histories = ""; String profileImgUrl = ""; String nickname = ""; @@ -243,19 +229,19 @@ public ProjectRes.MatchHistory MatchHistoryDetail(DonationHistory result) { .build(); } - public DonationHistory DonationHistoryTurnOn(Long id, HistoryStatus historyStatus) { + public DonationHistory convertToDonationHistoryTurnOn(Long id, HistoryStatus historyStatus) { return DonationHistory.builder() .regularPaymentId(id) .historyStatus(historyStatus) .build(); } - public List DonationList(Page donationUsers) { + public List convertToDonationList(Page donationUsers) { List donationLists = new ArrayList<>(); donationUsers.getContent().forEach( result ->{ donationLists.add( - DonationListDetail(result) + convertToDonationListDetail(result) ); } ); @@ -267,53 +253,53 @@ public List BurningMatch(List burningMatchRes = new ArrayList<>(); flameLists.forEach( result -> { - burningMatchRes.add(BurningMatchDetail(result)); + burningMatchRes.add(convertToBurningMatchDetail(result)); } ); return burningMatchRes; } - public List DonationRegularList(List donationHistories, String inherenceName){ + public List convertToDonationRegularList(List donationHistories, String inherenceName){ List donationRegularLists = new ArrayList<>(); donationHistories.forEach( result -> donationRegularLists.add( - DonationRegularListDetail(result, inherenceName) + convertToDonationRegularListDetail(result, inherenceName) ) ); return donationRegularLists; } - public List MatchHistory(List donationHistories){ + public List convertToMatchHistory(List donationHistories){ List matchHistories = new ArrayList<>(); donationHistories.forEach( result -> matchHistories.add( - MatchHistoryDetail(result) + convertToMatchHistoryDetail(result) ) ); return matchHistories; } - public List FlameProjectList(List donationUsers){ + public List convertToFlameProjectList(List donationUsers){ List flameProjectLists = new ArrayList<>(); donationUsers.forEach( result -> flameProjectLists.add( - FlameProject(result) + convertToFlameProject(result) ) ); return flameProjectLists; } - public List PayList(List donationUsers) { + public List convertToPayList(List donationUsers) { List payLists = new ArrayList<>(); donationUsers.forEach( result -> payLists.add( - PayListDetail(result) + convertToPayListDetail(result) ) ); diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationTemporaryConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationTemporaryConvertor.java index 8f3b3031..1e30e104 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationTemporaryConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/DonationTemporaryConvertor.java @@ -13,7 +13,7 @@ @Convertor public class DonationTemporaryConvertor { - public DonationTemporaryRes.UserInfo UserInfo(User user) { + public DonationTemporaryRes.UserInfo convertToUserInfo(User user) { return DonationTemporaryRes.UserInfo .builder() .name(user.getName()) @@ -22,7 +22,7 @@ public DonationTemporaryRes.UserInfo UserInfo(User user) { .build(); } - public DonationTemporary DonationInfo(User user, DonationTemporaryReq.DonationInfo donationInfo) { + public DonationTemporary convertToDonationInfo(User user, DonationTemporaryReq.DonationInfo donationInfo) { return DonationTemporary .builder() .userId(user.getId()) @@ -34,17 +34,17 @@ public DonationTemporary DonationInfo(User user, DonationTemporaryReq.DonationIn .build(); } - public DonationTemporaryRes.DonationList DonationList(DonationList result, String amount) { + public DonationTemporaryRes.DonationList convertToDonationList(DonationList result, String amount) { return DonationTemporaryRes.DonationList .builder() .name(result.getName()) .amount(amount) .donationDate(result.getCreatedAt().getYear()+"."+result.getCreatedAt().getMonthValue()+"."+result.getCreatedAt().getDayOfMonth()+"."+result.getCreatedAt().getHour()+"."+result.getCreatedAt().getMinute()) - .name(replaceMiddleWithAsterisk(result.getName())) + .name(convertToReplaceMiddleWithAsterisk(result.getName())) .build(); } - public String replaceMiddleWithAsterisk(String str) { + public String convertToReplaceMiddleWithAsterisk(String str) { int length = str.length(); if (length == 2) { @@ -56,17 +56,17 @@ public String replaceMiddleWithAsterisk(String str) { return str.substring(0, middle) + "*" + str.substring(middle + 1); } - public List DonationRequestAdminList(List content) { + public List convertToDonationRequestAdminList(List content) { List donationRequestAdminLists = new ArrayList<>(); content.forEach( result -> donationRequestAdminLists.add( - DonationInfoList(result) + convertToDonationInfoList(result) ) ); return donationRequestAdminLists; } - public DonationTemporaryRes.DonationRequestAdminList DonationInfoList(DonationTemporary result) { + public DonationTemporaryRes.DonationRequestAdminList convertToDonationInfoList(DonationTemporary result) { return DonationTemporaryRes.DonationRequestAdminList .builder() .donationRequestId(result.getId()) @@ -80,7 +80,7 @@ public DonationTemporaryRes.DonationRequestAdminList DonationInfoList(DonationTe .build(); } - public DonationList DonationDeposit(DonationTemporaryReq.DonationDeposit donationDeposit) { + public DonationList convertToDonationDeposit(DonationTemporaryReq.DonationDeposit donationDeposit) { return DonationList.builder() .donationTemporaryId(donationDeposit.getDonationRequestId()) .amount(donationDeposit.getAmount()) @@ -88,7 +88,7 @@ public DonationList DonationDeposit(DonationTemporaryReq.DonationDeposit donatio .build(); } - public DonationTemporaryRes.DonationDetail DonationInfoDetail(DonationTemporary donationTemporary) { + public DonationTemporaryRes.DonationDetail convertToDonationInfoDetail(DonationTemporary donationTemporary) { return DonationTemporaryRes.DonationDetail .builder() .donationRequestId(donationTemporary.getId()) @@ -103,7 +103,7 @@ public DonationTemporaryRes.DonationDetail DonationInfoDetail(DonationTemporary .build(); } - public DonationTemporary DonationInfoEmail(User user, DonationTemporaryReq.DonationInfo donationInfo) { + public DonationTemporary convertToDonationInfoEmail(User user, DonationTemporaryReq.DonationInfo donationInfo) { return DonationTemporary .builder() .userId(user.getId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java index f19d5398..5306b7fe 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/convertor/RegularPaymentConvertor.java @@ -16,17 +16,17 @@ public class RegularPaymentConvertor { private final TimeHelper timeHelper; private final DonationHelper donationHelper; - public List MatchList(List regularPayments) { + public List convertToMatchList(List regularPayments) { List matchLists = new ArrayList<>(); regularPayments.forEach( - result -> matchLists.add(MatchListDetail(result)) + result -> matchLists.add(convertToMatchListDetail(result)) ); return matchLists; } - private DonationRes.MatchList MatchListDetail(RegularPayment result) { + private DonationRes.MatchList convertToMatchListDetail(RegularPayment result) { return DonationRes.MatchList .builder() .regularDate(timeHelper.matchTimeFormat(result.getCreatedAt())) @@ -37,12 +37,12 @@ private DonationRes.MatchList MatchListDetail(RegularPayment result) { .build(); } - public List BurningFlameList(List donationUsers) { + public List convertToBurningFlameList(List donationUsers) { List burningFlameDto = new ArrayList<>(); donationUsers.forEach( result -> burningFlameDto.add( - BurningFlame(result) + convertToBurningFlame(result) ) ); @@ -50,7 +50,7 @@ public List BurningFlameList(List don } - private DonationRes.BurningFlameDto BurningFlame(DonationUser donationUser) { + private DonationRes.BurningFlameDto convertToBurningFlame(DonationUser donationUser) { return DonationRes.BurningFlameDto .builder() diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java index 2b799496..9c4f8711 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java @@ -16,9 +16,9 @@ public class DonationHistoryService { private final DonationConvertor donationConvertor; public void postRegularDonationHistory(Long regularPaymentId, Long donationId) { - saveDonationHistory(donationConvertor.DonationHistoryTurnOn(regularPaymentId, TURN_ON)); + saveDonationHistory(donationConvertor.convertToDonationHistoryTurnOn(regularPaymentId, TURN_ON)); - saveDonationHistory(donationConvertor.DonationHistory(donationId, CREATE)); + saveDonationHistory(donationConvertor.convertToDonationHistory(donationId, CREATE)); } public void saveDonationHistory(DonationHistory donationHistory){ @@ -26,6 +26,6 @@ public void saveDonationHistory(DonationHistory donationHistory){ } public void oneTimeDonationHistory(Long donationId){ - saveDonationHistory(donationConvertor.DonationHistory(donationId, CREATE)); + saveDonationHistory(donationConvertor.convertToDonationHistory(donationId, CREATE)); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index 42b2c4d3..4534b9a6 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -53,7 +53,7 @@ public class DonationService { public PageResponse> getDonationList(Long userId, int filter, int page, int size) { Page donationUsers = donationAdaptor.findDonationList(userId, filter, page ,size); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.DonationList(donationUsers)); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.convertToDonationList(donationUsers)); } @Transactional @@ -82,7 +82,7 @@ public void cancelRegularPay(User user, Long regularId) { public DonationRes.DonationCount getDonationCount(User user) { List donationUser = donationAdaptor.findByDonationCount(user); - return donationConvertor.DonationCount(donationUser); + return donationConvertor.convertToDonationCount(donationUser); } public PageResponse> getBurningMatch(User user, int page, int size) { @@ -94,7 +94,7 @@ public PageResponse> getBurningMatch(User user @Transactional public DonationRes.DonationRegular getDonationRegular(Long regularPayId, User user) { RegularPayment regularPayment = regularPaymentAdaptor.findById(regularPayId); - return donationConvertor.DonationRegular(regularPayment); + return donationConvertor.convertToDonationRegular(regularPayment); } @Transactional @@ -103,19 +103,19 @@ public PageResponse> getDonationRegularLis Page donationHistories = donationHistoryAdaptor.findDonationRegularList(regularPayId, regularPayment.getProjectId(), HistoryStatus.TURN_ON ,page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent(), "")); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.convertToDonationRegularList(donationHistories.getContent(), "")); } public List getPayList(User user, Long regularPayId) { List donationUsers = donationAdaptor.findPayList(regularPayId); - return donationConvertor.PayList(donationUsers); + return donationConvertor.convertToPayList(donationUsers); } public PageResponse> getFlameProjectList(User user, String content, int page, int size) { Page donationUsers = donationAdaptor.getFlameProjectList(user, content, page, size); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.FlameProjectList(donationUsers.getContent())); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), donationConvertor.convertToFlameProjectList(donationUsers.getContent())); } public PageResponse> getFlameRegularList(Long donationId, User user, int page, int size) { @@ -123,31 +123,31 @@ public PageResponse> getFlameRegularList(L Page donationHistories = donationHistoryAdaptor.findDonationHistory(donationUser, donationId, page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.DonationRegularList(donationHistories.getContent(), donationUser.getInherenceName())); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.convertToDonationRegularList(donationHistories.getContent(), donationUser.getInherenceName())); } public DonationRes.DonationFlame getFlameRegular(Long donationId, User user) { DonationUser donationUser = donationAdaptor.findById(donationId); int sequence = donationHelper.getDonationSequence(donationUser, donationId); - return donationConvertor.DonationFlame(sequence, donationUser); + return donationConvertor.convertToDonationFlame(sequence, donationUser); } public PageResponse> getMatchHistory(User user, Long projectId, int page, int size) { Page donationHistories = donationHistoryAdaptor.findMatchHistory(projectId, page, size); - return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.MatchHistory(donationHistories.getContent())); + return new PageResponse<>(donationHistories.isLast(), donationHistories.getTotalElements(), donationConvertor.convertToMatchHistory(donationHistories.getContent())); } public PageResponse> getUserMatchList(User user, int page, int size) { Page regularPayments = regularPaymentAdaptor.findByUser(user, page, size); - return new PageResponse<>(regularPayments.isLast(), regularPayments.getTotalElements(), regularPaymentConvertor.MatchList(regularPayments.getContent())); + return new PageResponse<>(regularPayments.isLast(), regularPayments.getTotalElements(), regularPaymentConvertor.convertToMatchList(regularPayments.getContent())); } @Cacheable(value = "flameCache", key = "{#user.id, #page, #size}") public PageResponse> getBurningFlameList(User user, int page, int size) { Page donationUsers = donationAdaptor.findByUser(user, page, size); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), regularPaymentConvertor.BurningFlameList(donationUsers.getContent())); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), regularPaymentConvertor.convertToBurningFlameList(donationUsers.getContent())); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationTemporaryService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationTemporaryService.java index 6b15cad0..9fac9ded 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationTemporaryService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationTemporaryService.java @@ -31,14 +31,14 @@ public class DonationTemporaryService { private final DonationListRepository donationListRepository; private final DonationHelper donationHelper; public DonationTemporaryRes.UserInfo getUserInfo(User user) { - return donationTemporaryConvertor.UserInfo(user); + return donationTemporaryConvertor.convertToUserInfo(user); } public void postDonationTemporary(User user, DonationTemporaryReq.DonationInfo donationInfo) { if(donationInfo.getAlarmMethod() == AlarmMethod.SMS) { - donationTemporaryRepository.save(donationTemporaryConvertor.DonationInfo(user, donationInfo)); + donationTemporaryRepository.save(donationTemporaryConvertor.convertToDonationInfo(user, donationInfo)); }else{ - donationTemporaryRepository.save(donationTemporaryConvertor.DonationInfoEmail(user, donationInfo)); + donationTemporaryRepository.save(donationTemporaryConvertor.convertToDonationInfoEmail(user, donationInfo)); } } @@ -49,7 +49,7 @@ public PageResponse> getDonationList(Don donationLists.getContent().forEach( result -> donationList.add( - donationTemporaryConvertor.DonationList(result, donationHelper.parsePriceComma(result.getAmount())) + donationTemporaryConvertor.convertToDonationList(result, donationHelper.parsePriceComma(result.getAmount())) ) ); @@ -73,7 +73,7 @@ public PageResponse> getDona donationTemporaries = donationTemporaryRepository.findByNameContainingAndDepositOrderByCreatedAtDesc(content,deposit, pageable); } } - return new PageResponse<>(donationTemporaries.isLast(), donationTemporaries.getTotalElements(), donationTemporaryConvertor.DonationRequestAdminList(donationTemporaries.getContent())); + return new PageResponse<>(donationTemporaries.isLast(), donationTemporaries.getTotalElements(), donationTemporaryConvertor.convertToDonationRequestAdminList(donationTemporaries.getContent())); } @Transactional @@ -81,7 +81,7 @@ public void postDonationDeposit(DonationTemporaryReq.DonationDeposit donationDep DonationTemporary donationTemporary = donationTemporaryRepository.findById(donationDeposit.getDonationRequestId()) .orElseThrow(()-> new BadRequestException(NOT_EXIST_DONATION_REQUEST)); - donationListRepository.save(donationTemporaryConvertor.DonationDeposit(donationDeposit)); + donationListRepository.save(donationTemporaryConvertor.convertToDonationDeposit(donationDeposit)); donationTemporary.setDeposit(Deposit.EXISTENCE); donationTemporaryRepository.save(donationTemporary); @@ -90,6 +90,6 @@ public void postDonationDeposit(DonationTemporaryReq.DonationDeposit donationDep public DonationTemporaryRes.DonationDetail getDonationInfo(Long donationRequestId) { DonationTemporary donationTemporary = donationTemporaryRepository.findById(donationRequestId) .orElseThrow(()-> new BadRequestException(NOT_EXIST_DONATION_REQUEST)); - return donationTemporaryConvertor.DonationInfoDetail(donationTemporary); + return donationTemporaryConvertor.convertToDonationInfoDetail(donationTemporary); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java index 09538934..96baa480 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/convetor/EventConvertor.java @@ -17,18 +17,18 @@ @RequiredArgsConstructor public class EventConvertor { private final TimeHelper timeHelper; - public List EventList(List content) { + public List convertToEventList(List content) { List eventLists = new ArrayList<>(); content.forEach( result -> { - eventLists.add(EventListDetail(result)); + eventLists.add(convertToEventListDetail(result)); } ); return eventLists; } - private EventRes.EventList EventListDetail(Event result) { + private EventRes.EventList convertToEventListDetail(Event result) { return EventRes.EventList .builder() .eventId(result.getId()) @@ -41,12 +41,12 @@ private EventRes.EventList EventListDetail(Event result) { .build(); } - public EventRes.EventDetail EventDetail(Event event) { - EventRes.EventInfo eventInfo = EventInfo(event); + public EventRes.EventDetail convertToEventDetail(Event event) { + EventRes.EventInfo eventInfo = convertToEventInfo(event); List eventContents = new ArrayList<>(); event.getEventContents().forEach( - result -> eventContents.add(EventContents(result)) + result -> eventContents.add(convertToEventContents(result)) ); return EventRes.EventDetail @@ -56,7 +56,7 @@ public EventRes.EventDetail EventDetail(Event event) { .build(); } - private EventRes.EventContents EventContents(EventContent result) { + private EventRes.EventContents convertToEventContents(EventContent result) { return EventRes.EventContents .builder() .contentId(result.getId()) @@ -65,7 +65,7 @@ private EventRes.EventContents EventContents(EventContent result) { .build(); } - private EventRes.EventInfo EventInfo(Event event) { + private EventRes.EventInfo convertToEventInfo(Event event) { return EventRes.EventInfo .builder() .eventId(event.getId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java index dee07e23..4d46fb27 100644 --- a/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java +++ b/Match-Api/src/main/java/com/example/matchapi/event/service/EventService.java @@ -27,12 +27,12 @@ public PageResponse> getEventList(int page, int size) { } public List cachingEventLists(List content) { - return eventConvertor.EventList(content); + return eventConvertor.convertToEventList(content); } public EventRes.EventDetail getEventDetail(Long eventId) { Event event = eventAdaptor.findByEvent(eventId); - return eventConvertor.EventDetail(event); + return eventConvertor.convertToEventDetail(event); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java b/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java index 34feb3c1..1721983c 100644 --- a/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/keword/convertor/KeywordConvertor.java @@ -7,7 +7,7 @@ @Convertor public class KeywordConvertor { - public KeywordRes.KeywordList KeywordList(SearchKeyword result) { + public KeywordRes.KeywordList convertToKeywordList(SearchKeyword result) { return KeywordRes.KeywordList .builder() .keywordId(result.getId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java index 4269ba83..63021870 100644 --- a/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java +++ b/Match-Api/src/main/java/com/example/matchapi/keword/service/KeywordService.java @@ -31,7 +31,7 @@ public List getKeyword(){ List keywordLists = new ArrayList<>(); searchKeywords.forEach( - result -> keywordLists.add(keywordConvertor.KeywordList(result)) + result -> keywordLists.add(keywordConvertor.convertToKeywordList(result)) ); return keywordLists; } diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java index 9de4bdf4..37895de3 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/convertor/NoticeConvertor.java @@ -14,19 +14,19 @@ @RequiredArgsConstructor public class NoticeConvertor { private final TimeHelper timeHelper; - public List NoticeList(List content) { + public List convertToNoticeList(List content) { List noticeLists = new ArrayList<>(); content.forEach( result -> noticeLists.add( - NoticeListDetail(result) + convertToNoticeListDetail(result) ) ); return noticeLists; } - private NoticeRes.NoticeList NoticeListDetail(Notice result) { + private NoticeRes.NoticeList convertToNoticeListDetail(Notice result) { return NoticeRes.NoticeList .builder() .noticeId(result.getId()) @@ -36,13 +36,13 @@ private NoticeRes.NoticeList NoticeListDetail(Notice result) { .build(); } - public NoticeRes.NoticeDetail NoticeDetail(Notice notice) { - NoticeRes.NoticeList noticeInfo = NoticeListDetail(notice); + public NoticeRes.NoticeDetail convertToNoticeDetail(Notice notice) { + NoticeRes.NoticeList noticeInfo = convertToNoticeListDetail(notice); List noticeContents = new ArrayList<>(); notice.getNoticeContents().forEach( result -> noticeContents.add( - NoticeContentsDetail(result) + convertToNoticeContentsDetail(result) ) ); return NoticeRes.NoticeDetail @@ -52,7 +52,7 @@ public NoticeRes.NoticeDetail NoticeDetail(Notice notice) { .build(); } - private NoticeRes.NoticeContents NoticeContentsDetail(NoticeContent result) { + private NoticeRes.NoticeContents convertToNoticeContentsDetail(NoticeContent result) { return NoticeRes.NoticeContents .builder() .contentId(result.getId()) diff --git a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java index 07d1998a..d9b34eb7 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java +++ b/Match-Api/src/main/java/com/example/matchapi/notice/service/NoticeService.java @@ -22,11 +22,11 @@ public class NoticeService { @Cacheable(value = "noticeCache", key = "{#page, #size}") public PageResponse> getNoticeList(int page, int size) { Page notices = noticeAdapter.getNoticeList(page, size); - return new PageResponse<>(notices.isLast(), notices.getTotalElements(), noticeConvertor.NoticeList(notices.getContent())); + return new PageResponse<>(notices.isLast(), notices.getTotalElements(), noticeConvertor.convertToNoticeList(notices.getContent())); } public NoticeRes.NoticeDetail getNoticeDetail(Long noticeId) { Notice notice = noticeAdapter.findNoticeDetail(noticeId); - return noticeConvertor.NoticeDetail(notice); + return noticeConvertor.convertToNoticeDetail(notice); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java index ce8d5bc6..ef7c2c91 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/convertor/NotificationConvertor.java @@ -18,19 +18,19 @@ @RequiredArgsConstructor public class NotificationConvertor { private final TimeHelper timeHelper; - public List NotificationList(List notifications) { + public List convertToNotificationList(List notifications) { List notificationLists = new ArrayList<>(); notifications.forEach( result -> notificationLists.add( - NotificationDetail(result) + convertToNotificationDetail(result) ) ); return notificationLists; } - private NotificationRes.NotificationList NotificationDetail(Notification result) { + private NotificationRes.NotificationList convertToNotificationDetail(Notification result) { return NotificationRes.NotificationList .builder() @@ -42,7 +42,7 @@ private NotificationRes.NotificationList NotificationDetail(Notification result) .build(); } - public Notification NotificationTest(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { + public Notification convertToNotificationTest(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { return Notification .builder() .body(fcmNotificationRequestDto.getBody()) diff --git a/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java index 79630f24..af5052d9 100644 --- a/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/notification/service/NotificationService.java @@ -22,11 +22,11 @@ public class NotificationService { public PageResponse getNotificationList(User user, int page, int size) { Page notifications = notificationAdaptor.findByUser(user, page, size); int notificationCount = notificationAdaptor.countByUnRead(user); - return new PageResponse<>(notifications.isLast(), notifications.getTotalElements(), new NotificationRes.NotificationListInfo(notificationCount, notificationConvertor.NotificationList(notifications.getContent()))); + return new PageResponse<>(notifications.isLast(), notifications.getTotalElements(), new NotificationRes.NotificationListInfo(notificationCount, notificationConvertor.convertToNotificationList(notifications.getContent()))); } public void saveTestNotification(User user, FCMNotificationRequestDto fcmNotificationRequestDto) { - Notification notification = notificationConvertor.NotificationTest(user, fcmNotificationRequestDto); + Notification notification = notificationConvertor.convertToNotificationTest(user, fcmNotificationRequestDto); notificationAdaptor.saveNotification(notification); } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 32b5848d..031261ba 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -27,56 +27,8 @@ public class OrderConvertor { private final OrderHelper orderHelper; private final DonationHelper donationHelper; - public DonationUser donationUser(NicePaymentAuth nicePaymentAuth, Long id, OrderReq.OrderDetail orderDetail, Long projectId, String flameName, String inherenceNumber) { - return DonationUser.builder() - .userId(id) - .projectId(projectId) - .price(orderDetail.getAmount()) - .tid(nicePaymentAuth.getTid()) - .orderId(nicePaymentAuth.getOrderId()) - .donationStatus(DonationStatus.EXECUTION_BEFORE) - .payMethod(orderHelper.getPayMethod(nicePaymentAuth.getPayMethod())) - .inherenceName(flameName) - .inherenceNumber(inherenceNumber) - .regularStatus(RegularStatus.ONE_TIME) - .flameImage(FlameImage.NORMAL_IMG.getImg()) - .build(); - } - public DonationUser donationUserV2(NicePaymentAuth nicePaymentAuth, Long id, Long amount, String projectId, String flameName, String inherenceNumber) { - return DonationUser.builder() - .userId(id) - .projectId(Long.valueOf(projectId)) - .price(amount) - .tid(nicePaymentAuth.getTid()) - .orderId(nicePaymentAuth.getOrderId()) - .donationStatus(DonationStatus.EXECUTION_BEFORE) - .payMethod(orderHelper.getPayMethod(nicePaymentAuth.getPayMethod())) - .inherenceName(flameName) - .inherenceNumber(inherenceNumber) - .regularStatus(RegularStatus.ONE_TIME) - .flameImage(FlameImage.NORMAL_IMG.getImg()) - .build(); - } - - public String createPlainText(OrderReq.RegistrationCard registrationCard) { - return "cardNo=" + registrationCard.getCardNo() + "&" - + "expYear=" + registrationCard.getExpYear() + "&" - + "expMonth=" + registrationCard.getExpMonth() + "&" - + "idNo=" + registrationCard.getIdNo() + "&" - + "cardPw=" + registrationCard.getCardPw(); - } - public NiceBillOkRequest niceBillOk(NicePayBillkeyResponse nicePayBillkeyResponse, String orderId) { - return NiceBillOkRequest.builder() - .cardQuota(0) - .amount(480L) - .goodsName("์นด๋“œ ํ™•์ธ ์šฉ ๊ฒฐ์ œ") - .useShopInterest(false) - .orderId(orderId) - .build(); - } - - public RegularPayment RegularPayment(Long id, OrderReq.RegularDonation regularDonation, Long userCardId, Long projectId) { + public RegularPayment convertToRegularPayment(Long id, OrderReq.RegularDonation regularDonation, Long userCardId, Long projectId) { return RegularPayment.builder() .userId(id) .payDate(regularDonation.getPayDate()) @@ -87,30 +39,6 @@ public RegularPayment RegularPayment(Long id, OrderReq.RegularDonation regularDo .build(); } - public UserCard UserCard(Long id, OrderReq.RegistrationCard registrationCard, NicePayBillkeyResponse nicePayBillkeyResponse){ - return UserCard.builder() - .userId(id) - .bid(nicePayBillkeyResponse.getBid()) - .cardNo(registrationCard.getCardNo()) - .expYear(registrationCard.getExpYear()) - .expMonth(registrationCard.getExpMonth()) - .idNo(registrationCard.getIdNo()) - .cardPw(registrationCard.getCardPw()) - .cardName(nicePayBillkeyResponse.getCardName()) - .orderId(nicePayBillkeyResponse.getOrderId()) - .build(); - } - - public RequestPaymentHistory recordHistory(Long userId, String orderId, String tid, Long amount, String reason) { - return RequestPaymentHistory.builder() - .userId(userId) - .tid(tid) - .orderId(orderId) - .amount(amount) - .reason(reason) - .build(); - } - public OrderRequest CreateRequest(Long userId, Long projectId, String orderId) { return OrderRequest.builder() .userId(String.valueOf(userId)) @@ -119,34 +47,7 @@ public OrderRequest CreateRequest(Long userId, Long projectId, String orderId) { .ttl(10L) .build(); } - - public NiceBillOkRequest billCardOneTime(Long amount, String orderId) { - return NiceBillOkRequest.builder() - .cardQuota(0) - .amount(amount) - .goodsName("๋งค์น˜ ๊ธฐ๋ถ€๊ธˆ ๊ฒฐ์ œ") - .useShopInterest(false) - .orderId(orderId) - .build(); - } - - public DonationUser donationBillUser(NiceBillOkResponse niceBillOkResponse, Long id, Long amount, Long projectId, String flameName, String inherenceNumber, RegularStatus regularStatus, Long regularPaymentId) { - return DonationUser.builder() - .userId(id) - .projectId(projectId) - .price(amount) - .tid(niceBillOkResponse.getTid()) - .orderId(niceBillOkResponse.getOrderId()) - .donationStatus(DonationStatus.EXECUTION_BEFORE) - .payMethod(orderHelper.getPayMethod(niceBillOkResponse.getPayMethod())) - .inherenceName(flameName) - .inherenceNumber(inherenceNumber) - .regularStatus(regularStatus) - .regularPaymentId(regularPaymentId) - .build(); - } - - public DonationUser donationUserPortone(Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { + public DonationUser convertToDonationUserPortone(Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { return DonationUser.builder() .userId(userId) .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) @@ -163,7 +64,7 @@ public DonationUser donationUserPortone(Long userId, PaymentReq.ValidatePayment .build(); } - public UserCard UserBillCard(Long id, OrderReq.RegistrationCard registrationCard, PortOneBillResponse portOneBillResponse) { + public UserCard convertToUserBillCard(Long id, OrderReq.RegistrationCard registrationCard, PortOneBillResponse portOneBillResponse) { return UserCard.builder() .userId(id) .bid(portOneBillResponse.getCustomer_uid()) @@ -197,7 +98,7 @@ public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id .build(); } - public OrderRes.CompleteDonation CompleteDonation(String name, Project project, Long amount) { + public OrderRes.CompleteDonation convertToCompleteDonation(String name, Project project, Long amount) { return OrderRes.CompleteDonation .builder() .username(name) diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java index b30f935e..21ece097 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java @@ -16,6 +16,7 @@ import com.example.matchinfrastructure.pay.nice.dto.NicePayCancelRequest; import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.RandomStringUtils; import org.springframework.http.HttpStatus; import java.time.LocalDateTime; @@ -47,18 +48,6 @@ public String getNicePaymentAuthorizationHeader() { return BASIC + Base64.getEncoder().encodeToString((nicePayProperties.getClient() + ":" + nicePayProperties.getSecret()).getBytes()); } - public void checkNicePaymentsResult(String resultCode, String resultMessage) { - switch(resultCode){ - case "0000": - break; - default: - throw new BaseException(HttpStatus.BAD_REQUEST, - false, - resultCode, - resultMessage); - } - } - public List getInherenceName(List donationUsers){ return donationUsers.stream() .map(DonationUser :: getInherenceName).collect(Collectors.toList()); @@ -84,19 +73,6 @@ public static > T getRandomEnumValue(Class enumClass) { return values[random.nextInt(values.length)]; } - public void checkBillResult(String resultCode, String resultMsg, String tid, String orderId) { - switch(resultCode){ - case "0000": - niceAuthFeignClient.cancelPayment(getNicePaymentAuthorizationHeader(), tid, new NicePayCancelRequest("๊ฒฐ์žฌ ํ™•์ธ ์™„๋ฃŒ ์ทจ์†Œ", orderId)); - break; - default: - throw new BaseException(HttpStatus.BAD_REQUEST, - false, - resultCode, - resultMsg); - } - } - public String maskMiddleNum(String cardNo) { String firstFourDigits = cardNo.substring(0, 4); String lastFourDigits = cardNo.substring(12); @@ -104,4 +80,12 @@ public String maskMiddleNum(String cardNo) { return firstFourDigits + middleDigitsMasked + lastFourDigits; } + + public String createOrderId(String type){ + boolean useLetters = true; + boolean useNumbers = true; + String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); + return type + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; + } + } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index 9bdaae1a..27e3fb13 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -94,19 +94,19 @@ public OrderRes.CompleteDonation regularDonation(User user, OrderReq.RegularDona Project project = projectService.checkProjectExists(projectId, RegularStatus.REGULAR); - PortOneResponse portOneResponse = portOneService.payBillKey(card.getBid(), createOrderId(REGULAR), regularDonation.getAmount(), project.getProjectName(), card.getCustomerId()); + PortOneResponse portOneResponse = paymentService.payBillKey(card, regularDonation.getAmount(), project.getProjectName(), REGULAR); String flameName = orderHelper.createFlameName(user); String inherenceNumber = createRandomUUID(); - RegularPayment regularPayment = regularPaymentRepository.save(orderConvertor.RegularPayment(user.getId(), regularDonation, cardId, projectId)); + RegularPayment regularPayment = regularPaymentRepository.save(orderConvertor.convertToRegularPayment(user.getId(), regularDonation, cardId, projectId)); DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); donationHistoryService.postRegularDonationHistory(regularPayment.getId(), donationUser.getId()); - return orderConvertor.CompleteDonation(user.getName(), project, regularDonation.getAmount()); + return orderConvertor.convertToCompleteDonation(user.getName(), project, regularDonation.getAmount()); } @@ -118,30 +118,35 @@ private void validateCard(UserCard card, User user) { @RedissonLock(LockName = "๋นŒํ‚ค-๋‹จ๊ธฐ-๊ธฐ๋ถ€", key = "#cardId") public OrderRes.CompleteDonation oneTimeDonationCard(User user, OrderReq.OneTimeDonation oneTimeDonation, Long cardId, Long projectId) { - UserCard card = userCardAdaptor.findCardByCardId(cardId); + try { + UserCard card = userCardAdaptor.findCardByCardId(cardId); - validateCard(card, user); + validateCard(card, user); - Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); + Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); - String accessToken = portOneAuthService.getToken(); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(card.getBid(), createOrderId(ONE_TIME), oneTimeDonation.getAmount(), project.getProjectName(), card.getCustomerId())); + PortOneResponse portOneResponse = paymentService.payBillKey(card, oneTimeDonation.getAmount(), project.getProjectName(), ONE_TIME); - String flameName = orderHelper.createFlameName(user); + String flameName = orderHelper.createFlameName(user); - String inherenceNumber = createRandomUUID(); + String inherenceNumber = createRandomUUID(); - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); - donationHistoryService.oneTimeDonationHistory(donationUser.getId()); + donationHistoryService.oneTimeDonationHistory(donationUser.getId()); - return orderConvertor.CompleteDonation(user.getName(), project, oneTimeDonation.getAmount()); + return orderConvertor.convertToCompleteDonation(user.getName(), project, oneTimeDonation.getAmount()); + }catch (Exception e){ + //paymentService.refundPayment(); + } + + return null; } @Transactional public String saveRequest(User user, Long projectId) { - String orderId = createOrderId(ONE_TIME); + String orderId = orderHelper.createOrderId(ONE_TIME); orderRequestRepository.save(orderConvertor.CreateRequest(user.getId(), projectId, orderId)); @@ -183,13 +188,14 @@ public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registr String expiry = "20" + registrationCard.getExpYear() + "-" + registrationCard.getExpMonth(); PortOneResponse portOneResponse = portOneFeignClient.getBillKey( accessToken, - createOrderId(BILL), - portOneConvertor.PortOneBill(cardNo, expiry, registrationCard.getIdNo(), registrationCard.getCardPw()) + orderHelper.createOrderId(BILL), + portOneConvertor.convertToPortOneBill(cardNo, expiry, registrationCard.getIdNo(), registrationCard.getCardPw()) ); + if(portOneResponse.getCode()!=0){ throw new BaseException(BAD_REQUEST, false, "PORT_ONE_BILL_AUTH_001", portOneResponse.getMessage()); } - userCardRepository.save(orderConvertor.UserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); + userCardRepository.save(orderConvertor.convertToUserBillCard(user.getId(), registrationCard, portOneResponse.getResponse())); return portOneResponse.getResponse(); } @@ -211,12 +217,6 @@ public String createRandomUUID() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + UUID.randomUUID().toString(); } - public String createOrderId(String type){ - boolean useLetters = true; - boolean useNumbers = true; - String randomStr = RandomStringUtils.random(12, useLetters, useNumbers); - return type + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; - } private void cancelRegularPayment(List regularPayments) { for(RegularPayment regularPayment : regularPayments){ @@ -226,7 +226,7 @@ private void cancelRegularPayment(List regularPayments) { } public String saveRequestPrepare(User user, Long projectId, int amount) { - String orderId = createOrderId(ONE_TIME); + String orderId = orderHelper.createOrderId(ONE_TIME); orderRequestRepository.save(orderConvertor.convertToRequestPrepare(user.getId(), projectId, amount, orderId)); diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 98e27c0e..2b7df925 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -10,6 +10,7 @@ import com.example.matchcommon.properties.PortOneProperties; import com.example.matchdomain.common.model.Status; import com.example.matchdomain.donation.entity.DonationUser; +import com.example.matchdomain.donation.entity.UserCard; import com.example.matchdomain.donation.repository.DonationUserRepository; import com.example.matchdomain.project.adaptor.ProjectAdaptor; import com.example.matchdomain.project.entity.Project; @@ -17,6 +18,12 @@ import com.example.matchdomain.redis.repository.OrderRequestRepository; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.repository.UserRepository; +import com.example.matchinfrastructure.pay.portone.client.PortOneFeignClient; +import com.example.matchinfrastructure.pay.portone.convertor.PortOneConvertor; +import com.example.matchinfrastructure.pay.portone.dto.PortOneBillPayResponse; +import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; +import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; +import com.example.matchinfrastructure.pay.portone.service.PortOneService; import com.siot.IamportRestClient.IamportClient; import com.siot.IamportRestClient.exception.IamportResponseException; import com.siot.IamportRestClient.request.CancelData; @@ -29,10 +36,9 @@ import java.io.IOException; import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.UUID; +import static com.example.matchcommon.constants.MatchStatic.ONE_TIME; import static com.example.matchdomain.order.exception.PortOneAuthErrorCode.*; import static com.example.matchdomain.project.exception.ProjectOneTimeErrorCode.PROJECT_NOT_EXIST; import static com.example.matchdomain.user.exception.UserLoginErrorCode.NOT_EXIST_USER; @@ -50,6 +56,10 @@ public class PaymentService { private final ProjectAdaptor projectAdaptor; private final DonationHistoryService donationHistoryService; private final PortOneProperties portOneProperties; + private final PortOneConvertor portOneConvertor; + private final PortOneFeignClient portOneFeignClient; + private final PortOneAuthService portOneAuthService; + @Autowired public PaymentService(PortOneProperties portOneProperties, @@ -57,7 +67,7 @@ public PaymentService(PortOneProperties portOneProperties, UserRepository userRepository, OrderHelper orderHelper, DonationUserRepository donationUserRepository, - OrderConvertor orderConvertor, ProjectAdaptor projectAdaptor, DonationHistoryService donationHistoryService) { + OrderConvertor orderConvertor, ProjectAdaptor projectAdaptor, DonationHistoryService donationHistoryService, PortOneConvertor portOneConvertor, PortOneFeignClient portOneFeignClient, PortOneAuthService portOneAuthService) { this.portOneProperties = portOneProperties; this.orderRequestRepository = orderRequestRepository; this.userRepository = userRepository; @@ -67,6 +77,9 @@ public PaymentService(PortOneProperties portOneProperties, this.iamportClient = new IamportClient(portOneProperties.getKey(), portOneProperties.getSecret()); this.projectAdaptor = projectAdaptor; this.donationHistoryService = donationHistoryService; + this.portOneConvertor = portOneConvertor; + this.portOneFeignClient = portOneFeignClient; + this.portOneAuthService = portOneAuthService; } @RedissonLock(LockName = "๊ฒฐ์ œ-๊ฒ€์ฆ", key = "#validatePayment.orderId") @@ -88,7 +101,7 @@ public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validat orderRequestRepository.deleteById(validatePayment.getOrderId()); - return orderConvertor.CompleteDonation(user.getName(), project, (long) validatePayment.getAmount()); + return orderConvertor.convertToCompleteDonation(user.getName(), project, (long) validatePayment.getAmount()); } catch (BadRequestException | IamportResponseException | IOException e) { try { refundPayment(validatePayment.getImpUid()); @@ -120,8 +133,14 @@ public void refundPayment(String impUid) { public void saveDonationUser(User user, PaymentReq.ValidatePayment validatePayment, Project project) { String flameName = orderHelper.createFlameName(user); - String inherenceNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + createRandomUUID(); - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationUserPortone(user.getId(), validatePayment, project.getId(), flameName, inherenceNumber)); + String inherenceNumber = orderHelper.createFlameName(user); + DonationUser donationUser = donationUserRepository.save(orderConvertor.convertToDonationUserPortone(user.getId(), validatePayment, project.getId(), flameName, inherenceNumber)); donationHistoryService.oneTimeDonationHistory(donationUser.getId()); } + + public PortOneResponse payBillKey(UserCard card, Long amount, String projectName, String type) { + String orderId = orderHelper.createOrderId(type); + String accessToken = portOneAuthService.getToken(); + return portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.convertPayWithBillKey(card.getBid(), orderId, amount, projectName, card.getCustomerId())); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java index 84068df3..82bf3234 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/convertor/ProjectConvertor.java @@ -32,7 +32,6 @@ public class ProjectConvertor { private final ProjectHelper projectHelper; private final RegularPaymentRepository regularPaymentRepository; - private final TimeHelper timeHelper; private static final String FIRST_TIME = "T00:00:00"; private static final String LAST_TIME = "T23:59:59"; public ProjectRes.ProjectDetail projectImgList(List projectImage) { @@ -82,18 +81,6 @@ public UserRes.MyPage getMyPage(List regularPayments, Long likeC .build(); } - - public ProjectRes.CommentList projectComment(Long userId, ProjectComment result) { - return ProjectRes.CommentList.builder() - .commentId(result.getId()) - .comment(result.getComment()) - .commentDate(timeHelper.dayTimeFormat(result.getCreatedAt())) - .nickname(result.getUser().getNickname()) - .userId(result.getUserId()) - .isMy(result.getUserId().equals(userId)) - .build(); - } - public Project postProject(ProjectReq.Project projects) { return Project.builder() .projectName(projects.getProjectName()) @@ -118,7 +105,7 @@ public ProjectImage postProjectImage(Long id, String imgUrl, ImageRepresentStatu .build(); } - public ProjectRes.ProjectAdminList ProjectList(ProjectRepository.ProjectAdminList result) { + public ProjectRes.ProjectAdminList convertToProjectList(ProjectRepository.ProjectAdminList result) { return ProjectRes.ProjectAdminList.builder() .projectId(result.getProjectId()) .projectName(result.getProjectName()) @@ -131,7 +118,7 @@ public ProjectRes.ProjectAdminList ProjectList(ProjectRepository.ProjectAdminLis .build(); } - public ProjectRes.ProjectAdminDetail ProjectAdminDetail(ProjectRepository.ProjectAdminDetail result, List projectImages) { + public ProjectRes.ProjectAdminDetail convertToProjectAdminDetail(ProjectRepository.ProjectAdminDetail result, List projectImages) { List projectImgLists = new ArrayList<>(); projectImages.forEach( results -> projectImgLists.add( @@ -163,18 +150,18 @@ public ProjectRes.ProjectAdminDetail ProjectAdminDetail(ProjectRepository.Projec .build(); } - public List DonationUserInfo(List donationUsers){ + public List convertToDonationUserInfo(List donationUsers){ List donationLists = new ArrayList<>(); donationUsers.forEach( result -> donationLists.add( - DonationUserInfoDetail(result) + convertToDonationUserInfoDetail(result) ) ); return donationLists; } - public ProjectRes.DonationList DonationUserInfoDetail(DonationUser result) { + public ProjectRes.DonationList convertToDonationUserInfoDetail(DonationUser result) { return ProjectRes.DonationList .builder() .donationId(result.getId()) @@ -193,7 +180,7 @@ public ProjectRes.DonationList DonationUserInfoDetail(DonationUser result) { .build(); } - public ProjectRes.ProjectLists ProjectListsDetail(ProjectRepository.ProjectList result) { + public ProjectRes.ProjectLists convertToProjectListsDetail(ProjectRepository.ProjectList result) { List imgUrlList = new ArrayList<>(); if(result.getImgUrlList()!=null){ imgUrlList = Stream.of(result.getImgUrlList().split(",")).collect(Collectors.toList()); @@ -214,37 +201,23 @@ public ProjectRes.ProjectLists ProjectListsDetail(ProjectRepository.ProjectList .build(); } - public List ProjectLists(List projects){ + public List convertToProjectLists(List projects){ List projectLists = new ArrayList<>(); projects.forEach( result -> { - projectLists.add(ProjectListsDetail(result)); + projectLists.add(convertToProjectListsDetail(result)); } ); return projectLists; } - public ProjectRes.ProjectLists ProjectListQueryDsl(ProjectList result) { - return ProjectRes.ProjectLists - .builder() - .projectId(result.getId()) - .imgUrl(result.getImgUrl()) - .title(result.getProjectName()) - .usages(result.getUsages()) - .kind(result.getProjectKind().getName()) - .like(result.getLike()) - .userProfileImages(result.getImgUrlList()) - .totalDonationCnt(Math.toIntExact(result.getTotalDonationCnt())) - .build(); - } - - public ProjectRes.ProjectAppDetail ProjectAppDetail(ProjectRepository.ProjectDetail projects, List projectImages) { + public ProjectRes.ProjectAppDetail convertToProjectAppDetail(ProjectRepository.ProjectDetail projects, List projectImages) { List projectImgLists = new ArrayList<>(); String thumbNail = ""; for(ProjectImage projectImage : projectImages){ if(projectImage.getImageRepresentStatus() == ImageRepresentStatus.NORMAL){ - projectImgLists.add(ProjectImages(projectImage)); + projectImgLists.add(convertToProjectImages(projectImage)); } else { thumbNail = projectImage.getUrl(); @@ -273,7 +246,7 @@ public ProjectRes.ProjectAppDetail ProjectAppDetail(ProjectRepository.ProjectDet .build(); } - private ProjectRes.ProjectImgList ProjectImages(ProjectImage projectImage) { + private ProjectRes.ProjectImgList convertToProjectImages(ProjectImage projectImage) { return ProjectRes.ProjectImgList .builder() .imgId(projectImage.getId()) @@ -282,7 +255,7 @@ private ProjectRes.ProjectImgList ProjectImages(ProjectImage projectImage) { .build(); } - public ProjectRes.ProjectLists ProjectToDto(ProjectDto result) { + public ProjectRes.ProjectLists convertToProjectToDto(ProjectDto result) { List imgUrlList = new ArrayList<>(); List regularPayments = regularPaymentRepository.findByProjectIdAndRegularPayStatus(result.getId(), RegularPayStatus.PROCEEDING); @@ -303,7 +276,7 @@ public ProjectRes.ProjectLists ProjectToDto(ProjectDto result) { .build(); } - public ProjectComment Comment(Long id, Long projectId, String comment) { + public ProjectComment convertToComment(Long id, Long projectId, String comment) { return ProjectComment .builder() .userId(id) @@ -312,7 +285,7 @@ public ProjectComment Comment(Long id, Long projectId, String comment) { .build(); } - public DonationHistory DonationHistory(Long projectId, HistoryStatus historyStatus) { + public DonationHistory convertToDonationHistory(Long projectId, HistoryStatus historyStatus) { return DonationHistory .builder() .projectId(projectId) @@ -320,7 +293,7 @@ public DonationHistory DonationHistory(Long projectId, HistoryStatus historyStat .build(); } - public CommentReport ReportComment(Long commentId, ReportReason reportReason) { + public CommentReport convertToReportComment(Long commentId, ReportReason reportReason) { return CommentReport .builder() .commentId(commentId) @@ -328,7 +301,7 @@ public CommentReport ReportComment(Long commentId, ReportReason reportReason) { .build(); } - public List ProjectListWeb(List projects) { + public List convertToProjectListWeb(List projects) { List projectLists = new ArrayList<>(); projects.forEach( @@ -347,7 +320,7 @@ public List ProjectListWeb(List ProjectListWebForNotLogin(List projects) { + public List convertToProjectListWebForNotLogin(List projects) { List projectLists = new ArrayList<>(); projects.forEach( diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index c21c801d..bf5478ba 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -73,11 +73,11 @@ public PageResponse> getProjectList(User user, int if(!userId.equals(0L)){ Page projects = projectAdaptor.findLoginUserProjectList(userId, page, size); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWeb(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectListWeb(projects.getContent())); } else{ Page projects = projectAdaptor.findNotLoginUserProjectList(page, size); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWebForNotLogin(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectListWebForNotLogin(projects.getContent())); } } @@ -94,11 +94,11 @@ public PageResponse> searchProjectList(User user, S if(!userId.equals(0L)){ Page projects = projectAdaptor.findLoginUserSearchProjectList(userId, page, size, content); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWeb(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectListWeb(projects.getContent())); } else{ Page projects = projectAdaptor.findNotLoginUserSearchProjectList(content, page, size); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectListWebForNotLogin(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectListWebForNotLogin(projects.getContent())); } } @@ -113,7 +113,7 @@ public void postProject(ProjectReq.Project projects, MultipartFile presentFile, saveImgList(project.getId(), url, imgUrlList); - donationHistoryRepository.save(projectConvertor.DonationHistory(project.getId(), HistoryStatus.TURN_ON)); + donationHistoryRepository.save(projectConvertor.convertToDonationHistory(project.getId(), HistoryStatus.TURN_ON)); } public PageResponse> getProjectList(int page, int size) { @@ -125,7 +125,7 @@ public PageResponse> getProjectList(int page, projectAdminLists.getContent().forEach( result -> projectLists.add( - projectConvertor.ProjectList(result) + projectConvertor.convertToProjectList(result) ) ); @@ -138,7 +138,7 @@ public void patchProjectStatus(ProjectStatus projectStatus, Long projectId) { project.setProjectStatus(projectStatus); - if(projectStatus.equals(ProjectStatus.DEADLINE)) donationHistoryRepository.save(projectConvertor.DonationHistory(projectId, HistoryStatus.FINISH)); + if(projectStatus.equals(ProjectStatus.DEADLINE)) donationHistoryRepository.save(projectConvertor.convertToDonationHistory(projectId, HistoryStatus.FINISH)); projectRepository.save(project); } @@ -184,13 +184,13 @@ public ProjectRes.ProjectAdminDetail getProjectAdminDetail(Long projectId) { List projectImages = projectImgAdaptor.findProjectImages(projectId); - return projectConvertor.ProjectAdminDetail(projectAdminDetail,projectImages); + return projectConvertor.convertToProjectAdminDetail(projectAdminDetail,projectImages); } public PageResponse> getDonationList(Long projectId, int page, int size) { Page donationUsers = donationAdaptor.findDonationUsers(projectId, page, size); - return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), projectConvertor.DonationUserInfo(donationUsers.getContent())); + return new PageResponse<>(donationUsers.isLast(), donationUsers.getTotalElements(), projectConvertor.convertToDonationUserInfo(donationUsers.getContent())); } @Transactional @@ -221,7 +221,7 @@ public void patchProjectActive(Long projectId) { public PageResponse> getProjectLists(User user, int page, int size, ProjectKind projectKind, String content, FILTER filter) { Page projects = projectAdaptor.findProject(user, page, size, projectKind, content, filter); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectLists(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectLists(projects.getContent())); } @Transactional @@ -239,14 +239,14 @@ public ProjectRes.ProjectLike patchProjectLike(User user, Long projectId) { public PageResponse> getTodayProjectLists(User user, int page, int size) { Page projects = projectAdaptor.getTodayProjectLists(user.getId(), page, size); - return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.ProjectLists(projects.getContent())); + return new PageResponse<>(projects.isLast(), projects.getTotalElements(), projectConvertor.convertToProjectLists(projects.getContent())); } public ProjectRes.ProjectAppDetail getProjectAppDetail(User user, Long projectId) { ProjectRepository.ProjectDetail projects = projectRepository.getProjectAppDetail(user.getId(), projectId); List projectImages = projectImageRepository.findByProjectIdOrderBySequenceAsc(projectId); - return projectConvertor.ProjectAppDetail(projects, projectImages); + return projectConvertor.convertToProjectAppDetail(projects, projectImages); } public PageResponse> projectList(User user, int page, int size, ProjectKind projectKind, String content) { @@ -259,7 +259,7 @@ public PageResponse> projectList(User user, int pa projects.getContent().forEach( result -> { - project.add(projectConvertor.ProjectToDto(result)); + project.add(projectConvertor.convertToProjectToDto(result)); } ); @@ -268,13 +268,13 @@ public PageResponse> projectList(User user, int pa public void postComment(User user, Long projectId, ProjectReq.Comment comment) { - projectCommentRepository.save(projectConvertor.Comment(user.getId(), projectId, comment.getComment())); + projectCommentRepository.save(projectConvertor.convertToComment(user.getId(), projectId, comment.getComment())); } public void reportComment(Long commentId, ReportReason reportReason) { ProjectComment projectComment = projectCommentRepository.findByIdAndStatus(commentId, ACTIVE).orElseThrow(()-> new NotFoundException(COMMENT_NOT_EXIST)); - commentReportRepository.save(projectConvertor.ReportComment(commentId, reportReason)); + commentReportRepository.save(projectConvertor.convertToReportComment(commentId, reportReason)); } public void deleteComment(User user, Long commentId) { diff --git a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java index 283a6197..f924e780 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/convertor/UserConvertor.java @@ -35,7 +35,7 @@ public class UserConvertor { private final PasswordEncoder passwordEncoder; private final AligoProperties aligoProperties; - public User KakaoSignUpUser(KakaoUserInfoDto kakaoUserInfoDto, SocialType authType, Authority authority) { + public User convertToKakaoSignUpUser(KakaoUserInfoDto kakaoUserInfoDto, SocialType authType) { String profileImg = BASE_PROFILE; if(kakaoUserInfoDto.getProfileUrl() != null){ profileImg = kakaoUserInfoDto.getProfileUrl(); @@ -58,13 +58,13 @@ public User KakaoSignUpUser(KakaoUserInfoDto kakaoUserInfoDto, SocialType authTy .build(); } - public Authority PostAuthority() { + public Authority convertToPostAuthority() { return Authority.builder() .authorityName("ROLE_USER") .build(); } - public User NaverSignUpUser(NaverUserInfoDto naverUserInfoDto, SocialType authType, Authority authority) { + public User convertToNaverSignUpUser(NaverUserInfoDto naverUserInfoDto, SocialType authType) { String profileImg = BASE_PROFILE; if(naverUserInfoDto.getProfileImage() != null){ profileImg = naverUserInfoDto.getProfileImage(); @@ -87,7 +87,7 @@ public User NaverSignUpUser(NaverUserInfoDto naverUserInfoDto, SocialType authTy .build(); } - public User SignUpUser(UserReq.SignUpUser signUpUser, Authority authority) { + public User convertToSignUpUser(UserReq.SignUpUser signUpUser) { return User.builder() .username(signUpUser.getEmail()) .profileImgUrl(BASE_PROFILE) @@ -105,7 +105,7 @@ public User SignUpUser(UserReq.SignUpUser signUpUser, Authority authority) { .build(); } - public UserRes.EditMyPage toMyPage(User user) { + public UserRes.EditMyPage convertToMyPage(User user) { return UserRes.EditMyPage.builder() .userId(user.getId()) .email(user.getEmail()) @@ -116,7 +116,7 @@ public UserRes.EditMyPage toMyPage(User user) { .build(); } - public UserAddress AddUserAddress(Long userId, KakaoUserAddressDto.ShippingAddresses shippingAddresses) { + public UserAddress convertToAddUserAddress(Long userId, KakaoUserAddressDto.ShippingAddresses shippingAddresses) { return UserAddress.builder() .userId(userId) .name(shippingAddresses.getName()) @@ -131,7 +131,7 @@ public UserAddress AddUserAddress(Long userId, KakaoUserAddressDto.ShippingAddre .build(); } - public RefreshToken RefreshToken(Long userId, String refreshToken, Long refreshTokenSeconds) { + public RefreshToken convertToRefreshToken(Long userId, String refreshToken, Long refreshTokenSeconds) { return RefreshToken.builder() .userId(String.valueOf(userId)) .token(refreshToken) @@ -139,14 +139,14 @@ public RefreshToken RefreshToken(Long userId, String refreshToken, Long refreshT .build(); } - public OrderRes.UserDetail userInfo(User user) { + public OrderRes.UserDetail convertToUserInfo(User user) { return OrderRes.UserDetail.builder() .name(user.getName()) .birthDay(user.getBirth().toString()) .phoneNumber(user.getPhoneNumber()).build(); } - public UserRes.SignUpInfo UserSignUpInfo(Long oneDayUser, Long weekUser, Long monthUser, Long totalUser) { + public UserRes.SignUpInfo convertToUserSignUpInfo(Long oneDayUser, Long weekUser, Long monthUser, Long totalUser) { return UserRes.SignUpInfo.builder() .totalUserCnt(totalUser) .oneDayUserCnt(oneDayUser) @@ -155,7 +155,7 @@ public UserRes.SignUpInfo UserSignUpInfo(Long oneDayUser, Long weekUser, Long mo .build(); } - public UserRes.UserList UserList(UserRepository.UserList result) { + public UserRes.UserList convertToUserList(UserRepository.UserList result) { return UserRes.UserList .builder() .userId(result.getUserId()) @@ -173,7 +173,7 @@ public UserRes.UserList UserList(UserRepository.UserList result) { .build(); } - public UserRes.UserAdminDetail UserAdminDetail(UserRepository.UserList userDetail, List userCards) { + public UserRes.UserAdminDetail convertToUserAdminDetail(UserRepository.UserList userDetail, List userCards) { return UserRes.UserAdminDetail .builder() .userId(userDetail.getUserId()) @@ -203,7 +203,7 @@ public SendReq SendSms(String phone, String code) { .build(); } - public UserRes.Profile UserProfile(User user) { + public UserRes.Profile convertToUserProfile(User user) { return UserRes.Profile .builder() .profileImgUrl(user.getProfileImgUrl()) @@ -215,7 +215,7 @@ public UserRes.Profile UserProfile(User user) { .build(); } - public UserFcmToken UserFcm(User user, UserReq.FcmToken token) { + public UserFcmToken convertToUserFcm(User user, UserReq.FcmToken token) { return UserFcmToken.builder() .userFcmPk( UserFcmPk.builder() @@ -226,7 +226,7 @@ public UserFcmToken UserFcm(User user, UserReq.FcmToken token) { .build(); } - public User AppleUserSignUp(AppleUserRes appleUserRes) { + public User convertToAppleUserSignUp(AppleUserRes appleUserRes) { return User.builder() .username(appleUserRes.getSocialId()) .password(authHelper.createRandomPassword()) @@ -242,7 +242,7 @@ public User AppleUserSignUp(AppleUserRes appleUserRes) { .build(); } - public UserRes.AlarmAgreeList AlarmAgree(User user) { + public UserRes.AlarmAgreeList convertToAlarmAgree(User user) { return UserRes.AlarmAgreeList .builder() .serviceAlarm(user.getServiceAlarm()) diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java index 4f9c69f1..f5db4ed5 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java @@ -97,7 +97,7 @@ public UserRes.UserToken kakaoLogIn(UserReq.SocialLoginToken socialLoginToken) { if(!kakaoUserAddressDto.isShippingAddressesNeedsAgreement()){ List userAddressList = new ArrayList<>(); for(KakaoUserAddressDto.ShippingAddresses shippingAddresses : kakaoUserAddressDto.getShippingAddresses()){ - UserAddress userAddress = userConvertor.AddUserAddress(userId,shippingAddresses); + UserAddress userAddress = userConvertor.convertToAddUserAddress(userId,shippingAddresses); userAddressList.add(userAddress); } userAddressRepository.saveAll(userAddressList); @@ -117,15 +117,13 @@ public UserRes.UserToken kakaoLogIn(UserReq.SocialLoginToken socialLoginToken) { private UserRes.Token createToken(Long userId) { UserRes.Token token = jwtService.createTokens(userId); - refreshTokenRepository.save(userConvertor.RefreshToken(userId,token.getRefreshToken(),jwtProperties.getRefreshTokenSeconds())); + refreshTokenRepository.save(userConvertor.convertToRefreshToken(userId,token.getRefreshToken(),jwtProperties.getRefreshTokenSeconds())); return token; } private Long kakaoSignUp(KakaoUserInfoDto kakaoUserInfoDto) { - - Authority authority = userConvertor.PostAuthority(); - User user = userConvertor.KakaoSignUpUser(kakaoUserInfoDto, KAKAO, authority); + User user = userConvertor.convertToKakaoSignUpUser(kakaoUserInfoDto, KAKAO); System.out.println(kakaoUserInfoDto.getPhoneNumber()); @@ -134,7 +132,7 @@ private Long kakaoSignUp(KakaoUserInfoDto kakaoUserInfoDto) { @Transactional public Long naverSignUp(NaverUserInfoDto naverUserInfoDto) { - return userRepository.save(userConvertor.NaverSignUpUser(naverUserInfoDto, NAVER, userConvertor.PostAuthority())).getId(); + return userRepository.save(userConvertor.convertToNaverSignUpUser(naverUserInfoDto, NAVER)).getId(); } public KakaoLoginTokenRes getOauthToken(String code, String referer) { return kakaoLoginFeignClient.kakaoAuth( @@ -177,9 +175,7 @@ public UserRes.UserToken signUpUser(UserReq.SignUpUser signUpUser) { if(userRepository.existsByPhoneNumber(signUpUser.getPhone())) throw new BadRequestException(USERS_EXISTS_PHONE); if(userRepository.existsByEmail(signUpUser.getEmail())) throw new BadRequestException(USERS_EXISTS_EMAIL); - Authority authority = userConvertor.PostAuthority(); - - Long userId = userRepository.save(userConvertor.SignUpUser(signUpUser,authority)).getId(); + Long userId = userRepository.save(userConvertor.convertToSignUpUser(signUpUser)).getId(); UserRes.Token token = createToken(userId); @@ -278,6 +274,6 @@ public UserRes.UserToken appleLogin(UserReq.SocialLoginToken socialLoginToken) { } private Long appleSignUp(AppleUserRes appleUserRes) { - return userRepository.save(userConvertor.AppleUserSignUp(appleUserRes)).getId(); + return userRepository.save(userConvertor.convertToAppleUserSignUp(appleUserRes)).getId(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java index a9d5d45e..d68022c8 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/UserService.java @@ -53,9 +53,7 @@ public class UserService { private final UserRepository userRepository; private final UserAddressRepository userAddressRepository; private final UserConvertor userConvertor; - private final DonationUserRepository donationUserRepository; private final ProjectConvertor projectConvertor; - private final ProjectHelper projectHelper; private final ProjectUserAttentionRepository projectUserAttentionRepository; private final OrderService orderService; private final RegularPaymentRepository regularPaymentRepository; @@ -73,7 +71,7 @@ public List findUserAddress(Long id) { } public UserRes.EditMyPage getEditMyPage(User user) { - return userConvertor.toMyPage(user); + return userConvertor.convertToMyPage(user); } public UserRes.MyPage getMyPage(User user) { @@ -84,18 +82,17 @@ public UserRes.MyPage getMyPage(User user) { } public OrderRes.UserDetail getUserInfo(User user) { - return userConvertor.userInfo(user); + return userConvertor.convertToUserInfo(user); } public UserRes.SignUpInfo getUserSignUpInfo() { LocalDate localDate = LocalDate.now(); - LocalDateTime localDateTime = LocalDateTime.now(); Long totalUser = userRepository.countBy(); Long oneDayUser = userRepository.countByCreatedAtGreaterThanAndCreatedAtLessThan(LocalDateTime.parse(localDate+FIRST_TIME), LocalDateTime.parse(localDate+LAST_TIME)); Long weekUser = userRepository.countByCreatedAtGreaterThanAndCreatedAtLessThan(LocalDateTime.parse(localDate.minusWeeks(1)+FIRST_TIME) , LocalDateTime.parse(localDate+LAST_TIME)); Long monthUser = userRepository.countByCreatedAtGreaterThanAndCreatedAtLessThan(LocalDateTime.parse(localDate.with(TemporalAdjusters.firstDayOfMonth())+FIRST_TIME), LocalDateTime.parse(localDate.with(TemporalAdjusters.lastDayOfMonth())+LAST_TIME)); - return userConvertor.UserSignUpInfo(oneDayUser,weekUser,monthUser,totalUser); + return userConvertor.convertToUserSignUpInfo(oneDayUser,weekUser,monthUser,totalUser); } @Transactional @@ -119,7 +116,7 @@ else if(status!=null){ userList.getContent().forEach( result -> userLists.add( - userConvertor.UserList(result) + userConvertor.convertToUserList(result) ) ); @@ -132,11 +129,11 @@ public UserRes.UserAdminDetail getUserAdminDetail(Long userId) { List userCards = orderService.getUserBillCard(userId); - return userConvertor.UserAdminDetail(userDetail,userCards); + return userConvertor.convertToUserAdminDetail(userDetail,userCards); } public UserRes.Profile getProfile(User user) { - return userConvertor.UserProfile(user); + return userConvertor.convertToUserProfile(user); } @Transactional @@ -166,7 +163,7 @@ else if (modifyProfile.getMultipartFile() != null){ } public void saveFcmToken(User user, UserReq.FcmToken token) { - userFcmTokenRepository.save(userConvertor.UserFcm(user, token)); + userFcmTokenRepository.save(userConvertor.convertToUserFcm(user, token)); } public void deleteFcmToken(Long userId, String deviceId) { @@ -192,7 +189,7 @@ public void modifyEmail(User user, UserReq.ModifyEmail email) { public UserRes.AlarmAgreeList getAlarmAgreeList(User user) { System.out.println(user.getName()); - return userConvertor.AlarmAgree(user); + return userConvertor.convertToAlarmAgree(user); } public UserRes.AlarmAgreeList patchAlarm(User user, AlarmType alarmType) { @@ -216,6 +213,6 @@ public UserRes.AlarmAgreeList patchAlarm(User user, AlarmType alarmType) { user = userRepository.save(user); - return userConvertor.AlarmAgree(user); + return userConvertor.convertToAlarmAgree(user); } } diff --git a/Match-Batch/src/main/java/com/example/matchbatch/scheduler/PaymentScheduler.java b/Match-Batch/src/main/java/com/example/matchbatch/scheduler/PaymentScheduler.java index 487726dc..3fae67ec 100644 --- a/Match-Batch/src/main/java/com/example/matchbatch/scheduler/PaymentScheduler.java +++ b/Match-Batch/src/main/java/com/example/matchbatch/scheduler/PaymentScheduler.java @@ -45,7 +45,7 @@ public void RegularPayScheduler(){ jobLauncher.run(regularPaymentJob.regularPaymentJob(), jobParameters); } catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException | JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) { - discordFeignClient.errorMessage(discordConvertor.ErrorBatchServer("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ", e.getMessage())); + discordFeignClient.errorMessage(discordConvertor.convertToErrorBatchServer("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ", e.getMessage())); log.error(e.getMessage()); } @@ -66,7 +66,7 @@ public void RegularFailedPayScheduler(){ jobLauncher.run(donationFailedRetry.regularPaymentRetryJob(), jobParameters); } catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException | JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) { - discordFeignClient.errorMessage(discordConvertor.ErrorBatchServer("์ •๊ธฐ ๊ฒฐ์ œ ์‹คํŒจ ์žฌ์‹œ๋„ ์Šค์ผ€์ค„๋Ÿฌ", e.getMessage())); + discordFeignClient.errorMessage(discordConvertor.convertToErrorBatchServer("์ •๊ธฐ ๊ฒฐ์ œ ์‹คํŒจ ์žฌ์‹œ๋„ ์Šค์ผ€์ค„๋Ÿฌ", e.getMessage())); log.error(e.getMessage()); } } diff --git a/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java b/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java index e7b54e47..a9fb13af 100644 --- a/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java +++ b/Match-Batch/src/main/java/com/example/matchbatch/service/OrderService.java @@ -64,7 +64,7 @@ public void regularDonationPayment() { int amount = 0; int successCnt = 0; - discordFeignClient.alertMessage(discordConvertor.AlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์‹œ์ž‘", regularPayments.size())); + discordFeignClient.alertMessage(discordConvertor.convertToAlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์‹œ์ž‘", regularPayments.size())); String accessToken = portOneAuthService.getTokens(); @@ -83,7 +83,7 @@ public void regularDonationPayment() { String orderId = REGULAR + createRandomOrderId(); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.convertPayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); String flameName = orderHelper.createFlameName(regularPayment.getUser().getName()); @@ -102,7 +102,7 @@ public void regularDonationPayment() { } donationHistoryRepository.saveAll(donationHistories); regularPaymentHistoryRepository.saveAll(requestPaymentHistories); - discordFeignClient.alertMessage(discordConvertor.AlertFinishMessage("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์ข…๋ฃŒ", amount, regularPayments.size(),successCnt, trueCnt)); + discordFeignClient.alertMessage(discordConvertor.convertToAlertFinishMessage("์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์ข…๋ฃŒ", amount, regularPayments.size(),successCnt, trueCnt)); } } @@ -156,14 +156,14 @@ public void regularPaymentRetry() { int trueCnt = 0; int successCnt = 0 ; String accessToken = portOneAuthService.getTokens(); - discordFeignClient.alertMessage(discordConvertor.AlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์‹คํŒจ ํ•œ ๋ฆฌ์ŠคํŠธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹œ์ž‘", requestPaymentHistories.size())); + discordFeignClient.alertMessage(discordConvertor.convertToAlertBatchMessage("์ •๊ธฐ ๊ฒฐ์ œ ์‹คํŒจ ํ•œ ๋ฆฌ์ŠคํŠธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹œ์ž‘", requestPaymentHistories.size())); for(RequestPaymentHistory requestPaymentHistory : requestPaymentHistories){ RegularPayment regularPayment = requestPaymentHistory.getRegularPayment(); UserCard userCard = requestPaymentHistory.getUserCard(); String orderId = REGULAR + createRandomOrderId(); - PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); + PortOneResponse portOneResponse = portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.convertPayWithBillKey(userCard.getBid(), orderId, regularPayment.getAmount(), LocalDateTime.now().getDayOfMonth() + "์›” ๋‹ฌ " +"MATCH ๊ธฐ๋ถ€๊ธˆ ์ •๊ธฐ ๊ฒฐ์ œ", userCard.getCustomerId())); trueCnt +=1 ; @@ -185,7 +185,7 @@ public void regularPaymentRetry() { donationUserRepository.saveAll(donationUsers); - discordFeignClient.alertMessage(discordConvertor.AlertFinishMessage("์‹คํŒจํ•œ ์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ข…๋ฃŒ", amount, requestPaymentHistories.size(),successCnt,trueCnt)); + discordFeignClient.alertMessage(discordConvertor.convertToAlertFinishMessage("์‹คํŒจํ•œ ์ •๊ธฐ ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ข…๋ฃŒ", amount, requestPaymentHistories.size(),successCnt,trueCnt)); } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java index f3a8b389..5a8cd855 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/convertor/DiscordConvertor.java @@ -18,7 +18,7 @@ public class DiscordConvertor { private final Environment environment; - public Message toConvertUnknownMessage(String username, Exception exception, HttpServletRequest request) { + public Message convertToUnknownMessage(String username, Exception exception, HttpServletRequest request) { List embedsList = new ArrayList<>(); embedsList.add(Message.Embeds.builder().title("์‹คํ–‰์ค‘์ธ ํ™˜๊ฒฝ").description(Arrays.toString(environment.getActiveProfiles())).build()); @@ -35,7 +35,7 @@ public Message toConvertUnknownMessage(String username, Exception exception, Htt .build(); } - public Message AlertBatchMessage(String title, int size) { + public Message convertToAlertBatchMessage(String title, int size) { LocalDateTime localDateTime = LocalDateTime.now(); List embedsList = new ArrayList<>(); embedsList.add(Message.Embeds.builder().title("์ด ๊ฒฐ์ œ ์˜ˆ์ • ์ˆ˜").description(String.valueOf(size)).build()); @@ -58,7 +58,7 @@ public Message AlertBatchMessage(String title, int size) { .build(); } - public Message AlertFinishMessage(String title, int amount, int size, int successCnt, int trueCnt) { + public Message convertToAlertFinishMessage(String title, int amount, int size, int successCnt, int trueCnt) { LocalDateTime localDateTime = LocalDateTime.now(); List embedsList = new ArrayList<>(); DecimalFormat decimalFormat = new DecimalFormat("#,###"); // ํฌ๋งท์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. @@ -89,7 +89,7 @@ public Message AlertFinishMessage(String title, int amount, int size, int succes .build(); } - public Message ErrorBatchServer(String title, String message) { + public Message convertToErrorBatchServer(String title, String message) { List embedsList = new ArrayList<>(); embedsList.add(Message.Embeds.builder().title("์‹คํ–‰์ค‘์ธ ํ™˜๊ฒฝ").description(Arrays.toString(environment.getActiveProfiles())).build()); @@ -105,7 +105,7 @@ public Message ErrorBatchServer(String title, String message) { .build(); } - public Message toConverKnownMessage(String message) { + public Message convertToKnownMessage(String message) { List embedsList = new ArrayList<>(); embedsList.add(Message.Embeds.builder().title("์‹คํ–‰์ค‘์ธ ํ™˜๊ฒฝ").description(Arrays.toString(environment.getActiveProfiles())).build()); diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java index b5f2177b..7730e6ec 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/discord/service/DiscordService.java @@ -15,12 +15,12 @@ public class DiscordService { private final DiscordConvertor discordConvertor; @Async("discord-message") public void sendUnKnownMessage(String username, Exception exception, HttpServletRequest request) { - discordFeignClient.errorMessage(discordConvertor.toConvertUnknownMessage(username, exception, request)); + discordFeignClient.errorMessage(discordConvertor.convertToUnknownMessage(username, exception, request)); } @Async("discord-message") public void sendKnownErrorMessage(String message) { - discordFeignClient.errorMessage(discordConvertor.toConverKnownMessage(message)); + discordFeignClient.errorMessage(discordConvertor.convertToKnownMessage(message)); } } diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java index a574a6ea..17c4fcbf 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/convertor/PortOneConvertor.java @@ -11,7 +11,7 @@ @RequiredArgsConstructor public class PortOneConvertor { private final PortOneProperties portOneProperties; - public PortOneBillReq PortOneBill(String cardNo, String expiry, String idNo, String cardPw) { + public PortOneBillReq convertToPortOneBill(String cardNo, String expiry, String idNo, String cardPw) { return PortOneBillReq .builder() .pg("nice."+portOneProperties.getBillmid()) @@ -22,7 +22,7 @@ public PortOneBillReq PortOneBill(String cardNo, String expiry, String idNo, Str .build(); } - public PayWithBillKeyReq PayWithBillKey(String bid, String orderId, Long amount, String projectName, String customerId) { + public PayWithBillKeyReq convertPayWithBillKey(String bid, String orderId, Long amount, String projectName, String customerId) { return PayWithBillKeyReq .builder() .customer_uid(bid) diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java index 1c718897..8b820159 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/pay/portone/service/PortOneService.java @@ -12,12 +12,4 @@ @Service @RequiredArgsConstructor public class PortOneService { - private final PortOneFeignClient portOneFeignClient; - private final PortOneAuthService portOneAuthService; - private final PortOneConvertor portOneConvertor; - - public PortOneResponse payBillKey(String bid, String orderId, Long amount, String projectName, String customerId){ - String accessToken = portOneAuthService.getToken(); - return portOneFeignClient.payWithBillKey(accessToken, portOneConvertor.PayWithBillKey(bid, orderId, amount, projectName, customerId)); - } } From 66dd5e6b903354adc4a7db2b62ff6fb0a882f008 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:05:53 +0900 Subject: [PATCH 80/82] =?UTF-8?q?:recycle:=20:=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/convertor/OrderConvertor.java | 12 +++--- .../example/matchapi/order/dto/OrderRes.java | 12 ++++++ .../matchapi/order/helper/DataEncrypt.java | 35 --------------- .../matchapi/order/helper/OrderHelper.java | 43 ++++++++++++------- .../matchapi/order/service/OrderService.java | 37 +++------------- .../portone/service/PaymentService.java | 9 +--- 6 files changed, 53 insertions(+), 95 deletions(-) delete mode 100644 Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java diff --git a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java index 031261ba..5afc2130 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/convertor/OrderConvertor.java @@ -47,7 +47,7 @@ public OrderRequest CreateRequest(Long userId, Long projectId, String orderId) { .ttl(10L) .build(); } - public DonationUser convertToDonationUserPortone(Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, String flameName, String inherenceNumber) { + public DonationUser convertToDonationUserPortone(Long userId, PaymentReq.ValidatePayment validatePayment, Long projectId, OrderRes.CreateInherenceDto createInherenceDto) { return DonationUser.builder() .userId(userId) .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) @@ -57,8 +57,8 @@ public DonationUser convertToDonationUserPortone(Long userId, PaymentReq.Validat .orderId(validatePayment.getOrderId()) .donationStatus(DonationStatus.EXECUTION_BEFORE) .payMethod(orderHelper.getPayMethod(validatePayment.getPayMethod())) - .inherenceName(flameName) - .inherenceNumber(inherenceNumber) + .inherenceName(createInherenceDto.getInherenceName()) + .inherenceNumber(createInherenceDto.getInherenceNumber()) .regularStatus(RegularStatus.ONE_TIME) .flameImage(FlameImage.NORMAL_IMG.getImg()) .build(); @@ -80,7 +80,7 @@ public UserCard convertToUserBillCard(Long id, OrderReq.RegistrationCard registr .build(); } - public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id, Long amount, Long projectId, String flameName, String inherenceNumber, RegularStatus regularStatus, Long regularPaymentId) { + public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id, Long amount, Long projectId, OrderRes.CreateInherenceDto createInherenceDto, RegularStatus regularStatus, Long regularPaymentId) { return DonationUser.builder() .userId(id) .projectId(projectId) @@ -89,8 +89,8 @@ public DonationUser donationBillPayUser(PortOneBillPayResponse response, Long id .orderId(response.getMerchant_uid()) .donationStatus(DonationStatus.EXECUTION_BEFORE) .payMethod(PayMethod.CARD) - .inherenceName(flameName) - .inherenceNumber(inherenceNumber) + .inherenceName(createInherenceDto.getInherenceName()) + .inherenceNumber(createInherenceDto.getInherenceNumber()) .regularStatus(regularStatus) .regularPaymentId(regularPaymentId) .flameImage(FlameImage.NORMAL_IMG.getImg()) diff --git a/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java b/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java index 32174bfc..928292c4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/dto/OrderRes.java @@ -53,4 +53,16 @@ public static class CompleteDonation { private String regularStatus; } + + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class CreateInherenceDto { + private String inherenceName; + + private String inherenceNumber; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java deleted file mode 100644 index bba621ea..00000000 --- a/Match-Api/src/main/java/com/example/matchapi/order/helper/DataEncrypt.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.matchapi.order.helper; - -import org.apache.commons.codec.binary.Hex; -import org.springframework.stereotype.Service; - -import java.security.MessageDigest; - -@Service -public class DataEncrypt{ - MessageDigest md; - String strSRCData = ""; - String strENCData = ""; - String strOUTData = ""; - - public DataEncrypt(){ } - public String encrypt(String strData){ - String passACL = null; - MessageDigest md = null; - try{ - md = MessageDigest.getInstance("SHA-256"); - md.reset(); - md.update(strData.getBytes()); - byte[] raw = md.digest(); - passACL = encodeHex(raw); - }catch(Exception e){ - System.out.print("์•”ํ˜ธํ™” ์—๋Ÿฌ" + e.toString()); - } - return passACL; - } - - public String encodeHex(byte [] b){ - char [] c = Hex.encodeHex(b); - return new String(c); - } -} \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java index 21ece097..5f550f1b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/helper/OrderHelper.java @@ -1,29 +1,21 @@ package com.example.matchapi.order.helper; -import com.example.matchapi.portone.dto.PaymentReq; +import com.example.matchapi.order.dto.OrderRes; import com.example.matchcommon.annotation.Helper; -import com.example.matchcommon.exception.BaseException; -import com.example.matchcommon.properties.NicePayProperties; import com.example.matchdomain.donation.adaptor.DonationAdaptor; import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.PayMethod; import com.example.matchdomain.donation.entity.flameEnum.Adjective; import com.example.matchdomain.donation.entity.flameEnum.AdjectiveFlame; -import com.example.matchdomain.donation.repository.DonationUserRepository; -import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; -import com.example.matchinfrastructure.pay.nice.client.NiceAuthFeignClient; -import com.example.matchinfrastructure.pay.nice.dto.NicePayCancelRequest; -import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.RandomStringUtils; -import org.springframework.http.HttpStatus; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Base64; import java.util.List; import java.util.Random; +import java.util.UUID; import java.util.stream.Collectors; import static com.example.matchcommon.constants.MatchStatic.BASIC; @@ -31,8 +23,6 @@ @Helper @RequiredArgsConstructor public class OrderHelper { - private final NicePayProperties nicePayProperties; - private final NiceAuthFeignClient niceAuthFeignClient; private final DonationAdaptor donationAdaptor; public PayMethod getPayMethod(String value) { @@ -44,10 +34,6 @@ public PayMethod getPayMethod(String value) { return null; } - public String getNicePaymentAuthorizationHeader() { - return BASIC + Base64.getEncoder().encodeToString((nicePayProperties.getClient() + ":" + nicePayProperties.getSecret()).getBytes()); - } - public List getInherenceName(List donationUsers){ return donationUsers.stream() .map(DonationUser :: getInherenceName).collect(Collectors.toList()); @@ -88,4 +74,29 @@ public String createOrderId(String type){ return type + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "-" + randomStr; } + public OrderRes.CreateInherenceDto createInherence(User user) { + + String flameName = createFlameName(user); + + String inherenceNumber = createRandomUUID(); + + return new OrderRes.CreateInherenceDto(flameName, inherenceNumber); + } + + public String createRandomUUID() { + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + UUID.randomUUID(); + } + + public String formatString(String input, int length) { + StringBuilder formatted = new StringBuilder(); + + for (int i = 0; i < input.length(); i++) { + if (i > 0 && i % length == 0) { + formatted.append('-'); + } + formatted.append(input.charAt(i)); + } + + return formatted.toString(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java index 27e3fb13..bb187b37 100644 --- a/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java +++ b/Match-Api/src/main/java/com/example/matchapi/order/service/OrderService.java @@ -29,13 +29,9 @@ import com.example.matchinfrastructure.pay.portone.dto.PortOneResponse; import com.example.matchinfrastructure.pay.portone.dto.req.PortOnePrepareReq; import com.example.matchinfrastructure.pay.portone.service.PortOneAuthService; -import com.example.matchinfrastructure.pay.portone.service.PortOneService; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Service; import javax.transaction.Transactional; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; import static com.example.matchcommon.constants.MatchStatic.*; @@ -59,7 +55,6 @@ public class OrderService { private final ProjectService projectService; private final RegularPaymentAdaptor regularPaymentAdaptor; private final UserCardAdaptor userCardAdaptor; - private final PortOneService portOneService; private final DonationHistoryService donationHistoryService; @Transactional @@ -96,13 +91,11 @@ public OrderRes.CompleteDonation regularDonation(User user, OrderReq.RegularDona PortOneResponse portOneResponse = paymentService.payBillKey(card, regularDonation.getAmount(), project.getProjectName(), REGULAR); - String flameName = orderHelper.createFlameName(user); - - String inherenceNumber = createRandomUUID(); + OrderRes.CreateInherenceDto createInherenceDto = orderHelper.createInherence(user); RegularPayment regularPayment = regularPaymentRepository.save(orderConvertor.convertToRegularPayment(user.getId(), regularDonation, cardId, projectId)); - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.REGULAR, regularPayment.getId())); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), regularDonation.getAmount(), projectId, createInherenceDto, RegularStatus.REGULAR, regularPayment.getId())); donationHistoryService.postRegularDonationHistory(regularPayment.getId(), donationUser.getId()); @@ -125,14 +118,12 @@ public OrderRes.CompleteDonation oneTimeDonationCard(User user, OrderReq.OneTime Project project = projectService.checkProjectExists(projectId, RegularStatus.ONE_TIME); - PortOneResponse portOneResponse = paymentService.payBillKey(card, oneTimeDonation.getAmount(), project.getProjectName(), ONE_TIME); - String flameName = orderHelper.createFlameName(user); - - String inherenceNumber = createRandomUUID(); + OrderRes.CreateInherenceDto createInherenceDto = orderHelper.createInherence(user); - DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, flameName, inherenceNumber, RegularStatus.ONE_TIME, null)); + DonationUser donationUser = donationUserRepository.save(orderConvertor.donationBillPayUser(portOneResponse.getResponse(), user.getId(), oneTimeDonation.getAmount(), projectId, + createInherenceDto, RegularStatus.ONE_TIME, null)); donationHistoryService.oneTimeDonationHistory(donationUser.getId()); @@ -184,7 +175,7 @@ public void revokePay(User user, Long cardId) { @RedissonLock(LockName = "์œ ์ €-์นด๋“œ-๋“ฑ๋ก", key = "#user") public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registrationCard) { String accessToken = portOneAuthService.getToken(); - String cardNo = formatString(registrationCard.getCardNo(), 4); + String cardNo = orderHelper.formatString(registrationCard.getCardNo(), 4); String expiry = "20" + registrationCard.getExpYear() + "-" + registrationCard.getExpMonth(); PortOneResponse portOneResponse = portOneFeignClient.getBillKey( accessToken, @@ -200,22 +191,6 @@ public PortOneBillResponse postCard(User user, OrderReq.RegistrationCard registr return portOneResponse.getResponse(); } - public String formatString(String input, int length) { - StringBuilder formatted = new StringBuilder(); - - for (int i = 0; i < input.length(); i++) { - if (i > 0 && i % length == 0) { - formatted.append('-'); - } - formatted.append(input.charAt(i)); - } - - return formatted.toString(); - } - - public String createRandomUUID() { - return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy.MM.dd.HH:mm")) + "." + UUID.randomUUID().toString(); - } private void cancelRegularPayment(List regularPayments) { diff --git a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java index 2b7df925..22ed564f 100644 --- a/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java +++ b/Match-Api/src/main/java/com/example/matchapi/portone/service/PaymentService.java @@ -112,10 +112,6 @@ public OrderRes.CompleteDonation checkPayment(PaymentReq.ValidatePayment validat } } - public String createRandomUUID() { - return UUID.randomUUID().toString(); - } - private CancelData createCancelData(IamportResponse response, int refundAmount) { if (refundAmount == 0) { //์ „์•ก ํ™˜๋ถˆ์ผ ๊ฒฝ์šฐ return new CancelData(response.getResponse().getImpUid(), true); @@ -132,9 +128,8 @@ public void refundPayment(String impUid) { } public void saveDonationUser(User user, PaymentReq.ValidatePayment validatePayment, Project project) { - String flameName = orderHelper.createFlameName(user); - String inherenceNumber = orderHelper.createFlameName(user); - DonationUser donationUser = donationUserRepository.save(orderConvertor.convertToDonationUserPortone(user.getId(), validatePayment, project.getId(), flameName, inherenceNumber)); + OrderRes.CreateInherenceDto createInherenceDto = orderHelper.createInherence(user); + DonationUser donationUser = donationUserRepository.save(orderConvertor.convertToDonationUserPortone(user.getId(), validatePayment, project.getId(), createInherenceDto)); donationHistoryService.oneTimeDonationHistory(donationUser.getId()); } From 762fb20ebab835bc5584211022f9f1d2dea46fb4 Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:24:10 +0900 Subject: [PATCH 81/82] =?UTF-8?q?:recycle:=20:=20swagger=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EA=B0=92=20=EC=88=98=EC=A0=95=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/matchapi/config/SwaggerConfig.java | 6 ++++++ .../main/java/com/example/matchapi/user/dto/UserRes.java | 1 + .../com/example/matchcommon/reponse/CommonResponse.java | 2 +- .../java/com/example/matchcommon/reponse/PageResponse.java | 3 ++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java index 79260e98..a330f53a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SwaggerConfig.java @@ -4,6 +4,8 @@ import com.example.matchcommon.annotation.ApiErrorCodeExample; import com.example.matchcommon.dto.ErrorReason; import com.example.matchcommon.exception.errorcode.BaseErrorCode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.v3.core.jackson.ModelResolver; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.examples.Example; @@ -45,6 +47,10 @@ public class SwaggerConfig { @Value("${spring.config.activate.on-profile}") private String profile; + @Bean + public ModelResolver modelResolver(ObjectMapper objectMapper) { + return new ModelResolver(objectMapper); + } @Bean public OpenAPI openAPI() { diff --git a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java index b2a88dd8..d0c35260 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/dto/UserRes.java @@ -96,6 +96,7 @@ public static class MyPage { @Builder @AllArgsConstructor @NoArgsConstructor + @Schema(description = "ํ† ํฐ ์žฌ๋ฐœ๊ธ‰", name = "ReIssueToken") public static class ReIssueToken { private String accessToken; } diff --git a/Match-Common/src/main/java/com/example/matchcommon/reponse/CommonResponse.java b/Match-Common/src/main/java/com/example/matchcommon/reponse/CommonResponse.java index f0250699..ec48dc1c 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/reponse/CommonResponse.java +++ b/Match-Common/src/main/java/com/example/matchcommon/reponse/CommonResponse.java @@ -22,7 +22,7 @@ public class CommonResponse { private final String message; @Schema(description = "์‘๋‹ต ์ฝ”๋“œ", required = true, example = "1000") private final String code; - @Schema(description = "์‘๋‹ต ๊ฒฐ๊ณผ", required = false, example = "์‘๋‹ต ๊ฒฐ๊ณผ") + @Schema(description = "์‘๋‹ต ๊ฒฐ๊ณผ", required = false) @JsonInclude(JsonInclude.Include.NON_NULL) private T result; diff --git a/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java b/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java index 4ee8c405..a6afda85 100644 --- a/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java +++ b/Match-Common/src/main/java/com/example/matchcommon/reponse/PageResponse.java @@ -1,6 +1,7 @@ package com.example.matchcommon.reponse; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,6 +15,6 @@ public class PageResponse implements Serializable { private final Boolean isLast; @Schema(description = "์ด ์š”์†Œ ๊ฐฏ์ˆ˜", required = true, example = "10") private final long totalCnt; - @Schema(description = "์š”์†Œ", required = true, example = "true") + @Schema(description = "์š”์†Œ", required = true) private final T contents; } From 04ae35f392b9ac4bfaff2d9ccbaae29abbad3efd Mon Sep 17 00:00:00 2001 From: LimHyunwoo <81962309+imenuuu@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:49:04 +0900 Subject: [PATCH 82/82] =?UTF-8?q?:green=5Fheart:=20:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20yml=20=EC=88=98=EC=A0=95=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dev_api_ci_cd.yml | 6 +++--- .github/workflows/prod_api_ci_cd.yml | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev_api_ci_cd.yml b/.github/workflows/dev_api_ci_cd.yml index f2ffaaed..d42071ac 100644 --- a/.github/workflows/dev_api_ci_cd.yml +++ b/.github/workflows/dev_api_ci_cd.yml @@ -3,8 +3,9 @@ name: dev MATCH API Server CI/CD on: push: branches: [dev] - #tags: - # - Dev-Api-v*.*.* + pull_request: + branches: [dev] + types: [closed] workflow_dispatch: # ์ˆ˜๋™ ์‹คํ–‰ ์˜ต์…˜ (์ƒ๋žต) jobs: @@ -50,7 +51,6 @@ jobs: discord.webhook.error: ${{ secrets.DISCORD_WEBHOOK_ERROR}} discord.webhook.alert: ${{ secrets.DISCORD_WEBHOOK_ALERT }} server.host: ${{ secrets.DEV_SERVER_HOST}} - spring.password: ${{ secrets.APP_PASSWORD}} aligo.username: ${{ secrets.ALIGO_USERNAME }} aligo.key: ${{ secrets.ALIGO_KEY }} diff --git a/.github/workflows/prod_api_ci_cd.yml b/.github/workflows/prod_api_ci_cd.yml index 96384444..d0000d30 100644 --- a/.github/workflows/prod_api_ci_cd.yml +++ b/.github/workflows/prod_api_ci_cd.yml @@ -4,14 +4,15 @@ on: push: tags: - Api-Release-v*.*.* - #tags: - # - Dev-Api-v*.*.* workflow_dispatch: # ์ˆ˜๋™ ์‹คํ–‰ ์˜ต์…˜ (์ƒ๋žต) jobs: build: runs-on: ubuntu-latest # action ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™๋  OS + outputs: + version: ${{ steps.get_version.outputs.BRANCH_NAME }} + steps: # ์ž‘์—… ๋‹จ๊ณ„ - name: Checkout source code # ๋‹จ๊ณ„๋ณ„ ์ด๋ฆ„, ๊ตฌ๋ถ„์ž๋กœ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ด uses: actions/checkout@v2