From a6bd873d355277aa866146901d426495ef386cd9 Mon Sep 17 00:00:00 2001 From: sojungpp Date: Sat, 9 Sep 2023 18:12:09 +0900 Subject: [PATCH] =?UTF-8?q?#168=20refactor:=20productService=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../psr/psr/product/service/ProductService.kt | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/psr/psr/product/service/ProductService.kt b/src/main/kotlin/com/psr/psr/product/service/ProductService.kt index 785c83f..c935ae9 100644 --- a/src/main/kotlin/com/psr/psr/product/service/ProductService.kt +++ b/src/main/kotlin/com/psr/psr/product/service/ProductService.kt @@ -35,27 +35,33 @@ class ProductService( private val productReportRepository: ProductReportRepository, private val userRepository: UserRepository, ) { + + // 상품 메인 조회 fun getProducts(user: User, category: String, pageable: Pageable): GetProductsRes { var interestCategoryList: MutableList = ArrayList() + // 카테고리를 선택하지 않았을 때, 유저의 관심목록에 해당하는 게시글 if(category.isEmpty()) { - // 유저의 관심목록 val userInterestList = userInterestRepository.findByUserAndStatus(user, ACTIVE_STATUS) interestCategoryList = userInterestList.stream().map { ui -> ui.category }.toList() } else { interestCategoryList.add(Category.getCategoryByName(category)) } + // 카테고리 상품들 val productList = productRepository.findAllCategoryProducts(pageable, user, interestCategoryList) + // 인기순(하트순) 상위 5개 상품들 val popularList = productRepository.findTop5PopularProducts(user, interestCategoryList) return GetProductsRes(popularList, productList) } + // 마이 게시글 fun getMyProducts(user: User, pageable: Pageable): GetMyProductsRes { val myProductList: Page? = productRepository.findAllByUserAndStatusOrderByCreatedAtDesc(user, ACTIVE_STATUS, pageable) return GetMyProductsRes.toDto(myProductList) } + // 유저 상품 목록 fun getProductsByUser(userId: Long, pageable: Pageable): GetProductsByUserRes { val user: User = userRepository.findByIdAndStatus(userId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_USER) val products: Page? = productRepository.findAllByUserAndStatusOrderByCreatedAtDesc(user, ACTIVE_STATUS, pageable) @@ -63,6 +69,7 @@ class ProductService( return GetProductsByUserRes.toDto(user, products) } + // 상품 상세 조회 - 상품 fun getProductDetail(user: User, productId: Long): GetProductDetailRes { val product: Product = productRepository.findByIdAndStatus(productId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_PRODUCT) val isOwner = product.user == user @@ -73,27 +80,33 @@ class ProductService( return GetProductDetailRes.toDto(isOwner, product, imgList, numOfLikes, isLike) } + // 상품 신고 fun reportProduct(user: User, productId: Long, category: ReportCategory) { val product: Product = productRepository.findByIdAndStatus(productId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_PRODUCT) + // 신고한 글은 재신고 불가 if (productReportRepository.findByProductAndUserAndStatus(product, user, ACTIVE_STATUS) != null) throw BaseException(BaseResponseCode.REPORT_ALREADY_COMPLETE) productReportRepository.save(ProductReport.toEntity(product, user, category)) } + // 찜 목록 fun getLikeProducts(user: User, pageable: Pageable): GetLikeProductsRes { val productList: Page? = productLikeRepository.findByUserAndStatus(user, ACTIVE_STATUS, pageable)?.map { it.product } return GetLikeProductsRes.toDto(productList) } + // 홈 화면 조회 - 상품 fun getHomePage(): GetHomePageRes { // MANAGER 상품 val mainTopProductList = userRepository.findByTypeAndStatus(Type.MANAGER, ACTIVE_STATUS)!!.products + // 전체 상품 val productList = productRepository.findAllByStatus(ACTIVE_STATUS) return GetHomePageRes.toDto(mainTopProductList, productList) } + // 상품 등록 @Transactional fun createProduct(user: User, request: CreateproductReq) { val product = productRepository.save(Product.toEntity(user, request)) @@ -102,6 +115,7 @@ class ProductService( request.imgList.map { imgUrl: String -> productImgRepository.save(ProductImg.toEntity(product, imgUrl)) } } + // 상품 찜 fun likeProduct(user: User, productId: Long) { val product: Product = productRepository.findByIdAndStatus(productId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_PRODUCT) @@ -120,30 +134,38 @@ class ProductService( } } + // 상품 삭제 fun deleteProduct(user: User, productId: Long) { val product: Product = productRepository.findByIdAndStatus(productId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_PRODUCT) + // 해당 글의 작성자 여부 확인 if(product.user != user) throw BaseException(BaseResponseCode.INVALID_PRODUCT_USER) productRepository.deleteById(productId) } + // 상품 검색 fun searchProducts(user: User, keyword: String, sortType: String, pageable: Pageable): GetSearchProducts { + // 인기순 val productList: Page = if(sortType == POPULAR) { productRepository.searchProductsByLike(user, keyword, pageable) - } else { + } + // 최신순 (default) + else { productRepository.searchProductsByCreatedAt(user, keyword, pageable) } return GetSearchProducts.toDto(productList) } - + // 상품 수정 @Transactional fun modifyProduct(user: User, productId: Long, request: CreateproductReq) { val product: Product = productRepository.findByIdAndStatus(productId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_PRODUCT) + // 해당 글의 작성자 여부 확인 if(product.user != user) throw BaseException(BaseResponseCode.INVALID_PRODUCT_USER) product.modifyProduct(request) + // 이미지 전체 삭제 후 재저장 productImgRepository.deleteByProduct(product) // 이미지가 있는 경우 저장 if (request.imgList != null) {