Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b3f344c
Feat : 경매 종료가 임박한 진행중인 경매 목록 조회
na0th Sep 7, 2024
3581808
Merge branch 'feat-pr' of https://github.com/na0th/auction into feat-pr
na0th Sep 7, 2024
1edfd44
style : 코드 포맷터 빌드
na0th Sep 7, 2024
f3f95cc
Refactor : 마감이 얼마 안남은 경매 조회 메서드에 파라미터 추가
na0th Sep 8, 2024
066a43d
Test: 마감 기한 얼마 안 남은 경매 목록 조회 : 테스트 코드 수정
na0th Sep 8, 2024
2499cc3
test : 테스트 코드 수정
na0th Sep 8, 2024
a70040e
refactor : endingSoon -> /auction 검색 필터로 엔드포인트 합치기
na0th Sep 10, 2024
1015a0f
Merge pull request #37 from na0th/feat-pr
polyglot-k Sep 10, 2024
7e4e4cf
fix : startTime 을 입력 받아서 진행, 내부에서 설정하는 것보다 확장성이 넓을 것으로 고려
polyglot-k Sep 10, 2024
98c1fff
refactor : Condition에서 StartTime도 받을 수 있도록 구성
polyglot-k Sep 10, 2024
612079e
refactor : AuctionCriteriaRepository BooleanBuilder 를 활용하여 쿼리의 null 안…
polyglot-k Sep 10, 2024
9ce20ec
test : auction test 추가 ( 현재 수정이 필요한 부분 주석 처리 되어있음)
polyglot-k Sep 10, 2024
41ef16b
fix : price 관련 필터 추가, 기본 생성자 추가
polyglot-k Sep 11, 2024
0350d5e
fix : AuctionCriteriaRepository에 price 관련 추가
polyglot-k Sep 11, 2024
fea9ddd
test : 필터 관련 테스트 추가
polyglot-k Sep 11, 2024
e0fedd3
feat: Resolver 를 통해서 Controller에서 QueryString 형식이 SearchCondition으로 W…
polyglot-k Sep 11, 2024
ca472bb
refactor : AuctionController GetMapping 에서 RequestBody 가 아닌 QueryStri…
polyglot-k Sep 11, 2024
87a95ff
fix : ProductCategory enum 클래스 exception 기저 추가
polyglot-k Sep 11, 2024
6b372d1
test : AuctionControllerTest 에 QueryString을 통해서 필터기반 조회 테스트
polyglot-k Sep 11, 2024
b5139cb
chore : 폴더 이동 및 lint 적용
polyglot-k Sep 11, 2024
3da4324
fix : 불필요한 DTO 제거
polyglot-k Sep 11, 2024
41828cb
fix : AuctionRepository 내에 불필요한 Repository 제거
polyglot-k Sep 11, 2024
6558813
refactor : 여성의류, ~~ 처럼 enum의 name이 아니라 메뉴의 고유 이름으로 enum 반환하게 변경
polyglot-k Sep 11, 2024
7138189
fix : @Deprecated 메소드 전체 제거
polyglot-k Sep 11, 2024
ca3a197
test : getAuctionsFilter을 통해 접근하도록 테스트 수정
polyglot-k Sep 11, 2024
f989092
chore : 전체 파일 내에 formatter 적용
polyglot-k Sep 11, 2024
0b8f970
refactor : bid 요소 추가 (입찰 수에 따른 정렬 기준을 위해서)
polyglot-k Sep 12, 2024
ae1e6a1
refactor : SearchCondition SortBy 추가
polyglot-k Sep 12, 2024
9ec54b7
refactor : SearchCondition SortBy 추가
polyglot-k Sep 12, 2024
0af0a45
remove : 불필요한 Repository 삭제
polyglot-k Sep 12, 2024
bd3959d
refactor : sortBy에 따라 OrderSpecifier 로 정렬이 가능하게 수정
polyglot-k Sep 12, 2024
9878732
test : Auction 도메인에 sortBy 를 추가하여 Test 진행
polyglot-k Sep 12, 2024
d9f899e
chore : ci&cd pipeline (ssh 기반)
polyglot-k Sep 13, 2024
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
53 changes: 53 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Java CI/CD with Gradle

on:
push:
branches:
- 'develop'
- 'main' # main 브랜치에 병합될 때 트리거

jobs:
ci-pipeline:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: '21'

- name: Grant execute permission for Gradle Wrapper
run: chmod +x ./gradlew

- name: Lint and format code
run: ./gradlew editorconfigFormat

- name: Build with Gradle
run: ./gradlew build

- name: Test with Gradle
run: ./gradlew test

cd-pipeline:
if: github.ref == 'refs/heads/main' # main 브랜치에만 배포 실행
runs-on: ubuntu-latest
steps:
- name: SSH로 NCP 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_USERNAME }}
password: ${{ secrets.NCP_SSH_PASSWORD }}
port: ${{ secrets.NCP_SSH_PORT }}
script_stop: true
script: |
cd auction
git pull knuk ttest
chmod 777 ./gradlew
./gradlew build
kill -9 $(lsof -t -i:8080) || echo "No process on 8080"
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
33 changes: 0 additions & 33 deletions .github/workflows/ci.yml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ public ResponseEntity<ApiResult<String>> getAuctionStatus(@PathVariable Long auc
@GetMapping
@Operation(summary = "Get all auctions", description = "Retrieves all auctions.")
@ApiResponse(responseCode = "200", description = "All auctions retrieved successfully")
public ResponseEntity<ApiResult<List<AuctionResponse>>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) {
List<AuctionResponse> auctions = auctionService.getAuctionsByFilter(productCategory, auctionCategory);
public ResponseEntity<ApiResult<List<AuctionResponse>>> getAllAuctions(AuctionRequest.SearchCondition searchCondition) {
List<AuctionResponse> auctions = auctionService.getAuctionsByFilter(searchCondition);
return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions));
}

Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/tasksprints/auction/common/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.tasksprints.auction.common.config;

import com.tasksprints.auction.common.resolver.SearchConditionResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {
private final SearchConditionResolver searchConditionResolver;

public WebConfig(SearchConditionResolver searchConditionResolver) {
this.searchConditionResolver = searchConditionResolver;
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(searchConditionResolver);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.tasksprints.auction.common.resolver;

import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest;
import com.tasksprints.auction.domain.auction.model.AuctionCategory;
import com.tasksprints.auction.domain.auction.model.AuctionStatus;
import com.tasksprints.auction.domain.product.model.ProductCategory;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class SearchConditionResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 메서드 파라미터 타입이 AuctionRequest.SearchCondition일 때 처리
return parameter.getParameterType().equals(AuctionRequest.SearchCondition.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {

// QueryString에서 값을 추출
String auctionCategory = webRequest.getParameter("auctionCategory");
String productCategory = webRequest.getParameter("productCategory");
String startTime = webRequest.getParameter("startTime");
String endTime = webRequest.getParameter("endTime");
String minPrice = webRequest.getParameter("minPrice");
String maxPrice = webRequest.getParameter("maxPrice");
String auctionStatus = webRequest.getParameter("auctionStatus");
String sortBy = webRequest.getParameter("sortBy");
// 파싱 및 변환
AuctionCategory parsedAuctionCategory = auctionCategory != null ? AuctionCategory.fromDisplayName(auctionCategory) : null;
ProductCategory parsedProductCategory = productCategory != null ? ProductCategory.fromDisplayName(productCategory) : null;
LocalDateTime parsedStartTime = startTime != null ? LocalDateTime.parse(startTime, DateTimeFormatter.ISO_DATE_TIME) : null;
LocalDateTime parsedEndTime = endTime != null ? LocalDateTime.parse(endTime, DateTimeFormatter.ISO_DATE_TIME) : null;
Comment thread
polyglot-k marked this conversation as resolved.
BigDecimal parsedMinPrice = minPrice != null ? new BigDecimal(minPrice) : null;
BigDecimal parsedMaxPrice = maxPrice != null ? new BigDecimal(maxPrice) : null;
AuctionStatus parsedAuctionStatus = auctionStatus != null ? AuctionStatus.fromDisplayName(auctionStatus) : null;

// SearchCondition 객체 생성 및 반환
return new AuctionRequest.SearchCondition(
parsedAuctionCategory,
parsedProductCategory,
parsedStartTime,
parsedEndTime,
parsedMinPrice,
parsedMaxPrice,
parsedAuctionStatus,
sortBy
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.tasksprints.auction.domain.auction.model.AuctionCategory;
import com.tasksprints.auction.domain.auction.model.AuctionStatus;
import com.tasksprints.auction.domain.product.model.ProductCategory;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -15,32 +16,25 @@ public class AuctionRequest {
@NoArgsConstructor
@AllArgsConstructor
public static class Create {
LocalDateTime startTime;
LocalDateTime endTime;
BigDecimal startingBid;
AuctionCategory auctionCategory;
AuctionStatus auctionStatus;
private LocalDateTime startTime;
private LocalDateTime endTime;
private BigDecimal startingBid;
private AuctionCategory auctionCategory;
private AuctionStatus auctionStatus;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class AuctionCategoryParam {
AuctionCategory auctionCategory;

public AuctionCategoryParam(String auctionCategory) {
this.auctionCategory = AuctionCategory.fromDisplayName(auctionCategory);
}
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class ProductCategoryParam {
ProductCategory productCategory;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public static class SearchCondition {
private AuctionCategory auctionCategory;
private ProductCategory productCategory;
private LocalDateTime startTime;
private LocalDateTime endTime;
private BigDecimal minPrice;
private BigDecimal maxPrice;
private AuctionStatus auctionStatus;
private String sortBy;

public ProductCategoryParam(String productCategory) {
this.productCategory = ProductCategory.fromDisplayName(productCategory);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.tasksprints.auction.domain.auction.model;

import com.tasksprints.auction.common.entity.BaseEntity;
import com.tasksprints.auction.domain.bid.model.Bid;
import com.tasksprints.auction.domain.product.model.Product;
import com.tasksprints.auction.domain.user.model.User;
import jakarta.persistence.*;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Builder
@NoArgsConstructor
Expand Down Expand Up @@ -47,6 +50,11 @@ public class Auction extends BaseEntity {
@Builder.Default
private Product product = null;


@OneToMany
@Builder.Default
private List<Bid> bids = new ArrayList<>();

public static Auction create(LocalDateTime startTime, LocalDateTime endTime, BigDecimal startingBid, AuctionCategory auctionCategory, AuctionStatus auctionStatus, User seller) {
Auction newAuction = Auction.builder()
.startTime(startTime)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,13 @@ public enum AuctionStatus {
PENDING,
ACTIVE,
CLOSED,
CANCELED
CANCELED;

public static AuctionStatus fromDisplayName(String auctionStatus) {
try {
return AuctionStatus.valueOf(auctionStatus.toUpperCase()); // 대문자로 변환하여 비교
} catch (IllegalArgumentException e) {
return AuctionStatus.ACTIVE; // 유효하지 않은 값일 경우 기본값으로 ACTIVE 반환
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@


import com.tasksprints.auction.domain.auction.model.Auction;
import com.tasksprints.auction.domain.auction.model.AuctionCategory;
import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository;
import com.tasksprints.auction.domain.product.model.ProductCategory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -14,15 +12,11 @@

public interface AuctionRepository extends JpaRepository<Auction, Long>, AuctionCriteriaRepository {


@Query("SELECT a FROM auction a WHERE a.seller.id = :userId")
List<Auction> findAuctionsByUserId(@Param("userId") Long userId);

@Query("SELECT a FROM auction a WHERE a.id = :auctionId")
Optional<Auction> findAuctionById(@Param("auctionId") Long auctionId);

List<Auction> findAuctionsByAuctionCategory(AuctionCategory auctionCategory);

List<Auction> findAuctionByProduct_Category(ProductCategory productCategory);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.tasksprints.auction.domain.auction.repository.support;

import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest;
import com.tasksprints.auction.domain.auction.model.Auction;
import com.tasksprints.auction.domain.auction.model.AuctionCategory;
import com.tasksprints.auction.domain.product.model.ProductCategory;

import java.util.List;

public interface AuctionCriteriaRepository {
public List<Auction> getAuctionsByFilters(ProductCategory productCategory,
AuctionCategory category);
List<Auction> getAuctionsByFilters(AuctionRequest.SearchCondition searchCondition);
}
Loading