From bff6649760a6745cc61f7d0ffec134ec0fa6479d Mon Sep 17 00:00:00 2001 From: SoliDeoHoneretGloria Date: Sat, 3 Jun 2023 12:58:03 +0200 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20[009-AUCTION=5FService=5FUpdate]=20?= =?UTF-8?q?=EC=97=AD=EB=93=B1=EB=A1=9D=20=EB=93=B1=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=ED=95=84=ED=84=B0=EB=A7=81=20=EB=B0=8F=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80(=EC=88=98=EB=9F=89=201=EA=B0=9C?= =?UTF-8?q?=20=EC=9D=B4=EC=83=81,=20=EA=B8=88=EC=95=A1=200=EC=9B=90=20?= =?UTF-8?q?=EC=9D=B4=EC=83=81)=20=EC=97=AD=EB=93=B1=EB=A1=9D=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EA=B8=80=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8(=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=EB=AC=B8=20=EC=97=90=EB=9F=AC=20=EB=B0=A9=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wantedmarket/exception/ErrorCode.java | 5 +- .../order/domain/common/AuctionCategory.java | 2 +- .../domain/controller/AuctionController.java | 21 ++++++++- .../domain/controller/dto/AuctionDto.java | 20 ++++---- .../controller/dto/UpdateAuctionForm.java | 20 ++++++++ .../order/domain/model/Auction.java | 22 ++++----- .../domain/repository/AuctionRepository.java | 2 + .../order/domain/service/AuctionService.java | 47 +++++++++++++++++++ 8 files changed, 112 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/example/wantedmarket/order/domain/controller/dto/UpdateAuctionForm.java diff --git a/src/main/java/com/example/wantedmarket/exception/ErrorCode.java b/src/main/java/com/example/wantedmarket/exception/ErrorCode.java index 9191792..0105ee6 100644 --- a/src/main/java/com/example/wantedmarket/exception/ErrorCode.java +++ b/src/main/java/com/example/wantedmarket/exception/ErrorCode.java @@ -18,7 +18,10 @@ public enum ErrorCode { NOT_ENOUGH_BALANCE(HttpStatus.BAD_REQUEST, "잔액이 부족합니다."), // auction - NOT_FOUND_AUCTION(HttpStatus.BAD_REQUEST,"입찰 실패 : 해당 역경매 글이 존재하지 않습니다."); + NOT_FOUND_AUCTION(HttpStatus.BAD_REQUEST,"입찰 실패 : 해당 역경매 글이 존재하지 않습니다."), + NOT_ENOUGH_QTY(HttpStatus.BAD_REQUEST, "등록 실패 : 수량은 1개 이상부터 등록이 가능합니다."), + NOT_ENOUGH_PRICE(HttpStatus.BAD_REQUEST, "등록 실패 : 가격은 0원 이상부터 등록이 가능합니다."); + private final HttpStatus httpStatus; private final String detail; } diff --git a/src/main/java/com/example/wantedmarket/order/domain/common/AuctionCategory.java b/src/main/java/com/example/wantedmarket/order/domain/common/AuctionCategory.java index 5f8e2d2..c63731e 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/common/AuctionCategory.java +++ b/src/main/java/com/example/wantedmarket/order/domain/common/AuctionCategory.java @@ -2,6 +2,6 @@ public enum AuctionCategory { CLOTHES, SHOES, ELECTRONICS, BAGS, COMPUTERS, COSMETICS, BOOKS, FURNITURE, - INFORMATION, Education, FOODS, TIME, CAMPING, CARS, BICYCLES, WATCHES, + INFORMATION, EDUCATION, FOODS, TIME, CAMPING, CARS, BICYCLES, WATCHES, MEDICINES, STATIONARY; } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java b/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java index aa158e7..2d7daa8 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java @@ -2,16 +2,18 @@ import com.example.wantedmarket.config.JwtAuthenticationProvider; import com.example.wantedmarket.order.domain.controller.dto.AuctionDto; -import com.example.wantedmarket.order.domain.model.Auction; +import com.example.wantedmarket.order.domain.controller.dto.UpdateAuctionForm; import com.example.wantedmarket.order.domain.service.AuctionService; import com.example.wantedmarket.user.domain.common.UserVo; -import com.example.wantedmarket.user.domain.user.ChangeBalanceForm; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/auction") @@ -28,4 +30,19 @@ public ResponseEntity post(@RequestHeader(name = "X-AUTH-TOKEN") Str UserVo vo = provider.getUserVo(token); return ResponseEntity.ok(AuctionDto.from(auctionService.postAuction(vo.getUserId(),dto))); } + + @PutMapping + public ResponseEntity put(@RequestHeader(name = "X-AUTH-TOKEN") String token, + @RequestBody UpdateAuctionForm dto){ + UserVo vo = provider.getUserVo(token); + return ResponseEntity.ok(AuctionDto.from(auctionService.modifyAuction(vo.getUserId(), dto))); + } + + @DeleteMapping + public ResponseEntity delete(@RequestHeader(name = "X-AUTH-TOKEN") String token, + @RequestParam Long id){ + UserVo vo = provider.getUserVo(token); + auctionService.deleteAuction(vo.getUserId(), id); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/AuctionDto.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/AuctionDto.java index 00b1845..1148063 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/AuctionDto.java +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/AuctionDto.java @@ -15,21 +15,17 @@ @Builder public class AuctionDto { @ApiModelProperty(hidden = true) - private String user_id; + private String userId; private AuctionCategory auctionCategory; - private Long auction_price; - private String auction_title; - private Long auction_qty; - private String auction_description; + private Long auctionPrice; + private String auctionTitle; + private Long auctionQty; + private String auctionDescription; public static AuctionDto from(Auction auction){ - return new AuctionDto(auction.getUser_id(), auction.getAuctionCategory(), - auction.getAuction_price(), auction.getAuction_title(), - auction.getAuction_qty(), auction.getAuction_description()); + return new AuctionDto(auction.getUserId(), auction.getAuctionCategory(), + auction.getAuctionPrice(), auction.getAuctionTitle(), + auction.getAuctionQty(), auction.getAuctionDescription()); } - - - - } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/UpdateAuctionForm.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/UpdateAuctionForm.java new file mode 100644 index 0000000..fbe22a1 --- /dev/null +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/UpdateAuctionForm.java @@ -0,0 +1,20 @@ +package com.example.wantedmarket.order.domain.controller.dto; + +import com.example.wantedmarket.order.domain.common.AuctionCategory; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateAuctionForm { + private Long auctionNumber; + private AuctionCategory auctionCategory; + private Long auctionPrice; + private String auctionTitle; + private Long auctionQty; + private String auctionDescription; +} diff --git a/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java b/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java index 13fb023..41222dd 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java +++ b/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java @@ -35,14 +35,14 @@ public class Auction extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long auction_number; - private String user_id; + private Long auctionNumber; + private String userId; @Enumerated(value = EnumType.STRING) private AuctionCategory auctionCategory; - private Long auction_price; - private String auction_title; - private Long auction_qty; - private String auction_description; + private Long auctionPrice; + private String auctionTitle; + private Long auctionQty; + private String auctionDescription; @OneToMany(mappedBy = "auction", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) @OrderBy("bid_record asc") // 가격 정렬 @@ -51,12 +51,12 @@ public class Auction extends BaseEntity { public static Auction from(String userId, AuctionDto dto) { return Auction.builder() - .user_id(userId) + .userId(userId) .auctionCategory(dto.getAuctionCategory()) - .auction_price(dto.getAuction_price()) - .auction_title(dto.getAuction_title()) - .auction_qty(dto.getAuction_qty()) - .auction_description(dto.getAuction_description()) + .auctionPrice(dto.getAuctionPrice()) + .auctionTitle(dto.getAuctionTitle()) + .auctionQty(dto.getAuctionQty()) + .auctionDescription(dto.getAuctionDescription()) .build(); } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/repository/AuctionRepository.java b/src/main/java/com/example/wantedmarket/order/domain/repository/AuctionRepository.java index f8c4283..6052b7c 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/repository/AuctionRepository.java +++ b/src/main/java/com/example/wantedmarket/order/domain/repository/AuctionRepository.java @@ -1,9 +1,11 @@ package com.example.wantedmarket.order.domain.repository; import com.example.wantedmarket.order.domain.model.Auction; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface AuctionRepository extends JpaRepository { + Optional findByUserIdAndAuctionNumber(String userId, Long auctionNumber); } diff --git a/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java b/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java index 68894d7..6a1a105 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java +++ b/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java @@ -1,6 +1,12 @@ package com.example.wantedmarket.order.domain.service; +import static com.example.wantedmarket.exception.ErrorCode.NOT_ENOUGH_PRICE; +import static com.example.wantedmarket.exception.ErrorCode.NOT_ENOUGH_QTY; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_AUCTION; + +import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.order.domain.controller.dto.AuctionDto; +import com.example.wantedmarket.order.domain.controller.dto.UpdateAuctionForm; import com.example.wantedmarket.order.domain.model.Auction; import com.example.wantedmarket.order.domain.repository.AuctionRepository; import com.example.wantedmarket.user.domain.repository.UserRepository; @@ -16,6 +22,47 @@ public class AuctionService { @Transactional public Auction postAuction(String userId, AuctionDto dto){ + // 수량은 1개 이상 + if(dto.getAuctionQty() <1){ + throw new CustomException(NOT_ENOUGH_QTY); + } + + // 최저 등록 가능 금액은 0 원 + if(dto.getAuctionPrice() < 0){ + throw new CustomException(NOT_ENOUGH_PRICE); + } return auctionRepository.save(Auction.from(userId,dto)); } + + @Transactional + public Auction modifyAuction(String userId, UpdateAuctionForm dto){ + // 수량은 1개 이상 + if(dto.getAuctionQty() <1){ + throw new CustomException(NOT_ENOUGH_QTY); + } + + // 최저 등록 가능 금액은 0 원 + if(dto.getAuctionPrice() < 0){ + throw new CustomException(NOT_ENOUGH_PRICE); + } + + Auction auction = auctionRepository.findByUserIdAndAuctionNumber( + userId, dto.getAuctionNumber()).orElseThrow( + () -> new CustomException(NOT_FOUND_AUCTION)); + auction.setAuctionCategory(dto.getAuctionCategory()); + auction.setAuctionTitle(dto.getAuctionTitle()); + auction.setAuctionDescription(dto.getAuctionDescription()); + auction.setAuctionPrice(dto.getAuctionPrice()); + auction.setAuctionQty(dto.getAuctionQty()); + return auction; + } + + @Transactional + public void deleteAuction(String userId, Long auctionNumber){ + Auction auction = auctionRepository.findByUserIdAndAuctionNumber( + userId, auctionNumber).orElseThrow( + () -> new CustomException(NOT_FOUND_AUCTION)); + auctionRepository.delete(auction); + } + } From a19fd6e7dec5418e6ba795ca3d2dae807e28f3be Mon Sep 17 00:00:00 2001 From: SoliDeoHoneretGloria Date: Sun, 4 Jun 2023 08:30:34 +0200 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20[010-AUCTION=5FDELETE]=20=EA=B2=BD?= =?UTF-8?q?=EB=A7=A4=EA=B8=80=EC=97=90=20=ED=99=9C=EC=84=B1=ED=99=94=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=B6=94=EA=B0=80=EB=A1=9C=20?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=A7=84=ED=96=89=20=EA=B0=80=EB=8A=A5=20?= =?UTF-8?q?=EA=B2=BD=EB=A7=A4=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=ED=95=B4=EB=8B=B9=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EC=97=AC=EB=B6=80=EB=A1=9C=20=EA=B8=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=9E=85=EC=B0=B0=20=EB=B6=88=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scratch_user.http | 34 +++++++++++++++---- .../domain/controller/AuctionController.java | 5 +-- .../controller/dto/DeleteAuctionForm.java | 14 ++++++++ .../order/domain/model/Auction.java | 14 ++++++-- .../wantedmarket/order/domain/model/Bid.java | 7 ++-- .../order/domain/service/AuctionService.java | 19 +++++++++-- .../order/domain/service/BidService.java | 5 +++ .../wantedmarket/user/domain/model/User.java | 12 +++++++ .../util/BooleanToYNConverter.java | 18 ++++++++++ 9 files changed, 111 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteAuctionForm.java create mode 100644 src/main/java/com/example/wantedmarket/util/BooleanToYNConverter.java diff --git a/scratch_user.http b/scratch_user.http index 07b0810..765fc0f 100644 --- a/scratch_user.http +++ b/scratch_user.http @@ -23,12 +23,12 @@ Content-Type: application/json ### 회원 정보 조회 ( 유저 ) GET http://localhost:8080/user/get-info Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg0NzgwODc4LCJleHAiOjE2ODQ4NjcyNzh9.RRmPsfyOTOaNAhDmj46My2N4g5hRB8iM8c3ynxPCJoQ +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1NDc3NDM2LCJleHAiOjE2ODU1NjM4MzZ9.bIn-mpCBHlczP82FaoQxbKvaoDCryev8db7EP0XKBss ### 잔액 변경 ( 유저 ) POST http://localhost:8080/user/balance Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg0NzgwMTA4LCJleHAiOjE2ODQ4NjY1MDh9.Hxl9-D34o91lcmQC40lbbQrghovwkp_24-EU6Sf78yQ +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1NDc2Nzg0LCJleHAiOjE2ODU1NjMxODR9.JF6azRLupU4F7len7ZQjoWiltJkp0lWr5GmPzI3QrhQ { "from": "admin", @@ -39,17 +39,37 @@ X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iL ### 역옥션 등록( 유저 ) POST http://localhost:8080/auction Content-Type: application/json -X-AUTH-TOKEN:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg0OTU3MTE5LCJleHAiOjE2ODUwNDM1MTl9.jWJ4Qi0W3HKnlw5kLRyjFQLekuC98aVNCdbAiaO0Imc +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODU5OTEwLCJleHAiOjE2ODU5NDYzMTB9.4zQXp3peOCB4YOeD-wpeDTtTuASe4qbkTC-Divnj570 { "auctionCategory": "BAGS", - "auction_description": "string", - "auction_price": 1000, - "auction_qty": 1, - "auction_title": "켈빈클라인 가방" + "auctionDescription": "string", + "auctionPrice": 1000, + "auctionQty": 10, + "auctionTitle": "켈비클라인가방" } +### 역옥션 수정( 유저 ) +PUT http://localhost:8080/auction +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODU5OTEwLCJleHAiOjE2ODU5NDYzMTB9.4zQXp3peOCB4YOeD-wpeDTtTuASe4qbkTC-Divnj570 + +{ + "auctionCategory": "BAGS", + "auctionNumber": 1, + "auctionDescription": "string", + "auctionPrice": 10000, + "auctionQty": 10, + "auctionTitle": "string" +} +### 역옥션 삭제( 유저 ) +DELETE http://localhost:8080/auction +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODU5Nzc1LCJleHAiOjE2ODU5NDYxNzV9.1NH1T33X5iX0B4J054mVOTXWcZhhWi7KSS4A2JMVg2s +{ + "auctionNumber": 1 +} ##################################### \ No newline at end of file diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java b/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java index 2d7daa8..0f98f34 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/AuctionController.java @@ -2,6 +2,7 @@ import com.example.wantedmarket.config.JwtAuthenticationProvider; import com.example.wantedmarket.order.domain.controller.dto.AuctionDto; +import com.example.wantedmarket.order.domain.controller.dto.DeleteAuctionForm; import com.example.wantedmarket.order.domain.controller.dto.UpdateAuctionForm; import com.example.wantedmarket.order.domain.service.AuctionService; import com.example.wantedmarket.user.domain.common.UserVo; @@ -40,9 +41,9 @@ public ResponseEntity put(@RequestHeader(name = "X-AUTH-TOKEN") Stri @DeleteMapping public ResponseEntity delete(@RequestHeader(name = "X-AUTH-TOKEN") String token, - @RequestParam Long id){ + @RequestBody DeleteAuctionForm dto){ UserVo vo = provider.getUserVo(token); - auctionService.deleteAuction(vo.getUserId(), id); + auctionService.deleteAuction(vo.getUserId(), dto); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteAuctionForm.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteAuctionForm.java new file mode 100644 index 0000000..29fd541 --- /dev/null +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteAuctionForm.java @@ -0,0 +1,14 @@ +package com.example.wantedmarket.order.domain.controller.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeleteAuctionForm { + private Long auctionNumber; +} diff --git a/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java b/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java index 41222dd..f61ac0b 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java +++ b/src/main/java/com/example/wantedmarket/order/domain/model/Auction.java @@ -2,11 +2,11 @@ import com.example.wantedmarket.order.domain.common.AuctionCategory; import com.example.wantedmarket.order.domain.controller.dto.AuctionDto; -import com.example.wantedmarket.user.domain.controller.dto.SignUpForm; -import com.example.wantedmarket.user.domain.model.User; +import com.example.wantedmarket.util.BooleanToYNConverter; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; +import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.envers.AuditOverride; import org.hibernate.envers.Audited; @@ -35,8 +36,11 @@ public class Auction extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name ="auction_number", unique = true) private Long auctionNumber; + private String userId; + @Enumerated(value = EnumType.STRING) private AuctionCategory auctionCategory; private Long auctionPrice; @@ -44,9 +48,12 @@ public class Auction extends BaseEntity { private Long auctionQty; private String auctionDescription; + @Convert(converter = BooleanToYNConverter.class) + private Boolean auctionActive; + @OneToMany(mappedBy = "auction", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) @OrderBy("bid_record asc") // 가격 정렬 - private List bid; + private List bids; public static Auction from(String userId, AuctionDto dto) { @@ -57,6 +64,7 @@ public static Auction from(String userId, AuctionDto dto) { .auctionTitle(dto.getAuctionTitle()) .auctionQty(dto.getAuctionQty()) .auctionDescription(dto.getAuctionDescription()) + .auctionActive(true) .build(); } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java b/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java index 3628923..ea8047c 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java +++ b/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java @@ -9,6 +9,7 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -17,12 +18,14 @@ import org.hibernate.envers.AuditOverride; import org.hibernate.envers.Audited; -@Entity + @Setter @Getter @Builder @NoArgsConstructor @AllArgsConstructor +@Table(name = "bids") +@Entity @Audited @AuditOverride(forClass = BaseEntity.class) public class Bid extends BaseEntity{ @@ -31,7 +34,7 @@ public class Bid extends BaseEntity{ private Long id; @ManyToOne - @JoinColumn(name = "auction_id") + @JoinColumn(name = "auction_number") private Auction auction; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java b/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java index 6a1a105..40d70fb 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java +++ b/src/main/java/com/example/wantedmarket/order/domain/service/AuctionService.java @@ -6,6 +6,7 @@ import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.order.domain.controller.dto.AuctionDto; +import com.example.wantedmarket.order.domain.controller.dto.DeleteAuctionForm; import com.example.wantedmarket.order.domain.controller.dto.UpdateAuctionForm; import com.example.wantedmarket.order.domain.model.Auction; import com.example.wantedmarket.order.domain.repository.AuctionRepository; @@ -49,6 +50,12 @@ public Auction modifyAuction(String userId, UpdateAuctionForm dto){ Auction auction = auctionRepository.findByUserIdAndAuctionNumber( userId, dto.getAuctionNumber()).orElseThrow( () -> new CustomException(NOT_FOUND_AUCTION)); + + // 역경매가 삭제되었거나 정상적인 상태가 아님. + if(auction.getAuctionActive().equals(false)){ + throw new CustomException(NOT_FOUND_AUCTION); + } + auction.setAuctionCategory(dto.getAuctionCategory()); auction.setAuctionTitle(dto.getAuctionTitle()); auction.setAuctionDescription(dto.getAuctionDescription()); @@ -58,11 +65,17 @@ public Auction modifyAuction(String userId, UpdateAuctionForm dto){ } @Transactional - public void deleteAuction(String userId, Long auctionNumber){ + public void deleteAuction(String userId, DeleteAuctionForm dto){ Auction auction = auctionRepository.findByUserIdAndAuctionNumber( - userId, auctionNumber).orElseThrow( + userId, dto.getAuctionNumber()).orElseThrow( () -> new CustomException(NOT_FOUND_AUCTION)); - auctionRepository.delete(auction); + + // 역경매가 삭제되었거나 정상적인 상태가 아님. + if(auction.getAuctionActive().equals(false)){ + throw new CustomException(NOT_FOUND_AUCTION); + } + + auction.setAuctionActive(false); } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java b/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java index e39156b..53ef7ad 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java +++ b/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java @@ -29,6 +29,11 @@ public Bid bidSave(String userId, Long auction_number, Long bidPrice){ Auction auction = auctionRepository.findById(auction_number).orElseThrow( () -> new CustomException(NOT_FOUND_AUCTION)); + // 역경매가 삭제되었거나 정상적인 상태가 아님. + if(auction.getAuctionActive().equals(false)){ + throw new CustomException(NOT_FOUND_AUCTION); + } + BidDto dto = new BidDto(); dto.setUser(user); dto.setAuction(auction); diff --git a/src/main/java/com/example/wantedmarket/user/domain/model/User.java b/src/main/java/com/example/wantedmarket/user/domain/model/User.java index 75d3c01..457481b 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/model/User.java +++ b/src/main/java/com/example/wantedmarket/user/domain/model/User.java @@ -1,23 +1,31 @@ package com.example.wantedmarket.user.domain.model; +import com.example.wantedmarket.order.domain.model.Bid; import com.example.wantedmarket.user.domain.controller.dto.SignUpForm; +import java.util.List; import java.util.Locale; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.hibernate.envers.AuditOverride; +import org.hibernate.envers.Audited; @Entity @Getter @Setter @Builder +@Audited @NoArgsConstructor @AllArgsConstructor @AuditOverride(forClass = BaseEntity.class) @@ -38,6 +46,10 @@ public class User extends BaseEntity{ @Column(columnDefinition = "int default 0") private Integer balance; + @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) + @OrderBy("bid_record asc") // 댓글 정렬 + private List bids; + public static User from(SignUpForm form){ return User.builder() .userId(form.getUserId().toLowerCase(Locale.ROOT)) diff --git a/src/main/java/com/example/wantedmarket/util/BooleanToYNConverter.java b/src/main/java/com/example/wantedmarket/util/BooleanToYNConverter.java new file mode 100644 index 0000000..c40a0cf --- /dev/null +++ b/src/main/java/com/example/wantedmarket/util/BooleanToYNConverter.java @@ -0,0 +1,18 @@ +package com.example.wantedmarket.util; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter +public class BooleanToYNConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(Boolean attribute) { + return (attribute != null&& attribute) ? "Y" : "N"; + } + + @Override + public Boolean convertToEntityAttribute(String yn) { + return "Y".equalsIgnoreCase(yn); + } +} From d7ddc2da65493b812d58d88f9f81d6cd899fc5f6 Mon Sep 17 00:00:00 2001 From: SoliDeoHoneretGloria Date: Sun, 4 Jun 2023 14:02:39 +0200 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20[011-USER=5FDEACTIVATE]=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EA=B0=80=20=ED=83=88=ED=87=B4=EC=8B=9C=20=EC=86=8C?= =?UTF-8?q?=ED=94=84=ED=8A=B8=20=EC=82=AD=EC=A0=9C=ED=99=94=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EC=9D=BC=20=EB=B3=84=EB=8F=84=20=EA=B8=B0=EC=9E=85?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9D=B4=EC=9C=A0?= =?UTF-8?q?=EB=8A=94=20=EC=96=B4=EC=B0=A8=ED=94=BC=20=EB=B9=84=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=EB=90=98=EB=A9=B4=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=9D=BC=EC=9D=B4=20=EB=B0=94=EB=80=94=20=EC=9D=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scratch_user.http | 2 +- .../config/JwtAuthenticationProvider.java | 21 ++++++++++++++++++- .../domain/controller/UserController.java | 11 ++++++++-- .../wantedmarket/user/domain/model/User.java | 6 ++++++ .../domain/repository/UserRepository.java | 1 + .../user/domain/service/UserService.java | 15 ++++++++++++- 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/scratch_user.http b/scratch_user.http index 765fc0f..6120a93 100644 --- a/scratch_user.http +++ b/scratch_user.http @@ -23,7 +23,7 @@ Content-Type: application/json ### 회원 정보 조회 ( 유저 ) GET http://localhost:8080/user/get-info Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1NDc3NDM2LCJleHAiOjE2ODU1NjM4MzZ9.bIn-mpCBHlczP82FaoQxbKvaoDCryev8db7EP0XKBss +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODc1NTE2LCJleHAiOjE2ODU5NjE5MTZ9.hU05oS-izc-0KRKXefbixDXDo3wPf3Ju_gkQkz-aQhI ### 잔액 변경 ( 유저 ) POST http://localhost:8080/user/balance diff --git a/src/main/java/com/example/wantedmarket/config/JwtAuthenticationProvider.java b/src/main/java/com/example/wantedmarket/config/JwtAuthenticationProvider.java index 0c1b84c..c131d36 100644 --- a/src/main/java/com/example/wantedmarket/config/JwtAuthenticationProvider.java +++ b/src/main/java/com/example/wantedmarket/config/JwtAuthenticationProvider.java @@ -1,7 +1,12 @@ package com.example.wantedmarket.config; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_USER; + +import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.user.domain.common.UserVo; import com.example.wantedmarket.user.domain.common.UserType; +import com.example.wantedmarket.user.domain.model.User; +import com.example.wantedmarket.user.domain.service.UserService; import com.example.wantedmarket.util.Aes256Util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; @@ -9,11 +14,19 @@ import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.Objects; +import org.springframework.beans.factory.annotation.Autowired; public class JwtAuthenticationProvider { private String secretKey = "secretKey"; private long tokenValidTime = 1000L * 60 * 60 * 24; + private UserService userService; + + @Autowired + public void setUserService(UserService userService){ + this.userService = userService; + } + public String createToken(String userPk, Long id, UserType userType){ Claims claims = Jwts.claims().setSubject(Aes256Util.encrypt(userPk)) @@ -40,8 +53,14 @@ public boolean validateToken(String jwtToken){ public UserVo getUserVo(String token){ Claims c = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token) .getBody(); - return new UserVo(Long.valueOf(Objects.requireNonNull(Aes256Util + UserVo userVo = new UserVo(Long.valueOf(Objects.requireNonNull(Aes256Util .decrypt(c.getId()))), Aes256Util.decrypt(c.getSubject())); + + if(!userService.validUser(userVo.getUserId()).getActive()){ + throw new CustomException(NOT_FOUND_USER); + } + + return userVo; } } diff --git a/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java b/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java index 61a1175..aaf5642 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java +++ b/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java @@ -12,6 +12,7 @@ import com.example.wantedmarket.user.domain.user.UserDto; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -40,9 +41,15 @@ public ResponseEntity getInfo(@RequestHeader(name = "X-AUTH-TOKEN") Str @PostMapping("/balance") public ResponseEntity changeBalance(@RequestHeader(name = "X-AUTH-TOKEN") String token, @RequestBody ChangeBalanceForm form){ - UserVo vo = provider.getUserVo(token); + UserVo vo = provider.getUserVo(token); - return ResponseEntity.ok( + return ResponseEntity.ok( userBalanceService.changeBalance(vo.getUserId(), form).getCurrentMoney()); } + @DeleteMapping + public void deactivateUser(@RequestHeader(name = "X-AUTH-TOKEN") String token){ + UserVo vo = provider.getUserVo(token); + userService.deactivateId(vo.getUserId()); + } + } diff --git a/src/main/java/com/example/wantedmarket/user/domain/model/User.java b/src/main/java/com/example/wantedmarket/user/domain/model/User.java index 457481b..82de9ee 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/model/User.java +++ b/src/main/java/com/example/wantedmarket/user/domain/model/User.java @@ -2,10 +2,12 @@ import com.example.wantedmarket.order.domain.model.Bid; import com.example.wantedmarket.user.domain.controller.dto.SignUpForm; +import com.example.wantedmarket.util.BooleanToYNConverter; import java.util.List; import java.util.Locale; import javax.persistence.CascadeType; import javax.persistence.Column; +import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; @@ -43,6 +45,9 @@ public class User extends BaseEntity{ private String email; private String profile; + @Convert(converter = BooleanToYNConverter.class) + private Boolean active; + @Column(columnDefinition = "int default 0") private Integer balance; @@ -59,6 +64,7 @@ public static User from(SignUpForm form){ .phone(form.getPhone()) .email(form.getEmail().toLowerCase(Locale.ROOT)) .profile("default.png") + .active(true) .build(); } diff --git a/src/main/java/com/example/wantedmarket/user/domain/repository/UserRepository.java b/src/main/java/com/example/wantedmarket/user/domain/repository/UserRepository.java index b53e70b..8c623fe 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/repository/UserRepository.java +++ b/src/main/java/com/example/wantedmarket/user/domain/repository/UserRepository.java @@ -10,4 +10,5 @@ public interface UserRepository extends JpaRepository { Optional findByUserId(String userId); Optional findByEmail(String email); + Optional findByUserIdAndActive(String userId, Boolean active); } diff --git a/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java b/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java index c87cf25..22284e6 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java +++ b/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java @@ -1,5 +1,8 @@ package com.example.wantedmarket.user.domain.service; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_USER; + +import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.user.domain.model.User; import com.example.wantedmarket.user.domain.repository.UserRepository; import java.util.Optional; @@ -11,7 +14,6 @@ public class UserService { private final UserRepository userRepository; - public Optional findByIdAndUserId(Long id, String userId){ return userRepository.findById(id) .stream().filter(user->user.getUserId().equals(userId)) @@ -26,4 +28,15 @@ public Optional findValidUser(String userId, String password){ public Optional findById(Long id) { return userRepository.findById(id); } + + + public User validUser(String userId){ + User user = userRepository.findByUserIdAndActive(userId, true) + .orElseThrow(() -> new CustomException(NOT_FOUND_USER)); + return user; + } + public void deactivateId(String userId){ + User user = validUser(userId); + user.setActive(false); + } } From 987184c035edaad2a7b898ffea88a496834e5aa8 Mon Sep 17 00:00:00 2001 From: SoliDeoHoneretGloria Date: Sun, 4 Jun 2023 17:11:17 +0200 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20[012-USER=5FUPDATE]=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95(=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8)=20=EB=B2=84=EA=B7=B8=EC=88=98?= =?UTF-8?q?=EC=A0=95=20:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=9C?= =?UTF-8?q?=EC=97=90=EB=8F=84=20=EC=9C=A0=EC=A0=80=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scratch_user.http | 52 +++++++++++++++++-- .../domain/application/SignInApplication.java | 9 +++- .../domain/controller/UserController.java | 14 ++++- .../domain/controller/dto/UpdateUserForm.java | 19 +++++++ .../user/domain/service/UserService.java | 19 ++++++- 5 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/wantedmarket/user/domain/controller/dto/UpdateUserForm.java diff --git a/scratch_user.http b/scratch_user.http index 6120a93..307b40c 100644 --- a/scratch_user.http +++ b/scratch_user.http @@ -1,4 +1,4 @@ -### 회원 가입 ( 유저 ) +### 회원 가입 ( 유저1 ) POST http://localhost:8080/sign-up/user Content-Type: application/json @@ -11,7 +11,21 @@ Content-Type: application/json "userId": "user" } -### 로그인 ( 유저 ) + +### 회원 가입 ( 유저2 ) +POST http://localhost:8080/sign-up/user +Content-Type: application/json + +{ + "email": "second@naver.com", + "name": "name", + "nickName": "nickname", + "password": 1, + "phone": "010-8888-8888", + "userId": "second" +} + +### 로그인 ( 유저1 ) POST http://localhost:8080/sign-in/user Content-Type: application/json @@ -20,15 +34,24 @@ Content-Type: application/json "userId": "user" } +### 로그인 ( 유저2 ) +POST http://localhost:8080/sign-in/user +Content-Type: application/json + +{ + "password": 1, + "userId": "second" +} + ### 회원 정보 조회 ( 유저 ) GET http://localhost:8080/user/get-info Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODc1NTE2LCJleHAiOjE2ODU5NjE5MTZ9.hU05oS-izc-0KRKXefbixDXDo3wPf3Ju_gkQkz-aQhI +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODg3MTU1LCJleHAiOjE2ODU5NzM1NTV9.-1tGp4hFzX6WCEEhv-mC2QCeCXcozaK56rGj0Grw5Bg ### 잔액 변경 ( 유저 ) POST http://localhost:8080/user/balance Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1NDc2Nzg0LCJleHAiOjE2ODU1NjMxODR9.JF6azRLupU4F7len7ZQjoWiltJkp0lWr5GmPzI3QrhQ +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODg3MTU1LCJleHAiOjE2ODU5NzM1NTV9.-1tGp4hFzX6WCEEhv-mC2QCeCXcozaK56rGj0Grw5Bg { "from": "admin", @@ -36,6 +59,27 @@ X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iL "money": 1000 } +### 회원 정보수정 (유저) +PUT http://localhost:8080/user/ +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODg3MTU1LCJleHAiOjE2ODU5NzM1NTV9.-1tGp4hFzX6WCEEhv-mC2QCeCXcozaK56rGj0Grw5Bg + +{ + "email": "string", + "name": "string", + "nickName": "string", + "password": "string", + "phone": "string", + "profile": "string" +} + + + +### 회원 삭제 ( 유저 ) +DELETE http://localhost:8080/user/ +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODkwMDIyLCJleHAiOjE2ODU5NzY0MjJ9.XYJETzVqfSAEy1lo_FGunAF7pzrJMnByo19cTcy94Z4 + ### 역옥션 등록( 유저 ) POST http://localhost:8080/auction Content-Type: application/json diff --git a/src/main/java/com/example/wantedmarket/user/domain/application/SignInApplication.java b/src/main/java/com/example/wantedmarket/user/domain/application/SignInApplication.java index fe3d7b7..ef1a629 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/application/SignInApplication.java +++ b/src/main/java/com/example/wantedmarket/user/domain/application/SignInApplication.java @@ -1,5 +1,8 @@ package com.example.wantedmarket.user.domain.application; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_AUCTION; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_USER; + import com.example.wantedmarket.config.JwtAuthenticationProvider; import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.exception.ErrorCode; @@ -18,10 +21,14 @@ public class SignInApplication { private final JwtAuthenticationProvider provider; - public String userloginToken(SignInForm form){ + public String userLoginToken(SignInForm form){ // 1. 로그인 가능 여부 User u = userService.findValidUser(form.getUserId(), form.getPassword()) .orElseThrow(()-> new CustomException(ErrorCode.LOGIN_CHECK_FAIL)); + // 비활성화 중이면 로그인 불가 + if(u.getActive().equals(false)){ + throw new CustomException(NOT_FOUND_USER); + } // 2. 토큰을 발행하고 // 3. 토큰을 response한다. return provider.createToken(u.getUserId(), u.getId(), UserType.CUSTOMER); diff --git a/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java b/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java index aaf5642..0c1fc37 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java +++ b/src/main/java/com/example/wantedmarket/user/domain/controller/UserController.java @@ -5,16 +5,18 @@ import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.exception.ErrorCode; import com.example.wantedmarket.user.domain.common.UserVo; +import com.example.wantedmarket.user.domain.controller.dto.UpdateUserForm; import com.example.wantedmarket.user.domain.model.User; import com.example.wantedmarket.user.domain.service.UserBalanceService; import com.example.wantedmarket.user.domain.service.UserService; -import com.example.wantedmarket.user.domain.user.ChangeBalanceForm; -import com.example.wantedmarket.user.domain.user.UserDto; +import com.example.wantedmarket.user.domain.controller.dto.ChangeBalanceForm; +import com.example.wantedmarket.user.domain.controller.dto.UserDto; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; @@ -46,6 +48,14 @@ public ResponseEntity changeBalance(@RequestHeader(name = "X-AUTH-TOKEN return ResponseEntity.ok( userBalanceService.changeBalance(vo.getUserId(), form).getCurrentMoney()); } + + @PutMapping + public ResponseEntity modifyUser(@RequestHeader(name = "X-AUTH-TOKEN") String token, + @RequestBody UpdateUserForm form){ + UserVo vo = provider.getUserVo(token); + return ResponseEntity.ok(userService.modifyUser(vo.getUserId(), form)); + } + @DeleteMapping public void deactivateUser(@RequestHeader(name = "X-AUTH-TOKEN") String token){ UserVo vo = provider.getUserVo(token); diff --git a/src/main/java/com/example/wantedmarket/user/domain/controller/dto/UpdateUserForm.java b/src/main/java/com/example/wantedmarket/user/domain/controller/dto/UpdateUserForm.java new file mode 100644 index 0000000..2ae636e --- /dev/null +++ b/src/main/java/com/example/wantedmarket/user/domain/controller/dto/UpdateUserForm.java @@ -0,0 +1,19 @@ +package com.example.wantedmarket.user.domain.controller.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateUserForm { + private String password; + private String name; + private String nickName; + private String phone; + private String email; + private String profile; +} diff --git a/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java b/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java index 22284e6..6e94955 100644 --- a/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java +++ b/src/main/java/com/example/wantedmarket/user/domain/service/UserService.java @@ -3,11 +3,13 @@ import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_USER; import com.example.wantedmarket.exception.CustomException; +import com.example.wantedmarket.user.domain.controller.dto.UpdateUserForm; import com.example.wantedmarket.user.domain.model.User; import com.example.wantedmarket.user.domain.repository.UserRepository; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -19,6 +21,7 @@ public Optional findByIdAndUserId(Long id, String userId){ .stream().filter(user->user.getUserId().equals(userId)) .findFirst(); } + public Optional findValidUser(String userId, String password){ return userRepository.findByUserId(userId).stream().filter( user -> user.getPassword().equals(password)) @@ -29,14 +32,28 @@ public Optional findById(Long id) { return userRepository.findById(id); } - public User validUser(String userId){ User user = userRepository.findByUserIdAndActive(userId, true) .orElseThrow(() -> new CustomException(NOT_FOUND_USER)); return user; } + + @Transactional public void deactivateId(String userId){ User user = validUser(userId); user.setActive(false); } + + @Transactional + public User modifyUser(String userId, UpdateUserForm dto){ + User user = validUser(userId); + user.setPassword(dto.getPassword()); + user.setName(dto.getName()); + user.setNickName(dto.getNickName()); + user.setPhone(dto.getPhone()); + user.setEmail(dto.getEmail()); + user.setProfile(dto.getProfile()); + return user; + } + } From 254a34924a3909a6fd3fc4ed89476f8326b8d881 Mon Sep 17 00:00:00 2001 From: SoliDeoHoneretGloria Date: Sun, 4 Jun 2023 20:51:01 +0200 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20[013-BID=5FDELETE=5FAND=5FFIX]=20?= =?UTF-8?q?=EC=9E=85=EC=B0=B0=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=9E=85=EC=B0=B0=20=EC=8B=9C=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=83=81=ED=83=9C=20=EB=B0=8F=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20Dto=20=EB=B0=8F=20?= =?UTF-8?q?Form=20=EA=B8=B0=EB=8A=A5=20=EA=B3=A0=EB=8F=84=ED=95=98=20?= =?UTF-8?q?=EC=9E=85=EC=B0=B0=20=EC=97=90=EB=9F=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scratch_user.http | 31 +++++++++++++++++-- .../wantedmarket/exception/ErrorCode.java | 9 ++++-- .../order/domain/common/Conditions.java | 5 +++ .../domain/controller/BidContorller.java | 15 +++++++-- .../order/domain/controller/dto/BidDto.java | 17 +++++----- .../order/domain/controller/dto/BidForm.java | 21 +++++++++++++ .../domain/controller/dto/DeleteBidForm.java | 14 +++++++++ .../wantedmarket/order/domain/model/Bid.java | 17 +++++++--- .../domain/repository/BidRepository.java | 2 ++ .../order/domain/service/BidService.java | 18 +++++++---- 10 files changed, 126 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/example/wantedmarket/order/domain/common/Conditions.java create mode 100644 src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidForm.java create mode 100644 src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteBidForm.java diff --git a/scratch_user.http b/scratch_user.http index 307b40c..d1ca49d 100644 --- a/scratch_user.http +++ b/scratch_user.http @@ -83,7 +83,7 @@ X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iL ### 역옥션 등록( 유저 ) POST http://localhost:8080/auction Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODU5OTEwLCJleHAiOjE2ODU5NDYzMTB9.4zQXp3peOCB4YOeD-wpeDTtTuASe4qbkTC-Divnj570 +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1OTAzOTU1LCJleHAiOjE2ODU5OTAzNTV9.AGXRkXQLTS3yJC8RoforQi9zAQbdzTIJxq_AY3bsmOM { "auctionCategory": "BAGS", @@ -96,7 +96,7 @@ X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iL ### 역옥션 수정( 유저 ) PUT http://localhost:8080/auction Content-Type: application/json -X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1ODU5OTEwLCJleHAiOjE2ODU5NDYzMTB9.4zQXp3peOCB4YOeD-wpeDTtTuASe4qbkTC-Divnj570 +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1OTAzOTU1LCJleHAiOjE2ODU5OTAzNTV9.AGXRkXQLTS3yJC8RoforQi9zAQbdzTIJxq_AY3bsmOM { "auctionCategory": "BAGS", @@ -116,4 +116,31 @@ X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iL "auctionNumber": 1 } + +### 입찰 ( 유저 ) + +< {% + request.variables.set("number", "1") +%} + +POST http://localhost:8080/bid/auction/{{number}} +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNFdqdHRxUzZteHEzYmF5Qm1paldBPT0iLCJqdGkiOiJDbVlEdjVNSzVZVXlpazhLR05Ed293PT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1OTAzOTU1LCJleHAiOjE2ODU5OTAzNTV9.AGXRkXQLTS3yJC8RoforQi9zAQbdzTIJxq_AY3bsmOM + +{ + "bid_record": 999999, + "conditions": "NEW", + "description": "새거입니다." +} + + +### 입찰 취소( 유저 ) +DELETE http://localhost:8080/bid/ +Content-Type: application/json +X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ6Q0diclhScGJ3cmU1MFU5eVNmM2VBPT0iLCJqdGkiOiJTdWJIZUtVUlJyZVFZK1dTT25Ca3RnPT0iLCJyb2xlcyI6IkNVU1RPTUVSIiwiaWF0IjoxNjg1OTA0NDE4LCJleHAiOjE2ODU5OTA4MTh9.8F1fuLZvVaJt9KT6JVXS7E88CGEeZj4_rlALnfrk12o + +{ + "id": 6 +} + ##################################### \ No newline at end of file diff --git a/src/main/java/com/example/wantedmarket/exception/ErrorCode.java b/src/main/java/com/example/wantedmarket/exception/ErrorCode.java index 0105ee6..e39f156 100644 --- a/src/main/java/com/example/wantedmarket/exception/ErrorCode.java +++ b/src/main/java/com/example/wantedmarket/exception/ErrorCode.java @@ -18,9 +18,14 @@ public enum ErrorCode { NOT_ENOUGH_BALANCE(HttpStatus.BAD_REQUEST, "잔액이 부족합니다."), // auction - NOT_FOUND_AUCTION(HttpStatus.BAD_REQUEST,"입찰 실패 : 해당 역경매 글이 존재하지 않습니다."), + NOT_ENOUGH_QTY(HttpStatus.BAD_REQUEST, "등록 실패 : 수량은 1개 이상부터 등록이 가능합니다."), - NOT_ENOUGH_PRICE(HttpStatus.BAD_REQUEST, "등록 실패 : 가격은 0원 이상부터 등록이 가능합니다."); + NOT_ENOUGH_PRICE(HttpStatus.BAD_REQUEST, "등록 실패 : 가격은 0원 이상부터 등록이 가능합니다."), + + // bid + NOT_FOUND_AUCTION(HttpStatus.BAD_REQUEST,"입찰 실패 : 해당 역경매 글이 존재하지 않습니다."), + HIGH_BID_PRICE(HttpStatus.BAD_REQUEST,"입찰 실패 : 요청 입찰 가격이 현재 최저 입찰가보다 높습니다."), + NOT_FOUND_BID(HttpStatus.BAD_REQUEST,"삭제 실패 : 입찰 가격 삭제가 실패하였습니다."); private final HttpStatus httpStatus; private final String detail; diff --git a/src/main/java/com/example/wantedmarket/order/domain/common/Conditions.java b/src/main/java/com/example/wantedmarket/order/domain/common/Conditions.java new file mode 100644 index 0000000..f7f1fba --- /dev/null +++ b/src/main/java/com/example/wantedmarket/order/domain/common/Conditions.java @@ -0,0 +1,5 @@ +package com.example.wantedmarket.order.domain.common; + +public enum Conditions { + NEW, USED_LIKE_NEW, USED_VERY_GOOD, USED_GOOD, USED_ACCEPTABLE, USED_DAMAGED; +} diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/BidContorller.java b/src/main/java/com/example/wantedmarket/order/domain/controller/BidContorller.java index dd04e5f..6e5bbe5 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/controller/BidContorller.java +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/BidContorller.java @@ -2,11 +2,15 @@ import com.example.wantedmarket.config.JwtAuthenticationProvider; import com.example.wantedmarket.order.domain.controller.dto.BidDto; +import com.example.wantedmarket.order.domain.controller.dto.BidForm; +import com.example.wantedmarket.order.domain.controller.dto.DeleteAuctionForm; +import com.example.wantedmarket.order.domain.controller.dto.DeleteBidForm; import com.example.wantedmarket.order.domain.model.Bid; import com.example.wantedmarket.order.domain.service.BidService; import com.example.wantedmarket.user.domain.common.UserVo; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -26,9 +30,16 @@ public class BidContorller { @PostMapping("/auction/{number}") public ResponseEntity bidding(@RequestHeader(name = "X-AUTH-TOKEN") String token, @PathVariable Long number, - @RequestParam(value = "bidding price")Long bid) { + @RequestBody BidForm dto) { UserVo vo = provider.getUserVo(token); - return ResponseEntity.ok(BidDto.from(bidService.bidSave(vo.getUserId(), number, bid))); + return ResponseEntity.ok(BidDto.from(bidService.bidSave(vo.getUserId(), number, dto.toService()))); + } + + @DeleteMapping + public void deleteBid(@RequestHeader(name = "X-AUTH-TOKEN") String token, + @RequestBody DeleteBidForm form){ + UserVo vo = provider.getUserVo(token); + bidService.bidDelete(vo.getUserId(), form); } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidDto.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidDto.java index 9b9af71..462612c 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidDto.java +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidDto.java @@ -1,27 +1,30 @@ package com.example.wantedmarket.order.domain.controller.dto; +import com.example.wantedmarket.order.domain.common.Conditions; import com.example.wantedmarket.order.domain.model.Auction; import com.example.wantedmarket.order.domain.model.Bid; -import com.example.wantedmarket.user.domain.model.User; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Builder -@Setter @Getter @AllArgsConstructor @NoArgsConstructor public class BidDto { + private Long auctionId; private Long bid_record; - private User user; - private Auction auction; + private Conditions conditions; + private String description; public static BidDto from(Bid bid){ - return new BidDto(bid.getBid_record(), bid.getUser(), bid.getAuction()); + return BidDto.builder() + .auctionId(bid.getAuction().getAuctionNumber()) + .bid_record(bid.getBid_record()) + .conditions(bid.getConditions()) + .description(bid.getDescription()) + .build(); } - } diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidForm.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidForm.java new file mode 100644 index 0000000..69ac971 --- /dev/null +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/BidForm.java @@ -0,0 +1,21 @@ +package com.example.wantedmarket.order.domain.controller.dto; + +import com.example.wantedmarket.order.domain.common.Conditions; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BidForm { + private Long bid_record; + private Conditions conditions; + private String description; + + public BidForm toService(){ + return new BidForm(bid_record, conditions, description); + } +} diff --git a/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteBidForm.java b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteBidForm.java new file mode 100644 index 0000000..04245d0 --- /dev/null +++ b/src/main/java/com/example/wantedmarket/order/domain/controller/dto/DeleteBidForm.java @@ -0,0 +1,14 @@ +package com.example.wantedmarket.order.domain.controller.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeleteBidForm { + private Long id; +} diff --git a/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java b/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java index ea8047c..157b097 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java +++ b/src/main/java/com/example/wantedmarket/order/domain/model/Bid.java @@ -1,8 +1,12 @@ package com.example.wantedmarket.order.domain.model; +import com.example.wantedmarket.order.domain.common.Conditions; import com.example.wantedmarket.order.domain.controller.dto.BidDto; +import com.example.wantedmarket.order.domain.controller.dto.BidForm; import com.example.wantedmarket.user.domain.model.User; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -18,7 +22,6 @@ import org.hibernate.envers.AuditOverride; import org.hibernate.envers.Audited; - @Setter @Getter @Builder @@ -42,12 +45,18 @@ public class Bid extends BaseEntity{ private User user; private Long bid_record; + private String description; + + @Enumerated(value = EnumType.STRING) + private Conditions conditions; - public static Bid from(BidDto dto){ + public static Bid of(Auction auction, User user, BidForm dto){ return Bid.builder() - .auction(dto.getAuction()) - .user(dto.getUser()) + .auction(auction) + .user(user) .bid_record(dto.getBid_record()) + .description(dto.getDescription()) + .conditions(dto.getConditions()) .build(); } } diff --git a/src/main/java/com/example/wantedmarket/order/domain/repository/BidRepository.java b/src/main/java/com/example/wantedmarket/order/domain/repository/BidRepository.java index 32e806b..7ff9c9c 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/repository/BidRepository.java +++ b/src/main/java/com/example/wantedmarket/order/domain/repository/BidRepository.java @@ -1,10 +1,12 @@ package com.example.wantedmarket.order.domain.repository; import com.example.wantedmarket.order.domain.model.Bid; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface BidRepository extends JpaRepository { + Optional findByUser_UserIdAndId(String UserId, Long Id); } diff --git a/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java b/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java index 53ef7ad..0ed748e 100644 --- a/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java +++ b/src/main/java/com/example/wantedmarket/order/domain/service/BidService.java @@ -1,10 +1,14 @@ package com.example.wantedmarket.order.domain.service; +import static com.example.wantedmarket.exception.ErrorCode.HIGH_BID_PRICE; import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_AUCTION; +import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_BID; import static com.example.wantedmarket.exception.ErrorCode.NOT_FOUND_USER; import com.example.wantedmarket.exception.CustomException; import com.example.wantedmarket.order.domain.controller.dto.BidDto; +import com.example.wantedmarket.order.domain.controller.dto.BidForm; +import com.example.wantedmarket.order.domain.controller.dto.DeleteBidForm; import com.example.wantedmarket.order.domain.model.Auction; import com.example.wantedmarket.order.domain.model.Bid; import com.example.wantedmarket.order.domain.repository.AuctionRepository; @@ -23,7 +27,7 @@ public class BidService { private final AuctionRepository auctionRepository; @Transactional - public Bid bidSave(String userId, Long auction_number, Long bidPrice){ + public Bid bidSave(String userId, Long auction_number, BidForm dto){ User user = userRepository.findByUserId(userId).orElseThrow( () -> new CustomException(NOT_FOUND_USER)); Auction auction = auctionRepository.findById(auction_number).orElseThrow( @@ -34,12 +38,14 @@ public Bid bidSave(String userId, Long auction_number, Long bidPrice){ throw new CustomException(NOT_FOUND_AUCTION); } - BidDto dto = new BidDto(); - dto.setUser(user); - dto.setAuction(auction); - dto.setBid_record(bidPrice); + return bidRepository.save(Bid.of(auction, user, dto)); + } - return bidRepository.save(Bid.from(dto)); + @Transactional + public void bidDelete(String userId, DeleteBidForm form){ + Bid bid = bidRepository.findByUser_UserIdAndId(userId,form.getId()) + .orElseThrow(() -> new CustomException(NOT_FOUND_BID)); + bidRepository.delete(bid); } }