Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/133 get purchased list #141

Merged
merged 10 commits into from
Jan 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package com.sptp.backend.art_work.repository;

import org.springframework.data.domain.Pageable;

import java.util.List;

public interface ArtWorkCustomRepository {

void updateStatusToProcessing(Long auctionId);

void updateStatusToTerminated(Long auctionId);

List<ArtWork> findTerminatedAuctionArtWorkList(Long auctionId, Long artWorkId, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package com.sptp.backend.art_work.repository;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.sptp.backend.auction.repository.AuctionStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;

import java.util.List;

import static com.sptp.backend.art_work.repository.QArtWork.*;

@RequiredArgsConstructor
public class ArtWorkCustomRepositoryImpl implements ArtWorkCustomRepository{
Expand All @@ -13,19 +19,46 @@ public class ArtWorkCustomRepositoryImpl implements ArtWorkCustomRepository{
public void updateStatusToProcessing(Long auctionId) {

queryFactory
.update(QArtWork.artWork)
.set(QArtWork.artWork.saleStatus, ArtWorkStatus.PROCESSING.getType())
.where(QArtWork.artWork.auction.id.eq(auctionId))
.update(artWork)
.set(artWork.saleStatus, ArtWorkStatus.PROCESSING.getType())
.where(artWork.auction.id.eq(auctionId))
.execute();
}

@Override
public void updateStatusToTerminated(Long auctionId) {

queryFactory
.update(QArtWork.artWork)
.set(QArtWork.artWork.saleStatus, ArtWorkStatus.SALES_SUCCESS.getType())
.where(QArtWork.artWork.auction.id.eq(auctionId))
.update(artWork)
.set(artWork.saleStatus, ArtWorkStatus.SALES_SUCCESS.getType())
.where(artWork.auction.id.eq(auctionId))
.execute();
}

@Override
public List<ArtWork> findTerminatedAuctionArtWorkList(Long auctionId, Long artWorkId, Pageable pageable) {
List<ArtWork> results = queryFactory
.select(artWork)
.from(artWork)
.where(
ltArtWorkId(artWorkId),
artWork.auction.id.eq(auctionId),
artWork.saleStatus.ne(ArtWorkStatus.REGISTERED.getType()),
artWork.saleStatus.ne(ArtWorkStatus.PROCESSING.getType())
)
.orderBy(artWork.id.desc())
.limit(pageable.getPageSize()+1)
.fetch();

return results;
}

private BooleanExpression ltArtWorkId(Long artWorkId) {

if (artWorkId == null) {
return null;
}

return artWork.id.lt(artWorkId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.sptp.backend.auction.repository.Auction;
import com.sptp.backend.member.repository.Member;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
Expand All @@ -12,5 +13,4 @@ public interface ArtWorkRepository extends JpaRepository<ArtWork, Long>, ArtWork
List<ArtWork> findArtWorkByMember(Member member);
List<ArtWork> findByAuctionId(Long auctionId);
List<ArtWork> findByAuctionIdAndSaleStatus(Long auctionId, String status);

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package com.sptp.backend.art_work.service;

import com.querydsl.core.Tuple;
import com.sptp.backend.art_work.event.ArtWorkEvent;
import com.sptp.backend.art_work.repository.ArtWork;
import com.sptp.backend.art_work.repository.ArtWorkRepository;
import com.sptp.backend.art_work.repository.ArtWorkSize;
import com.sptp.backend.art_work.repository.ArtWorkStatus;
import com.sptp.backend.art_work.repository.*;
import com.sptp.backend.art_work.web.dto.request.ArtWorkSaveRequestDto;
import com.sptp.backend.art_work.web.dto.response.ArtWorkInfoResponseDto;
import com.sptp.backend.art_work.web.dto.response.ArtWorkMyListResponseDto;
import com.sptp.backend.art_work.web.dto.response.BiddingListResponse;
import com.sptp.backend.art_work.web.dto.response.*;
import com.sptp.backend.art_work_image.repository.ArtWorkImage;
import com.sptp.backend.art_work_image.repository.ArtWorkImageRepository;
import com.sptp.backend.art_work_keyword.repository.ArtWorkKeyword;
Expand All @@ -21,6 +17,7 @@
import com.sptp.backend.aws.service.FileService;
import com.sptp.backend.bidding.repository.Bidding;
import com.sptp.backend.bidding.repository.BiddingRepository;
import com.sptp.backend.bidding.repository.QBidding;
import com.sptp.backend.common.KeywordMap;
import com.sptp.backend.common.NotificationCode;
import com.sptp.backend.common.entity.BaseEntity;
Expand All @@ -32,6 +29,9 @@
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
Expand Down Expand Up @@ -214,6 +214,7 @@ public ArtWorkInfoResponseDto getArtWork(Long artWorkId, Member member) {
.artist(ArtWorkInfoResponseDto.ArtistDto.from(findArtist, storageUrl))
.artWork(ArtWorkInfoResponseDto.ArtWorkDto.from(findArtWork, artWorkImages, artWorkKeywords, storageUrl))
.isPreferred(isPreferred)
.turn(findArtWork.getAuction().getTurn())
.build();
}

Expand Down Expand Up @@ -311,4 +312,78 @@ private List<AuctionArtWorkListResponseDto.ArtWorkDto> transferToArtWorkDto(List

return artWorkDtoList;
}

public ArtWorkTerminatedListResponseDto getTerminatedAuctionArtWorkList(Long auctionId, Long artWorkId, Pageable pageable) {

Auction auction = auctionRepository.findById(auctionId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_AUCTION_TURN));

if (!auction.getStatus().equals(AuctionStatus.TERMINATED.getType())) {
throw new CustomException(ErrorCode.IS_NOT_TERMINATED_AUCTION);
}

List<ArtWork> results = artWorkRepository.findTerminatedAuctionArtWorkList(auctionId, artWorkId, pageable);
List<ArtWorkTerminatedListResponseDto.ArtWorkDto> artWorkDtoList = transferToTerminatedArtWorkDto(results);

boolean hasNext = false;

// μ‘°νšŒν•œ κ²°κ³Ό κ°œμˆ˜κ°€ μš”μ²­ν•œ νŽ˜μ΄μ§€ μ‚¬μ΄μ¦ˆλ³΄λ‹€ 클 경우, next = true
if (artWorkDtoList.size() > pageable.getPageSize()) {
hasNext = true;
artWorkDtoList.remove(pageable.getPageSize());
}

ArtWorkTerminatedListResponseDto artWorkTerminatedListResponseDto = ArtWorkTerminatedListResponseDto.builder()
.nextPage(hasNext)
.artWorks(artWorkDtoList)
.build();

return artWorkTerminatedListResponseDto;
}

private List<ArtWorkTerminatedListResponseDto.ArtWorkDto> transferToTerminatedArtWorkDto(List<ArtWork> artWorkList) {

List<ArtWorkTerminatedListResponseDto.ArtWorkDto> artWorkDtoList = new ArrayList<>();

for (ArtWork artWork : artWorkList) {

List<Long> priceList = artWork.getBiddingList().stream().map(m -> m.getPrice()).collect(Collectors.toList());
Long topPrice = artWork.getPrice();
if (!priceList.isEmpty()) {
topPrice = Collections.max(priceList);
}

ArtWorkTerminatedListResponseDto.ArtWorkDto artWorkDto = ArtWorkTerminatedListResponseDto.ArtWorkDto.from(artWork, topPrice, artWork.getBiddingList().size(), storageUrl);
artWorkDtoList.add(artWorkDto);
}

return artWorkDtoList;
}

public ArtWorkPurchasedListResponseDto getMyBidding(Member member) {

List<ArtWorkPurchasedListResponseDto.BiddingDto> biddingDtoList = new ArrayList<>();
List<ArtWorkPurchasedListResponseDto.SuccessfulBiddingDto> successfulBiddingDtoList = new ArrayList<>();

List<Tuple> list = biddingRepository.findByMemberWithMaxBidding(member);

for (Tuple tuple : list) {

ArtWork findArtWork = tuple.get(QBidding.bidding.artWork);
Long myMaxBiddingPrice = tuple.get(QBidding.bidding.price.max());

Long topPrice = biddingRepository.getFirstByArtWorkOrderByPriceDesc(findArtWork).get().getPrice();

if (myMaxBiddingPrice.equals(topPrice)) {
successfulBiddingDtoList.add(ArtWorkPurchasedListResponseDto.SuccessfulBiddingDto.from(findArtWork, topPrice, storageUrl));
} else {
biddingDtoList.add(ArtWorkPurchasedListResponseDto.BiddingDto.from(findArtWork, myMaxBiddingPrice, topPrice, storageUrl));
}
}

return ArtWorkPurchasedListResponseDto.builder()
.successfulBiddingList(successfulBiddingDtoList)
.biddingList(biddingDtoList)
.build();
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/sptp/backend/art_work/web/ArtWorkController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.sptp.backend.art_work.web.dto.request.ArtWorkSaveRequestDto;
import com.sptp.backend.art_work.web.dto.response.ArtWorkInfoResponseDto;
import com.sptp.backend.art_work.web.dto.response.ArtWorkMyListResponseDto;
import com.sptp.backend.art_work.web.dto.response.ArtWorkPurchasedListResponseDto;
import com.sptp.backend.art_work.web.dto.response.BiddingListResponse;
import com.sptp.backend.jwt.service.dto.CustomUserDetails;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -75,4 +76,13 @@ public ResponseEntity<BiddingListResponse> getBiddingList(@PathVariable Long art

return ResponseEntity.ok(artWorkService.getBiddingList(artWorkId));
}

// λ‚˜μ˜ 경맀 쑰회
@GetMapping("/bidding/me")
public ResponseEntity<ArtWorkPurchasedListResponseDto> getMyBidding(@AuthenticationPrincipal CustomUserDetails userDetails) {

ArtWorkPurchasedListResponseDto artWorkPurchasedListResponseDto = artWorkService.getMyBidding(userDetails.getMember());

return ResponseEntity.status(HttpStatus.OK).body(artWorkPurchasedListResponseDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class ArtWorkInfoResponseDto {
private ArtistDto artist;
private ArtWorkDto artWork;
private boolean isPreferred;
private Integer turn;

@Data
@Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.sptp.backend.art_work.web.dto.response;

import com.sptp.backend.art_work.repository.ArtWork;
import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ArtWorkPurchasedListResponseDto {

private List<BiddingDto> biddingList;
private List<SuccessfulBiddingDto> successfulBiddingList;

@Data
@Builder
public static class BiddingDto {

private Long id;
private String mainImage;
private Integer turn;
private String title;
private String artistName;
private Long myBiddingPrice;
private Long finalBiddingPrice;

public static BiddingDto from(ArtWork artWork, Long myBiddingPrice, Long finalBiddingPrice, String storageUrl) {
return BiddingDto.builder()
.id(artWork.getId())
.mainImage(storageUrl + artWork.getMainImage())
.turn(artWork.getAuction().getTurn())
.title(artWork.getTitle())
.artistName(artWork.getMember().getNickname())
.myBiddingPrice(myBiddingPrice)
.finalBiddingPrice(finalBiddingPrice)
.build();
}
}

@Data
@Builder
public static class SuccessfulBiddingDto {

private Long id;
private String mainImage;
private Integer turn;
private String title;
private String artistName;
private Long finalBiddingPrice;

public static SuccessfulBiddingDto from(ArtWork artWork, Long finalBiddingPrice, String storageUrl) {
return SuccessfulBiddingDto.builder()
.id(artWork.getId())
.mainImage(storageUrl + artWork.getMainImage())
.turn(artWork.getAuction().getTurn())
.title(artWork.getTitle())
.artistName(artWork.getMember().getNickname())
.finalBiddingPrice(finalBiddingPrice)
.build();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.sptp.backend.art_work.web.dto.response;

import com.sptp.backend.art_work.repository.ArtWork;
import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ArtWorkTerminatedListResponseDto {

private boolean nextPage;
private List<ArtWorkDto> artWorks;

@Data
@Builder
public static class ArtWorkDto {
private Long id;
private String mainImage;
private String title;
private String material;
private Long topPrice;
private Integer biddingCount;
private String status;

public static ArtWorkDto from(ArtWork artWork, Long topPrice, Integer biddingCount, String storageUrl) {
return ArtWorkDto.builder()
.id(artWork.getId())
.mainImage(storageUrl + artWork.getMainImage())
.title(artWork.getTitle())
.material(artWork.getMaterial())
.topPrice(topPrice)
.biddingCount(biddingCount)
.status(artWork.getSaleStatus())
.build();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@ public interface AuctionCustomRepository {
List<Auction> findLatestScheduledAuction();

Auction findCurrentlyProcessingAuction();

List<Auction> findScheduledAuction();

List<Auction> findTerminatedAuction();
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,24 @@ public Auction findCurrentlyProcessingAuction() {
.fetchOne();
}

@Override
public List<Auction> findScheduledAuction() {
return queryFactory
.select(auction)
.from(auction)
.where(auction.status.eq(AuctionStatus.SCHEDULED.getType())
.and(auction.startDate.goe(LocalDateTime.now())))
.fetch();
}

@Override
public List<Auction> findTerminatedAuction() {
return queryFactory
.select(auction)
.from(auction)
.where(auction.status.eq(AuctionStatus.TERMINATED.getType()))
.fetch();
}


}
Loading