Skip to content

Commit

Permalink
Feat/deal api (#99)
Browse files Browse the repository at this point in the history
* Fix: 기타 API 추가

* Feat: 1분 주석 및 농산물 상세에 판매자 이미지 추가

* Feat: 시작 및 종료시간 이중 감지
  • Loading branch information
klkim1913 authored Aug 11, 2023
1 parent 3827e10 commit 1c34889
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 13 deletions.
3 changes: 2 additions & 1 deletion src/main/java/com/anywayclear/MokuMokuApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableJpaAuditing
@EnableScheduling
@SpringBootApplication
public class MokuMokuApplication {
public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ public ResponseEntity<BiddingResponse> bidding(
@PathVariable("auction-id") long auctionId,
@RequestBody BiddingRequest request) { // 인증정보 받기 추가 예정
String consumerId = (String) oAuth2User.getAttributes().get("userId");
auctionService.checkAuctionFinished(auctionId);
return ResponseEntity.ok(auctionService.Bidding(auctionId, consumerId, request));
}

/*폐기*/
@PatchMapping("/{auction-id}/status")
public ResponseEntity<Long> changeFinished(@PathVariable("auction-id") long auctionId) {
Long dealId = auctionService.changeFinished(auctionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,16 @@ public ResponseEntity<Void> createProduce(@AuthenticationPrincipal OAuth2User oA
@GetMapping("/{id}")
// @Secured({"ROLE_CONSUMER", "ROLE_SELLER"})
public ResponseEntity<ProduceResponse> getProduce(@Positive @PathVariable("id") long id) {
produceService.updateProduceStatus();
return ResponseEntity.ok(produceService.getProduce(id));
}

@GetMapping
public ResponseEntity<MultiResponse<ProduceResponse, Produce>> getProduceList(
@RequestParam(value = "userId",required = false) String sellerId, @RequestParam(required = false, defaultValue = "all") String filter, @RequestParam List<Integer> statusNoList,
@RequestParam(value = "userId", required = false) String sellerId, @RequestParam(required = false, defaultValue = "all") String filter, @RequestParam List<Integer> statusNoList,
Pageable pageable, @RequestParam(required = false, defaultValue = "") String name) {
produceService.updateProduceStatus();

return ResponseEntity.ok(produceService.getProducePage(statusNoList, pageable, name, sellerId, filter));
}

Expand Down
8 changes: 6 additions & 2 deletions src/main/java/com/anywayclear/entity/Auction.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package com.anywayclear.entity;

import com.anywayclear.util.BaseTime;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Auction extends BaseTime{
public class Auction extends BaseTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand All @@ -23,11 +25,13 @@ public class Auction extends BaseTime{
private int price;

private String nickname;
private LocalDateTime lastBidding;

private int status; // 0: 대기, 1: 경매중, 2: 경매 완료
private boolean isClosed;
public Auction(Produce produce) {
this.produce = produce;
this.price = produce.getStartPrice();
this.nickname = "";
this.lastBidding = produce.getStartDate();
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/anywayclear/entity/Point.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.anywayclear.entity;

import com.anywayclear.util.BaseTime;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -12,7 +13,7 @@
@Getter
@Setter
@NoArgsConstructor
public class Point extends BaseTime{
public class Point extends BaseTime {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/anywayclear/entity/Review.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.anywayclear.entity;

import com.anywayclear.dto.request.ReviewRequest;
import com.anywayclear.util.BaseTime;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -12,7 +13,7 @@
@Setter
@Entity
@NoArgsConstructor
public class Review extends BaseTime{
public class Review extends BaseTime {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,5 @@
public interface AuctionRepository extends JpaRepository<Auction, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Auction> findById(Long id);

List<Auction> findAllByProduce(Produce produce);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@
public interface ProduceRepository extends JpaRepository<Produce, Long> {
Page<Produce> findAllByStatusInAndNameContaining(List<Integer> statusNoList, Pageable pageable, String name);

Page<Produce> findAllBySellerAndStatusInAndNameContaining(Member seller,Pageable pageable,List<Integer> statusNoList,String name);
Page<Produce> findAllBySellerAndStatusInAndNameContaining(Member seller, Pageable pageable, List<Integer> statusNoList, String name);

List<Produce> findByStatus(int status);
}
22 changes: 19 additions & 3 deletions src/main/java/com/anywayclear/service/AuctionService.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ public AuctionService(AuctionRepository auctionRepository,
@Transactional
public BiddingResponse Bidding(long auctionId, String consumerId, BiddingRequest request) {
Auction auction = auctionRepository.findById(auctionId).orElseThrow(() -> new CustomException(INVALID_AUCTION_ID));
if (auction.getStatus() == 0 || auction.getStatus() == 2) {
if (auction.getProduce().getStatus() == 0 || auction.isClosed()) {
throw new CustomException(INVALID_AUCTION_STATUS);
}
/* 테스트동안 제한 안함 */
// if (LocalDateTime.now().isAfter(auction.getUpdatedAt().plusMinutes(1))) {
// if (LocalDateTime.now().isAfter(auction.getUpdatedAt().plusMinutes(5))) {
// throw new CustomException(EXPIRED_AUCTION_TIME);
// }
Member consumer = memberRepository.findByUserId(consumerId).orElseThrow(() -> new CustomException(INVALID_MEMBER));
Expand All @@ -58,17 +58,32 @@ public BiddingResponse Bidding(long auctionId, String consumerId, BiddingRequest
.build();
}

@Transactional
public void checkAuctionFinished(long auctionId) {
Auction auction=auctionRepository.findById(auctionId).orElseThrow(()->new CustomException(INVALID_AUCTION_ID));
Produce produce = auction.getProduce();
if (produce.getStatus() == 1 && !auction.isClosed() && LocalDateTime.now().isAfter(auction.getLastBidding().plusMinutes(5))) {
auction.setClosed(true);
produce.setEa(produce.getEa() - 1);
// 한 상품의 모든 경매가 종료되었을 경우
if (produce.getEa() == 0) {
produce.setStatus(2);
}
}
}

@Transactional(readOnly = true)
public AuctionResponseList getAuctionList(long produceId) {
Produce produce = produceRepository.findById(produceId).orElseThrow(() -> new CustomException(INVALID_PRODUCE_ID));
List<Auction> auctionList = auctionRepository.findAllByProduce(produce);
return new AuctionResponseList(auctionList);
}

/* 요청으로 불가해서 폐기 */
@Transactional
public Long changeFinished(long auctionId) {
Auction auction = auctionRepository.findById(auctionId).orElseThrow(() -> new CustomException(INVALID_AUCTION_ID));
auction.setStatus(2);
auction.setClosed(true);
DealCreateRequest dealCreateRequest = DealCreateRequest.builder()
.endPrice(auction.getPrice())
.consumer(memberRepository.findByNickname(auction.getNickname()).orElseThrow(() -> new CustomException(INVALID_MEMBER)))
Expand All @@ -77,6 +92,7 @@ public Long changeFinished(long auctionId) {
.build();
return dealService.createDeal(dealCreateRequest);
}

/**
* test용 - 자동 최소 비딩
*/
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/com/anywayclear/service/ProduceService.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ public class ProduceService {
private final ProduceRepository produceRepository;
private final AuctionRepository auctionRepository;
private final MemberRepository memberRepository;
private final AuctionService auctionService;

public ProduceService(ProduceRepository produceRepository, AuctionRepository auctionRepository, MemberRepository memberRepository) {
public ProduceService(ProduceRepository produceRepository, AuctionRepository auctionRepository, MemberRepository memberRepository, AuctionService auctionService) {
this.produceRepository = produceRepository;
this.auctionRepository = auctionRepository;
this.memberRepository = memberRepository;
this.auctionService = auctionService;
}

@Transactional
Expand Down Expand Up @@ -60,4 +62,13 @@ public MultiResponse<ProduceResponse, Produce> getProducePage(List<Integer> stat
List<ProduceResponse> produceResponseList = producePage.map(ProduceResponse::toResponse).getContent();
return new MultiResponse<>(produceResponseList, producePage);
}

@Transactional
public void updateProduceStatus() {
for (Produce produce : produceRepository.findByStatus(1)) {
for (Auction auction : produce.getAuctionList()) {
auctionService.checkAuctionFinished(auction.getId());
}
}
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/anywayclear/util/AuctionScheduler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.anywayclear.util;

import com.anywayclear.entity.Produce;
import com.anywayclear.repository.ProduceRepository;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

@Component
@Transactional
public class AuctionScheduler {
private final ProduceRepository produceRepository;

public AuctionScheduler(ProduceRepository produceRepository) {
this.produceRepository = produceRepository;
}

@Scheduled(cron = "0 0/5 * * * ?", zone = "Asia/Seoul")
public void updateAuctionStatus() {
for (Produce produce : produceRepository.findAll()) {
if (produce.getStatus() == 0 && LocalDateTime.now().isAfter(produce.getStartDate())) {
produce.setStatus(1);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.anywayclear.entity;
package com.anywayclear.util;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
Expand Down

0 comments on commit 1c34889

Please sign in to comment.