From a702f35a5518da812db0db426676ede16a648c52 Mon Sep 17 00:00:00 2001 From: osjkate Date: Fri, 11 Oct 2024 22:39:08 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20QR=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20API=20&=20=EC=A0=84=EC=B2=B4=20User=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=97=90=EC=84=9C=20QR=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95,=20dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/dto/OrderCreateRequestDto.java | 1 - .../Order/dto/OrderDetailResponseDto.java | 6 +-- .../Order/dto/OrderSimpleResponseDto.java | 9 ++-- .../concon/Order/service/OrderFacade.java | 13 +++-- .../Order/service/OrderServiceImpl.java | 2 +- .../concon/Photo/service/PhotoFacade.java | 4 ++ .../sookmyung/concon/User/Entity/User.java | 9 ++++ .../User/controller/UserController.java | 9 ++++ .../User/dto/UserDetailConfigResponseDto.java | 4 +- .../User/dto/UserDetailResponseDto.java | 4 +- .../concon/User/dto/UserModifyRequestDto.java | 1 + .../User/dto/UserModifyResponseDto.java | 4 +- .../User/dto/UserQRImageModifyRequestDto.java | 8 +++ .../dto/UserQRImageModifyResponseDto.java | 18 +++++++ .../concon/User/service/OrderUserFacade.java | 3 +- .../concon/User/service/UserService.java | 1 + .../concon/User/service/UserServiceImpl.java | 53 ++++++++++++++++--- 17 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyRequestDto.java create mode 100644 src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyResponseDto.java diff --git a/src/main/java/com/sookmyung/concon/Order/dto/OrderCreateRequestDto.java b/src/main/java/com/sookmyung/concon/Order/dto/OrderCreateRequestDto.java index f97ce94..b0254f5 100644 --- a/src/main/java/com/sookmyung/concon/Order/dto/OrderCreateRequestDto.java +++ b/src/main/java/com/sookmyung/concon/Order/dto/OrderCreateRequestDto.java @@ -11,7 +11,6 @@ @Getter public class OrderCreateRequestDto { private Long couponId; - private Long sellerId; public Orders toEntity(Coupon coupon, User seller) { return Orders.builder() diff --git a/src/main/java/com/sookmyung/concon/Order/dto/OrderDetailResponseDto.java b/src/main/java/com/sookmyung/concon/Order/dto/OrderDetailResponseDto.java index e08b5a5..bc6a92e 100644 --- a/src/main/java/com/sookmyung/concon/Order/dto/OrderDetailResponseDto.java +++ b/src/main/java/com/sookmyung/concon/Order/dto/OrderDetailResponseDto.java @@ -12,7 +12,7 @@ @Builder @Getter public class OrderDetailResponseDto { - private Long id; + private Long orderId; private CouponSimpleResponseDto coupon; private UserSimpleResponseDto buyer; private UserSimpleResponseDto seller; @@ -21,9 +21,9 @@ public class OrderDetailResponseDto { private OrderStatus status; - public static OrderDetailResponseDto toDto(Orders order, CouponSimpleResponseDto coupon, UserSimpleResponseDto buyer, UserSimpleResponseDto seller) { + public static OrderDetailResponseDto toDto(Orders order, CouponSimpleResponseDto coupon, UserSimpleResponseDto seller, UserSimpleResponseDto buyer) { return OrderDetailResponseDto.builder() - .id(order.getId()) + .orderId(order.getId()) .coupon(coupon) .buyer(buyer) .seller(seller) diff --git a/src/main/java/com/sookmyung/concon/Order/dto/OrderSimpleResponseDto.java b/src/main/java/com/sookmyung/concon/Order/dto/OrderSimpleResponseDto.java index f651d67..a648b5e 100644 --- a/src/main/java/com/sookmyung/concon/Order/dto/OrderSimpleResponseDto.java +++ b/src/main/java/com/sookmyung/concon/Order/dto/OrderSimpleResponseDto.java @@ -10,17 +10,20 @@ @Builder @Getter public class OrderSimpleResponseDto { - private Long id; + private Long orderId; private CouponSimpleResponseDto coupon; private UserIdResponseDto seller; + private UserIdResponseDto buyer; + private OrderStatus status; public static OrderSimpleResponseDto toDto(Orders orders, CouponSimpleResponseDto coupon, - UserIdResponseDto seller) { + UserIdResponseDto seller, UserIdResponseDto buyer) { return OrderSimpleResponseDto.builder() - .id(orders.getId()) + .orderId(orders.getId()) .coupon(coupon) .seller(seller) + .buyer(buyer) .status(orders.getStatus()) .build(); } diff --git a/src/main/java/com/sookmyung/concon/Order/service/OrderFacade.java b/src/main/java/com/sookmyung/concon/Order/service/OrderFacade.java index 170a17f..308e532 100644 --- a/src/main/java/com/sookmyung/concon/Order/service/OrderFacade.java +++ b/src/main/java/com/sookmyung/concon/Order/service/OrderFacade.java @@ -33,16 +33,23 @@ public Orders findOrdersById(Long orderId) { public OrderDetailResponseDto toDetailDto(Orders orders) { CouponSimpleResponseDto couponDto = couponFacade.toSimpleDto(orders.getCoupon()); - UserSimpleResponseDto buyerDto = userFacade.toSimpleDto(orders.getBuyer()); + UserSimpleResponseDto buyerDto = null; + if (orders.getBuyer() != null) { + buyerDto = userFacade.toSimpleDto(orders.getBuyer()); + } UserSimpleResponseDto sellerDto = userFacade.toSimpleDto(orders.getSeller()); - return OrderDetailResponseDto.toDto(orders, couponDto, buyerDto, sellerDto); + return OrderDetailResponseDto.toDto(orders, couponDto, sellerDto, buyerDto); } public OrderSimpleResponseDto toSimpleDto(Orders orders) { CouponSimpleResponseDto couponDto = couponFacade.toSimpleDto(orders.getCoupon()); UserIdResponseDto sellerDto = UserIdResponseDto.toDto(orders.getSeller()); + UserIdResponseDto buyerDto = null; + if (orders.getBuyer() != null) { + buyerDto = UserIdResponseDto.toDto(orders.getBuyer()); + } - return OrderSimpleResponseDto.toDto(orders, couponDto, sellerDto); + return OrderSimpleResponseDto.toDto(orders, couponDto, sellerDto, buyerDto); } } diff --git a/src/main/java/com/sookmyung/concon/Order/service/OrderServiceImpl.java b/src/main/java/com/sookmyung/concon/Order/service/OrderServiceImpl.java index b6e45ce..48e8431 100644 --- a/src/main/java/com/sookmyung/concon/Order/service/OrderServiceImpl.java +++ b/src/main/java/com/sookmyung/concon/Order/service/OrderServiceImpl.java @@ -45,7 +45,7 @@ public class OrderServiceImpl implements OrderService{ public OrderDetailResponseDto createOrder(OrderCreateRequestDto request) { Coupon coupon = orderFacade.findCouponById(request.getCouponId()); Item item = coupon.getItem(); - User seller = orderUserFacade.findUserById(request.getSellerId()); + User seller = coupon.getUser(); Orders orders = request.toEntity(coupon, seller); orderRepository.save(orders); return OrderDetailResponseDto.toDto(orders, diff --git a/src/main/java/com/sookmyung/concon/Photo/service/PhotoFacade.java b/src/main/java/com/sookmyung/concon/Photo/service/PhotoFacade.java index 098f2f7..95d9423 100644 --- a/src/main/java/com/sookmyung/concon/Photo/service/PhotoFacade.java +++ b/src/main/java/com/sookmyung/concon/Photo/service/PhotoFacade.java @@ -44,6 +44,10 @@ public String uploadCouponBarcodePhoto(Coupon coupon, String imageFileName, Loca public String getUserPhotoUrl(User user) { return photoManager.getPhoto(USER_PREFIX + user.getId(), user.getProfilePhotoName(), user.getProfileCreatedDate()); } + + public String getUserQRPhotoUrl(User user) { + return photoManager.getPhoto(USER_PREFIX + user.getId() + "/QR", user.getQRImageName(), user.getQRImageCreateDate()); + } public String getItemPhotoUrl(Item item) { // return photoService.getPhoto(ITEM_PREFIX + item.getId() + item.getImagePath()); return item.getImageUrl(); diff --git a/src/main/java/com/sookmyung/concon/User/Entity/User.java b/src/main/java/com/sookmyung/concon/User/Entity/User.java index 6973e33..4a459fd 100644 --- a/src/main/java/com/sookmyung/concon/User/Entity/User.java +++ b/src/main/java/com/sookmyung/concon/User/Entity/User.java @@ -33,6 +33,10 @@ public class User { private String profilePhotoName; private LocalDateTime profileCreatedDate; + // QR 코드 이미지 + private String QRImageName; + private LocalDateTime QRImageCreateDate; + private String color; // 알람 여부 @@ -80,4 +84,9 @@ public void updatePhoto(String fileName, LocalDateTime time) { this.profilePhotoName = fileName; this.profileCreatedDate = time; } + + public void updateQRImage(String QRFileName, LocalDateTime time) { + this.QRImageName = QRFileName; + this.QRImageCreateDate = time; + } } diff --git a/src/main/java/com/sookmyung/concon/User/controller/UserController.java b/src/main/java/com/sookmyung/concon/User/controller/UserController.java index 27c3059..1ea767a 100644 --- a/src/main/java/com/sookmyung/concon/User/controller/UserController.java +++ b/src/main/java/com/sookmyung/concon/User/controller/UserController.java @@ -75,4 +75,13 @@ public ResponseEntity modifyUser( @RequestBody UserModifyRequestDto request) { return ResponseEntity.ok(userService.modifyUser(token, request)); } + + // QR 이미지만 추가 + @Operation(summary = "QR 이미지 수정") + @PutMapping("/qr") + public ResponseEntity modifyQRImage( + @RequestHeader("Authorization") String token, + @RequestBody UserQRImageModifyRequestDto request) { + return ResponseEntity.ok(userService.modifyQRImage(token, request)); + } } diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserDetailConfigResponseDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserDetailConfigResponseDto.java index 973abe1..965206c 100644 --- a/src/main/java/com/sookmyung/concon/User/dto/UserDetailConfigResponseDto.java +++ b/src/main/java/com/sookmyung/concon/User/dto/UserDetailConfigResponseDto.java @@ -10,17 +10,19 @@ public class UserDetailConfigResponseDto { private Long userId; private String username; private String profileUrl; + private String QRImageUrl; private String color; private boolean gift_notify; private boolean expiry_notify; private int expiry_days; private boolean is_verified; - public static UserDetailConfigResponseDto toDto(User user, String profileUrl) { + public static UserDetailConfigResponseDto toDto(User user, String profileUrl, String QRImageUrl) { return UserDetailConfigResponseDto.builder() .userId(user.getId()) .username(user.getUsername()) .profileUrl(profileUrl) + .QRImageUrl(QRImageUrl) .color(user.getColor()) .gift_notify(user.isGift_notify()) .expiry_notify(user.isExpiry_notify()) diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserDetailResponseDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserDetailResponseDto.java index c28036c..159739a 100644 --- a/src/main/java/com/sookmyung/concon/User/dto/UserDetailResponseDto.java +++ b/src/main/java/com/sookmyung/concon/User/dto/UserDetailResponseDto.java @@ -17,14 +17,16 @@ public class UserDetailResponseDto { private Long userId; private String username; private String profileUrl; + private String QRImageUrl; private String color; private List orders; - public static UserDetailResponseDto toDto(User user, List orders, String profileUrl) { + public static UserDetailResponseDto toDto(User user, List orders, String profileUrl, String QRImageUrl) { return UserDetailResponseDto.builder() .userId(user.getId()) .username(user.getUsername()) .profileUrl(profileUrl) + .QRImageUrl(QRImageUrl) .color(user.getColor()) .orders(orders) .build(); diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserModifyRequestDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserModifyRequestDto.java index 9f187b1..4edf93b 100644 --- a/src/main/java/com/sookmyung/concon/User/dto/UserModifyRequestDto.java +++ b/src/main/java/com/sookmyung/concon/User/dto/UserModifyRequestDto.java @@ -9,6 +9,7 @@ public class UserModifyRequestDto { private String username; private String fileName; + private String QRFileName; private String color; private boolean gift_notify; private boolean expiry_notify; diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserModifyResponseDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserModifyResponseDto.java index 3dd8c34..f2650ac 100644 --- a/src/main/java/com/sookmyung/concon/User/dto/UserModifyResponseDto.java +++ b/src/main/java/com/sookmyung/concon/User/dto/UserModifyResponseDto.java @@ -8,11 +8,13 @@ public class UserModifyResponseDto { UserDetailConfigResponseDto user; String photoModifyUrl; + String QRPhotoModifyURl; - public static UserModifyResponseDto toDto(UserDetailConfigResponseDto user, String photoModifyUrl) { + public static UserModifyResponseDto toDto(UserDetailConfigResponseDto user, String photoModifyUrl, String QRPhotoModifyURl) { return UserModifyResponseDto.builder() .user(user) .photoModifyUrl(photoModifyUrl) + .QRPhotoModifyURl(QRPhotoModifyURl) .build(); } } diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyRequestDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyRequestDto.java new file mode 100644 index 0000000..048f3ec --- /dev/null +++ b/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyRequestDto.java @@ -0,0 +1,8 @@ +package com.sookmyung.concon.User.dto; + +import lombok.Getter; + +@Getter +public class UserQRImageModifyRequestDto { + String QRFileName; +} diff --git a/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyResponseDto.java b/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyResponseDto.java new file mode 100644 index 0000000..d55e23a --- /dev/null +++ b/src/main/java/com/sookmyung/concon/User/dto/UserQRImageModifyResponseDto.java @@ -0,0 +1,18 @@ +package com.sookmyung.concon.User.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UserQRImageModifyResponseDto { + UserIdResponseDto user; + String QRImageModifyUrl; + + static public UserQRImageModifyResponseDto toDto(UserIdResponseDto user, String qrImageUrl) { + return UserQRImageModifyResponseDto.builder() + .user(user) + .QRImageModifyUrl(qrImageUrl) + .build(); + } +} diff --git a/src/main/java/com/sookmyung/concon/User/service/OrderUserFacade.java b/src/main/java/com/sookmyung/concon/User/service/OrderUserFacade.java index 8037f4e..d7d46e0 100644 --- a/src/main/java/com/sookmyung/concon/User/service/OrderUserFacade.java +++ b/src/main/java/com/sookmyung/concon/User/service/OrderUserFacade.java @@ -70,7 +70,8 @@ public UserDetailResponseDto toUserDetailResponseDto(Long userId) { .stream().map(orderFacade::toSimpleDto).toList(); String photoUrl = photoManager.getPhoto("user/" + user.getId(), user.getProfilePhotoName(), user.getProfileCreatedDate()); - return UserDetailResponseDto.toDto(user, top2OrderByUser, photoUrl); + String QRPhotoUrl = photoManager.getPhoto("user/" + user.getId() + "/QR", user.getQRImageName(), user.getQRImageCreateDate()); + return UserDetailResponseDto.toDto(user, top2OrderByUser, photoUrl, QRPhotoUrl); } @Transactional(readOnly = true) diff --git a/src/main/java/com/sookmyung/concon/User/service/UserService.java b/src/main/java/com/sookmyung/concon/User/service/UserService.java index a66b1b5..52124a8 100644 --- a/src/main/java/com/sookmyung/concon/User/service/UserService.java +++ b/src/main/java/com/sookmyung/concon/User/service/UserService.java @@ -15,6 +15,7 @@ public interface UserService { List getUsersByKeyword(String keyword); UserModifyResponseDto modifyUser(String token, UserModifyRequestDto request); + UserQRImageModifyResponseDto modifyQRImage(String token, UserQRImageModifyRequestDto request); List get5RandomUser(); diff --git a/src/main/java/com/sookmyung/concon/User/service/UserServiceImpl.java b/src/main/java/com/sookmyung/concon/User/service/UserServiceImpl.java index 8caf016..b0822b1 100644 --- a/src/main/java/com/sookmyung/concon/User/service/UserServiceImpl.java +++ b/src/main/java/com/sookmyung/concon/User/service/UserServiceImpl.java @@ -1,8 +1,6 @@ package com.sookmyung.concon.User.service; import com.sookmyung.concon.Item.service.ItemService; -import com.sookmyung.concon.Kakao.dto.KakaoTokenResponse; -import com.sookmyung.concon.Kakao.dto.KakaoUnlinkResponse; import com.sookmyung.concon.Kakao.service.KakaoService; import com.sookmyung.concon.Photo.service.PhotoFacade; import com.sookmyung.concon.Photo.service.PhotoManager; @@ -16,7 +14,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -43,17 +40,25 @@ public class UserServiceImpl implements UserService { @Transactional(readOnly = true) public UserDetailConfigResponseDto getUserInfo(String token) { User user = orderUserFacade.findUserByToken(token); - return UserDetailConfigResponseDto.toDto(user, getUserPhoto(user)); + return UserDetailConfigResponseDto.toDto(user, getUserPhoto(user), getUserQRPhoto(user)); } private String getUserPhoto(User user) { return photoFacade.getUserPhotoUrl(user); } + private String getUserQRPhoto(User user) { + return photoFacade.getUserQRPhotoUrl(user); + } + private String makePrefix(User user) { return PREFIX + user.getId(); } + private String makeQRPrefix(User user) { + return PREFIX + user.getId() + "/QR"; + } + // id로 회원 정보 조회 // TODO : Review 추가하기 @Override @@ -90,17 +95,51 @@ public UserModifyResponseDto modifyUser(String token, UserModifyRequestDto reque User user = orderUserFacade.findUserByToken(token); user.update(request); String photoModifyUrl = ""; + String qrPhotoModifyUrl = ""; + LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); if (request.getFileName() != null && !request.getFileName().isEmpty()) { String fileName = request.getFileName(); - // TODO : modify - LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + photoModifyUrl = photoManager.updatePhoto(makePrefix(user), user.getProfilePhotoName(), user.getProfileCreatedDate(), fileName, now); + user.updatePhoto(fileName, now); } + + if (request.getQRFileName() != null && !request.getQRFileName().isEmpty()) { + String QRFileName = request.getQRFileName(); + + qrPhotoModifyUrl = photoManager.updatePhoto(makeQRPrefix(user), + user.getQRImageName(), user.getQRImageCreateDate(), + QRFileName, now); + + user.updateQRImage(QRFileName, now); + } // TODO : 사진 수정 - return UserModifyResponseDto.toDto(UserDetailConfigResponseDto.toDto(user, "로직 추가 예정"), photoModifyUrl); + return UserModifyResponseDto.toDto(UserDetailConfigResponseDto.toDto(user, "로직 추가 예정", "추가 예정"), photoModifyUrl, qrPhotoModifyUrl); + } + + + // QR 이미지 수정 + @Override + @Transactional + public UserQRImageModifyResponseDto modifyQRImage(String token, UserQRImageModifyRequestDto request) { + User user = orderUserFacade.findUserByToken(token); + + String qrPhotoModifyUrl = ""; + LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + if (request.getQRFileName() != null && !request.getQRFileName().isEmpty()) { + String QRFileName = request.getQRFileName(); + + qrPhotoModifyUrl = photoManager.updatePhoto(makeQRPrefix(user), + user.getQRImageName(), user.getQRImageCreateDate(), + QRFileName, now); + + user.updateQRImage(QRFileName, now); + } + + return UserQRImageModifyResponseDto.toDto(UserIdResponseDto.toDto(user), qrPhotoModifyUrl); } // 거래용 랜덤 5명의 판매 정보 가져오기