diff --git a/build.gradle b/build.gradle index e19852eb..49842485 100644 --- a/build.gradle +++ b/build.gradle @@ -75,7 +75,6 @@ dependencies { implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'javax.xml.bind:jaxb-api:2.3.1' } - tasks.named('test') { useJUnitPlatform() } diff --git a/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntity.java b/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntity.java deleted file mode 100644 index 71a60b9e..00000000 --- a/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tasksprints.auction.common.entity; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = -501798226L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntityWithUpdate.java b/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntityWithUpdate.java deleted file mode 100644 index 75dbafed..00000000 --- a/src/main/generated/com/tasksprints/auction/common/entity/QBaseEntityWithUpdate.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tasksprints.auction.common.entity; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntityWithUpdate is a Querydsl query type for BaseEntityWithUpdate - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntityWithUpdate extends EntityPathBase { - - private static final long serialVersionUID = 639151741L; - - public static final QBaseEntityWithUpdate baseEntityWithUpdate = new QBaseEntityWithUpdate("baseEntityWithUpdate"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); - - public QBaseEntityWithUpdate(String variable) { - super(BaseEntityWithUpdate.class, forVariable(variable)); - } - - public QBaseEntityWithUpdate(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntityWithUpdate(PathMetadata metadata) { - super(BaseEntityWithUpdate.class, metadata); - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/auction/model/QAuction.java b/src/main/generated/com/tasksprints/auction/domain/auction/model/QAuction.java deleted file mode 100644 index d8d0c59a..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/auction/model/QAuction.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.tasksprints.auction.domain.auction.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QAuction is a Querydsl query type for Auction - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAuction extends EntityPathBase { - - private static final long serialVersionUID = -698942437L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QAuction auction = new QAuction("auction"); - - public final com.tasksprints.auction.common.entity.QBaseEntity _super = new com.tasksprints.auction.common.entity.QBaseEntity(this); - - public final EnumPath auctionCategory = createEnum("auctionCategory", AuctionCategory.class); - - public final EnumPath auctionStatus = createEnum("auctionStatus", AuctionStatus.class); - - public final ListPath bids = this.createList("bids", com.tasksprints.auction.domain.bid.model.Bid.class, com.tasksprints.auction.domain.bid.model.QBid.class, PathInits.DIRECT2); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); - - public final NumberPath id = createNumber("id", Long.class); - - public final com.tasksprints.auction.domain.product.model.QProduct product; - - public final com.tasksprints.auction.domain.user.model.QUser seller; - - public final NumberPath startingBid = createNumber("startingBid", java.math.BigDecimal.class); - - public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); - - public final NumberPath viewCount = createNumber("viewCount", Long.class); - - public QAuction(String variable) { - this(Auction.class, forVariable(variable), INITS); - } - - public QAuction(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QAuction(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QAuction(PathMetadata metadata, PathInits inits) { - this(Auction.class, metadata, inits); - } - - public QAuction(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.product = inits.isInitialized("product") ? new com.tasksprints.auction.domain.product.model.QProduct(forProperty("product"), inits.get("product")) : null; - this.seller = inits.isInitialized("seller") ? new com.tasksprints.auction.domain.user.model.QUser(forProperty("seller")) : null; - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/bid/model/QBid.java b/src/main/generated/com/tasksprints/auction/domain/bid/model/QBid.java deleted file mode 100644 index ba479754..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/bid/model/QBid.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.tasksprints.auction.domain.bid.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QBid is a Querydsl query type for Bid - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBid extends EntityPathBase { - - private static final long serialVersionUID = -531916529L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QBid bid = new QBid("bid"); - - public final com.tasksprints.auction.common.entity.QBaseEntity _super = new com.tasksprints.auction.common.entity.QBaseEntity(this); - - public final NumberPath amount = createNumber("amount", java.math.BigDecimal.class); - - public final com.tasksprints.auction.domain.auction.model.QAuction auction; - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final NumberPath id = createNumber("id", Long.class); - - public final com.tasksprints.auction.domain.user.model.QUser user; - - public final StringPath uuid = createString("uuid"); - - public QBid(String variable) { - this(Bid.class, forVariable(variable), INITS); - } - - public QBid(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QBid(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QBid(PathMetadata metadata, PathInits inits) { - this(Bid.class, metadata, inits); - } - - public QBid(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.auction = inits.isInitialized("auction") ? new com.tasksprints.auction.domain.auction.model.QAuction(forProperty("auction"), inits.get("auction")) : null; - this.user = inits.isInitialized("user") ? new com.tasksprints.auction.domain.user.model.QUser(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/product/model/QProduct.java b/src/main/generated/com/tasksprints/auction/domain/product/model/QProduct.java deleted file mode 100644 index d6bc8ea6..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/product/model/QProduct.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.tasksprints.auction.domain.product.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QProduct is a Querydsl query type for Product - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QProduct extends EntityPathBase { - - private static final long serialVersionUID = -1668563853L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QProduct product = new QProduct("product"); - - public final com.tasksprints.auction.common.entity.QBaseEntity _super = new com.tasksprints.auction.common.entity.QBaseEntity(this); - - public final com.tasksprints.auction.domain.auction.model.QAuction auction; - - public final EnumPath category = createEnum("category", ProductCategory.class); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath description = createString("description"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath name = createString("name"); - - public final com.tasksprints.auction.domain.user.model.QUser owner; - - public final ListPath productImageList = this.createList("productImageList", ProductImage.class, QProductImage.class, PathInits.DIRECT2); - - public QProduct(String variable) { - this(Product.class, forVariable(variable), INITS); - } - - public QProduct(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QProduct(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QProduct(PathMetadata metadata, PathInits inits) { - this(Product.class, metadata, inits); - } - - public QProduct(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.auction = inits.isInitialized("auction") ? new com.tasksprints.auction.domain.auction.model.QAuction(forProperty("auction"), inits.get("auction")) : null; - this.owner = inits.isInitialized("owner") ? new com.tasksprints.auction.domain.user.model.QUser(forProperty("owner")) : null; - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/product/model/QProductImage.java b/src/main/generated/com/tasksprints/auction/domain/product/model/QProductImage.java deleted file mode 100644 index d39909c6..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/product/model/QProductImage.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tasksprints.auction.domain.product.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QProductImage is a Querydsl query type for ProductImage - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QProductImage extends EntityPathBase { - - private static final long serialVersionUID = 434031784L; - - public static final QProductImage productImage = new QProductImage("productImage"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath imageUrl = createString("imageUrl"); - - public QProductImage(String variable) { - super(ProductImage.class, forVariable(variable)); - } - - public QProductImage(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QProductImage(PathMetadata metadata) { - super(ProductImage.class, metadata); - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/review/model/QReview.java b/src/main/generated/com/tasksprints/auction/domain/review/model/QReview.java deleted file mode 100644 index 248565be..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/review/model/QReview.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.tasksprints.auction.domain.review.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QReview is a Querydsl query type for Review - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QReview extends EntityPathBase { - - private static final long serialVersionUID = -1171556645L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QReview review = new QReview("review"); - - public final com.tasksprints.auction.domain.auction.model.QAuction auction; - - public final StringPath content = createString("content"); - - public final NumberPath id = createNumber("id", Long.class); - - public final NumberPath rating = createNumber("rating", Integer.class); - - public final com.tasksprints.auction.domain.user.model.QUser writer; - - public QReview(String variable) { - this(Review.class, forVariable(variable), INITS); - } - - public QReview(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QReview(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QReview(PathMetadata metadata, PathInits inits) { - this(Review.class, metadata, inits); - } - - public QReview(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.auction = inits.isInitialized("auction") ? new com.tasksprints.auction.domain.auction.model.QAuction(forProperty("auction"), inits.get("auction")) : null; - this.writer = inits.isInitialized("writer") ? new com.tasksprints.auction.domain.user.model.QUser(forProperty("writer")) : null; - } - -} - diff --git a/src/main/generated/com/tasksprints/auction/domain/user/model/QUser.java b/src/main/generated/com/tasksprints/auction/domain/user/model/QUser.java deleted file mode 100644 index 1520cddd..00000000 --- a/src/main/generated/com/tasksprints/auction/domain/user/model/QUser.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.tasksprints.auction.domain.user.model; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUser is a Querydsl query type for User - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUser extends EntityPathBase { - - private static final long serialVersionUID = -738054213L; - - public static final QUser user = new QUser("user"); - - public final com.tasksprints.auction.common.entity.QBaseEntityWithUpdate _super = new com.tasksprints.auction.common.entity.QBaseEntityWithUpdate(this); - - public final ListPath auctions = this.createList("auctions", com.tasksprints.auction.domain.auction.model.Auction.class, com.tasksprints.auction.domain.auction.model.QAuction.class, PathInits.DIRECT2); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); - - public final StringPath email = createString("email"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath name = createString("name"); - - public final StringPath nickName = createString("nickName"); - - public final StringPath password = createString("password"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public QUser(String variable) { - super(User.class, forVariable(variable)); - } - - public QUser(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QUser(PathMetadata metadata) { - super(User.class, metadata); - } - -} - diff --git a/src/main/java/com/tasksprints/auction/api/wallet/WalletController.java b/src/main/java/com/tasksprints/auction/api/wallet/WalletController.java deleted file mode 100644 index 77757598..00000000 --- a/src/main/java/com/tasksprints/auction/api/wallet/WalletController.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tasksprints.auction.api.wallet; - -public class WalletController { -} diff --git a/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java b/src/main/java/com/tasksprints/auction/auction/application/resolver/SearchConditionResolver.java similarity index 89% rename from src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java rename to src/main/java/com/tasksprints/auction/auction/application/resolver/SearchConditionResolver.java index ab9dacb6..6ca52788 100644 --- a/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java +++ b/src/main/java/com/tasksprints/auction/auction/application/resolver/SearchConditionResolver.java @@ -1,9 +1,9 @@ -package com.tasksprints.auction.common.resolver; +package com.tasksprints.auction.auction.application.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 com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.product.domain.entity.ProductCategory; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/auction/application/service/AuctionService.java similarity index 76% rename from src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java rename to src/main/java/com/tasksprints/auction/auction/application/service/AuctionService.java index 69606124..3ff947a3 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/auction/application/service/AuctionService.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.auction.service; +package com.tasksprints.auction.auction.application.service; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.product.model.ProductCategory; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.dto.response.AuctionResponse; +import com.tasksprints.auction.product.domain.entity.ProductCategory; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/auction/application/service/AuctionServiceImpl.java similarity index 81% rename from src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java rename to src/main/java/com/tasksprints/auction/auction/application/service/AuctionServiceImpl.java index f14522cf..7f059082 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/auction/application/service/AuctionServiceImpl.java @@ -1,17 +1,17 @@ -package com.tasksprints.auction.domain.auction.service; - -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.auction.exception.AuctionAlreadyClosedException; -import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; -import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +package com.tasksprints.auction.auction.application.service; + +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.dto.response.AuctionResponse; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.auction.exception.AuctionAlreadyClosedException; +import com.tasksprints.auction.auction.exception.AuctionNotFoundException; +import com.tasksprints.auction.auction.exception.InvalidAuctionTimeException; +import com.tasksprints.auction.product.domain.entity.ProductCategory; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/auction/domain/dto/request/AuctionRequest.java similarity index 78% rename from src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java rename to src/main/java/com/tasksprints/auction/auction/domain/dto/request/AuctionRequest.java index 927f297e..f72a00ad 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/dto/request/AuctionRequest.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.auction.dto.request; +package com.tasksprints.auction.auction.domain.dto.request; -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 com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.product.domain.entity.ProductCategory; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionResponse.java b/src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionResponse.java similarity index 94% rename from src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionResponse.java rename to src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionResponse.java index c0ff0dd4..25254c70 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionResponse.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionResponse.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.auction.dto.response; +package com.tasksprints.auction.auction.domain.dto.response; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.product.model.ProductImage; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.product.domain.entity.ProductImage; import lombok.*; import java.math.BigDecimal; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionStatusResponse.java b/src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionStatusResponse.java similarity index 60% rename from src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionStatusResponse.java rename to src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionStatusResponse.java index ae608607..d11fd091 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/response/AuctionStatusResponse.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/dto/response/AuctionStatusResponse.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.dto.response; +package com.tasksprints.auction.auction.domain.dto.response; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java b/src/main/java/com/tasksprints/auction/auction/domain/entity/Auction.java similarity index 88% rename from src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java rename to src/main/java/com/tasksprints/auction/auction/domain/entity/Auction.java index 93607251..d9e9d694 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/entity/Auction.java @@ -1,12 +1,11 @@ -package com.tasksprints.auction.domain.auction.model; +package com.tasksprints.auction.auction.domain.entity; +import com.tasksprints.auction.bid.domain.entity.Bid; 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 com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.ColumnDefault; import java.math.BigDecimal; import java.time.LocalDateTime; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionCategory.java b/src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionCategory.java similarity index 89% rename from src/main/java/com/tasksprints/auction/domain/auction/model/AuctionCategory.java rename to src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionCategory.java index 7c362815..28189d11 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionCategory.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionCategory.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.model; +package com.tasksprints.auction.auction.domain.entity; public enum AuctionCategory { PRIVATE_FREE, diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java b/src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionStatus.java similarity index 88% rename from src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java rename to src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionStatus.java index 71355903..c9d4a5b8 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java +++ b/src/main/java/com/tasksprints/auction/auction/domain/entity/AuctionStatus.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.model; +package com.tasksprints.auction.auction.domain.entity; public enum AuctionStatus { PENDING, diff --git a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionAlreadyClosedException.java b/src/main/java/com/tasksprints/auction/auction/exception/AuctionAlreadyClosedException.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionAlreadyClosedException.java rename to src/main/java/com/tasksprints/auction/auction/exception/AuctionAlreadyClosedException.java index 33ed6523..d01fe22a 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionAlreadyClosedException.java +++ b/src/main/java/com/tasksprints/auction/auction/exception/AuctionAlreadyClosedException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.exception; +package com.tasksprints.auction.auction.exception; public class AuctionAlreadyClosedException extends RuntimeException { public AuctionAlreadyClosedException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionEndedException.java b/src/main/java/com/tasksprints/auction/auction/exception/AuctionEndedException.java similarity index 71% rename from src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionEndedException.java rename to src/main/java/com/tasksprints/auction/auction/exception/AuctionEndedException.java index e145943d..26766e96 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionEndedException.java +++ b/src/main/java/com/tasksprints/auction/auction/exception/AuctionEndedException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.exception; +package com.tasksprints.auction.auction.exception; public class AuctionEndedException extends RuntimeException { public AuctionEndedException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionNotFoundException.java b/src/main/java/com/tasksprints/auction/auction/exception/AuctionNotFoundException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionNotFoundException.java rename to src/main/java/com/tasksprints/auction/auction/exception/AuctionNotFoundException.java index e0d5f63d..08fdb375 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/exception/AuctionNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/auction/exception/AuctionNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.exception; +package com.tasksprints.auction.auction.exception; public class AuctionNotFoundException extends RuntimeException { public AuctionNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/auction/exception/InvalidAuctionTimeException.java b/src/main/java/com/tasksprints/auction/auction/exception/InvalidAuctionTimeException.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/auction/exception/InvalidAuctionTimeException.java rename to src/main/java/com/tasksprints/auction/auction/exception/InvalidAuctionTimeException.java index 34f5c3b8..b7560eba 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/exception/InvalidAuctionTimeException.java +++ b/src/main/java/com/tasksprints/auction/auction/exception/InvalidAuctionTimeException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.auction.exception; +package com.tasksprints.auction.auction.exception; public class InvalidAuctionTimeException extends RuntimeException { public InvalidAuctionTimeException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/auction/infrastructure/AuctionRepository.java similarity index 74% rename from src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java rename to src/main/java/com/tasksprints/auction/auction/infrastructure/AuctionRepository.java index 24f95a20..76f82e81 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/auction/infrastructure/AuctionRepository.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.auction.repository; +package com.tasksprints.auction.auction.infrastructure; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.infrastructure.support.AuctionCriteriaRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepository.java similarity index 60% rename from src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java rename to src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepository.java index 47fc40ee..ac3ecacb 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepository.java @@ -1,10 +1,9 @@ -package com.tasksprints.auction.domain.auction.repository.support; +package com.tasksprints.auction.auction.infrastructure.support; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.entity.Auction; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.product.model.ProductCategory; +import com.tasksprints.auction.product.domain.entity.ProductCategory; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepositoryImpl.java similarity index 85% rename from src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java rename to src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepositoryImpl.java index 4fa75f16..83128f64 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/auction/infrastructure/support/AuctionCriteriaRepositoryImpl.java @@ -1,11 +1,11 @@ -package com.tasksprints.auction.domain.auction.repository.support; +package com.tasksprints.auction.auction.infrastructure.support; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.product.model.ProductCategory; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.product.domain.entity.ProductCategory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -14,9 +14,9 @@ import java.util.List; -import static com.tasksprints.auction.domain.auction.model.QAuction.auction; -import static com.tasksprints.auction.domain.product.model.QProduct.product; -import static com.tasksprints.auction.domain.user.model.QUser.user; +import static com.tasksprints.auction.auction.domain.entity.QAuction.auction; +import static com.tasksprints.auction.product.domain.entity.QProduct.product; +import static com.tasksprints.auction.user.domain.entity.QUser.user; @RequiredArgsConstructor @Repository @@ -57,8 +57,8 @@ private List buildQueryWithPaginationAndSorting(BooleanBuilder builder, @Deprecated public Page getAuctionsByCategory(Pageable pageable, - AuctionRequest.SearchCondition condition, - ProductCategory category) { + AuctionRequest.SearchCondition condition, + ProductCategory category) { BooleanBuilder builder = buildSearchCondition(condition); filterByCategory(category, builder); diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/auction/presentation/AuctionController.java similarity index 93% rename from src/main/java/com/tasksprints/auction/api/auction/AuctionController.java rename to src/main/java/com/tasksprints/auction/auction/presentation/AuctionController.java index 48956bba..810793d6 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/auction/presentation/AuctionController.java @@ -1,14 +1,14 @@ -package com.tasksprints.auction.api.auction; +package com.tasksprints.auction.auction.presentation; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.dto.response.AuctionResponse; +import com.tasksprints.auction.auction.application.service.AuctionService; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.auction.service.AuctionService; -import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; -import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; -import com.tasksprints.auction.domain.review.service.ReviewService; +import com.tasksprints.auction.product.domain.entity.ProductCategory; +import com.tasksprints.auction.review.domain.dto.request.ReviewRequest; +import com.tasksprints.auction.review.domain.dto.response.ReviewResponse; +import com.tasksprints.auction.review.application.service.ReviewService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; diff --git a/src/main/java/com/tasksprints/auction/auth/application/AuthService.java b/src/main/java/com/tasksprints/auction/auth/application/AuthService.java new file mode 100644 index 00000000..e21a38ec --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/AuthService.java @@ -0,0 +1,11 @@ +package com.tasksprints.auction.auth.application; + +import com.tasksprints.auction.auth.domain.dto.response.ResponseTokens; + +public interface AuthService { + Long validateLogin(String email, String password); + + ResponseTokens issueResponseTokens(Long userId); + + ResponseTokens reissueResponseTokens(String refreshToken); +} diff --git a/src/main/java/com/tasksprints/auction/auth/application/AuthServiceImpl.java b/src/main/java/com/tasksprints/auction/auth/application/AuthServiceImpl.java new file mode 100644 index 00000000..5f535fd9 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/AuthServiceImpl.java @@ -0,0 +1,50 @@ +package com.tasksprints.auction.auth.application; + +import com.tasksprints.auction.common.jwt.JwtProvider; +import com.tasksprints.auction.auth.domain.dto.response.ResponseTokens; +import com.tasksprints.auction.auth.domain.dto.response.UserTokens; +import com.tasksprints.auction.auth.exception.AuthException; +import com.tasksprints.auction.user.application.service.UserService; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseCookie; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +@Transactional(readOnly = true) +public class AuthServiceImpl implements AuthService { + private final UserService userService; + private final JwtProvider jwtProvider; + private final RefreshTokenService refreshTokenService; + + @Override + public Long validateLogin(String email, String password) { + UserDetailResponse userDetail = userService.getUserDetailByEmail(email); + log.info(userDetail.toString()); + if (!password.equals(userDetail.getPassword())) { + throw new AuthException("password is not correct"); + } + return userDetail.getId(); + } + + @Transactional + @Override + public ResponseTokens issueResponseTokens(Long userId) { + UserTokens tokens = jwtProvider.generateToken(userId.toString()); + refreshTokenService.saveRefreshToken(tokens.getRefreshToken(), userId); + ResponseCookie refreshToken = refreshTokenService.getResponseRefreshToken(tokens.getRefreshToken()); + + return ResponseTokens.of(tokens.getAccessToken(), refreshToken); + } + + @Transactional + @Override + public ResponseTokens reissueResponseTokens(String refreshToken) { + Long userId = refreshTokenService.findRefreshTokenById(refreshToken).getUserId(); + return issueResponseTokens(userId); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManager.java b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManager.java new file mode 100644 index 00000000..d53a86f2 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManager.java @@ -0,0 +1,45 @@ +package com.tasksprints.auction.auth.application; + +import static com.tasksprints.auction.common.constant.ApiResponseMessages.REFRESH_TOKEN_NOT_FOUND; + +import com.tasksprints.auction.auth.exception.RefreshTokenException; +import com.tasksprints.auction.auth.infrastructure.RefreshTokenRepository; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Arrays; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseCookie; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RefreshTokenCookieManager { + private static final Integer COOKIE_AGE_SECONDS = 1209600; + private static final String COOKIE_NAME = "refresh-token"; + + private final RefreshTokenRepository refreshTokenRepository; + + public String extractRefreshToken(HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + + if (cookies == null) { + throw new RefreshTokenException(REFRESH_TOKEN_NOT_FOUND); + } + return Arrays.stream(cookies) + .filter(cookie -> cookie.getName().equals(COOKIE_NAME)) + .filter(cookie -> refreshTokenRepository.existsById(cookie.getValue())) + .findFirst() + .orElseThrow(() -> new RefreshTokenException(REFRESH_TOKEN_NOT_FOUND)) + .getValue(); + } + + public ResponseCookie createResponseCookie(String refreshToken) { + return ResponseCookie.from(COOKIE_NAME, refreshToken) + .maxAge(COOKIE_AGE_SECONDS) + .secure(true) + .httpOnly(true) + .sameSite("None") + .path("/") + .build(); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenService.java b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenService.java new file mode 100644 index 00000000..83b5f1ec --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenService.java @@ -0,0 +1,12 @@ +package com.tasksprints.auction.auth.application; + +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import org.springframework.http.ResponseCookie; + +public interface RefreshTokenService { + RefreshToken saveRefreshToken(String refreshTokenValue, Long userId); + + ResponseCookie getResponseRefreshToken(String refresh); + + RefreshToken findRefreshTokenById(String refreshToken); +} diff --git a/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImpl.java b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImpl.java new file mode 100644 index 00000000..3122bf8c --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImpl.java @@ -0,0 +1,35 @@ +package com.tasksprints.auction.auth.application; + +import com.tasksprints.auction.auth.exception.RefreshTokenException; +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import com.tasksprints.auction.auth.infrastructure.RefreshTokenRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseCookie; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Service +@Transactional(readOnly = true) +public class RefreshTokenServiceImpl implements RefreshTokenService { + private final RefreshTokenRepository refreshTokenRepository; + private final RefreshTokenCookieManager cookieManager; + + @Override + @Transactional + public RefreshToken saveRefreshToken(String refreshTokenValue, Long userId) { + RefreshToken refreshToken = RefreshToken.of(refreshTokenValue, userId); + return refreshTokenRepository.save(refreshToken); + } + + @Override + public ResponseCookie getResponseRefreshToken(String refreshToken) { + return cookieManager.createResponseCookie(refreshToken); + } + + @Override + public RefreshToken findRefreshTokenById(String refreshToken) { + return refreshTokenRepository.findById(refreshToken) + .orElseThrow(() -> new RefreshTokenException("Invalid refresh token")); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/application/resolver/AuthenticationResolver.java b/src/main/java/com/tasksprints/auction/auth/application/resolver/AuthenticationResolver.java new file mode 100644 index 00000000..efe5a249 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/application/resolver/AuthenticationResolver.java @@ -0,0 +1,54 @@ +package com.tasksprints.auction.auth.application.resolver; + +import com.tasksprints.auction.common.jwt.Auth; +import com.tasksprints.auction.common.jwt.JwtProvider; +import com.tasksprints.auction.auth.infrastructure.TokenExtractor; +import com.tasksprints.auction.auth.exception.RefreshTokenException; +import com.tasksprints.auction.auth.domain.model.Accessor; +import com.tasksprints.auction.auth.application.RefreshTokenCookieManager; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +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; + +@Component +@RequiredArgsConstructor +public class AuthenticationResolver implements HandlerMethodArgumentResolver { + private final JwtProvider jwtProvider; + private final RefreshTokenCookieManager refreshTokenCookieManager; + private final TokenExtractor accessTokenExtractor; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter + .hasParameterAnnotation(Auth.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory) { + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + + if (request == null) { + throw new IllegalArgumentException(); + } + try { + String refreshToken = refreshTokenCookieManager.extractRefreshToken(request); + String accessToken = accessTokenExtractor.extractToken(request); + + jwtProvider.validateToken(accessToken); + jwtProvider.validateToken(refreshToken); + + Long userId = Long.valueOf(jwtProvider.getSubject(refreshToken)); + return Accessor.user(userId); + } catch (RefreshTokenException e) { + return Accessor.guest(); + } + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/dto/request/LoginRequest.java b/src/main/java/com/tasksprints/auction/auth/domain/dto/request/LoginRequest.java new file mode 100644 index 00000000..6fae33c6 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/dto/request/LoginRequest.java @@ -0,0 +1,16 @@ +package com.tasksprints.auction.auth.domain.dto.request; + +import lombok.Builder; + + +public class LoginRequest { + @Builder + public record Login(String email, String password) { + public static Login of(String email, String password) { + return Login.builder() + .email(email) + .password(password) + .build(); + } + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/dto/response/AccessToken.java b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/AccessToken.java new file mode 100644 index 00000000..b5056e57 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/AccessToken.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.domain.dto.response; + +public record AccessToken(String accessToken) { + public static AccessToken of(String accessToken) { + return new AccessToken(accessToken); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/dto/response/ResponseTokens.java b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/ResponseTokens.java new file mode 100644 index 00000000..e965469c --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/ResponseTokens.java @@ -0,0 +1,14 @@ +package com.tasksprints.auction.auth.domain.dto.response; + +import lombok.Builder; +import org.springframework.http.ResponseCookie; + +@Builder +public record ResponseTokens(AccessToken accessToken, ResponseCookie refreshToken) { + public static ResponseTokens of(AccessToken accessToken, ResponseCookie refreshToken) { + return ResponseTokens.builder() + .accessToken(accessToken) + .refreshToken(refreshToken) + .build(); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/dto/response/UserTokens.java b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/UserTokens.java new file mode 100644 index 00000000..cca2653d --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/dto/response/UserTokens.java @@ -0,0 +1,18 @@ +package com.tasksprints.auction.auth.domain.dto.response; + +import lombok.*; + +@Getter +@Builder +@AllArgsConstructor +public class UserTokens { + private String refreshToken; + private AccessToken accessToken; + + public static UserTokens of(AccessToken accessToken, String refreshToken) { + return UserTokens.builder() + .accessToken(accessToken) + .refreshToken(refreshToken) + .build(); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/model/Accessor.java b/src/main/java/com/tasksprints/auction/auth/domain/model/Accessor.java new file mode 100644 index 00000000..4e54c4d3 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/model/Accessor.java @@ -0,0 +1,32 @@ +package com.tasksprints.auction.auth.domain.model; + +import lombok.Builder; + +@Builder +public record Accessor(Long userId, Role role) { + + private static final Long GUEST_USER_ID = 0L; + + public static Accessor guest() { + return Accessor.of(GUEST_USER_ID, Role.GUEST); + } + + public static Accessor user(Long userId) { + return Accessor.of(userId, Role.USER); + } + + public static Accessor admin(Long userId) { + return Accessor.of(userId, Role.ADMIN); + } + + public boolean isUser() { + return Role.USER.equals(role); + } + + private static Accessor of(Long userId, Role role) { + return Accessor.builder() + .userId(userId) + .role(role) + .build(); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/model/RefreshToken.java b/src/main/java/com/tasksprints/auction/auth/domain/model/RefreshToken.java new file mode 100644 index 00000000..77c126ad --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/model/RefreshToken.java @@ -0,0 +1,30 @@ +package com.tasksprints.auction.auth.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class RefreshToken { + @Id + private String id; + + @Column + private Long userId; + + public static RefreshToken of(String id, Long userId) { + return RefreshToken.builder() + .id(id) + .userId(userId) + .build(); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/domain/model/Role.java b/src/main/java/com/tasksprints/auction/auth/domain/model/Role.java new file mode 100644 index 00000000..8237f9ae --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/domain/model/Role.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.domain.model; + +public enum Role { + USER, + ADMIN, + GUEST +} diff --git a/src/main/java/com/tasksprints/auction/auth/exception/AccessTokenException.java b/src/main/java/com/tasksprints/auction/auth/exception/AccessTokenException.java new file mode 100644 index 00000000..d466843f --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/exception/AccessTokenException.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.exception; + +public class AccessTokenException extends AuthException { + public AccessTokenException(String message) { + super(message); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/exception/AuthException.java b/src/main/java/com/tasksprints/auction/auth/exception/AuthException.java new file mode 100644 index 00000000..c3823c26 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/exception/AuthException.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.exception; + +public class AuthException extends RuntimeException { + public AuthException(String message) { + super(message); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/exception/RefreshTokenException.java b/src/main/java/com/tasksprints/auction/auth/exception/RefreshTokenException.java new file mode 100644 index 00000000..d06fc1fc --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/exception/RefreshTokenException.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.exception; + +public class RefreshTokenException extends AuthException { + public RefreshTokenException(String message) { + super(message); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/infrastructure/AccessTokenExtractor.java b/src/main/java/com/tasksprints/auction/auth/infrastructure/AccessTokenExtractor.java new file mode 100644 index 00000000..0c007d3a --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/infrastructure/AccessTokenExtractor.java @@ -0,0 +1,23 @@ +package com.tasksprints.auction.auth.infrastructure; + +import static com.tasksprints.auction.common.constant.ApiResponseMessages.ACCESS_TOKEN_NOT_FOUND; + +import com.tasksprints.auction.auth.exception.AccessTokenException; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component +@Qualifier("accessTokenExtractor") +public class AccessTokenExtractor implements TokenExtractor { + private static final String TYPE = "Bearer "; + private static final String HEADER = "Authorization"; + + public String extractToken(HttpServletRequest request) { + String header = request.getHeader(HEADER); + if(header != null && header.startsWith(TYPE)) { + return header.substring(TYPE.length()); + } + throw new AccessTokenException(ACCESS_TOKEN_NOT_FOUND); + } +} diff --git a/src/main/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepository.java b/src/main/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepository.java new file mode 100644 index 00000000..e33d14f5 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepository.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.infrastructure; + +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RefreshTokenRepository extends JpaRepository { +} diff --git a/src/main/java/com/tasksprints/auction/auth/infrastructure/TokenExtractor.java b/src/main/java/com/tasksprints/auction/auth/infrastructure/TokenExtractor.java new file mode 100644 index 00000000..1f32952f --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/infrastructure/TokenExtractor.java @@ -0,0 +1,7 @@ +package com.tasksprints.auction.auth.infrastructure; + +import jakarta.servlet.http.HttpServletRequest; + +public interface TokenExtractor { + String extractToken(HttpServletRequest request); +} diff --git a/src/main/java/com/tasksprints/auction/auth/presentation/AuthController.java b/src/main/java/com/tasksprints/auction/auth/presentation/AuthController.java new file mode 100644 index 00000000..425a3b4e --- /dev/null +++ b/src/main/java/com/tasksprints/auction/auth/presentation/AuthController.java @@ -0,0 +1,44 @@ +package com.tasksprints.auction.auth.presentation; + +import static org.springframework.http.HttpHeaders.SET_COOKIE; + +import com.tasksprints.auction.common.constant.ApiResponseMessages; +import com.tasksprints.auction.common.response.ApiResult; +import com.tasksprints.auction.auth.domain.dto.request.LoginRequest; +import com.tasksprints.auction.auth.domain.dto.response.AccessToken; +import com.tasksprints.auction.auth.domain.dto.response.ResponseTokens; +import com.tasksprints.auction.auth.application.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequiredArgsConstructor +@RequestMapping("/api/v1/auth") +public class AuthController { + private final AuthService authService; + + @PostMapping("/login") + public ResponseEntity> login(@RequestBody LoginRequest.Login login) { + Long userId = authService.validateLogin(login.email(), login.password()); + ResponseTokens responseTokens = authService.issueResponseTokens(userId); + + return ResponseEntity.ok() + .header(SET_COOKIE, responseTokens.refreshToken().toString()) + .body(ApiResult.success(ApiResponseMessages.LOGIN_SUCCESS, responseTokens.accessToken())); + } + + @GetMapping("/reissue") + public ResponseEntity> reissueTokens(@CookieValue("refresh-token") String refreshToken) { + ResponseTokens responseTokens = authService.reissueResponseTokens(refreshToken); + + return ResponseEntity.ok() + .header(SET_COOKIE, responseTokens.refreshToken().toString()) + .body(ApiResult.success(ApiResponseMessages.LOGIN_SUCCESS, responseTokens.accessToken())); + } +} diff --git a/src/main/java/com/tasksprints/auction/domain/bid/service/BidService.java b/src/main/java/com/tasksprints/auction/bid/application/service/BidService.java similarity index 77% rename from src/main/java/com/tasksprints/auction/domain/bid/service/BidService.java rename to src/main/java/com/tasksprints/auction/bid/application/service/BidService.java index b47e0e0f..7ef99a30 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/service/BidService.java +++ b/src/main/java/com/tasksprints/auction/bid/application/service/BidService.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.bid.service; +package com.tasksprints.auction.bid.application.service; -import com.tasksprints.auction.domain.bid.dto.BidResponse; +import com.tasksprints.auction.bid.domain.dto.BidResponse; import java.math.BigDecimal; diff --git a/src/main/java/com/tasksprints/auction/domain/bid/service/BidServiceImpl.java b/src/main/java/com/tasksprints/auction/bid/application/service/BidServiceImpl.java similarity index 79% rename from src/main/java/com/tasksprints/auction/domain/bid/service/BidServiceImpl.java rename to src/main/java/com/tasksprints/auction/bid/application/service/BidServiceImpl.java index 17e77e55..8a3906c3 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/service/BidServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/bid/application/service/BidServiceImpl.java @@ -1,17 +1,18 @@ -package com.tasksprints.auction.domain.bid.service; - -import com.tasksprints.auction.domain.auction.exception.AuctionEndedException; -import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.bid.dto.BidResponse; -import com.tasksprints.auction.domain.bid.exception.BidNotFoundException; -import com.tasksprints.auction.domain.bid.exception.InvalidBidAmountException; -import com.tasksprints.auction.domain.bid.model.Bid; -import com.tasksprints.auction.domain.bid.repository.BidRepository; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +package com.tasksprints.auction.bid.application.service; + +import com.tasksprints.auction.bid.application.service.BidService; +import com.tasksprints.auction.bid.exception.BidNotFoundException; +import com.tasksprints.auction.bid.exception.InvalidBidAmountException; +import com.tasksprints.auction.bid.domain.entity.Bid; +import com.tasksprints.auction.bid.infrastructure.BidRepository; +import com.tasksprints.auction.auction.exception.AuctionEndedException; +import com.tasksprints.auction.auction.exception.AuctionNotFoundException; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.bid.domain.dto.BidResponse; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/tasksprints/auction/domain/bid/dto/BidRequest.java b/src/main/java/com/tasksprints/auction/bid/domain/dto/BidRequest.java similarity index 80% rename from src/main/java/com/tasksprints/auction/domain/bid/dto/BidRequest.java rename to src/main/java/com/tasksprints/auction/bid/domain/dto/BidRequest.java index 284a7ba3..474fa65a 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/dto/BidRequest.java +++ b/src/main/java/com/tasksprints/auction/bid/domain/dto/BidRequest.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.bid.dto; +package com.tasksprints.auction.bid.domain.dto; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/bid/dto/BidResponse.java b/src/main/java/com/tasksprints/auction/bid/domain/dto/BidResponse.java similarity index 86% rename from src/main/java/com/tasksprints/auction/domain/bid/dto/BidResponse.java rename to src/main/java/com/tasksprints/auction/bid/domain/dto/BidResponse.java index ff75f9e1..56b12302 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/dto/BidResponse.java +++ b/src/main/java/com/tasksprints/auction/bid/domain/dto/BidResponse.java @@ -1,6 +1,5 @@ -package com.tasksprints.auction.domain.bid.dto; - -import com.tasksprints.auction.domain.bid.model.Bid; +package com.tasksprints.auction.bid.domain.dto; +import com.tasksprints.auction.bid.domain.entity.Bid; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/bid/model/Bid.java b/src/main/java/com/tasksprints/auction/bid/domain/entity/Bid.java similarity index 90% rename from src/main/java/com/tasksprints/auction/domain/bid/model/Bid.java rename to src/main/java/com/tasksprints/auction/bid/domain/entity/Bid.java index 8df974cd..e011318e 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/model/Bid.java +++ b/src/main/java/com/tasksprints/auction/bid/domain/entity/Bid.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.bid.model; +package com.tasksprints.auction.bid.domain.entity; import com.tasksprints.auction.common.entity.BaseEntity; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -10,7 +10,6 @@ import lombok.NoArgsConstructor; import java.math.BigDecimal; -import java.util.UUID; @Entity(name = "bids") @AllArgsConstructor diff --git a/src/main/java/com/tasksprints/auction/domain/bid/exception/BidNotFoundException.java b/src/main/java/com/tasksprints/auction/bid/exception/BidNotFoundException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/bid/exception/BidNotFoundException.java rename to src/main/java/com/tasksprints/auction/bid/exception/BidNotFoundException.java index 79067b6a..159c8fa4 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/exception/BidNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/bid/exception/BidNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.bid.exception; +package com.tasksprints.auction.bid.exception; public class BidNotFoundException extends RuntimeException { public BidNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/bid/exception/InvalidBidAmountException.java b/src/main/java/com/tasksprints/auction/bid/exception/InvalidBidAmountException.java similarity index 74% rename from src/main/java/com/tasksprints/auction/domain/bid/exception/InvalidBidAmountException.java rename to src/main/java/com/tasksprints/auction/bid/exception/InvalidBidAmountException.java index 148a73bf..7d52fddf 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/exception/InvalidBidAmountException.java +++ b/src/main/java/com/tasksprints/auction/bid/exception/InvalidBidAmountException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.bid.exception; +package com.tasksprints.auction.bid.exception; public class InvalidBidAmountException extends RuntimeException { public InvalidBidAmountException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/bid/repository/BidRepository.java b/src/main/java/com/tasksprints/auction/bid/infrastructure/BidRepository.java similarity index 85% rename from src/main/java/com/tasksprints/auction/domain/bid/repository/BidRepository.java rename to src/main/java/com/tasksprints/auction/bid/infrastructure/BidRepository.java index 6fbd03ab..9064cd86 100644 --- a/src/main/java/com/tasksprints/auction/domain/bid/repository/BidRepository.java +++ b/src/main/java/com/tasksprints/auction/bid/infrastructure/BidRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.bid.repository; +package com.tasksprints.auction.bid.infrastructure; -import com.tasksprints.auction.domain.bid.model.Bid; +import com.tasksprints.auction.bid.domain.entity.Bid; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/tasksprints/auction/api/bid/BidController.java b/src/main/java/com/tasksprints/auction/bid/presentation/BidController.java similarity index 89% rename from src/main/java/com/tasksprints/auction/api/bid/BidController.java rename to src/main/java/com/tasksprints/auction/bid/presentation/BidController.java index 3e1d486d..ad7babaf 100644 --- a/src/main/java/com/tasksprints/auction/api/bid/BidController.java +++ b/src/main/java/com/tasksprints/auction/bid/presentation/BidController.java @@ -1,15 +1,15 @@ -package com.tasksprints.auction.api.bid; +package com.tasksprints.auction.bid.presentation; +import com.tasksprints.auction.bid.domain.dto.BidRequest; +import com.tasksprints.auction.bid.domain.dto.BidResponse; +import com.tasksprints.auction.bid.application.service.BidService; +import com.tasksprints.auction.chat.application.service.ChatService; +import com.tasksprints.auction.chat.domain.dto.AddChatRoomDto; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.bid.dto.BidRequest; -import com.tasksprints.auction.domain.bid.dto.BidResponse; -import com.tasksprints.auction.domain.bid.service.BidService; -import com.tasksprints.auction.domain.chat.dto.AddChatRoomDto; -import com.tasksprints.auction.domain.chat.service.ChatService; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.service.UserService; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.application.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/service/ChatService.java b/src/main/java/com/tasksprints/auction/chat/application/service/ChatService.java similarity index 53% rename from src/main/java/com/tasksprints/auction/domain/chat/service/ChatService.java rename to src/main/java/com/tasksprints/auction/chat/application/service/ChatService.java index 83ff438d..b9e7cff3 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/service/ChatService.java +++ b/src/main/java/com/tasksprints/auction/chat/application/service/ChatService.java @@ -1,8 +1,10 @@ -package com.tasksprints.auction.domain.chat.service; +package com.tasksprints.auction.chat.application.service; + + +import com.tasksprints.auction.chat.domain.dto.AddChatRoomDto; +import com.tasksprints.auction.chat.domain.model.ChatRoom; +import com.tasksprints.auction.user.domain.entity.User; -import com.tasksprints.auction.domain.chat.dto.AddChatRoomDto; -import com.tasksprints.auction.domain.chat.model.ChatRoom; -import com.tasksprints.auction.domain.user.model.User; import java.util.List; public interface ChatService { diff --git a/src/main/java/com/tasksprints/auction/domain/chat/service/ChatServiceImpl.java b/src/main/java/com/tasksprints/auction/chat/application/service/ChatServiceImpl.java similarity index 79% rename from src/main/java/com/tasksprints/auction/domain/chat/service/ChatServiceImpl.java rename to src/main/java/com/tasksprints/auction/chat/application/service/ChatServiceImpl.java index e84eb50b..f754cbcc 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/service/ChatServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/chat/application/service/ChatServiceImpl.java @@ -1,10 +1,10 @@ -package com.tasksprints.auction.domain.chat.service; +package com.tasksprints.auction.chat.application.service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.domain.chat.dto.AddChatRoomDto; -import com.tasksprints.auction.domain.chat.model.ChatRoom; -import com.tasksprints.auction.domain.chat.repository.ChatRoomRepository; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.chat.domain.dto.AddChatRoomDto; +import com.tasksprints.auction.chat.domain.model.ChatRoom; +import com.tasksprints.auction.chat.infrastructure.ChatRoomRepository; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.annotation.PostConstruct; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -18,7 +18,7 @@ @Slf4j @RequiredArgsConstructor @Service -public class ChatServiceImpl implements ChatService{ +public class ChatServiceImpl implements ChatService { private final ObjectMapper mapper; private ConcurrentHashMap chatRoomMap; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/dto/AddChatRoomDto.java b/src/main/java/com/tasksprints/auction/chat/domain/dto/AddChatRoomDto.java similarity index 64% rename from src/main/java/com/tasksprints/auction/domain/chat/dto/AddChatRoomDto.java rename to src/main/java/com/tasksprints/auction/chat/domain/dto/AddChatRoomDto.java index 3eb6fd9a..0faac74b 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/dto/AddChatRoomDto.java +++ b/src/main/java/com/tasksprints/auction/chat/domain/dto/AddChatRoomDto.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.chat.dto; +package com.tasksprints.auction.chat.domain.dto; -import com.tasksprints.auction.domain.chat.model.ChatRoom; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.chat.domain.model.ChatRoom; +import com.tasksprints.auction.user.domain.entity.User; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/dto/MessageDto.java b/src/main/java/com/tasksprints/auction/chat/domain/dto/MessageDto.java similarity index 89% rename from src/main/java/com/tasksprints/auction/domain/chat/dto/MessageDto.java rename to src/main/java/com/tasksprints/auction/chat/domain/dto/MessageDto.java index 34444193..b0749e5e 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/dto/MessageDto.java +++ b/src/main/java/com/tasksprints/auction/chat/domain/dto/MessageDto.java @@ -1,4 +1,5 @@ -package com.tasksprints.auction.domain.chat.dto; +package com.tasksprints.auction.chat.domain.dto; + import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/dto/WhisperDto.java b/src/main/java/com/tasksprints/auction/chat/domain/dto/WhisperDto.java similarity index 87% rename from src/main/java/com/tasksprints/auction/domain/chat/dto/WhisperDto.java rename to src/main/java/com/tasksprints/auction/chat/domain/dto/WhisperDto.java index f7d3a336..5a2fee36 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/dto/WhisperDto.java +++ b/src/main/java/com/tasksprints/auction/chat/domain/dto/WhisperDto.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.chat.dto; +package com.tasksprints.auction.chat.domain.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/model/ChatRoom.java b/src/main/java/com/tasksprints/auction/chat/domain/model/ChatRoom.java similarity index 90% rename from src/main/java/com/tasksprints/auction/domain/chat/model/ChatRoom.java rename to src/main/java/com/tasksprints/auction/chat/domain/model/ChatRoom.java index a1606cb7..273eeaa1 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/model/ChatRoom.java +++ b/src/main/java/com/tasksprints/auction/chat/domain/model/ChatRoom.java @@ -1,6 +1,5 @@ -package com.tasksprints.auction.domain.chat.model; - -import com.tasksprints.auction.domain.user.model.User; +package com.tasksprints.auction.chat.domain.model; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; diff --git a/src/main/java/com/tasksprints/auction/domain/chat/repository/ChatRoomRepository.java b/src/main/java/com/tasksprints/auction/chat/infrastructure/ChatRoomRepository.java similarity index 63% rename from src/main/java/com/tasksprints/auction/domain/chat/repository/ChatRoomRepository.java rename to src/main/java/com/tasksprints/auction/chat/infrastructure/ChatRoomRepository.java index cf891bc9..333a94c6 100644 --- a/src/main/java/com/tasksprints/auction/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/tasksprints/auction/chat/infrastructure/ChatRoomRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.chat.repository; +package com.tasksprints.auction.chat.infrastructure; -import com.tasksprints.auction.domain.chat.model.ChatRoom; +import com.tasksprints.auction.chat.domain.model.ChatRoom; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/tasksprints/auction/api/chat/ChatController.java b/src/main/java/com/tasksprints/auction/chat/presentation/ChatController.java similarity index 80% rename from src/main/java/com/tasksprints/auction/api/chat/ChatController.java rename to src/main/java/com/tasksprints/auction/chat/presentation/ChatController.java index 33258582..b68bc3b5 100644 --- a/src/main/java/com/tasksprints/auction/api/chat/ChatController.java +++ b/src/main/java/com/tasksprints/auction/chat/presentation/ChatController.java @@ -1,10 +1,8 @@ -package com.tasksprints.auction.api.chat; - -import com.tasksprints.auction.domain.chat.dto.MessageDto; -import com.tasksprints.auction.domain.chat.dto.MessageDto.MessageType; -import com.tasksprints.auction.domain.chat.dto.WhisperDto; -import com.tasksprints.auction.domain.chat.service.ChatService; -import com.tasksprints.auction.domain.user.service.UserService; +package com.tasksprints.auction.chat.presentation; +import com.tasksprints.auction.chat.application.service.ChatService; +import com.tasksprints.auction.chat.domain.dto.MessageDto; +import com.tasksprints.auction.chat.domain.dto.WhisperDto; +import com.tasksprints.auction.user.application.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessageSendingOperations; @@ -25,10 +23,10 @@ public void message(MessageDto messageDto) { } //메시지 전송자가 경매자라면 메시지 전송 금지 String sender = userService.getUserDetailsById(messageDto.getSender()).getNickName(); - if (MessageType.ENTER.equals(messageDto.getType())) { + if (MessageDto.MessageType.ENTER.equals(messageDto.getType())) { messageDto.setMessage(sender + "님이 입장하셨습니다."); } - if (MessageType.LEAVE.equals(messageDto.getType())) { + if (MessageDto.MessageType.LEAVE.equals(messageDto.getType())) { messageDto.setMessage(sender + "님이 퇴장하셨습니다."); } simpMessageSendingOperations.convertAndSend("/topic/chat/room/" + messageDto.getRoomId(), messageDto); diff --git a/src/main/java/com/tasksprints/auction/api/chat/ChatRoomController.java b/src/main/java/com/tasksprints/auction/chat/presentation/ChatRoomController.java similarity index 82% rename from src/main/java/com/tasksprints/auction/api/chat/ChatRoomController.java rename to src/main/java/com/tasksprints/auction/chat/presentation/ChatRoomController.java index 0408f2ac..893d7f9e 100644 --- a/src/main/java/com/tasksprints/auction/api/chat/ChatRoomController.java +++ b/src/main/java/com/tasksprints/auction/chat/presentation/ChatRoomController.java @@ -1,7 +1,6 @@ -package com.tasksprints.auction.api.chat; - -import com.tasksprints.auction.domain.chat.model.ChatRoom; -import com.tasksprints.auction.domain.chat.service.ChatService; +package com.tasksprints.auction.chat.presentation; +import com.tasksprints.auction.chat.application.service.ChatService; +import com.tasksprints.auction.chat.domain.model.ChatRoom; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/tasksprints/auction/common/config/JwtConfig.java b/src/main/java/com/tasksprints/auction/common/config/JwtConfig.java new file mode 100644 index 00000000..f272e578 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/config/JwtConfig.java @@ -0,0 +1,24 @@ +package com.tasksprints.auction.common.config; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +@Getter +@RequiredArgsConstructor +public class JwtConfig { + + @Value("${jwt.expire-ms}") + private final Long accessExpireMs; + + @Value("${jwt.expire-ms}") + private final Long refreshExpireMs; + + @Value("${jwt.issuer}") + private final String issuer; + + @Value("${jwt.secret}") + private final String secretKey; +} diff --git a/src/main/java/com/tasksprints/auction/common/config/WebConfig.java b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java index 0f7bb22a..41c255ec 100644 --- a/src/main/java/com/tasksprints/auction/common/config/WebConfig.java +++ b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java @@ -1,7 +1,7 @@ package com.tasksprints.auction.common.config; -import com.tasksprints.auction.common.resolver.SearchConditionResolver; -import lombok.RequiredArgsConstructor; +import com.tasksprints.auction.auction.application.resolver.SearchConditionResolver; +import com.tasksprints.auction.auth.application.resolver.AuthenticationResolver; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.CorsRegistry; @@ -12,14 +12,17 @@ @Configuration public class WebConfig implements WebMvcConfigurer { private final SearchConditionResolver searchConditionResolver; + private final AuthenticationResolver authenticationResolver; - public WebConfig(SearchConditionResolver searchConditionResolver) { + public WebConfig(SearchConditionResolver searchConditionResolver, AuthenticationResolver authenticationResolver) { this.searchConditionResolver = searchConditionResolver; + this.authenticationResolver = authenticationResolver; } @Override public void addArgumentResolvers(List resolvers) { resolvers.add(searchConditionResolver); + resolvers.add(authenticationResolver); } @Override diff --git a/src/main/java/com/tasksprints/auction/common/constant/ApiResponseMessages.java b/src/main/java/com/tasksprints/auction/common/constant/ApiResponseMessages.java index 9804ce3d..00aa3e75 100644 --- a/src/main/java/com/tasksprints/auction/common/constant/ApiResponseMessages.java +++ b/src/main/java/com/tasksprints/auction/common/constant/ApiResponseMessages.java @@ -30,6 +30,11 @@ public class ApiResponseMessages { public static final String REVIEWS_RETRIEVED = "Reviews successfully retrieved"; public static final String REVIEW_RETRIEVED = "Review successfully retrieved"; + // AUTH + public static final String ACCESS_TOKEN_NOT_FOUND = "Access token Not found"; + public static final String REFRESH_TOKEN_NOT_FOUND = "Refresh token not found"; + public static final String LOGIN_SUCCESS = "Login Success"; + // Additional messages can be defined as needed // PAYMENT diff --git a/src/main/java/com/tasksprints/auction/common/handler/GlobalExceptionHandler.java b/src/main/java/com/tasksprints/auction/common/handler/GlobalExceptionHandler.java index 670739c3..e569c4aa 100644 --- a/src/main/java/com/tasksprints/auction/common/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/tasksprints/auction/common/handler/GlobalExceptionHandler.java @@ -1,17 +1,18 @@ package com.tasksprints.auction.common.handler; +import com.tasksprints.auction.auction.exception.AuctionAlreadyClosedException; +import com.tasksprints.auction.auction.exception.AuctionEndedException; +import com.tasksprints.auction.auction.exception.AuctionNotFoundException; +import com.tasksprints.auction.auction.exception.InvalidAuctionTimeException; +import com.tasksprints.auction.bid.exception.BidNotFoundException; +import com.tasksprints.auction.bid.exception.InvalidBidAmountException; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.auction.exception.AuctionAlreadyClosedException; -import com.tasksprints.auction.domain.auction.exception.AuctionEndedException; -import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; -import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; -import com.tasksprints.auction.domain.bid.exception.BidNotFoundException; -import com.tasksprints.auction.domain.bid.exception.InvalidBidAmountException; -import com.tasksprints.auction.domain.payment.exception.InvalidSessionException; -import com.tasksprints.auction.domain.payment.exception.PaymentDataMismatchException; -import com.tasksprints.auction.domain.product.exception.ProductNotFoundException; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; +import com.tasksprints.auction.auth.exception.AuthException; +import com.tasksprints.auction.payment.exception.InvalidSessionException; +import com.tasksprints.auction.payment.exception.PaymentDataMismatchException; +import com.tasksprints.auction.product.exception.ProductNotFoundException; +import com.tasksprints.auction.user.exception.UserNotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -89,4 +90,9 @@ public ResponseEntity> handleIllegalStateException(IllegalStat public ResponseEntity> handleRuntimeException(RuntimeException ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResult.failure(ex.getMessage())); } + + @ExceptionHandler(AuthException.class) + public ResponseEntity> handleAuthException(AuthException ex) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResult.failure(ApiResponseMessages.USER_NOT_FOUND)); + } } diff --git a/src/main/java/com/tasksprints/auction/common/initializer/AuctionInitializer.java b/src/main/java/com/tasksprints/auction/common/initializer/AuctionInitializer.java index e77b2094..770eb9c1 100644 --- a/src/main/java/com/tasksprints/auction/common/initializer/AuctionInitializer.java +++ b/src/main/java/com/tasksprints/auction/common/initializer/AuctionInitializer.java @@ -1,19 +1,18 @@ package com.tasksprints.auction.common.initializer; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductImage; -import com.tasksprints.auction.domain.product.repository.ProductImageRepository; -import com.tasksprints.auction.domain.product.repository.ProductRepository; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductImage; +import com.tasksprints.auction.product.infrastructure.ProductImageRepository; +import com.tasksprints.auction.product.infrastructure.ProductRepository; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import jakarta.transaction.Transactional; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; -import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.math.BigDecimal; diff --git a/src/main/java/com/tasksprints/auction/common/jwt/Auth.java b/src/main/java/com/tasksprints/auction/common/jwt/Auth.java new file mode 100644 index 00000000..2061c8ab --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/jwt/Auth.java @@ -0,0 +1,11 @@ +package com.tasksprints.auction.common.jwt; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface Auth { +} diff --git a/src/main/java/com/tasksprints/auction/common/jwt/JwtProperties.java b/src/main/java/com/tasksprints/auction/common/jwt/JwtProperties.java deleted file mode 100644 index e87ce1d1..00000000 --- a/src/main/java/com/tasksprints/auction/common/jwt/JwtProperties.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tasksprints.auction.common.jwt; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component -@Getter -public class JwtProperties { - @Value("${jwt.header}") - private String header; - - @Value("${jwt.prefix}") - private String prefix; - - @Value("${jwt.expire-ms}") - private Long expireMs; - - @Value("${jwt.expire-ms}") - private Long refreshExpireMs; - - @Value("${jwt.issuer}") - private String issuer; - - @Value("${jwt.secret}") - private String secretKey; -} diff --git a/src/main/java/com/tasksprints/auction/common/jwt/JwtProvider.java b/src/main/java/com/tasksprints/auction/common/jwt/JwtProvider.java index 033e8ead..971dcefe 100644 --- a/src/main/java/com/tasksprints/auction/common/jwt/JwtProvider.java +++ b/src/main/java/com/tasksprints/auction/common/jwt/JwtProvider.java @@ -2,8 +2,12 @@ import static com.tasksprints.auction.common.util.TimeUtil.*; -import com.tasksprints.auction.common.jwt.dto.response.JwtResponse; +import com.tasksprints.auction.common.config.JwtConfig; +import com.tasksprints.auction.auth.domain.dto.response.AccessToken; +import com.tasksprints.auction.auth.domain.dto.response.UserTokens; import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Header; +import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.time.Clock; @@ -16,44 +20,51 @@ @Component @RequiredArgsConstructor public class JwtProvider { - - private final JwtProperties jwtProperties; + private static final String EMPTY_SUBJECT = ""; + private final JwtConfig jwtConfig; private final Clock clock; - public JwtResponse generateToken(Long userId, String userRole) { - return JwtResponse.of(createAccessToken(userId, userRole), createRefreshToken()); - } + public UserTokens generateToken(String subject) { + String accessTokenValue = createToken(subject, jwtConfig.getAccessExpireMs()); + AccessToken accessToken = AccessToken.of(accessTokenValue); - public String createAccessToken(Long userId, String userRole) { + String refreshToken = createToken(EMPTY_SUBJECT, jwtConfig.getRefreshExpireMs()); - Date now = localDateTimeToDate(LocalDateTime.now(clock)); - - return Jwts.builder().setIssuer(jwtProperties.getIssuer()).claim("userId", userId).claim("userRole", userRole) - .setIssuedAt(now).setExpiration(new Date(now.getTime() + jwtProperties.getExpireMs())) - .signWith(SignatureAlgorithm.HS256, JwtUtil.encodeSecretKey(jwtProperties.getSecretKey())).compact(); + return UserTokens.of( + accessToken, + refreshToken + ); } - public String createRefreshToken() { - + private String createToken(String subject, Long expiredMs) { + byte[] secretKey = JwtUtil.encodeSecretKey(jwtConfig.getSecretKey()); Date now = localDateTimeToDate(LocalDateTime.now(clock)); - - return Jwts.builder().setIssuer(jwtProperties.getIssuer()).setIssuedAt(now) - .setExpiration(new Date(now.getTime() + jwtProperties.getRefreshExpireMs())) - .signWith(SignatureAlgorithm.HS256, JwtUtil.encodeSecretKey(jwtProperties.getSecretKey())).compact(); + Date expirationTime = new Date(now.getTime() + expiredMs); + + return Jwts.builder() + .setHeaderParam(Header.TYPE, Header.JWT_TYPE) + .setIssuer(jwtConfig.getIssuer()) + .setSubject(subject) + .setIssuedAt(now) + .setExpiration(expirationTime) + .signWith(SignatureAlgorithm.HS256, secretKey) + .compact(); } - public boolean verifyToken(String token) { - - Date now = localDateTimeToDate(LocalDateTime.now(clock)); - - Claims claims = getClaims(token); + public void validateToken(String token) { + parseToken(token); + } - return !claims.getExpiration().before(now); + public String getSubject(String token) { + return parseToken(token) + .getBody() + .getSubject(); } - public Claims getClaims(String token) { - return Jwts.parser().setSigningKey(JwtUtil.encodeSecretKey(jwtProperties.getSecretKey())) - .parseClaimsJws(token) - .getBody(); + private Jws parseToken(String token) { + byte[] secretKey = JwtUtil.encodeSecretKey(jwtConfig.getSecretKey()); + return Jwts.parser() + .setSigningKey(secretKey) + .parseClaimsJws(token); } } diff --git a/src/main/java/com/tasksprints/auction/common/jwt/UserCheck.java b/src/main/java/com/tasksprints/auction/common/jwt/UserCheck.java new file mode 100644 index 00000000..1265e8e1 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/jwt/UserCheck.java @@ -0,0 +1,25 @@ +package com.tasksprints.auction.common.jwt; + +import com.tasksprints.auction.auth.exception.AuthException; +import com.tasksprints.auction.auth.domain.model.Accessor; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class UserCheck { + @Before("@annotation(UserOnly)") + public void userCheck(JoinPoint joinPoint) { + Object[] args = joinPoint.getArgs(); + + for (Object arg : args) { + if (arg instanceof Accessor accessor) { + if (!accessor.isUser()) { + throw new AuthException("Invalid Access"); + } + } + } + } +} diff --git a/src/main/java/com/tasksprints/auction/common/jwt/UserOnly.java b/src/main/java/com/tasksprints/auction/common/jwt/UserOnly.java new file mode 100644 index 00000000..bc794653 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/jwt/UserOnly.java @@ -0,0 +1,11 @@ +package com.tasksprints.auction.common.jwt; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserOnly { +} diff --git a/src/main/java/com/tasksprints/auction/common/jwt/dto/response/JwtResponse.java b/src/main/java/com/tasksprints/auction/common/jwt/dto/response/JwtResponse.java deleted file mode 100644 index 1d209eca..00000000 --- a/src/main/java/com/tasksprints/auction/common/jwt/dto/response/JwtResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tasksprints.auction.common.jwt.dto.response; - -import lombok.*; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class JwtResponse { - private String refreshToken; - private String accessToken; - - public static JwtResponse of(String accessToken, String refreshToken) { - return JwtResponse.builder() - .accessToken(accessToken) - .refreshToken(refreshToken) - .build(); - } -} diff --git a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserResponse.java b/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserResponse.java deleted file mode 100644 index 1d4f1082..00000000 --- a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tasksprints.auction.domain.user.dto.response; - -public class UserResponse { -} diff --git a/src/main/java/com/tasksprints/auction/domain/user/repository/UserRepository.java b/src/main/java/com/tasksprints/auction/domain/user/repository/UserRepository.java deleted file mode 100644 index 007cf110..00000000 --- a/src/main/java/com/tasksprints/auction/domain/user/repository/UserRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tasksprints.auction.domain.user.repository; - -import com.tasksprints.auction.domain.user.model.User; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserRepository extends JpaRepository { -} diff --git a/src/main/java/com/tasksprints/auction/domain/payment/api/Response.java b/src/main/java/com/tasksprints/auction/payment/api/Response.java similarity index 91% rename from src/main/java/com/tasksprints/auction/domain/payment/api/Response.java rename to src/main/java/com/tasksprints/auction/payment/api/Response.java index 41482d29..ef8e1db7 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/api/Response.java +++ b/src/main/java/com/tasksprints/auction/payment/api/Response.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.api; +package com.tasksprints.auction.payment.api; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/service/PaymentService.java b/src/main/java/com/tasksprints/auction/payment/application/service/PaymentService.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/payment/service/PaymentService.java rename to src/main/java/com/tasksprints/auction/payment/application/service/PaymentService.java index fc9f65ca..fe2c6e70 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/service/PaymentService.java +++ b/src/main/java/com/tasksprints/auction/payment/application/service/PaymentService.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.payment.service; +package com.tasksprints.auction.payment.application.service; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; import jakarta.servlet.http.HttpSession; import java.io.IOException; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImpl.java b/src/main/java/com/tasksprints/auction/payment/application/service/PaymentServiceImpl.java similarity index 79% rename from src/main/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImpl.java rename to src/main/java/com/tasksprints/auction/payment/application/service/PaymentServiceImpl.java index 6940efe2..1d92715f 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/payment/application/service/PaymentServiceImpl.java @@ -1,13 +1,13 @@ -package com.tasksprints.auction.domain.payment.service; +package com.tasksprints.auction.payment.application.service; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.client.PaymentApiSerializer; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.payment.model.Payment; -import com.tasksprints.auction.domain.payment.repository.PaymentRepository; -import com.tasksprints.auction.domain.wallet.model.Wallet; -import com.tasksprints.auction.domain.wallet.service.WalletService; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.infrastructure.client.PaymentApiSerializer; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.domain.entity.Payment; +import com.tasksprints.auction.payment.infrastructure.PaymentRepository; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.wallet.application.service.WalletService; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -66,7 +66,7 @@ private Response handlePaymentSuccess(Long userId, PaymentRequest.Confir } } - Response handlePaymentFailure(Response response) { + public Response handlePaymentFailure(Response response) { log.info("결제 실패"); return response; } diff --git a/src/main/java/com/tasksprints/auction/domain/payment/dto/request/PaymentRequest.java b/src/main/java/com/tasksprints/auction/payment/domain/dto/request/PaymentRequest.java similarity index 85% rename from src/main/java/com/tasksprints/auction/domain/payment/dto/request/PaymentRequest.java rename to src/main/java/com/tasksprints/auction/payment/domain/dto/request/PaymentRequest.java index 8fee6d93..8bc00c67 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/dto/request/PaymentRequest.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/dto/request/PaymentRequest.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.payment.dto.request; +package com.tasksprints.auction.payment.domain.dto.request; -import com.tasksprints.auction.domain.payment.model.PayType; -import com.tasksprints.auction.domain.payment.model.Payment; +import com.tasksprints.auction.payment.domain.entity.PayType; +import com.tasksprints.auction.payment.domain.entity.Payment; import lombok.*; import java.math.BigDecimal; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentErrorResponse.java b/src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentErrorResponse.java similarity index 90% rename from src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentErrorResponse.java rename to src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentErrorResponse.java index c24ac52d..bb0193b1 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentErrorResponse.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentErrorResponse.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.dto.response; +package com.tasksprints.auction.payment.domain.dto.response; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentResponse.java b/src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentResponse.java similarity index 91% rename from src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentResponse.java rename to src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentResponse.java index 7aaab351..6e810fcb 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/dto/response/PaymentResponse.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/dto/response/PaymentResponse.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.dto.response; +package com.tasksprints.auction.payment.domain.dto.response; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/model/PayStatus.java b/src/main/java/com/tasksprints/auction/payment/domain/entity/PayStatus.java similarity index 94% rename from src/main/java/com/tasksprints/auction/domain/payment/model/PayStatus.java rename to src/main/java/com/tasksprints/auction/payment/domain/entity/PayStatus.java index e3de7c55..e1547511 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/model/PayStatus.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/entity/PayStatus.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.model; +package com.tasksprints.auction.payment.domain.entity; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/model/PayType.java b/src/main/java/com/tasksprints/auction/payment/domain/entity/PayType.java similarity index 93% rename from src/main/java/com/tasksprints/auction/domain/payment/model/PayType.java rename to src/main/java/com/tasksprints/auction/payment/domain/entity/PayType.java index ae4a3d3f..7c4ec703 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/model/PayType.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/entity/PayType.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.model; +package com.tasksprints.auction.payment.domain.entity; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/model/Payment.java b/src/main/java/com/tasksprints/auction/payment/domain/entity/Payment.java similarity index 90% rename from src/main/java/com/tasksprints/auction/domain/payment/model/Payment.java rename to src/main/java/com/tasksprints/auction/payment/domain/entity/Payment.java index 4669e460..746de281 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/model/Payment.java +++ b/src/main/java/com/tasksprints/auction/payment/domain/entity/Payment.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.payment.model; +package com.tasksprints.auction.payment.domain.entity; import com.tasksprints.auction.common.entity.BaseEntityWithUpdate; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.wallet.model.Wallet; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.wallet.domain.entity.Wallet; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/exception/InvalidSessionException.java b/src/main/java/com/tasksprints/auction/payment/exception/InvalidSessionException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/payment/exception/InvalidSessionException.java rename to src/main/java/com/tasksprints/auction/payment/exception/InvalidSessionException.java index 4342867a..3b774d8c 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/exception/InvalidSessionException.java +++ b/src/main/java/com/tasksprints/auction/payment/exception/InvalidSessionException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.exception; +package com.tasksprints.auction.payment.exception; public class InvalidSessionException extends RuntimeException { public InvalidSessionException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentDataMismatchException.java b/src/main/java/com/tasksprints/auction/payment/exception/PaymentDataMismatchException.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentDataMismatchException.java rename to src/main/java/com/tasksprints/auction/payment/exception/PaymentDataMismatchException.java index de29bb44..072da633 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentDataMismatchException.java +++ b/src/main/java/com/tasksprints/auction/payment/exception/PaymentDataMismatchException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.exception; +package com.tasksprints.auction.payment.exception; public class PaymentDataMismatchException extends RuntimeException { public PaymentDataMismatchException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentUserNotFoundException.java b/src/main/java/com/tasksprints/auction/payment/exception/PaymentUserNotFoundException.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentUserNotFoundException.java rename to src/main/java/com/tasksprints/auction/payment/exception/PaymentUserNotFoundException.java index d840b871..fa892e10 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/exception/PaymentUserNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/payment/exception/PaymentUserNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.payment.exception; +package com.tasksprints.auction.payment.exception; public class PaymentUserNotFoundException extends RuntimeException { public PaymentUserNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/payment/repository/PaymentRepository.java b/src/main/java/com/tasksprints/auction/payment/infrastructure/PaymentRepository.java similarity index 54% rename from src/main/java/com/tasksprints/auction/domain/payment/repository/PaymentRepository.java rename to src/main/java/com/tasksprints/auction/payment/infrastructure/PaymentRepository.java index cbc9456c..e513d984 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/repository/PaymentRepository.java +++ b/src/main/java/com/tasksprints/auction/payment/infrastructure/PaymentRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.payment.repository; +package com.tasksprints.auction.payment.infrastructure; -import com.tasksprints.auction.domain.payment.model.Payment; +import com.tasksprints.auction.payment.domain.entity.Payment; import org.springframework.data.jpa.repository.JpaRepository; public interface PaymentRepository extends JpaRepository { diff --git a/src/main/java/com/tasksprints/auction/domain/payment/client/ClientWrapper.java b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapper.java similarity index 87% rename from src/main/java/com/tasksprints/auction/domain/payment/client/ClientWrapper.java rename to src/main/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapper.java index fafee92d..d83db2eb 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/client/ClientWrapper.java +++ b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapper.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; -import com.tasksprints.auction.domain.payment.api.Response; +import com.tasksprints.auction.payment.api.Response; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/client/HttpClientWrapper.java b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/HttpClientWrapper.java similarity index 62% rename from src/main/java/com/tasksprints/auction/domain/payment/client/HttpClientWrapper.java rename to src/main/java/com/tasksprints/auction/payment/infrastructure/client/HttpClientWrapper.java index 9471b6f3..f18635ad 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/client/HttpClientWrapper.java +++ b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/HttpClientWrapper.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; -import com.tasksprints.auction.domain.payment.api.Response; +import com.tasksprints.auction.payment.api.Response; import java.io.IOException; import java.net.http.HttpRequest; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/client/PaymentApiSerializer.java b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/PaymentApiSerializer.java similarity index 64% rename from src/main/java/com/tasksprints/auction/domain/payment/client/PaymentApiSerializer.java rename to src/main/java/com/tasksprints/auction/payment/infrastructure/client/PaymentApiSerializer.java index 79cd5aff..ad0cc63e 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/client/PaymentApiSerializer.java +++ b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/PaymentApiSerializer.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; import java.io.IOException; diff --git a/src/main/java/com/tasksprints/auction/domain/payment/client/TossPaymentImpl.java b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImpl.java similarity index 93% rename from src/main/java/com/tasksprints/auction/domain/payment/client/TossPaymentImpl.java rename to src/main/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImpl.java index d2d74101..8bd5dba2 100644 --- a/src/main/java/com/tasksprints/auction/domain/payment/client/TossPaymentImpl.java +++ b/src/main/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImpl.java @@ -1,13 +1,13 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.tasksprints.auction.common.properties.PaymentProperties; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentErrorResponse; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.domain.dto.response.PaymentErrorResponse; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/tasksprints/auction/api/payment/PaymentController.java b/src/main/java/com/tasksprints/auction/payment/presentation/PaymentController.java similarity index 86% rename from src/main/java/com/tasksprints/auction/api/payment/PaymentController.java rename to src/main/java/com/tasksprints/auction/payment/presentation/PaymentController.java index 82dbd29f..35abe18a 100644 --- a/src/main/java/com/tasksprints/auction/api/payment/PaymentController.java +++ b/src/main/java/com/tasksprints/auction/payment/presentation/PaymentController.java @@ -1,13 +1,13 @@ -package com.tasksprints.auction.api.payment; +package com.tasksprints.auction.payment.presentation; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.payment.exception.InvalidSessionException; -import com.tasksprints.auction.domain.payment.exception.PaymentDataMismatchException; -import com.tasksprints.auction.domain.payment.service.PaymentService; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.exception.InvalidSessionException; +import com.tasksprints.auction.payment.exception.PaymentDataMismatchException; +import com.tasksprints.auction.payment.application.service.PaymentService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpSession; diff --git a/src/main/java/com/tasksprints/auction/domain/product/service/ProductService.java b/src/main/java/com/tasksprints/auction/product/application/service/ProductService.java similarity index 77% rename from src/main/java/com/tasksprints/auction/domain/product/service/ProductService.java rename to src/main/java/com/tasksprints/auction/product/application/service/ProductService.java index 475fde1d..6a362e20 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/service/ProductService.java +++ b/src/main/java/com/tasksprints/auction/product/application/service/ProductService.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.product.service; +package com.tasksprints.auction.product.application.service; -import com.tasksprints.auction.domain.product.dto.request.ProductRequest; -import com.tasksprints.auction.domain.product.dto.response.ProductResponse; +import com.tasksprints.auction.product.domain.dto.request.ProductRequest; +import com.tasksprints.auction.product.domain.dto.response.ProductResponse; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; diff --git a/src/main/java/com/tasksprints/auction/domain/product/service/ProductServiceImpl.java b/src/main/java/com/tasksprints/auction/product/application/service/ProductServiceImpl.java similarity index 80% rename from src/main/java/com/tasksprints/auction/domain/product/service/ProductServiceImpl.java rename to src/main/java/com/tasksprints/auction/product/application/service/ProductServiceImpl.java index 26ba29c2..e3986000 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/service/ProductServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/product/application/service/ProductServiceImpl.java @@ -1,19 +1,19 @@ -package com.tasksprints.auction.domain.product.service; - -import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.product.dto.request.ProductRequest; -import com.tasksprints.auction.domain.product.dto.response.ProductResponse; -import com.tasksprints.auction.domain.product.exception.ProductImageUploadException; -import com.tasksprints.auction.domain.product.exception.ProductNotFoundException; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductImage; -import com.tasksprints.auction.domain.product.repository.ProductImageRepository; -import com.tasksprints.auction.domain.product.repository.ProductRepository; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +package com.tasksprints.auction.product.application.service; + +import com.tasksprints.auction.auction.exception.AuctionNotFoundException; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.product.domain.dto.request.ProductRequest; +import com.tasksprints.auction.product.domain.dto.response.ProductResponse; +import com.tasksprints.auction.product.exception.ProductImageUploadException; +import com.tasksprints.auction.product.exception.ProductNotFoundException; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductImage; +import com.tasksprints.auction.product.infrastructure.ProductImageRepository; +import com.tasksprints.auction.product.infrastructure.ProductRepository; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/tasksprints/auction/domain/product/dto/request/ProductRequest.java b/src/main/java/com/tasksprints/auction/product/domain/dto/request/ProductRequest.java similarity index 89% rename from src/main/java/com/tasksprints/auction/domain/product/dto/request/ProductRequest.java rename to src/main/java/com/tasksprints/auction/product/domain/dto/request/ProductRequest.java index 0c57dc62..2eb0b16c 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/dto/request/ProductRequest.java +++ b/src/main/java/com/tasksprints/auction/product/domain/dto/request/ProductRequest.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.product.dto.request; +package com.tasksprints.auction.product.domain.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/product/dto/response/ProductResponse.java b/src/main/java/com/tasksprints/auction/product/domain/dto/response/ProductResponse.java similarity index 86% rename from src/main/java/com/tasksprints/auction/domain/product/dto/response/ProductResponse.java rename to src/main/java/com/tasksprints/auction/product/domain/dto/response/ProductResponse.java index 22359ee7..d8a16d4e 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/dto/response/ProductResponse.java +++ b/src/main/java/com/tasksprints/auction/product/domain/dto/response/ProductResponse.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.product.dto.response; +package com.tasksprints.auction.product.domain.dto.response; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductImage; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductImage; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/Product.java b/src/main/java/com/tasksprints/auction/product/domain/entity/Product.java similarity index 92% rename from src/main/java/com/tasksprints/auction/domain/product/model/Product.java rename to src/main/java/com/tasksprints/auction/product/domain/entity/Product.java index ff72c7c7..bb195282 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/Product.java +++ b/src/main/java/com/tasksprints/auction/product/domain/entity/Product.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.product.model; +package com.tasksprints.auction.product.domain.entity; import com.tasksprints.auction.common.entity.BaseEntity; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java b/src/main/java/com/tasksprints/auction/product/domain/entity/ProductCategory.java similarity index 97% rename from src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java rename to src/main/java/com/tasksprints/auction/product/domain/entity/ProductCategory.java index db4d2de4..1d10dcc1 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java +++ b/src/main/java/com/tasksprints/auction/product/domain/entity/ProductCategory.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.product.model; +package com.tasksprints.auction.product.domain.entity; public enum ProductCategory { WOMENS_CLOTHING("여성의류"), diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductImage.java b/src/main/java/com/tasksprints/auction/product/domain/entity/ProductImage.java similarity index 91% rename from src/main/java/com/tasksprints/auction/domain/product/model/ProductImage.java rename to src/main/java/com/tasksprints/auction/product/domain/entity/ProductImage.java index 6f3eb357..4ebac704 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductImage.java +++ b/src/main/java/com/tasksprints/auction/product/domain/entity/ProductImage.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.product.model; +package com.tasksprints.auction.product.domain.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/tasksprints/auction/domain/product/exception/ProductImageUploadException.java b/src/main/java/com/tasksprints/auction/product/exception/ProductImageUploadException.java similarity index 82% rename from src/main/java/com/tasksprints/auction/domain/product/exception/ProductImageUploadException.java rename to src/main/java/com/tasksprints/auction/product/exception/ProductImageUploadException.java index 993fcee8..8c1462cc 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/exception/ProductImageUploadException.java +++ b/src/main/java/com/tasksprints/auction/product/exception/ProductImageUploadException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.product.exception; +package com.tasksprints.auction.product.exception; public class ProductImageUploadException extends RuntimeException { diff --git a/src/main/java/com/tasksprints/auction/domain/product/exception/ProductNotFoundException.java b/src/main/java/com/tasksprints/auction/product/exception/ProductNotFoundException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/product/exception/ProductNotFoundException.java rename to src/main/java/com/tasksprints/auction/product/exception/ProductNotFoundException.java index 6fb2881f..30d60c26 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/exception/ProductNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/product/exception/ProductNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.product.exception; +package com.tasksprints.auction.product.exception; public class ProductNotFoundException extends RuntimeException { public ProductNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/product/repository/ProductImageRepository.java b/src/main/java/com/tasksprints/auction/product/infrastructure/ProductImageRepository.java similarity index 54% rename from src/main/java/com/tasksprints/auction/domain/product/repository/ProductImageRepository.java rename to src/main/java/com/tasksprints/auction/product/infrastructure/ProductImageRepository.java index 75f89859..b1e2b122 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/repository/ProductImageRepository.java +++ b/src/main/java/com/tasksprints/auction/product/infrastructure/ProductImageRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.product.repository; +package com.tasksprints.auction.product.infrastructure; -import com.tasksprints.auction.domain.product.model.ProductImage; +import com.tasksprints.auction.product.domain.entity.ProductImage; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductImageRepository extends JpaRepository { diff --git a/src/main/java/com/tasksprints/auction/domain/product/repository/ProductRepository.java b/src/main/java/com/tasksprints/auction/product/infrastructure/ProductRepository.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/product/repository/ProductRepository.java rename to src/main/java/com/tasksprints/auction/product/infrastructure/ProductRepository.java index 2231e7e1..16597e97 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/repository/ProductRepository.java +++ b/src/main/java/com/tasksprints/auction/product/infrastructure/ProductRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.product.repository; +package com.tasksprints.auction.product.infrastructure; -import com.tasksprints.auction.domain.product.model.Product; +import com.tasksprints.auction.product.domain.entity.Product; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/tasksprints/auction/api/product/ProductController.java b/src/main/java/com/tasksprints/auction/product/presentation/ProductController.java similarity index 91% rename from src/main/java/com/tasksprints/auction/api/product/ProductController.java rename to src/main/java/com/tasksprints/auction/product/presentation/ProductController.java index 5d0c2d55..6f4d3169 100644 --- a/src/main/java/com/tasksprints/auction/api/product/ProductController.java +++ b/src/main/java/com/tasksprints/auction/product/presentation/ProductController.java @@ -1,10 +1,10 @@ -package com.tasksprints.auction.api.product; +package com.tasksprints.auction.product.presentation; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.product.dto.request.ProductRequest; -import com.tasksprints.auction.domain.product.dto.response.ProductResponse; -import com.tasksprints.auction.domain.product.service.ProductService; +import com.tasksprints.auction.product.domain.dto.request.ProductRequest; +import com.tasksprints.auction.product.domain.dto.response.ProductResponse; +import com.tasksprints.auction.product.application.service.ProductService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; diff --git a/src/main/java/com/tasksprints/auction/domain/review/service/ReviewService.java b/src/main/java/com/tasksprints/auction/review/application/service/ReviewService.java similarity index 63% rename from src/main/java/com/tasksprints/auction/domain/review/service/ReviewService.java rename to src/main/java/com/tasksprints/auction/review/application/service/ReviewService.java index 725f186a..313fd07e 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/service/ReviewService.java +++ b/src/main/java/com/tasksprints/auction/review/application/service/ReviewService.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.review.service; +package com.tasksprints.auction.review.application.service; -import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; -import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; +import com.tasksprints.auction.review.domain.dto.request.ReviewRequest; +import com.tasksprints.auction.review.domain.dto.response.ReviewResponse; import java.util.List; diff --git a/src/main/java/com/tasksprints/auction/domain/review/service/ReviewServiceImpl.java b/src/main/java/com/tasksprints/auction/review/application/service/ReviewServiceImpl.java similarity index 71% rename from src/main/java/com/tasksprints/auction/domain/review/service/ReviewServiceImpl.java rename to src/main/java/com/tasksprints/auction/review/application/service/ReviewServiceImpl.java index 1d4fe951..90648e2e 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/service/ReviewServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/review/application/service/ReviewServiceImpl.java @@ -1,13 +1,13 @@ -package com.tasksprints.auction.domain.review.service; +package com.tasksprints.auction.review.application.service; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; -import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; -import com.tasksprints.auction.domain.review.model.Review; -import com.tasksprints.auction.domain.review.repository.ReviewRepository; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.review.domain.dto.request.ReviewRequest; +import com.tasksprints.auction.review.domain.dto.response.ReviewResponse; +import com.tasksprints.auction.review.domain.entity.Review; +import com.tasksprints.auction.review.infrastructure.ReviewRepository; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/tasksprints/auction/domain/review/dto/request/ReviewRequest.java b/src/main/java/com/tasksprints/auction/review/domain/dto/request/ReviewRequest.java similarity index 71% rename from src/main/java/com/tasksprints/auction/domain/review/dto/request/ReviewRequest.java rename to src/main/java/com/tasksprints/auction/review/domain/dto/request/ReviewRequest.java index 92653ba4..c51dfcb2 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/dto/request/ReviewRequest.java +++ b/src/main/java/com/tasksprints/auction/review/domain/dto/request/ReviewRequest.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.review.dto.request; +package com.tasksprints.auction.review.domain.dto.request; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/review/dto/response/ReviewResponse.java b/src/main/java/com/tasksprints/auction/review/domain/dto/response/ReviewResponse.java similarity index 78% rename from src/main/java/com/tasksprints/auction/domain/review/dto/response/ReviewResponse.java rename to src/main/java/com/tasksprints/auction/review/domain/dto/response/ReviewResponse.java index 0967b8ad..aca97c14 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/dto/response/ReviewResponse.java +++ b/src/main/java/com/tasksprints/auction/review/domain/dto/response/ReviewResponse.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.review.dto.response; +package com.tasksprints.auction.review.domain.dto.response; -import com.tasksprints.auction.domain.review.model.Review; +import com.tasksprints.auction.review.domain.entity.Review; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/review/model/Review.java b/src/main/java/com/tasksprints/auction/review/domain/entity/Review.java similarity index 88% rename from src/main/java/com/tasksprints/auction/domain/review/model/Review.java rename to src/main/java/com/tasksprints/auction/review/domain/entity/Review.java index 867b9e40..76ae130f 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/model/Review.java +++ b/src/main/java/com/tasksprints/auction/review/domain/entity/Review.java @@ -1,7 +1,7 @@ -package com.tasksprints.auction.domain.review.model; +package com.tasksprints.auction.review.domain.entity; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/tasksprints/auction/domain/review/repository/ReviewRepository.java b/src/main/java/com/tasksprints/auction/review/infrastructure/ReviewRepository.java similarity index 80% rename from src/main/java/com/tasksprints/auction/domain/review/repository/ReviewRepository.java rename to src/main/java/com/tasksprints/auction/review/infrastructure/ReviewRepository.java index a6d654bf..33e5b798 100644 --- a/src/main/java/com/tasksprints/auction/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/tasksprints/auction/review/infrastructure/ReviewRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.review.repository; +package com.tasksprints.auction.review.infrastructure; -import com.tasksprints.auction.domain.review.model.Review; +import com.tasksprints.auction.review.domain.entity.Review; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/tasksprints/auction/domain/user/service/UserService.java b/src/main/java/com/tasksprints/auction/user/application/service/UserService.java similarity index 51% rename from src/main/java/com/tasksprints/auction/domain/user/service/UserService.java rename to src/main/java/com/tasksprints/auction/user/application/service/UserService.java index 9ac79052..15dce097 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/service/UserService.java +++ b/src/main/java/com/tasksprints/auction/user/application/service/UserService.java @@ -1,11 +1,10 @@ -package com.tasksprints.auction.domain.user.service; +package com.tasksprints.auction.user.application.service; -import com.tasksprints.auction.domain.user.dto.request.UserRequest; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.dto.response.UserSummaryResponse; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.user.domain.dto.request.UserRequest; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.dto.response.UserSummaryResponse; +import com.tasksprints.auction.user.domain.entity.User; -import com.tasksprints.auction.domain.user.model.User; import java.util.List; public interface UserService { @@ -19,5 +18,7 @@ public interface UserService { void deleteUser(Long id); + UserDetailResponse getUserDetailByEmail(String email); + User getUserById(Long id); } diff --git a/src/main/java/com/tasksprints/auction/domain/user/service/UserServiceImpl.java b/src/main/java/com/tasksprints/auction/user/application/service/UserServiceImpl.java similarity index 71% rename from src/main/java/com/tasksprints/auction/domain/user/service/UserServiceImpl.java rename to src/main/java/com/tasksprints/auction/user/application/service/UserServiceImpl.java index 4f96751b..5e56ff26 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/user/application/service/UserServiceImpl.java @@ -1,20 +1,15 @@ -package com.tasksprints.auction.domain.user.service; +package com.tasksprints.auction.user.application.service; -import com.tasksprints.auction.domain.user.dto.request.UserRequest; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.dto.response.UserSummaryResponse; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; -import com.tasksprints.auction.domain.wallet.exception.WalletCreationException; -import com.tasksprints.auction.domain.wallet.model.Wallet; -import com.tasksprints.auction.domain.wallet.repository.WalletRepository; -import jakarta.transaction.Transactional; +import com.tasksprints.auction.user.domain.dto.request.UserRequest; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.dto.response.UserSummaryResponse; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @Service @@ -43,7 +38,7 @@ public List getUsersSummary() { List foundUsers = userRepository.findAll(); return foundUsers.stream() .map(UserSummaryResponse::new) - .collect(Collectors.toList()); + .toList(); } @Override @@ -64,9 +59,16 @@ public void deleteUser(Long id) { userRepository.save(user); // 상태 업데이트를 저장 } + @Override + public UserDetailResponse getUserDetailByEmail(String email) { + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new UserNotFoundException("User not found with email " + email)); + return UserDetailResponse.of(user); + } + @Override public User getUserById(Long id) { - return userRepository.findById(id) + return userRepository.findById(id) .orElseThrow(() -> new UserNotFoundException("User not found with id " + id)); } } diff --git a/src/main/java/com/tasksprints/auction/domain/user/dto/request/UserRequest.java b/src/main/java/com/tasksprints/auction/user/domain/dto/request/UserRequest.java similarity index 90% rename from src/main/java/com/tasksprints/auction/domain/user/dto/request/UserRequest.java rename to src/main/java/com/tasksprints/auction/user/domain/dto/request/UserRequest.java index 7960e859..10b13c5d 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/dto/request/UserRequest.java +++ b/src/main/java/com/tasksprints/auction/user/domain/dto/request/UserRequest.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.user.dto.request; +package com.tasksprints.auction.user.domain.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserDetailResponse.java b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserDetailResponse.java similarity index 85% rename from src/main/java/com/tasksprints/auction/domain/user/dto/response/UserDetailResponse.java rename to src/main/java/com/tasksprints/auction/user/domain/dto/response/UserDetailResponse.java index e27e6fe8..3e0004c1 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserDetailResponse.java +++ b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserDetailResponse.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.user.dto.response; +package com.tasksprints.auction.user.domain.dto.response; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.user.domain.entity.User; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserResponse.java b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserResponse.java new file mode 100644 index 00000000..a3ccb44e --- /dev/null +++ b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserResponse.java @@ -0,0 +1,4 @@ +package com.tasksprints.auction.user.domain.dto.response; + +public class UserResponse { +} diff --git a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserSummaryResponse.java b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserSummaryResponse.java similarity index 78% rename from src/main/java/com/tasksprints/auction/domain/user/dto/response/UserSummaryResponse.java rename to src/main/java/com/tasksprints/auction/user/domain/dto/response/UserSummaryResponse.java index 19af4890..19264394 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/dto/response/UserSummaryResponse.java +++ b/src/main/java/com/tasksprints/auction/user/domain/dto/response/UserSummaryResponse.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.user.dto.response; +package com.tasksprints.auction.user.domain.dto.response; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.user.domain.entity.User; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/tasksprints/auction/domain/user/model/User.java b/src/main/java/com/tasksprints/auction/user/domain/entity/User.java similarity index 94% rename from src/main/java/com/tasksprints/auction/domain/user/model/User.java rename to src/main/java/com/tasksprints/auction/user/domain/entity/User.java index a440bb98..de95660f 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/model/User.java +++ b/src/main/java/com/tasksprints/auction/user/domain/entity/User.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.user.model; +package com.tasksprints.auction.user.domain.entity; +import com.tasksprints.auction.auction.domain.entity.Auction; import com.tasksprints.auction.common.entity.BaseEntityWithUpdate; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.wallet.model.Wallet; +import com.tasksprints.auction.wallet.domain.entity.Wallet; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.SQLRestriction; @@ -45,7 +45,7 @@ public class User extends BaseEntityWithUpdate { @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "wallet_id") private Wallet wallet; - + // 추후 추가 // @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) // @Builder.Default diff --git a/src/main/java/com/tasksprints/auction/domain/user/model/UserRole.java b/src/main/java/com/tasksprints/auction/user/domain/entity/UserRole.java similarity index 100% rename from src/main/java/com/tasksprints/auction/domain/user/model/UserRole.java rename to src/main/java/com/tasksprints/auction/user/domain/entity/UserRole.java diff --git a/src/main/java/com/tasksprints/auction/domain/user/exception/UserNotFoundException.java b/src/main/java/com/tasksprints/auction/user/exception/UserNotFoundException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/user/exception/UserNotFoundException.java rename to src/main/java/com/tasksprints/auction/user/exception/UserNotFoundException.java index 4e83e58c..9b7e003a 100644 --- a/src/main/java/com/tasksprints/auction/domain/user/exception/UserNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/user/exception/UserNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.user.exception; +package com.tasksprints.auction.user.exception; public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/user/infrastructure/UserRepository.java b/src/main/java/com/tasksprints/auction/user/infrastructure/UserRepository.java new file mode 100644 index 00000000..392813b3 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/user/infrastructure/UserRepository.java @@ -0,0 +1,10 @@ +package com.tasksprints.auction.user.infrastructure; + +import com.tasksprints.auction.user.domain.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); +} diff --git a/src/main/java/com/tasksprints/auction/api/user/UserController.java b/src/main/java/com/tasksprints/auction/user/presentation/UserController.java similarity index 93% rename from src/main/java/com/tasksprints/auction/api/user/UserController.java rename to src/main/java/com/tasksprints/auction/user/presentation/UserController.java index 1771ec0d..67522527 100644 --- a/src/main/java/com/tasksprints/auction/api/user/UserController.java +++ b/src/main/java/com/tasksprints/auction/user/presentation/UserController.java @@ -1,11 +1,11 @@ -package com.tasksprints.auction.api.user; +package com.tasksprints.auction.user.presentation; import com.tasksprints.auction.common.constant.ApiResponseMessages; import com.tasksprints.auction.common.response.ApiResult; -import com.tasksprints.auction.domain.user.dto.request.UserRequest; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.dto.response.UserSummaryResponse; -import com.tasksprints.auction.domain.user.service.UserService; +import com.tasksprints.auction.user.domain.dto.request.UserRequest; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.dto.response.UserSummaryResponse; +import com.tasksprints.auction.user.application.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/service/WalletService.java b/src/main/java/com/tasksprints/auction/wallet/application/service/WalletService.java similarity index 62% rename from src/main/java/com/tasksprints/auction/domain/wallet/service/WalletService.java rename to src/main/java/com/tasksprints/auction/wallet/application/service/WalletService.java index 0383a46b..d38364cc 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/service/WalletService.java +++ b/src/main/java/com/tasksprints/auction/wallet/application/service/WalletService.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.wallet.service; +package com.tasksprints.auction.wallet.application.service; -import com.tasksprints.auction.domain.wallet.model.Wallet; +import com.tasksprints.auction.wallet.domain.entity.Wallet; import java.math.BigDecimal; diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImpl.java b/src/main/java/com/tasksprints/auction/wallet/application/service/WalletServiceImpl.java similarity index 67% rename from src/main/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImpl.java rename to src/main/java/com/tasksprints/auction/wallet/application/service/WalletServiceImpl.java index 7325c3ab..7a4de7b2 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/wallet/application/service/WalletServiceImpl.java @@ -1,9 +1,7 @@ -package com.tasksprints.auction.domain.wallet.service; +package com.tasksprints.auction.wallet.application.service; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.service.UserService; -import com.tasksprints.auction.domain.wallet.model.Wallet; -import com.tasksprints.auction.domain.wallet.repository.WalletRepository; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.wallet.infrastructure.WalletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/model/Wallet.java b/src/main/java/com/tasksprints/auction/wallet/domain/entity/Wallet.java similarity index 89% rename from src/main/java/com/tasksprints/auction/domain/wallet/model/Wallet.java rename to src/main/java/com/tasksprints/auction/wallet/domain/entity/Wallet.java index 1a14a7ee..08a7fc2e 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/model/Wallet.java +++ b/src/main/java/com/tasksprints/auction/wallet/domain/entity/Wallet.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.wallet.model; +package com.tasksprints.auction.wallet.domain.entity; import com.tasksprints.auction.common.entity.BaseEntityWithUpdate; -import com.tasksprints.auction.domain.payment.model.Payment; -import com.tasksprints.auction.domain.user.model.User; +import com.tasksprints.auction.payment.domain.entity.Payment; +import com.tasksprints.auction.user.domain.entity.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/exception/InSufficientBalanceException.java b/src/main/java/com/tasksprints/auction/wallet/exception/InSufficientBalanceException.java similarity index 73% rename from src/main/java/com/tasksprints/auction/domain/wallet/exception/InSufficientBalanceException.java rename to src/main/java/com/tasksprints/auction/wallet/exception/InSufficientBalanceException.java index 2af6c8f5..791c563d 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/exception/InSufficientBalanceException.java +++ b/src/main/java/com/tasksprints/auction/wallet/exception/InSufficientBalanceException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.wallet.exception; +package com.tasksprints.auction.wallet.exception; public class InSufficientBalanceException extends RuntimeException { public InSufficientBalanceException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletCreationException.java b/src/main/java/com/tasksprints/auction/wallet/exception/WalletCreationException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletCreationException.java rename to src/main/java/com/tasksprints/auction/wallet/exception/WalletCreationException.java index be09e573..f3d2e47c 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletCreationException.java +++ b/src/main/java/com/tasksprints/auction/wallet/exception/WalletCreationException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.wallet.exception; +package com.tasksprints.auction.wallet.exception; public class WalletCreationException extends RuntimeException { public WalletCreationException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletNotFoundException.java b/src/main/java/com/tasksprints/auction/wallet/exception/WalletNotFoundException.java similarity index 72% rename from src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletNotFoundException.java rename to src/main/java/com/tasksprints/auction/wallet/exception/WalletNotFoundException.java index 76461711..e3809892 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/exception/WalletNotFoundException.java +++ b/src/main/java/com/tasksprints/auction/wallet/exception/WalletNotFoundException.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.domain.wallet.exception; +package com.tasksprints.auction.wallet.exception; public class WalletNotFoundException extends RuntimeException { public WalletNotFoundException(String message) { diff --git a/src/main/java/com/tasksprints/auction/domain/wallet/repository/WalletRepository.java b/src/main/java/com/tasksprints/auction/wallet/infrastructure/WalletRepository.java similarity index 76% rename from src/main/java/com/tasksprints/auction/domain/wallet/repository/WalletRepository.java rename to src/main/java/com/tasksprints/auction/wallet/infrastructure/WalletRepository.java index cfe4e83c..afc41c2b 100644 --- a/src/main/java/com/tasksprints/auction/domain/wallet/repository/WalletRepository.java +++ b/src/main/java/com/tasksprints/auction/wallet/infrastructure/WalletRepository.java @@ -1,6 +1,6 @@ -package com.tasksprints.auction.domain.wallet.repository; +package com.tasksprints.auction.wallet.infrastructure; -import com.tasksprints.auction.domain.wallet.model.Wallet; +import com.tasksprints.auction.wallet.domain.entity.Wallet; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/tasksprints/auction/wallet/presentation/WalletController.java b/src/main/java/com/tasksprints/auction/wallet/presentation/WalletController.java new file mode 100644 index 00000000..f9beb1d1 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/wallet/presentation/WalletController.java @@ -0,0 +1,4 @@ +package com.tasksprints.auction.wallet.presentation; + +public class WalletController { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff1c0f23..67ef9efc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -51,6 +51,7 @@ logging: level: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: TRACE + root: debug server: port: 8080 diff --git a/src/test/java/com/tasksprints/auction/BaseControllerTest.java b/src/test/java/com/tasksprints/auction/BaseControllerTest.java new file mode 100644 index 00000000..ec73678b --- /dev/null +++ b/src/test/java/com/tasksprints/auction/BaseControllerTest.java @@ -0,0 +1,10 @@ +package com.tasksprints.auction; + +import com.tasksprints.auction.common.config.TestAuthConfig; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.annotation.Import; + +@WebMvcTest +@Import(TestAuthConfig.class) +public abstract class BaseControllerTest { +} diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/auction/application/AuctionServiceImplTest.java similarity index 94% rename from src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java rename to src/test/java/com/tasksprints/auction/auction/application/AuctionServiceImplTest.java index 966a0587..4c190814 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/auction/application/AuctionServiceImplTest.java @@ -1,17 +1,18 @@ package com.tasksprints.auction.domain.auction.service; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.auction.exception.AuctionAlreadyClosedException; -import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; -import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.dto.response.AuctionResponse; +import com.tasksprints.auction.auction.exception.AuctionAlreadyClosedException; +import com.tasksprints.auction.auction.exception.AuctionNotFoundException; +import com.tasksprints.auction.auction.exception.InvalidAuctionTimeException; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.auction.application.service.AuctionServiceImpl; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/auction/infrastructure/AuctionRepositoryTest.java similarity index 90% rename from src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java rename to src/test/java/com/tasksprints/auction/auction/infrastructure/AuctionRepositoryTest.java index 57ce46bf..ea29e9d5 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/auction/infrastructure/AuctionRepositoryTest.java @@ -1,16 +1,16 @@ package com.tasksprints.auction.domain.auction.repository; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; import com.tasksprints.auction.common.config.QueryDslConfig; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -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.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.product.repository.ProductRepository; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductCategory; +import com.tasksprints.auction.product.infrastructure.ProductRepository; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/auction/presentation/AuctionControllerTest.java similarity index 90% rename from src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java rename to src/test/java/com/tasksprints/auction/auction/presentation/AuctionControllerTest.java index 9cc04755..c3575caa 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/auction/presentation/AuctionControllerTest.java @@ -1,18 +1,17 @@ -package com.tasksprints.auction.api; +package com.tasksprints.auction.auction.presentation; import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.api.auction.AuctionController; +import com.tasksprints.auction.BaseControllerTest; import com.tasksprints.auction.common.constant.ApiResponseMessages; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.service.AuctionService; -import com.tasksprints.auction.domain.bid.dto.BidResponse; -import com.tasksprints.auction.domain.bid.service.BidService; -import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; -import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; -import com.tasksprints.auction.domain.review.service.ReviewService; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.dto.response.AuctionResponse; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.application.service.AuctionService; +import com.tasksprints.auction.bid.application.service.BidService; +import com.tasksprints.auction.review.domain.dto.request.ReviewRequest; +import com.tasksprints.auction.review.domain.dto.response.ReviewResponse; +import com.tasksprints.auction.review.application.service.ReviewService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,10 +39,10 @@ @WebMvcTest(AuctionController.class) @MockBean(JpaMetamodelMappingContext.class) -public class AuctionControllerTest { +public class AuctionControllerTest extends BaseControllerTest { @Autowired - private MockMvc mockMvc; + protected MockMvc mockMvc; @MockBean private AuctionService auctionService; diff --git a/src/test/java/com/tasksprints/auction/auth/application/AuthServiceImplTest.java b/src/test/java/com/tasksprints/auction/auth/application/AuthServiceImplTest.java new file mode 100644 index 00000000..0507917d --- /dev/null +++ b/src/test/java/com/tasksprints/auction/auth/application/AuthServiceImplTest.java @@ -0,0 +1,134 @@ +package com.tasksprints.auction.auth.application; + + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import com.tasksprints.auction.common.jwt.JwtProvider; +import com.tasksprints.auction.auth.domain.dto.response.AccessToken; +import com.tasksprints.auction.auth.domain.dto.response.ResponseTokens; +import com.tasksprints.auction.auth.domain.dto.response.UserTokens; +import com.tasksprints.auction.auth.exception.AuthException; +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import com.tasksprints.auction.user.application.service.UserService; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.entity.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseCookie; + + +@ExtendWith(MockitoExtension.class) +class AuthServiceImplTest { + + @Mock + UserService userService; + @Mock + JwtProvider jwtProvider; + @Mock + RefreshTokenService refreshTokenService; + @InjectMocks + private AuthServiceImpl authService; + + private UserDetailResponse userDetail; + + private String loginEmail; + + @BeforeEach + void setUp() { + loginEmail = "user@exapmle.com"; + User existingUser = User.createWithWallet( + "realName", + "user@example.com", + "password", + "testUser" + ); + userDetail = UserDetailResponse.of(existingUser); + userDetail.setId(1L); + } + + public static ResponseCookie createResponseCookie(String value) { + return ResponseCookie.from("refresh-token", value) + .maxAge(3600) + .secure(true) + .httpOnly(true) + .sameSite("None") + .path("/") + .build(); + } + + @Nested + @DisplayName("Validate login information test") + class TestLogin { + @Test + @DisplayName("Return userDetails, when password same") + void validateLogin_success() { + // given + String password = "password"; + when(userService.getUserDetailByEmail(any())).thenReturn(userDetail); + + // when + Long actualUserId = authService.validateLogin(loginEmail, password); + + // then + assertEquals(1L, actualUserId); + } + + @Test + @DisplayName("Should throw exception when password is different") + void validateLoginDifferentPassword() { + // given + String password = "differentPassword"; + when(userService.getUserDetailByEmail(any())).thenReturn(userDetail); + + // when + AuthException exception = assertThrows(AuthException.class, () -> { + authService.validateLogin(loginEmail, password); + }); + + // then + assertEquals("password is not correct", exception.getMessage()); + } + } + + @Nested + @DisplayName("Issue response tokens test") + class TestIssueTokens { + public static AccessToken createAccessToken(String value) { + return new AccessToken(value); + } + + public static UserTokens createUserTokens(String accessTokenValue, String refreshTokenValue) { + return UserTokens.of(createAccessToken(accessTokenValue), refreshTokenValue); + } + + @Test + @DisplayName("Return tokens, when issue tokens successfully") + void returnResponseTokens_success() { + // given + String refreshTokenValue = "refreshTokenValue"; + String accessTokenValue = "accessTokenValue"; + UserTokens generatedTokens = createUserTokens(accessTokenValue, refreshTokenValue); + Long userId = 1L; + RefreshToken refreshToken = new RefreshToken(refreshTokenValue, userId); + + when(jwtProvider.generateToken(any())).thenReturn(generatedTokens); + when(refreshTokenService.saveRefreshToken(any(), any())).thenReturn(refreshToken); + when(refreshTokenService.getResponseRefreshToken(any())).thenReturn(createResponseCookie(refreshTokenValue)); + + // when + ResponseTokens responseTokens = authService.issueResponseTokens(userId); + + // then + assertNotNull(responseTokens); + assertNotNull(responseTokens.accessToken()); + assertNotNull(responseTokens.refreshToken()); + } + } +} diff --git a/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManagerTest.java b/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManagerTest.java new file mode 100644 index 00000000..7ece6462 --- /dev/null +++ b/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenCookieManagerTest.java @@ -0,0 +1,97 @@ +package com.tasksprints.auction.auth.application; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.tasksprints.auction.auth.exception.RefreshTokenException; +import com.tasksprints.auction.auth.infrastructure.RefreshTokenRepository; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.http.ResponseCookie; + +class RefreshTokenCookieManagerTest { + @Mock + private RefreshTokenRepository refreshTokenRepository; + + @InjectMocks + private RefreshTokenCookieManager cookieManager; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Nested + @DisplayName("") + class TestExtractToken { + @Test + @DisplayName("Return refresh token, after extracting refresh token") + void extractRefreshToken_success() { + // given + Cookie[] cookies = { + new Cookie("nothing", "token"), + new Cookie("refresh-token", "tokenName"), + }; + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getCookies()).thenReturn(cookies); + when(refreshTokenRepository.existsById("tokenName")).thenReturn(true); + + // when + String resultValue = cookieManager.extractRefreshToken(request); + + // then + assertThat(resultValue).isEqualTo("tokenName"); + } + + @Test + @DisplayName("Should throw exception, when refresh token doesn't exist in cookie") + void extractRefreshToken_fail() { + // given + Cookie[] cookies = { + new Cookie("nothing", "token"), + }; + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getCookies()).thenReturn(cookies); + + // when, then + Assertions.assertThrows(RefreshTokenException.class, () -> { + cookieManager.extractRefreshToken(request); + }, "리프레시토큰이 쿠키에 존재해야 합니다."); + } + + } + + + @Nested + @DisplayName("Get response cookie test") + class TestResponseCookie { + + @Test + @DisplayName("Return ResponseCookie, when creating the cookie successfully") + void returnResponseCookie_success() { + // given + String refreshToken = "refreshTokenValue"; + + // when + ResponseCookie responseCookie = cookieManager.createResponseCookie(refreshToken); + + // then + assertEquals(1209600, responseCookie.getMaxAge().toSeconds()); + assertTrue(responseCookie.isSecure()); + assertTrue(responseCookie.isHttpOnly()); + assertEquals("None", responseCookie.getSameSite()); + assertEquals("/", responseCookie.getPath()); + } + } +} diff --git a/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImplTest.java b/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImplTest.java new file mode 100644 index 00000000..c1e2dff2 --- /dev/null +++ b/src/test/java/com/tasksprints/auction/auth/application/RefreshTokenServiceImplTest.java @@ -0,0 +1,78 @@ +package com.tasksprints.auction.auth.application; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import com.tasksprints.auction.auth.exception.RefreshTokenException; +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import com.tasksprints.auction.auth.infrastructure.RefreshTokenRepository; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class RefreshTokenServiceImplTest { + + @Mock + RefreshTokenRepository refreshTokenRepository; + + @InjectMocks + RefreshTokenServiceImpl refreshTokenService; + + @Nested + @DisplayName("Save RefreshToken test") + class TestSaveRefreshToken { + @Test + @DisplayName("should return RefreshToken, when the test is success") + void testSaveRefreshToken_success() { + // given + String refreshTokenValue = "refreshToken"; + Long userId = 1L; + RefreshToken expectedRefreshToken = RefreshToken.of(refreshTokenValue, userId); + when(refreshTokenRepository.save(any())).thenReturn(expectedRefreshToken); + + // when + RefreshToken actualRefreshToken = refreshTokenService.saveRefreshToken(refreshTokenValue, userId); + + // then + assertEquals(expectedRefreshToken.getUserId(), actualRefreshToken.getUserId()); + assertEquals(expectedRefreshToken.getId(), actualRefreshToken.getId()); + } + } + + @Nested + @DisplayName("Find refresh Token test") + class TestFindRefreshToken { + + void testFindRefreshToken_success() { + // given + String refreshTokenValue = "refreshToken"; + RefreshToken existedRefreshToken = RefreshToken.of("refreshToken", 1L); + when(refreshTokenRepository.findById(any())).thenReturn(Optional.ofNullable(existedRefreshToken)); + + // when + RefreshToken foundRefreshToken = refreshTokenService.findRefreshTokenById(refreshTokenValue); + + // then + assertEquals(1L, foundRefreshToken.getUserId()); + assertEquals(refreshTokenValue, foundRefreshToken.getId()); + } + + void testFindRefreshToken_fail() { + // given + String refreshTokenValue = "refreshToken"; + when(refreshTokenRepository.findById(any())).thenReturn(Optional.empty()); + + // when, then + Assertions.assertThrows(RefreshTokenException.class, () -> { + refreshTokenService.findRefreshTokenById(refreshTokenValue); + }); + } + } +} diff --git a/src/test/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepositoryTest.java b/src/test/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepositoryTest.java new file mode 100644 index 00000000..37f62b1e --- /dev/null +++ b/src/test/java/com/tasksprints/auction/auth/infrastructure/RefreshTokenRepositoryTest.java @@ -0,0 +1,60 @@ +package com.tasksprints.auction.auth.infrastructure; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import com.tasksprints.auction.common.config.QueryDslConfig; +import com.tasksprints.auction.auth.domain.model.RefreshToken; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + + +@DataJpaTest +@Import(QueryDslConfig.class) +class RefreshTokenRepositoryTest { + + @Autowired + private RefreshTokenRepository refreshTokenRepository; + + private RefreshToken refreshToken; + + @BeforeEach + void setUp() { + refreshToken = RefreshToken.builder() + .id("testId") + .userId(1L) + .build(); + } + + @Test + @DisplayName("refresh token ID로 refresh token 조회") + void testFindById() { + // given + refreshTokenRepository.save(refreshToken); + + // when + Optional resultRefreshToken = refreshTokenRepository.findById(refreshToken.getId()); + + // then + assertTrue(resultRefreshToken.isPresent()); + assertThat(refreshToken.getId()).isEqualTo(resultRefreshToken.get().getId()); + } + + @Test + @DisplayName("refresh token ID로 refresh token이 존재하는지 확인합니다.") + void testExistById() { + // given + refreshTokenRepository.save(refreshToken); + + // when + boolean resultRefreshToken = refreshTokenRepository.existsById(refreshToken.getId()); + + // then + assertTrue(resultRefreshToken); + } +} diff --git a/src/test/java/com/tasksprints/auction/auth/presentation/AuthControllerTest.java b/src/test/java/com/tasksprints/auction/auth/presentation/AuthControllerTest.java new file mode 100644 index 00000000..558e334d --- /dev/null +++ b/src/test/java/com/tasksprints/auction/auth/presentation/AuthControllerTest.java @@ -0,0 +1,172 @@ +package com.tasksprints.auction.auth.presentation; + +import static org.hamcrest.Matchers.containsString; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tasksprints.auction.BaseControllerTest; +import com.tasksprints.auction.auth.presentation.AuthController; +import com.tasksprints.auction.common.constant.ApiResponseMessages; +import com.tasksprints.auction.auth.domain.dto.request.LoginRequest; +import com.tasksprints.auction.auth.domain.dto.request.LoginRequest.Login; +import com.tasksprints.auction.auth.domain.dto.response.AccessToken; +import com.tasksprints.auction.auth.domain.dto.response.ResponseTokens; +import com.tasksprints.auction.auth.domain.dto.response.UserTokens; +import com.tasksprints.auction.auth.exception.AuthException; +import com.tasksprints.auction.auth.application.AuthService; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import jakarta.servlet.http.Cookie; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseCookie; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + + +@WebMvcTest(AuthController.class) +@MockBean(JpaMetamodelMappingContext.class) +class AuthControllerTest extends BaseControllerTest { + @Autowired + private MockMvc mockMvc; + + @MockBean + private AuthService authService; + + @Autowired + private ObjectMapper objectMapper; + + static ResponseCookie createResponseCookie() { + return ResponseCookie.from("refresh-token", "refreshTokenValue") + .maxAge(3600) + .secure(true) + .httpOnly(true) + .sameSite("None") + .path("/") + .build(); + } + + + @Nested + @DisplayName("Test login") + class LoginTest { + private final ResponseCookie responseCookie = ResponseCookie.from("refresh-token", "refreshTokenValue") + .maxAge(3600) + .secure(true) + .httpOnly(true) + .sameSite("None") + .path("/") + .build(); + + + @Test + @DisplayName("Return refresh and access token, when login success") + void login_success() throws Exception { + // given + AccessToken accessToken = AccessToken.of("accessTokenValue"); + UserTokens tokens = UserTokens.of(accessToken, "refreshTokenValue"); + LoginRequest.Login request = new Login("example@email.com", "password"); + ResponseTokens responseTokens = ResponseTokens.of(accessToken, responseCookie); + when(authService.validateLogin(any(), any())).thenReturn(1L); + when(authService.issueResponseTokens(any())).thenReturn(responseTokens); + + // when + ResultActions resultActions = mockMvc.perform(post("/api/v1/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultActions + .andExpect(status().isOk()) + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.data.accessToken").value("accessTokenValue")) + .andExpect(jsonPath("$.message").value(ApiResponseMessages.LOGIN_SUCCESS)) + .andExpect(header().string("set-cookie", containsString("refresh-token=refreshTokenValue"))) + .andExpect(header().string("set-cookie", containsString("Max-Age=3600"))) + .andExpect(header().string("set-cookie", containsString("Secure"))) + .andExpect(header().string("set-cookie", containsString("HttpOnly"))) + .andExpect(header().string("set-cookie", containsString("SameSite=None"))); + } + + @Test + @DisplayName("Throw Exception, when password is different") + void loginFailWhenPasswordIsDifferent() throws Exception { + // given + LoginRequest.Login request = new Login("example@email.com", "password"); + when(authService.validateLogin(any(), any())).thenThrow(AuthException.class); + + // when + ResultActions resultActions = mockMvc.perform(post("/api/v1/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultActions + .andExpect(status().isNotFound()) + .andExpect(jsonPath("$.message").value(ApiResponseMessages.USER_NOT_FOUND)); + } + + @Test + @DisplayName("Throw Exception, when email is different") + void loginFailWhenEmailIsDifferent() throws Exception { + // given + LoginRequest.Login request = new Login("example@email.com", "password"); + when(authService.validateLogin(any(), any())).thenThrow(UserNotFoundException.class); + + // when + ResultActions resultActions = mockMvc.perform(post("/api/v1/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultActions + .andExpect(status().isNotFound()) + .andExpect(jsonPath("$.message").value(ApiResponseMessages.USER_NOT_FOUND)); + } + } + + @Nested + @DisplayName("Test reissueToken") + class ReissueTest { + // given + Long userId = 1L; + AccessToken accessToken = AccessToken.of("accessTokenValue"); + ResponseTokens responseTokens = ResponseTokens.of(accessToken, createResponseCookie()); + Cookie cookie = new Cookie("refresh-token", "refreshToken"); + @Test + @DisplayName("If refresh token exist in repository, return refresh token") + void testReissue_success() throws Exception { + // given + when(authService.reissueResponseTokens(any())).thenReturn(responseTokens); + + // when + ResultActions resultActions = mockMvc.perform(get("/api/v1/auth/reissue") + .contentType(MediaType.APPLICATION_JSON) + .cookie(cookie) + ); + + // then + resultActions + .andExpect(status().isOk()) + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.data.accessToken").value("accessTokenValue")) + .andExpect(jsonPath("$.message").value(ApiResponseMessages.LOGIN_SUCCESS)) + .andExpect(header().string("set-cookie", containsString("refresh-token=refreshTokenValue"))) + .andExpect(header().string("set-cookie", containsString("Max-Age=3600"))) + .andExpect(header().string("set-cookie", containsString("Secure"))) + .andExpect(header().string("set-cookie", containsString("HttpOnly"))) + .andExpect(header().string("set-cookie", containsString("SameSite=None"))); + } + } +} + diff --git a/src/test/java/com/tasksprints/auction/api/BidControllerTest.java b/src/test/java/com/tasksprints/auction/bid/BidControllerTest.java similarity index 86% rename from src/test/java/com/tasksprints/auction/api/BidControllerTest.java rename to src/test/java/com/tasksprints/auction/bid/BidControllerTest.java index 17995512..7da5ccaa 100644 --- a/src/test/java/com/tasksprints/auction/api/BidControllerTest.java +++ b/src/test/java/com/tasksprints/auction/bid/BidControllerTest.java @@ -1,12 +1,13 @@ -package com.tasksprints.auction.api; +package com.tasksprints.auction.bid; import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.api.bid.BidController; +import com.tasksprints.auction.BaseControllerTest; +import com.tasksprints.auction.bid.domain.dto.BidResponse; +import com.tasksprints.auction.bid.application.service.BidService; +import com.tasksprints.auction.bid.presentation.BidController; import com.tasksprints.auction.common.constant.ApiResponseMessages; -import com.tasksprints.auction.domain.bid.dto.BidResponse; -import com.tasksprints.auction.domain.bid.service.BidService; -import com.tasksprints.auction.domain.chat.service.ChatService; -import com.tasksprints.auction.domain.user.service.UserService; +import com.tasksprints.auction.chat.application.service.ChatService; +import com.tasksprints.auction.user.application.service.UserService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -28,7 +29,7 @@ @WebMvcTest(BidController.class) @MockBean(JpaMetamodelMappingContext.class) -public class BidControllerTest { +public class BidControllerTest extends BaseControllerTest { @Autowired private MockMvc mockMvc; @@ -41,6 +42,7 @@ public class BidControllerTest { @MockBean UserService userService; + @MockBean private SimpMessageSendingOperations simpMessageSendingOperations; private ObjectMapper objectMapper; diff --git a/src/test/java/com/tasksprints/auction/common/config/TestAuthConfig.java b/src/test/java/com/tasksprints/auction/common/config/TestAuthConfig.java new file mode 100644 index 00000000..65fe5e68 --- /dev/null +++ b/src/test/java/com/tasksprints/auction/common/config/TestAuthConfig.java @@ -0,0 +1,19 @@ +package com.tasksprints.auction.common.config; + +import com.tasksprints.auction.common.jwt.JwtProvider; +import com.tasksprints.auction.auth.infrastructure.TokenExtractor; +import com.tasksprints.auction.auth.application.RefreshTokenCookieManager; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; + +@TestConfiguration +public class TestAuthConfig { + @MockBean + public JwtProvider jwtProvider; + + @MockBean + public RefreshTokenCookieManager refreshTokenCookieManager; + + @MockBean + public TokenExtractor accessTokenExtractor; +} diff --git a/src/test/java/com/tasksprints/auction/common/jwt/JwtProviderTest.java b/src/test/java/com/tasksprints/auction/common/jwt/JwtProviderTest.java index ea1bafc5..9482e6b0 100644 --- a/src/test/java/com/tasksprints/auction/common/jwt/JwtProviderTest.java +++ b/src/test/java/com/tasksprints/auction/common/jwt/JwtProviderTest.java @@ -1,6 +1,7 @@ package com.tasksprints.auction.common.jwt; -import com.tasksprints.auction.common.jwt.dto.response.JwtResponse; +import com.tasksprints.auction.common.config.JwtConfig; +import com.tasksprints.auction.auth.domain.dto.response.UserTokens; import io.jsonwebtoken.ExpiredJwtException; import java.time.Clock; import java.time.Instant; @@ -21,7 +22,7 @@ @ExtendWith(MockitoExtension.class) class JwtProviderTest { @Mock - private JwtProperties jwtProperties; + private JwtConfig jwtConfig; @Mock private Clock clock; @InjectMocks @@ -38,77 +39,79 @@ class JwtProviderTest { public void setUp() { when(clock.instant()).thenReturn(Instant.now()); when(clock.getZone()).thenReturn(ZONE_ID); - when(jwtProperties.getIssuer()).thenReturn(ISSUER); - when(jwtProperties.getSecretKey()).thenReturn(SECRET_KEY); + when(jwtConfig.getIssuer()).thenReturn(ISSUER); + when(jwtConfig.getSecretKey()).thenReturn(SECRET_KEY); } private void stubAccessTokenExpiration(Long expireMs) { - when(jwtProperties.getExpireMs()).thenReturn(expireMs); + when(jwtConfig.getAccessExpireMs()).thenReturn(expireMs); } private void stubRefreshTokenExpiration(Long expireMs) { - when(jwtProperties.getRefreshExpireMs()).thenReturn(expireMs); + when(jwtConfig.getRefreshExpireMs()).thenReturn(expireMs); } @Test - @DisplayName("token generator 을 통한 access token, refresh token 발급 테스트") + @DisplayName("accessToken과 refreshToken을 발급해야한다.") void generateToken() { - JwtResponse jwtResponse = jwtProvider.generateToken(1L, "admin"); + // when + UserTokens userTokens = jwtProvider.generateToken("1L"); - assertNotNull(jwtResponse.getAccessToken(), "access token 이 발급되어야 합니다."); - assertNotNull(jwtResponse.getRefreshToken(), "refresh token 이 발급되어야 합니다."); + // then + assertNotNull(userTokens.getAccessToken(), "access token 이 발급되어야 합니다."); + assertNotNull(userTokens.getRefreshToken(), "refresh token 이 발급되어야 합니다."); } @Test - @DisplayName("access token 발급 테스트") - void createAccessToken() { - stubAccessTokenExpiration(VALID_EXPIRE_MS); - - String token = jwtProvider.createAccessToken(1L, "admin"); - - assertNotNull(token, "access token 이 발급되어야 합니다."); - } - - @Test - @DisplayName("refresh token 발급 테스트") - void createRefreshToken() { - stubRefreshTokenExpiration(REFRESH_EXPIRE_MS); - String token = jwtProvider.createRefreshToken(); - assertNotNull(token, "refresh token 이 발급되어야 합니다."); - } - - @Test - @DisplayName("유효한 토큰 테스트") + @DisplayName("유효기간에는 토큰이 유효해야한다.") void verifyToken_valid() { + // given stubAccessTokenExpiration(VALID_EXPIRE_MS); + stubRefreshTokenExpiration(REFRESH_EXPIRE_MS); - String token = jwtProvider.createAccessToken(1L, "admin"); + // when + UserTokens userTokens = jwtProvider.generateToken("1L"); - Assertions.assertTrue(jwtProvider.verifyToken(token)); + // then + Assertions.assertDoesNotThrow(() -> { + jwtProvider.validateToken(userTokens.getAccessToken().accessToken()); + }); + Assertions.assertDoesNotThrow(() -> { + jwtProvider.validateToken(userTokens.getRefreshToken()); + }); } @Test - @DisplayName("만료된 토큰 테스트") + @DisplayName("유효기간이 지나면, 토큰 만료 예외를 반환해야한다") void verifyToken_expired() { + // given stubAccessTokenExpiration(EXPIRED_EXPIRE_MS); + stubRefreshTokenExpiration(EXPIRED_EXPIRE_MS); + + // when + UserTokens userTokens = jwtProvider.generateToken("1L"); - String token = jwtProvider.createAccessToken(1L, "admin"); + // then + Assertions.assertThrows(ExpiredJwtException.class, () -> { + jwtProvider.validateToken(userTokens.getRefreshToken()); + }, "리프레시토큰이 즉시 만료되어야 합니다."); Assertions.assertThrows(ExpiredJwtException.class, () -> { - jwtProvider.verifyToken(token); - }, "토큰이 즉시 만료되어야 합니다."); + jwtProvider.validateToken(userTokens.getAccessToken().accessToken()); + }, "액세스토큰이 즉시 만료되어야 합니다."); } @Test @DisplayName("디코딩 된 페이로드 정확성 테스트") void getClaims() { + // given stubAccessTokenExpiration(VALID_EXPIRE_MS); + UserTokens userTokens = jwtProvider.generateToken("1L"); - String token = jwtProvider.createAccessToken(1L, "admin"); - Long decodedUserId = jwtProvider.getClaims(token).get("userId", Long.class); - String decodedUserRole = jwtProvider.getClaims(token).get("userRole", String.class); + // when + String decodedUserId = jwtProvider.getSubject(userTokens.getAccessToken().accessToken()); - assertThat(decodedUserId).isEqualTo(1L); - assertThat(decodedUserRole).isEqualTo("admin"); + // then + assertThat(decodedUserId).isEqualTo("1L"); } } diff --git a/src/test/java/com/tasksprints/auction/domain/auth/AccessTokenExtractorTest.java b/src/test/java/com/tasksprints/auction/domain/auth/AccessTokenExtractorTest.java new file mode 100644 index 00000000..43a63e30 --- /dev/null +++ b/src/test/java/com/tasksprints/auction/domain/auth/AccessTokenExtractorTest.java @@ -0,0 +1,50 @@ +package com.tasksprints.auction.domain.auth; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.tasksprints.auction.auth.infrastructure.AccessTokenExtractor; +import com.tasksprints.auction.auth.infrastructure.TokenExtractor; +import com.tasksprints.auction.auth.exception.AccessTokenException; +import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class AccessTokenExtractorTest { + private TokenExtractor tokenExtractor; + + @BeforeEach + void setUp() { + tokenExtractor = new AccessTokenExtractor(); + } + + @Test + @DisplayName("헤더에서 access token 을 꺼낸다") + void testExtractToken_success() { + // given + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getHeader("Authorization")).thenReturn("Bearer token"); + + // when + String accessToken = tokenExtractor.extractToken(request); + + // then + assertThat(accessToken).isEqualTo("token"); + } + + @Test + @DisplayName("access token 이 존재하지 않으면 예외를 반환한다") + void testExtractToken_fail() { + // given + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getHeader("Authorization")).thenReturn("notoken"); + + // when, then + Assertions.assertThrows(AccessTokenException.class, () -> { + tokenExtractor.extractToken(request); + }); + } +} diff --git a/src/test/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImplTest.java b/src/test/java/com/tasksprints/auction/payment/application/PaymentServiceImplTest.java similarity index 88% rename from src/test/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImplTest.java rename to src/test/java/com/tasksprints/auction/payment/application/PaymentServiceImplTest.java index d936f11e..7151f42f 100644 --- a/src/test/java/com/tasksprints/auction/domain/payment/service/PaymentServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/payment/application/PaymentServiceImplTest.java @@ -1,15 +1,16 @@ -package com.tasksprints.auction.domain.payment.service; - -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.client.PaymentApiSerializer; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentErrorResponse; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.payment.model.Payment; -import com.tasksprints.auction.domain.payment.repository.PaymentRepository; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.wallet.model.Wallet; -import com.tasksprints.auction.domain.wallet.service.WalletService; +package com.tasksprints.auction.payment.application; + +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.infrastructure.client.PaymentApiSerializer; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.domain.dto.response.PaymentErrorResponse; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.domain.entity.Payment; +import com.tasksprints.auction.payment.infrastructure.PaymentRepository; +import com.tasksprints.auction.payment.application.service.PaymentServiceImpl; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.wallet.application.service.WalletService; +import com.tasksprints.auction.user.domain.entity.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/com/tasksprints/auction/domain/payment/repository/PaymentRepositoryTest.java b/src/test/java/com/tasksprints/auction/payment/infrastructure/PaymentRepositoryTest.java similarity index 86% rename from src/test/java/com/tasksprints/auction/domain/payment/repository/PaymentRepositoryTest.java rename to src/test/java/com/tasksprints/auction/payment/infrastructure/PaymentRepositoryTest.java index 4aecc0b7..e6dd0b86 100644 --- a/src/test/java/com/tasksprints/auction/domain/payment/repository/PaymentRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/payment/infrastructure/PaymentRepositoryTest.java @@ -1,10 +1,11 @@ -package com.tasksprints.auction.domain.payment.repository; +package com.tasksprints.auction.payment.infrastructure; import com.tasksprints.auction.common.config.QueryDslConfig; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.payment.model.PayStatus; -import com.tasksprints.auction.domain.payment.model.PayType; -import com.tasksprints.auction.domain.payment.model.Payment; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.domain.entity.PayStatus; +import com.tasksprints.auction.payment.domain.entity.PayType; +import com.tasksprints.auction.payment.domain.entity.Payment; +import com.tasksprints.auction.payment.infrastructure.PaymentRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/tasksprints/auction/domain/payment/client/ClientWrapperTest.java b/src/test/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapperTest.java similarity index 88% rename from src/test/java/com/tasksprints/auction/domain/payment/client/ClientWrapperTest.java rename to src/test/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapperTest.java index 8ea3231b..d2d0a234 100644 --- a/src/test/java/com/tasksprints/auction/domain/payment/client/ClientWrapperTest.java +++ b/src/test/java/com/tasksprints/auction/payment/infrastructure/client/ClientWrapperTest.java @@ -1,6 +1,7 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; -import com.tasksprints.auction.domain.payment.api.Response; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.infrastructure.client.ClientWrapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/com/tasksprints/auction/domain/payment/client/TossPaymentImplTest.java b/src/test/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImplTest.java similarity index 90% rename from src/test/java/com/tasksprints/auction/domain/payment/client/TossPaymentImplTest.java rename to src/test/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImplTest.java index 90d4ddae..af9c93d4 100644 --- a/src/test/java/com/tasksprints/auction/domain/payment/client/TossPaymentImplTest.java +++ b/src/test/java/com/tasksprints/auction/payment/infrastructure/client/TossPaymentImplTest.java @@ -1,11 +1,14 @@ -package com.tasksprints.auction.domain.payment.client; +package com.tasksprints.auction.payment.infrastructure.client; import com.fasterxml.jackson.databind.ObjectMapper; import com.tasksprints.auction.common.properties.PaymentProperties; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentErrorResponse; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.infrastructure.client.HttpClientWrapper; +import com.tasksprints.auction.payment.infrastructure.client.PaymentApiSerializer; +import com.tasksprints.auction.payment.infrastructure.client.TossPaymentImpl; +import com.tasksprints.auction.payment.domain.dto.request.PaymentRequest; +import com.tasksprints.auction.payment.domain.dto.response.PaymentErrorResponse; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/tasksprints/auction/api/PaymentControllerTest.java b/src/test/java/com/tasksprints/auction/payment/presentation/PaymentControllerTest.java similarity index 91% rename from src/test/java/com/tasksprints/auction/api/PaymentControllerTest.java rename to src/test/java/com/tasksprints/auction/payment/presentation/PaymentControllerTest.java index 5baef70b..fa47274b 100644 --- a/src/test/java/com/tasksprints/auction/api/PaymentControllerTest.java +++ b/src/test/java/com/tasksprints/auction/payment/presentation/PaymentControllerTest.java @@ -1,20 +1,17 @@ -package com.tasksprints.auction.api; +package com.tasksprints.auction.payment.presentation; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.api.payment.PaymentController; +import com.tasksprints.auction.BaseControllerTest; import com.tasksprints.auction.common.constant.ApiResponseMessages; -import com.tasksprints.auction.domain.payment.api.Response; -import com.tasksprints.auction.domain.payment.dto.request.PaymentRequest; -import com.tasksprints.auction.domain.payment.dto.response.PaymentErrorResponse; -import com.tasksprints.auction.domain.payment.dto.response.PaymentResponse; -import com.tasksprints.auction.domain.payment.exception.InvalidSessionException; -import com.tasksprints.auction.domain.payment.exception.PaymentDataMismatchException; -import com.tasksprints.auction.domain.payment.service.PaymentService; +import com.tasksprints.auction.payment.api.Response; +import com.tasksprints.auction.payment.domain.dto.response.PaymentErrorResponse; +import com.tasksprints.auction.payment.domain.dto.response.PaymentResponse; +import com.tasksprints.auction.payment.exception.InvalidSessionException; +import com.tasksprints.auction.payment.exception.PaymentDataMismatchException; +import com.tasksprints.auction.payment.application.service.PaymentService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -36,7 +33,7 @@ @WebMvcTest(PaymentController.class) @MockBean(JpaMetamodelMappingContext.class) -public class PaymentControllerTest { +public class PaymentControllerTest extends BaseControllerTest { @Autowired private MockMvc mockMvc; diff --git a/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java b/src/test/java/com/tasksprints/auction/product/application/ProductServiceImplTest.java similarity index 88% rename from src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java rename to src/test/java/com/tasksprints/auction/product/application/ProductServiceImplTest.java index b751f060..633f591c 100644 --- a/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/product/application/ProductServiceImplTest.java @@ -1,20 +1,20 @@ -package com.tasksprints.auction.domain.product; - -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.product.dto.request.ProductRequest; -import com.tasksprints.auction.domain.product.dto.response.ProductResponse; -import com.tasksprints.auction.domain.product.exception.ProductNotFoundException; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.product.repository.ProductImageRepository; -import com.tasksprints.auction.domain.product.repository.ProductRepository; -import com.tasksprints.auction.domain.product.service.ProductServiceImpl; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +package com.tasksprints.auction.product.application; + +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.product.application.service.ProductServiceImpl; +import com.tasksprints.auction.product.domain.dto.request.ProductRequest; +import com.tasksprints.auction.product.domain.dto.response.ProductResponse; +import com.tasksprints.auction.product.exception.ProductNotFoundException; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductCategory; +import com.tasksprints.auction.product.infrastructure.ProductImageRepository; +import com.tasksprints.auction.product.infrastructure.ProductRepository; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import org.junit.jupiter.api.*; import org.mockito.InjectMocks; import org.mockito.Mock; diff --git a/src/test/java/com/tasksprints/auction/domain/product/ProductRepositoryTest.java b/src/test/java/com/tasksprints/auction/product/infrastructure/ProductRepositoryTest.java similarity index 89% rename from src/test/java/com/tasksprints/auction/domain/product/ProductRepositoryTest.java rename to src/test/java/com/tasksprints/auction/product/infrastructure/ProductRepositoryTest.java index 2972ffef..a7067fdf 100644 --- a/src/test/java/com/tasksprints/auction/domain/product/ProductRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/product/infrastructure/ProductRepositoryTest.java @@ -1,19 +1,15 @@ -package com.tasksprints.auction.domain.product; +package com.tasksprints.auction.product.infrastructure; import com.tasksprints.auction.common.config.QueryDslConfig; -import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; -import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.auction.repository.AuctionRepository; -import com.tasksprints.auction.domain.product.model.Product; -import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.product.model.ProductImage; -import com.tasksprints.auction.domain.product.repository.ProductRepository; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; -import org.assertj.core.api.Assertions; +import com.tasksprints.auction.auction.domain.dto.request.AuctionRequest; +import com.tasksprints.auction.auction.domain.entity.Auction; +import com.tasksprints.auction.auction.domain.entity.AuctionCategory; +import com.tasksprints.auction.auction.domain.entity.AuctionStatus; +import com.tasksprints.auction.auction.infrastructure.AuctionRepository; +import com.tasksprints.auction.product.domain.entity.Product; +import com.tasksprints.auction.product.domain.entity.ProductCategory; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/tasksprints/auction/api/ProductControllerTest.java b/src/test/java/com/tasksprints/auction/product/presentation/ProductControllerTest.java similarity index 93% rename from src/test/java/com/tasksprints/auction/api/ProductControllerTest.java rename to src/test/java/com/tasksprints/auction/product/presentation/ProductControllerTest.java index 54212bc5..fe04f2c5 100644 --- a/src/test/java/com/tasksprints/auction/api/ProductControllerTest.java +++ b/src/test/java/com/tasksprints/auction/product/presentation/ProductControllerTest.java @@ -1,11 +1,11 @@ -package com.tasksprints.auction.api; +package com.tasksprints.auction.product.presentation; import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.api.product.ProductController; +import com.tasksprints.auction.BaseControllerTest; import com.tasksprints.auction.common.constant.ApiResponseMessages; -import com.tasksprints.auction.domain.product.dto.request.ProductRequest; -import com.tasksprints.auction.domain.product.dto.response.ProductResponse; -import com.tasksprints.auction.domain.product.service.ProductService; +import com.tasksprints.auction.product.domain.dto.request.ProductRequest; +import com.tasksprints.auction.product.domain.dto.response.ProductResponse; +import com.tasksprints.auction.product.application.service.ProductService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -28,7 +28,7 @@ @WebMvcTest(ProductController.class) @MockBean(JpaMetamodelMappingContext.class) -public class ProductControllerTest { +public class ProductControllerTest extends BaseControllerTest { @Autowired private MockMvc mockMvc; diff --git a/src/test/java/com/tasksprints/auction/domain/user/UserServiceImplTest.java b/src/test/java/com/tasksprints/auction/user/application/UserServiceImplTest.java similarity index 75% rename from src/test/java/com/tasksprints/auction/domain/user/UserServiceImplTest.java rename to src/test/java/com/tasksprints/auction/user/application/UserServiceImplTest.java index 37db4e07..b8a6c0cb 100644 --- a/src/test/java/com/tasksprints/auction/domain/user/UserServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/user/application/UserServiceImplTest.java @@ -1,12 +1,11 @@ -package com.tasksprints.auction.domain.user; - -import com.tasksprints.auction.domain.user.dto.request.UserRequest; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; -import com.tasksprints.auction.domain.user.service.UserServiceImpl; -import com.tasksprints.auction.domain.wallet.model.Wallet; +package com.tasksprints.auction.user.application; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.user.application.service.UserServiceImpl; +import com.tasksprints.auction.user.domain.dto.request.UserRequest; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.infrastructure.UserRepository; import org.junit.jupiter.api.*; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -181,4 +180,43 @@ void shouldThrowExceptionWhenUserNotFound() { verify(userRepository, never()).delete(any(User.class)); } } + + @Nested + @DisplayName("Get User By Email") + class GetUserByEmailTests { + + @Test + @DisplayName("Get user's detail information by email") + void shouldReturnUserWhenFound() { + // given + String findEmail = "test@example.com"; + when(userRepository.findByEmail(any())).thenReturn(Optional.ofNullable(existingUser)); + + // when + UserDetailResponse user = userService.getUserDetailByEmail(findEmail); + + // then + Assertions.assertNotNull(user); + Assertions.assertEquals(existingUser.getId(), user.getId()); + Assertions.assertEquals(existingUser.getName(), user.getName()); + verify(userRepository, times(1)).findByEmail(findEmail); + } + + @Test + @DisplayName("Should throw an exception if the user cannot be found by email") + void shouldThrowExceptionWhenUserNotFound() { + // given + String findEmail = "different@example.com"; + when(userRepository.findByEmail(any())).thenReturn(Optional.empty()); + + // when + UserNotFoundException exception = Assertions.assertThrows(UserNotFoundException.class, () -> { + userService.getUserDetailByEmail(findEmail); + }); + + // then + Assertions.assertEquals("User not found with email " + findEmail, exception.getMessage()); + verify(userRepository, times(1)).findByEmail(findEmail); + } + } } diff --git a/src/test/java/com/tasksprints/auction/domain/user/UserRepositoryTest.java b/src/test/java/com/tasksprints/auction/user/infrastructure/UserRepositoryTest.java similarity index 78% rename from src/test/java/com/tasksprints/auction/domain/user/UserRepositoryTest.java rename to src/test/java/com/tasksprints/auction/user/infrastructure/UserRepositoryTest.java index 45f64ea9..c121d781 100644 --- a/src/test/java/com/tasksprints/auction/domain/user/UserRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/user/infrastructure/UserRepositoryTest.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.user; +package com.tasksprints.auction.user.infrastructure; import com.tasksprints.auction.common.config.QueryDslConfig; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -95,4 +95,25 @@ void createUser() { log.info("Created User: {}", createdUser); } } + + + @DisplayName("find User By Email") + @Test + void findUserByEmail() { + // given + User createdUser = userRepository.save(user); + String findEmail = "test@example.com"; + + // when + User foundUser = userRepository.findByEmail(findEmail).orElse(null); + + // then + Assertions.assertNotNull(foundUser); + Assertions.assertEquals(createdUser.getId(), foundUser.getId()); + Assertions.assertEquals("testUser", foundUser.getName()); + Assertions.assertEquals("testNick", foundUser.getNickName()); + Assertions.assertEquals("test@example.com", foundUser.getEmail()); + + log.info("Found User: {}", foundUser); + } } diff --git a/src/test/java/com/tasksprints/auction/api/UserControllerTest.java b/src/test/java/com/tasksprints/auction/user/presentation/UserControllerTest.java similarity index 94% rename from src/test/java/com/tasksprints/auction/api/UserControllerTest.java rename to src/test/java/com/tasksprints/auction/user/presentation/UserControllerTest.java index 3b3dfac5..102c944b 100644 --- a/src/test/java/com/tasksprints/auction/api/UserControllerTest.java +++ b/src/test/java/com/tasksprints/auction/user/presentation/UserControllerTest.java @@ -1,13 +1,13 @@ -package com.tasksprints.auction.api; +package com.tasksprints.auction.user.presentation; import com.fasterxml.jackson.databind.ObjectMapper; -import com.tasksprints.auction.api.user.UserController; +import com.tasksprints.auction.BaseControllerTest; import com.tasksprints.auction.common.constant.ApiResponseMessages; -import com.tasksprints.auction.domain.user.dto.request.UserRequest; -import com.tasksprints.auction.domain.user.dto.response.UserDetailResponse; -import com.tasksprints.auction.domain.user.dto.response.UserSummaryResponse; -import com.tasksprints.auction.domain.user.exception.UserNotFoundException; -import com.tasksprints.auction.domain.user.service.UserService; +import com.tasksprints.auction.user.domain.dto.request.UserRequest; +import com.tasksprints.auction.user.domain.dto.response.UserDetailResponse; +import com.tasksprints.auction.user.domain.dto.response.UserSummaryResponse; +import com.tasksprints.auction.user.exception.UserNotFoundException; +import com.tasksprints.auction.user.application.service.UserService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -30,7 +30,7 @@ @WebMvcTest(UserController.class) @MockBean(JpaMetamodelMappingContext.class) -class UserControllerTest { +class UserControllerTest extends BaseControllerTest { @Autowired private MockMvc mockMvc; diff --git a/src/test/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImplTest.java b/src/test/java/com/tasksprints/auction/wallet/application/WalletServiceImplTest.java similarity index 85% rename from src/test/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImplTest.java rename to src/test/java/com/tasksprints/auction/wallet/application/WalletServiceImplTest.java index 2618fb93..32fd4ce2 100644 --- a/src/test/java/com/tasksprints/auction/domain/wallet/service/WalletServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/wallet/application/WalletServiceImplTest.java @@ -1,8 +1,8 @@ -package com.tasksprints.auction.domain.wallet.service; +package com.tasksprints.auction.wallet.application; -import com.tasksprints.auction.domain.wallet.model.Wallet; -import com.tasksprints.auction.domain.wallet.repository.WalletRepository; -import org.assertj.core.api.Assertions; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.wallet.infrastructure.WalletRepository; +import com.tasksprints.auction.wallet.application.service.WalletServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/tasksprints/auction/domain/wallet/repository/WalletRepositoryTest.java b/src/test/java/com/tasksprints/auction/wallet/infrastructure/WalletRepositoryTest.java similarity index 81% rename from src/test/java/com/tasksprints/auction/domain/wallet/repository/WalletRepositoryTest.java rename to src/test/java/com/tasksprints/auction/wallet/infrastructure/WalletRepositoryTest.java index bf358704..11f66ebc 100644 --- a/src/test/java/com/tasksprints/auction/domain/wallet/repository/WalletRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/wallet/infrastructure/WalletRepositoryTest.java @@ -1,9 +1,10 @@ -package com.tasksprints.auction.domain.wallet.repository; +package com.tasksprints.auction.wallet.infrastructure; import com.tasksprints.auction.common.config.QueryDslConfig; -import com.tasksprints.auction.domain.user.model.User; -import com.tasksprints.auction.domain.user.repository.UserRepository; -import com.tasksprints.auction.domain.wallet.model.Wallet; +import com.tasksprints.auction.wallet.domain.entity.Wallet; +import com.tasksprints.auction.user.domain.entity.User; +import com.tasksprints.auction.user.infrastructure.UserRepository; +import com.tasksprints.auction.wallet.infrastructure.WalletRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;