Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/api/v1/campaigns")
Expand All @@ -30,7 +31,7 @@ public CampaignController(CampaignService campaignService) {

@PostMapping
public ResponseEntity<CreateCampaignResponse> createCampaigns(@Auth Member member,
@RequestBody CreateCampaignRequest request) {
@RequestBody CreateCampaignRequest request) {
var response = campaignService.createCampaign(request, member, LocalDateTime.now());
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
Expand All @@ -52,4 +53,12 @@ public ResponseEntity<List<MemberCampaignResponse>> readMemberCampaign(@Auth Mem
List<MemberCampaignResponse> response = campaignService.readMemberCampaign(member);
return ResponseEntity.ok(response);
}

@GetMapping("/search")
public ResponseEntity<List<ReadCampaignResponse>> searchCampaigns(@RequestParam String keyword,
@RequestParam int page,
@RequestParam int size) {
List<ReadCampaignResponse> response = campaignService.searchByProductName(keyword, page, size);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
import cholog.wiseshop.exception.WiseShopException;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -127,4 +131,25 @@ public List<MemberCampaignResponse> readMemberCampaign(Member member) {
return MemberCampaignResponse.of(campaign, products.getFirst());
}).toList();
}

public List<ReadCampaignResponse> searchByProductName(String keyword, int page, int size) {
keyword = keyword.trim();
Pageable pageable = PageRequest.of(page, size, Sort.by("id").ascending());
Page<Product> pages = productRepository.findByNameContaining(keyword, pageable);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Page<Product> pages = productRepository.findByNameContaining(keyword, pageable);
Page<Product> pages = productRepository.findAllByNameContaining(keyword, pageable);

사소한건데 All 붙이기로 했었던걸로 기억하고 있어용

return pages.getContent().stream()
.map(product -> {
Campaign campaign = product.getCampaign();
return new ReadCampaignResponse(
campaign.getId(),
campaign.getStartDate().toString(),
campaign.getEndDate().toString(),
campaign.getGoalQuantity(),
campaign.getSoldQuantity(),
product.getStock().getTotalQuantity(),
campaign.getState(),
new ProductResponse(product),
campaign.getMember().orElse(Member.createEmpty()).getId()
);
}).toList();
Comment on lines +139 to +153

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return pages.getContent().stream()
.map(product -> {
Campaign campaign = product.getCampaign();
return new ReadCampaignResponse(
campaign.getId(),
campaign.getStartDate().toString(),
campaign.getEndDate().toString(),
campaign.getGoalQuantity(),
campaign.getSoldQuantity(),
product.getStock().getTotalQuantity(),
campaign.getState(),
new ProductResponse(product),
campaign.getMember().orElse(Member.createEmpty()).getId()
);
}).toList();
return pages.getContent().stream()
.map(product -> {
Campaign campaign = product.getCampaign();
Member member = campaign.getMember().orElse(Member.createEmpty());
return new ReadCampaignResponse(
campaign.getId(),
campaign.getStartDate().toString(),
campaign.getEndDate().toString(),
campaign.getGoalQuantity(),
campaign.getSoldQuantity(),
product.getStock().getTotalQuantity(),
campaign.getState(),
new ProductResponse(product),
member.getId()
);
}).toList();

멤버는 바깥에서 분리하는건 어떤가용??

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import cholog.wiseshop.db.campaign.Campaign;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -14,4 +16,8 @@ public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findAllByCampaign(Campaign campaign);

List<Product> findAllByOwnerId(Long memberId);

@Query(value = "SELECT p FROM Product p JOIN FETCH p.stock JOIN FETCH p.campaign WHERE p.name LIKE %:keyword%",
countQuery = "SELECT COUNT(p) FROM Product p WHERE p.name LIKE %:keyword%")
Page<Product> findByNameContaining(String keyword, Pageable pageable);
}
27 changes: 27 additions & 0 deletions src/test/java/cholog/wiseshop/domain/CampaignServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -311,4 +311,31 @@ class 캠페인을_조회한다 {
assertThat(response).hasSize(2);
}
}

@Nested
class 캠페인을_상품이름으로_검색한다 {

@Test
void 캠페인_상품이름으로_검색() {
// given
Member member = memberRepository.save(MemberFixture.최준호());
Campaign campaign = campaignRepository.save(CampaignFixture.진행중인_보약_캠페인(member));
Stock stock = new Stock(20);
stockRepository.save(stock);
productRepository.save(
ProductFixture.재고가_설정된_이름있는_캠페인의_보약(campaign, stock, member, "아주 좋은 보약"));

Campaign campaign2 = campaignRepository.save(CampaignFixture.진행중인_보약_캠페인(member));
Stock stock2 = new Stock(30);
stockRepository.save(stock2);
productRepository.save(
ProductFixture.재고가_설정된_이름있는_캠페인의_보약(campaign2, stock2, member, "아주 나쁜 보약"));

// when
List<ReadCampaignResponse> response = campaignService.searchByProductName("좋은", 0, 10);

// then
assertThat(response).hasSize(1);
}
}
}
14 changes: 14 additions & 0 deletions src/test/java/cholog/wiseshop/fixture/ProductFixture.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,20 @@ public class ProductFixture {
.build();
}

public static Product 재고가_설정된_이름있는_캠페인의_보약(
Campaign campaign,
Stock stock,
Member owner,
String name) {
return Product.builder()
.name(name)
.campaign(campaign)
.price(1000)
.stock(stock)
.owner(owner)
.build();
}

public static Product 재고가_설정된_캠페인의_보약(Campaign campaign, Stock stock, Member owner) {
return Product.builder()
.campaign(campaign)
Expand Down