Skip to content

Commit 483b363

Browse files
committed
feat : 가게에 달린 응원들 조회 서비스 로직 구현
1 parent fcd83b2 commit 483b363

File tree

6 files changed

+77
-3
lines changed

6 files changed

+77
-3
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package eatda.controller.store;
2+
3+
import eatda.domain.store.Cheer;
4+
5+
public record CheerInStoreResponse(
6+
long id,
7+
long memberId,
8+
String memberName,
9+
String description
10+
) {
11+
12+
public CheerInStoreResponse(Cheer cheer) {
13+
this(
14+
cheer.getId(),
15+
cheer.getMember().getId(),
16+
cheer.getMember().getNickname(),
17+
cheer.getDescription()
18+
);
19+
}
20+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package eatda.controller.store;
2+
3+
import java.util.List;
4+
5+
public record CheersInStoreResponse(List<CheerInStoreResponse> cheers) {
6+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface CheerRepository extends Repository<Cheer, Long> {
1515

1616
List<Cheer> findAllByOrderByCreatedAtDesc(Pageable pageable);
1717

18+
List<Cheer> findAllByStoreOrderByCreatedAtDesc(Store store, Pageable pageable);
19+
1820
@Query("""
1921
SELECT c.imageKey FROM Cheer c
2022
WHERE c.store = :store AND c.imageKey IS NOT NULL

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package eatda.repository.store;
22

33
import eatda.domain.store.Store;
4+
import eatda.exception.BusinessErrorCode;
5+
import eatda.exception.BusinessException;
46
import java.util.List;
57
import java.util.Optional;
68
import org.springframework.data.domain.Pageable;
7-
import org.springframework.data.repository.Repository;
9+
import org.springframework.data.jpa.repository.JpaRepository;
810

9-
public interface StoreRepository extends Repository<Store, Long> {
11+
public interface StoreRepository extends JpaRepository<Store, Long> {
1012

11-
Store save(Store store);
13+
@Override
14+
default Store getById(Long id) {
15+
return findById(id)
16+
.orElseThrow(() -> new BusinessException(BusinessErrorCode.STORE_NOT_FOUND));
17+
}
1218

1319
Optional<Store> findByKakaoId(String kakaoId);
1420

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import eatda.client.map.MapClient;
44
import eatda.client.map.StoreSearchResult;
5+
import eatda.controller.store.CheerInStoreResponse;
56
import eatda.controller.store.CheerPreviewResponse;
67
import eatda.controller.store.CheerRegisterRequest;
78
import eatda.controller.store.CheerResponse;
9+
import eatda.controller.store.CheersInStoreResponse;
810
import eatda.controller.store.CheersResponse;
911
import eatda.domain.ImageDomain;
1012
import eatda.domain.member.Member;
@@ -72,4 +74,15 @@ private CheersResponse toCheersResponse(List<Cheer> cheers) {
7274
imageStorage.getPresignedUrl(cheer.getImageKey())))
7375
.toList());
7476
}
77+
78+
@Transactional(readOnly = true)
79+
public CheersInStoreResponse getCheersByStoreId(Long storeId, int size) {
80+
Store store = storeRepository.getById(storeId);
81+
List<Cheer> cheers = cheerRepository.findAllByStoreOrderByCreatedAtDesc(store, Pageable.ofSize(size));
82+
83+
List<CheerInStoreResponse> cheersResponse = cheers.stream()
84+
.map(CheerInStoreResponse::new)
85+
.toList(); // TODO N+1 문제 해결
86+
return new CheersInStoreResponse(cheersResponse);
87+
}
7588
}

src/test/java/eatda/service/store/CheerServiceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import eatda.client.map.StoreSearchResult;
1010
import eatda.controller.store.CheerRegisterRequest;
1111
import eatda.controller.store.CheerResponse;
12+
import eatda.controller.store.CheersInStoreResponse;
1213
import eatda.controller.store.CheersResponse;
1314
import eatda.domain.member.Member;
1415
import eatda.domain.store.Cheer;
@@ -146,5 +147,31 @@ class GetCheers {
146147
() -> assertThat(response.cheers().get(1).cheerId()).isEqualTo(cheer2.getId())
147148
);
148149
}
150+
151+
@Nested
152+
class GetCheersByStoreId {
153+
154+
@Test
155+
void 요청한_가게의_응원을_최신순으로_반환한다() throws InterruptedException {
156+
Member member1 = memberGenerator.generateRegisteredMember("123", "[email protected]", "1234", "01012341234");
157+
Member member2 = memberGenerator.generateRegisteredMember("124", "[email protected]", "1235", "01012341235");
158+
Member member3 = memberGenerator.generateRegisteredMember("125", "[email protected]", "1236", "01012341236");
159+
160+
Store store = storeGenerator.generate("123", "서울시 강남구 역삼동 123-45");
161+
Cheer cheer1 = cheerGenerator.generateCommon(member1, store);
162+
Thread.sleep(5);
163+
Cheer cheer2 = cheerGenerator.generateCommon(member2, store);
164+
Thread.sleep(5);
165+
Cheer cheer3 = cheerGenerator.generateCommon(member3, store);
166+
167+
CheersInStoreResponse response = cheerService.getCheersByStoreId(store.getId(), 2);
168+
169+
assertAll(
170+
() -> assertThat(response.cheers()).hasSize(2),
171+
() -> assertThat(response.cheers().get(0).id()).isEqualTo(cheer3.getId()),
172+
() -> assertThat(response.cheers().get(1).id()).isEqualTo(cheer2.getId())
173+
);
174+
}
175+
}
149176
}
150177
}

0 commit comments

Comments
 (0)