Skip to content

Commit 1ad376d

Browse files
authored
Merge pull request #177 from YAPP-Github/feat/PRODUCT-259
[Feat] 최신 상점 조회 API의 응원 내용 추가
2 parents 671b4ee + 17a10e3 commit 1ad376d

File tree

10 files changed

+166
-34
lines changed

10 files changed

+166
-34
lines changed
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package eatda.controller.store;
22

33
import eatda.domain.store.Store;
4+
import java.util.List;
45

56
public record StorePreviewResponse(
67
long id,
78
String imageUrl,
89
String name,
910
String district,
1011
String neighborhood,
11-
String category
12+
String category,
13+
List<String> cheerDescriptions
1214
) {
1315

1416
public StorePreviewResponse(Store store, String imageUrl) {
@@ -18,7 +20,8 @@ public StorePreviewResponse(Store store, String imageUrl) {
1820
store.getName(),
1921
store.getAddressDistrict(),
2022
store.getAddressNeighborhood(),
21-
store.getCategory().getCategoryName()
23+
store.getCategory().getCategoryName(),
24+
store.getCheerDescriptions()
2225
);
2326
}
2427
}

src/main/java/eatda/domain/store/Store.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eatda.domain.store;
22

33
import eatda.domain.AuditingEntity;
4+
import eatda.domain.cheer.Cheer;
45
import jakarta.persistence.Column;
56
import jakarta.persistence.Embedded;
67
import jakarta.persistence.Entity;
@@ -9,7 +10,10 @@
910
import jakarta.persistence.GeneratedValue;
1011
import jakarta.persistence.GenerationType;
1112
import jakarta.persistence.Id;
13+
import jakarta.persistence.OneToMany;
1214
import jakarta.persistence.Table;
15+
import java.util.ArrayList;
16+
import java.util.List;
1317
import lombok.AccessLevel;
1418
import lombok.Builder;
1519
import lombok.Getter;
@@ -54,6 +58,9 @@ public class Store extends AuditingEntity {
5458
@Embedded
5559
private Coordinates coordinates;
5660

61+
@OneToMany(mappedBy = "store")
62+
private List<Cheer> cheers = new ArrayList<>();
63+
5764
@Builder
5865
private Store(String kakaoId,
5966
StoreCategory category,
@@ -87,4 +94,10 @@ public String getAddressNeighborhood() {
8794
}
8895
return addressParts[2];
8996
}
97+
98+
public List<String> getCheerDescriptions() {
99+
return cheers.stream()
100+
.map(Cheer::getDescription)
101+
.toList();
102+
}
90103
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package eatda.repository.cheer;
22

33
import eatda.domain.cheer.CheerImage;
4+
import eatda.domain.store.Store;
45
import java.util.List;
56
import java.util.Optional;
67
import org.springframework.data.jpa.repository.JpaRepository;
78

89
public interface CheerImageRepository extends JpaRepository<CheerImage, Long> {
910

10-
List<CheerImage> findAllByCheer_Store_IdOrderByOrderIndexAsc(Long storeId);
11+
List<CheerImage> findAllByCheer_StoreOrderByOrderIndexAsc(Store store);
1112

1213
Optional<CheerImage> findFirstByCheer_Store_IdOrderByCreatedAtDesc(Long storeId);
1314
}

src/main/java/eatda/repository/store/StoreRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Optional;
99
import org.springframework.data.domain.Pageable;
10+
import org.springframework.data.jpa.repository.EntityGraph;
1011
import org.springframework.data.jpa.repository.JpaRepository;
1112
import org.springframework.data.jpa.repository.Query;
1213

@@ -20,8 +21,10 @@ default Store getById(Long id) {
2021

2122
Optional<Store> findByKakaoId(String kakaoId);
2223

24+
@EntityGraph(attributePaths = {"cheers"})
2325
List<Store> findAllByOrderByCreatedAtDesc(Pageable pageable);
2426

27+
@EntityGraph(attributePaths = {"cheers"})
2528
List<Store> findAllByCategoryOrderByCreatedAtDesc(StoreCategory category, Pageable pageable);
2629

2730
@Query("""

src/main/java/eatda/service/store/StoreService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public StoreResponse getStore(long storeId) {
4141
}
4242

4343
// TODO : N+1 문제 해결
44+
@Transactional(readOnly = true)
4445
public StoresResponse getStores(int page, int size, @Nullable String category) {
4546
return findStores(page, size, category)
4647
.stream()
@@ -56,8 +57,10 @@ private List<Store> findStores(int page, int size, @Nullable String category) {
5657
StoreCategory.from(category), PageRequest.of(page, size));
5758
}
5859

60+
@Transactional(readOnly = true)
5961
public ImagesResponse getStoreImages(long storeId) {
60-
List<String> urls = cheerImageRepository.findAllByCheer_Store_IdOrderByOrderIndexAsc(storeId)
62+
Store store = storeRepository.getById(storeId);
63+
List<String> urls = cheerImageRepository.findAllByCheer_StoreOrderByOrderIndexAsc(store)
6164
.stream()
6265
.map(img -> "https://" + cdnBaseUrl + "/" + img.getImageKey())
6366
.toList();

src/test/java/eatda/controller/BaseControllerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package eatda.controller;
22

3+
import static org.mockito.ArgumentMatchers.any;
34
import static org.mockito.ArgumentMatchers.anyString;
45
import static org.mockito.Mockito.doReturn;
56

67
import eatda.DatabaseCleaner;
8+
import eatda.client.file.FileClient;
79
import eatda.client.map.MapClient;
810
import eatda.client.map.MapClientStoreSearchResult;
911
import eatda.client.oauth.OauthClient;
@@ -85,6 +87,9 @@ public class BaseControllerTest {
8587
@Autowired
8688
protected JwtManager jwtManager;
8789

90+
@MockitoBean
91+
private FileClient fileClient;
92+
8893
@MockitoBean
8994
private OauthClient oauthClient;
9095

@@ -119,6 +124,8 @@ final void mockingClient() throws URISyntaxException {
119124
"서울 중구 북창동 19-4", null, 37.0d, 128.0d)
120125
);
121126
doReturn(searchResults).when(mapClient).searchStores(anyString());
127+
128+
doReturn(MOCKED_IMAGE_URL).when(fileClient).generateUploadPresignedUrl(anyString(), any());
122129
}
123130

124131
protected final RequestSpecification given() {

src/test/java/eatda/controller/store/StoreControllerTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class GetStore {
2222
void 음식점_정보를_조회한다() {
2323
Member member = memberGenerator.generate("111");
2424
Store store = storeGenerator.generate("농민백암순대", "서울 강남구 대치동 896-33");
25-
cheerGenerator.generateCommon(member, store, false);
25+
cheerGenerator.generateCommon(member, store);
2626

2727
StoreResponse response = given()
2828
.pathParam("storeId", store.getId())
@@ -53,9 +53,9 @@ class GetStores {
5353
startAt.plusHours(1));
5454
Store store3 = storeGenerator.generate("114", "서울 강남구 역삼동 678-90", StoreCategory.KOREAN,
5555
startAt.plusHours(2));
56-
cheerGenerator.generateCommon(member, store1, false);
57-
cheerGenerator.generateCommon(member, store2, false);
58-
cheerGenerator.generateCommon(member, store3, false);
56+
cheerGenerator.generateCommon(member, store1);
57+
cheerGenerator.generateCommon(member, store2);
58+
cheerGenerator.generateCommon(member, store3);
5959

6060
int page = 0;
6161
int size = 2;
@@ -85,9 +85,9 @@ class GetStores {
8585
startAt.plusHours(1));
8686
Store store3 = storeGenerator.generate("114", "서울 강남구 역삼동 678-90", StoreCategory.CAFE,
8787
startAt.plusHours(2));
88-
cheerGenerator.generateCommon(member, store1, false);
89-
cheerGenerator.generateCommon(member, store2, false);
90-
cheerGenerator.generateCommon(member, store3, false);
88+
cheerGenerator.generateCommon(member, store1);
89+
cheerGenerator.generateCommon(member, store2);
90+
cheerGenerator.generateCommon(member, store3);
9191

9292
int page = 0;
9393
int size = 2;
@@ -118,7 +118,7 @@ class GetStoreImages {
118118
void 음식점_이미지들을_조회한다() {
119119
Member member = memberGenerator.generate("111");
120120
Store store = storeGenerator.generate("농민백암순대", "서울 강남구 대치동 896-33");
121-
Cheer cheer = cheerGenerator.generateCommon(member, store, false);
121+
Cheer cheer = cheerGenerator.generateCommon(member, store);
122122

123123
cheerImageGenerator.generate(cheer, "image1.png", 1L);
124124
cheerImageGenerator.generate(cheer, "image2.png", 2L);

src/test/java/eatda/document/store/StoreDocumentTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ class GetStores {
116116
fieldWithPath("stores[].name").type(STRING).description("음식점 이름"),
117117
fieldWithPath("stores[].district").type(STRING).description("음식점 주소 (구)"),
118118
fieldWithPath("stores[].neighborhood").type(STRING).description("음식점 주소 (동)"),
119-
fieldWithPath("stores[].category").type(STRING).description("음식점 카테고리")
119+
fieldWithPath("stores[].category").type(STRING).description("음식점 카테고리"),
120+
fieldWithPath("stores[].cheerDescriptions").type(ARRAY).description("음식점에 달린 응원 메시지")
120121
);
121122

122123
@Test
@@ -125,8 +126,10 @@ class GetStores {
125126
int size = 2;
126127
StoreCategory category = StoreCategory.CAFE;
127128
StoresResponse response = new StoresResponse(List.of(
128-
new StorePreviewResponse(2L, "https://example.image", "농민백암순대", "강남구", "대치동", "한식"),
129-
new StorePreviewResponse(1L, "https://example.image", "석관동떡볶이", "성북구", "석관동", "한식")
129+
new StorePreviewResponse(2L, "https://example.image", "농민백암순대", "강남구", "대치동", "한식",
130+
List.of("응원해요!", "순대가 맛돌이!")),
131+
new StorePreviewResponse(1L, "https://example.image", "석관동떡볶이", "성북구", "석관동", "한식",
132+
List.of("응원해요!", "떡볶이가 맛있게 매워요~", "매운 떡볶이 최고!"))
130133
));
131134
doReturn(response).when(storeService).getStores(page, size, category.getCategoryName());
132135

src/test/java/eatda/fixture/CheerGenerator.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ public Cheer generateCommon(Member member, Store store) {
2929
return generateCommon(member, store, false, DEFAULT_DESCRIPTION);
3030
}
3131

32-
public Cheer generateCommon(Member member, Store store, boolean isAdmin) {
33-
return generateCommon(member, store, isAdmin, DEFAULT_DESCRIPTION);
34-
}
35-
3632
public Cheer generateCommon(Member member, Store store, LocalDateTime createdAt) {
3733
Cheer cheer = generateCommon(member, store, false, DEFAULT_DESCRIPTION);
3834
DomainUtils.setCreatedAt(cheer, createdAt);

0 commit comments

Comments
 (0)