더보기
더보기
package no.gunbang.market.domain.auction.service;
import lombok.RequiredArgsConstructor;
import no.gunbang.market.common.Item;
import no.gunbang.market.common.ItemRepository;
import no.gunbang.market.common.exception.CustomException;
import no.gunbang.market.common.exception.ErrorCode;
import no.gunbang.market.domain.auction.dto.request.CreateAuctionRequestDto;
import no.gunbang.market.domain.auction.dto.response.CreateAuctionResponseDto;
import no.gunbang.market.domain.auction.entity.Auction;
import no.gunbang.market.domain.auction.repository.AuctionRepository;
import no.gunbang.market.domain.user.entity.User;
import no.gunbang.market.domain.user.repository.UserRepository;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AuctionService {
private final AuctionRepository auctionRepository;
private final ItemRepository itemRepository;
private final UserRepository userRepository;
public CreateAuctionResponseDto saveAuction(
CreateAuctionRequestDto requestDto,
Long userId
) {
User foundUser = findUserById(userId);
Long itemId = requestDto.getItemId();
Item foundItem = findItemByItem(itemId);
boolean isAuctionDaysOutOfRange = requestDto.getAuctionDays() < 3
|| 7 < requestDto.getAuctionDays();
if (isAuctionDaysOutOfRange) {
throw new CustomException(ErrorCode.AUCTION_DAYS_OUT_OF_RANGE);
}
Auction auctionToSave = Auction.of(
foundUser,
foundItem,
requestDto.getStartingPrice(),
requestDto.getAuctionDays()
);
Auction savedAuction = auctionRepository.save(auctionToSave);
return CreateAuctionResponseDto.toDto(savedAuction);
}
private User findUserById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(
() -> new CustomException(ErrorCode.USER_NOT_FOUND)
);
}
private Item findItemByItem(Long itemId) {
return itemRepository.findById(itemId)
.orElseThrow(
() -> new CustomException(ErrorCode.ITEM_NOT_FOUND)
);
}
}
더보기
더보기
package no.gunbang.market.domain.auction.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.NoArgsConstructor;
import no.gunbang.market.common.BaseEntity;
import no.gunbang.market.common.Item;
import no.gunbang.market.common.Status;
import no.gunbang.market.common.exception.CustomException;
import no.gunbang.market.common.exception.ErrorCode;
import no.gunbang.market.domain.user.entity.User;
import org.hibernate.annotations.Comment;
@Entity
@Table(name = "auction")
@Getter
@NoArgsConstructor
public class Auction extends BaseEntity {
@Comment("경매장 식별자")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "BIGINT")
private Long id;
@Comment("경매 시작가")
private long startingPrice;
@Comment("경매 마감 기한")
private LocalDateTime dueDate;
@Enumerated(EnumType.STRING)
@Comment("경매 진행 상태")
private Status status;
@Comment("사용자 외래키")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Comment("아이템 외래키")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
public static Auction of(
User user,
Item item,
long startingPrice,
int auctionDays
) {
validateAuctionDays(auctionDays);
Auction auction = new Auction();
auction.user = user;
auction.item = item;
auction.startingPrice = startingPrice;
auction.status = Status.ON_SALE;
auction.dueDate = auction.toDueDate(auctionDays);
return auction;
}
private LocalDateTime toDueDate(int auctionDays) {
return LocalDateTime.now().plusDays(auctionDays);
}
private static void validateAuctionDays(int auctionDays) {
if (auctionDays < 3 || auctionDays > 7) {
throw new CustomException(ErrorCode.AUCTION_DAYS_OUT_OF_RANGE);
}
}
}
더보기
더보기
package no.gunbang.market.domain.auction.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.NoArgsConstructor;
import no.gunbang.market.common.BaseEntity;
import no.gunbang.market.common.Item;
import no.gunbang.market.common.Status;
import no.gunbang.market.common.exception.CustomException;
import no.gunbang.market.common.exception.ErrorCode;
import no.gunbang.market.domain.user.entity.User;
import org.hibernate.annotations.Comment;
@Entity
@Table(name = "auction")
@Getter
@NoArgsConstructor
public class Auction extends BaseEntity {
@Comment("경매장 식별자")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "BIGINT")
private Long id;
@Comment("경매 시작가")
private long startingPrice;
@Comment("경매 마감 기한")
private LocalDateTime dueDate;
@Enumerated(EnumType.STRING)
@Comment("경매 진행 상태")
private Status status;
@Comment("사용자 외래키")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Comment("아이템 외래키")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
private static final int minAuctionDays = 3;
private static final int maxAuctionDays = 7;
public static Auction of(
User user,
Item item,
long startingPrice,
int auctionDays
) {
validateAuctionDays(auctionDays);
Auction auction = new Auction();
auction.user = user;
auction.item = item;
auction.startingPrice = startingPrice;
auction.status = Status.ON_SALE;
auction.dueDate = auction.toDueDate(auctionDays);
return auction;
}
private LocalDateTime toDueDate(int auctionDays) {
return LocalDateTime.now().plusDays(auctionDays);
}
private static void validateAuctionDays(int auctionDays) {
if (auctionDays < minAuctionDays || auctionDays > maxAuctionDays) {
throw new CustomException(ErrorCode.AUCTION_DAYS_OUT_OF_RANGE);
}
}
}
더보기
더보기
package no.gunbang.market.domain.auction.service;
import lombok.RequiredArgsConstructor;
import no.gunbang.market.common.Item;
import no.gunbang.market.common.ItemRepository;
import no.gunbang.market.common.exception.CustomException;
import no.gunbang.market.common.exception.ErrorCode;
import no.gunbang.market.domain.auction.dto.request.CreateAuctionRequestDto;
import no.gunbang.market.domain.auction.dto.response.CreateAuctionResponseDto;
import no.gunbang.market.domain.auction.entity.Auction;
import no.gunbang.market.domain.auction.repository.AuctionRepository;
import no.gunbang.market.domain.user.entity.User;
import no.gunbang.market.domain.user.repository.UserRepository;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AuctionService {
private final AuctionRepository auctionRepository;
private final ItemRepository itemRepository;
private final UserRepository userRepository;
public CreateAuctionResponseDto saveAuction(
CreateAuctionRequestDto requestDto,
Long userId
) {
User foundUser = findUserById(userId);
Long itemId = requestDto.getItemId();
Item foundItem = findItemByItem(itemId);
Auction auctionToSave = Auction.of(
foundUser,
foundItem,
requestDto.getStartingPrice(),
requestDto.getAuctionDays()
);
Auction savedAuction = auctionRepository.save(auctionToSave);
return CreateAuctionResponseDto.toDto(savedAuction);
}
private User findUserById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(
() -> new CustomException(ErrorCode.USER_NOT_FOUND)
);
}
private Item findItemByItem(Long itemId) {
return itemRepository.findById(itemId)
.orElseThrow(
() -> new CustomException(ErrorCode.ITEM_NOT_FOUND)
);
}
}
'끝을 보는 용기' 카테고리의 다른 글
Day 117 - 게임 아이템 거래소 프로젝트 10%, 기록 팀장은 감기에 걸려도 기록을 포기하지 못한다. (0) | 2025.01.31 |
---|---|
Day 116 - 휴식 후 JVM을 간단하게 복습하다. (0) | 2025.01.30 |
Day 115 - '왜 생겼을까?' 계속 물어보며 TCP와 HTTP를 공부하다. (0) | 2025.01.29 |
Day 114 - 느긋하게 테스트 코드를 공부하고, 이름이 신기해서 @Slf4j를 알아보다. (0) | 2025.01.28 |
Day 113 - 플러스 프로젝트 과제 제출, 예비 개발자로서 휴일을 보내는 가장 완벽한 방법 (0) | 2025.01.27 |