Skip to content

Commit 0db5d62

Browse files
authored
Merge pull request #129 from YAPP-Github/feat/story-add-storeId
[Feat] '스토리 상세 조회 API'에 storeId 값 추가
2 parents 8d4bee8 + e1aa3bc commit 0db5d62

File tree

5 files changed

+75
-17
lines changed

5 files changed

+75
-17
lines changed

src/main/java/eatda/controller/story/StoryResponse.java

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

3+
import org.springframework.lang.Nullable;
4+
35
public record StoryResponse(
6+
@Nullable Long storeId,
47
String storeKakaoId,
58
String category,
69
String storeName,
@@ -11,4 +14,5 @@ public record StoryResponse(
1114
long memberId,
1215
String memberNickname
1316
) {
17+
1418
}

src/main/java/eatda/service/story/StoryService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import eatda.domain.ImageDomain;
1212
import eatda.domain.ImageKey;
1313
import eatda.domain.member.Member;
14+
import eatda.domain.store.Store;
1415
import eatda.domain.story.Story;
1516
import eatda.exception.BusinessErrorCode;
1617
import eatda.exception.BusinessException;
1718
import eatda.repository.member.MemberRepository;
19+
import eatda.repository.store.StoreRepository;
1820
import eatda.repository.story.StoryRepository;
1921
import eatda.storage.image.ImageStorage;
2022
import java.util.List;
@@ -35,6 +37,7 @@ public class StoryService {
3537
private final ImageStorage imageStorage;
3638
private final MapClient mapClient;
3739
private final StoryRepository storyRepository;
40+
private final StoreRepository storeRepository;
3841
private final MemberRepository memberRepository;
3942

4043
@Transactional
@@ -93,8 +96,12 @@ public StoriesResponse getPagedStoryPreviews(int size) {
9396
public StoryResponse getStory(long storyId) {
9497
Story story = storyRepository.findById(storyId)
9598
.orElseThrow(() -> new BusinessException(BusinessErrorCode.STORY_NOT_FOUND));
99+
Long storeId = storeRepository.findByKakaoId(story.getStoreKakaoId())
100+
.map(Store::getId)
101+
.orElse(null);
96102

97103
return new StoryResponse(
104+
storeId,
98105
story.getStoreKakaoId(),
99106
story.getStoreCategory().getCategoryName(),
100107
story.getStoreName(),

src/test/java/eatda/controller/story/StoryControllerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class GetStory {
9090
long storyId = 1L;
9191

9292
doReturn(new StoryResponse(
93+
5L,
9394
"123456",
9495
"한식",
9596
"진또곱창집",
@@ -110,6 +111,7 @@ class GetStory {
110111
.extract().as(StoryResponse.class);
111112

112113
assertAll(
114+
() -> assertThat(response.storeId()).isEqualTo(5L),
113115
() -> assertThat(response.storeKakaoId()).isEqualTo("123456"),
114116
() -> assertThat(response.category()).isEqualTo("한식"),
115117
() -> assertThat(response.storeName()).isEqualTo("진또곱창집"),

src/test/java/eatda/document/story/StoryDocumentTest.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import static org.mockito.Mockito.doReturn;
66
import static org.mockito.Mockito.doThrow;
77
import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
8+
import static org.springframework.restdocs.payload.JsonFieldType.NUMBER;
9+
import static org.springframework.restdocs.payload.JsonFieldType.STRING;
810
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
911
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
1012
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
@@ -162,21 +164,23 @@ class GetStory {
162164

163165
RestDocsResponse responseDocument = response()
164166
.responseBodyField(
165-
fieldWithPath("storeKakaoId").description("가게의 카카오 ID"),
166-
fieldWithPath("category").description("가게 카테고리"),
167-
fieldWithPath("storeName").description("가게 이름"),
168-
fieldWithPath("storeDistrict").description("가게 주소의 구"),
169-
fieldWithPath("storeNeighborhood").description("가게 주소의 동"),
170-
fieldWithPath("description").description("스토리 내용"),
171-
fieldWithPath("imageUrl").description("스토리 이미지 URL"),
172-
fieldWithPath("memberId").description("회원 ID"),
173-
fieldWithPath("memberNickname").description("회원 닉네임")
167+
fieldWithPath("storeId").type(NUMBER).description("가게의 카카오 ID (nullable)").optional(),
168+
fieldWithPath("storeKakaoId").type(STRING).description("가게의 카카오 ID"),
169+
fieldWithPath("category").type(STRING).description("가게 카테고리"),
170+
fieldWithPath("storeName").type(STRING).description("가게 이름"),
171+
fieldWithPath("storeDistrict").type(STRING).description("가게 주소의 구"),
172+
fieldWithPath("storeNeighborhood").type(STRING).description("가게 주소의 동"),
173+
fieldWithPath("description").type(STRING).description("스토리 내용"),
174+
fieldWithPath("imageUrl").type(STRING).description("스토리 이미지 URL"),
175+
fieldWithPath("memberId").type(NUMBER).description("회원 ID"),
176+
fieldWithPath("memberNickname").type(STRING).description("회원 닉네임")
174177
);
175178

176179
@Test
177180
void 스토리_상세_조회_성공() {
178181
long storyId = 1L;
179182
StoryResponse response = new StoryResponse(
183+
null,
180184
"123456",
181185
"한식",
182186
"진또곱창집",

src/test/java/eatda/service/story/StoryServiceTest.java

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5+
import static org.junit.jupiter.api.Assertions.assertAll;
56
import static org.mockito.Mockito.doReturn;
67
import static org.mockito.Mockito.mock;
78
import static org.mockito.Mockito.when;
@@ -12,6 +13,7 @@
1213
import eatda.controller.story.StoryResponse;
1314
import eatda.domain.ImageKey;
1415
import eatda.domain.member.Member;
16+
import eatda.domain.store.Store;
1517
import eatda.domain.store.StoreCategory;
1618
import eatda.domain.story.Story;
1719
import eatda.exception.BusinessErrorCode;
@@ -107,7 +109,7 @@ class GetPagedStoryPreviews {
107109
class GetStory {
108110

109111
@Test
110-
void 스토리_상세_정보를_조회할_수_있다() {
112+
void 스토리_상세_정보를_조회할_때_스토어ID가_없으면_NULL로_반환된다() {
111113
Member member = memberGenerator.generate("99999");
112114

113115
Story story = Story.builder()
@@ -120,21 +122,60 @@ class GetStory {
120122
.description("곱창은 여기")
121123
.imageKey(new ImageKey("story-image-key"))
122124
.build();
125+
storyRepository.save(story);
126+
127+
when(externalImageStorage.getPreSignedUrl(new ImageKey("story-image-key")))
128+
.thenReturn("https://s3.bucket.com/story/dummy/1.jpg");
129+
130+
StoryResponse response = storyService.getStory(story.getId());
123131

132+
assertAll(
133+
() -> assertThat(response.storeId()).isNull(),
134+
() -> assertThat(response.storeKakaoId()).isEqualTo("123456"),
135+
() -> assertThat(response.category()).isEqualTo("한식"),
136+
() -> assertThat(response.storeName()).isEqualTo("진또곱창집"),
137+
() -> assertThat(response.storeDistrict()).isEqualTo("성동구"),
138+
() -> assertThat(response.storeNeighborhood()).isEqualTo("성수동1가"),
139+
() -> assertThat(response.description()).isEqualTo("곱창은 여기"),
140+
() -> assertThat(response.imageUrl()).isEqualTo("https://s3.bucket.com/story/dummy/1.jpg"),
141+
() -> assertThat(response.memberId()).isEqualTo(member.getId()),
142+
() -> assertThat(response.memberNickname()).isEqualTo(member.getNickname())
143+
);
144+
}
145+
146+
@Test
147+
void 스토리_상세_정보를_조회할_때_스토어ID가_있으면_해당_ID값을_반환한다() {
148+
Member member = memberGenerator.generate("99999");
149+
Store store = storeGenerator.generate("123456", "서울시 성북구 장위동 123-45");
150+
Story story = Story.builder()
151+
.member(member)
152+
.storeKakaoId("123456")
153+
.storeName("진또곱창집")
154+
.storeRoadAddress("서울시 성동구 왕십리로 1길 12")
155+
.storeLotNumberAddress("서울시 성동구 성수동1가 685-12")
156+
.storeCategory(StoreCategory.KOREAN)
157+
.description("곱창은 여기")
158+
.imageKey(new ImageKey("story-image-key"))
159+
.build();
124160
storyRepository.save(story);
125161

126162
when(externalImageStorage.getPreSignedUrl(new ImageKey("story-image-key")))
127163
.thenReturn("https://s3.bucket.com/story/dummy/1.jpg");
128164

129165
StoryResponse response = storyService.getStory(story.getId());
130166

131-
assertThat(response.storeKakaoId()).isEqualTo("123456");
132-
assertThat(response.category()).isEqualTo("한식");
133-
assertThat(response.storeName()).isEqualTo("진또곱창집");
134-
assertThat(response.storeDistrict()).isEqualTo("성동구");
135-
assertThat(response.storeNeighborhood()).isEqualTo("성수동1가");
136-
assertThat(response.description()).isEqualTo("곱창은 여기");
137-
assertThat(response.imageUrl()).isEqualTo("https://s3.bucket.com/story/dummy/1.jpg");
167+
assertAll(
168+
() -> assertThat(response.storeId()).isEqualTo(store.getId()),
169+
() -> assertThat(response.storeKakaoId()).isEqualTo("123456"),
170+
() -> assertThat(response.category()).isEqualTo("한식"),
171+
() -> assertThat(response.storeName()).isEqualTo("진또곱창집"),
172+
() -> assertThat(response.storeDistrict()).isEqualTo("성동구"),
173+
() -> assertThat(response.storeNeighborhood()).isEqualTo("성수동1가"),
174+
() -> assertThat(response.description()).isEqualTo("곱창은 여기"),
175+
() -> assertThat(response.imageUrl()).isEqualTo("https://s3.bucket.com/story/dummy/1.jpg"),
176+
() -> assertThat(response.memberId()).isEqualTo(member.getId()),
177+
() -> assertThat(response.memberNickname()).isEqualTo(member.getNickname())
178+
);
138179
}
139180

140181
@Test

0 commit comments

Comments
 (0)