Skip to content
Merged
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
@@ -1,7 +1,7 @@
package com.todaysound.todaysound_server.domain.alarm.controller;

import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import com.todaysound.todaysound_server.global.exception.CustomErrorResponse;
import com.todaysound.todaysound_server.global.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -91,7 +91,7 @@ public interface AlarmApi {
)
})
List<RecentAlarmResponse> getRecentAlarms(
@ModelAttribute PageRequestDTO pageRequest,
@ModelAttribute PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse;
import com.todaysound.todaysound_server.domain.alarm.service.AlarmQueryService;
import com.todaysound.todaysound_server.domain.summary.service.SummaryCommandService;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;

@RestController
Expand All @@ -23,7 +23,7 @@ public class AlarmQueryController implements AlarmApi {
@GetMapping()
@Override
public List<RecentAlarmResponse> getRecentAlarms(
@ModelAttribute final PageRequestDTO pageRequest,
@ModelAttribute final PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@

import java.util.List;
import com.todaysound.todaysound_server.domain.summary.entity.Summary;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;

public interface AlarmDynamicRepository {

List<Summary> findAlarms(Long userId, PageRequestDTO pageRequest);
List<Summary> findAlarms(Long userId, PageRequest pageRequest);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@
import java.util.List;

import com.todaysound.todaysound_server.domain.summary.entity.Summary;
import com.todaysound.todaysound_server.global.exception.BaseException;
import org.springframework.stereotype.Repository;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.todaysound.todaysound_server.domain.alarm.exception.AlarmException;
import com.todaysound.todaysound_server.domain.subscription.entity.Subscription;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;

import static com.todaysound.todaysound_server.domain.subscription.entity.QSubscription.subscription;
Expand All @@ -24,7 +19,7 @@ public class AlarmDynamicRepositoryImpl implements AlarmDynamicRepository {
private final JPAQueryFactory queryFactory;

@Override
public List<Summary> findAlarms(Long userId, PageRequestDTO pageRequest) {
public List<Summary> findAlarms(Long userId, PageRequest pageRequest) {

return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin()
.where(subscription.user.id.eq(userId), subscription.isAlarmEnabled.eq(true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.springframework.stereotype.Service;
import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse;
import com.todaysound.todaysound_server.domain.alarm.repository.AlarmRepository;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -20,7 +20,7 @@ public class AlarmQueryService {
private final AlarmRepository alarmRepository;
private final HeaderAuthValidator headerAuthValidator;

public List<RecentAlarmResponse> getRecentAlarms(final PageRequestDTO pageRequest, final String userUuid,
public List<RecentAlarmResponse> getRecentAlarms(final PageRequest pageRequest, final String userUuid,
final String deviceSecret) {

// 헀더 인증 검증 및 μ‚¬μš©μž νšλ“
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO;
import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.ModelAttribute;
Expand All @@ -17,7 +17,7 @@ public interface FeedApi {
μ‚¬μš©μžμ˜ 읽지 μ•Šμ€ μš”μ•½(Summary) 쀑 μ•ŒλžŒμ΄ ν™œμ„±ν™”λœ κ΅¬λ…μ˜ μš”μ•½λ“€μΈ ν”Όλ“œλ₯Ό
νŽ˜μ΄μ§€λ„€μ΄μ…˜ν•˜μ—¬ μ‘°νšŒν•©λ‹ˆλ‹€.
""", tags = {"Feed"}, operationId = "getFeeds")
List<FeedResponseDTO> findFeeds(@ModelAttribute PageRequestDTO pageRequest,
List<FeedResponseDTO> findFeeds(@ModelAttribute PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO;
import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse;
import com.todaysound.todaysound_server.domain.feed.service.FeedQueryService;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;

@RestController
Expand All @@ -21,7 +21,7 @@ public class FeedController implements FeedApi {

@Override
@GetMapping()
public List<FeedResponseDTO> findFeeds(@ModelAttribute final PageRequestDTO pageRequest,
public List<FeedResponseDTO> findFeeds(@ModelAttribute final PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import java.util.List;

import com.todaysound.todaysound_server.domain.summary.entity.Summary;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;



public interface FeedDynamicRepository {

List<Summary> findFeeds(Long userId, PageRequestDTO pageRequest);
List<Summary> findFeeds(Long userId, PageRequest pageRequest);

List<Summary> findFeedsForHome(Long userId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import org.springframework.stereotype.Repository;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.todaysound.todaysound_server.domain.summary.entity.Summary;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;

import static com.todaysound.todaysound_server.domain.summary.entity.QSummary.summary;
Expand All @@ -18,7 +18,7 @@ public class FeedDynamicRepositoryImpl implements FeedDynamicRepository {
private final JPAQueryFactory queryFactory;

@Override
public List<Summary> findFeeds(Long userId, PageRequestDTO pageRequest) {
public List<Summary> findFeeds(Long userId, PageRequest pageRequest) {

return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin()
.where(subscription.user.id.eq(userId)).orderBy(summary.updatedAt.desc(), summary.id.desc())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import lombok.RequiredArgsConstructor;

import org.springframework.transaction.annotation.Transactional;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO;
import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse;
import com.todaysound.todaysound_server.domain.feed.repository.FeedDynamicRepository;
Expand All @@ -23,7 +23,7 @@ public class FeedQueryService {
private final HeaderAuthValidator headerAuthValidator;

public List<FeedResponseDTO> findFeeds(final String userUuid, final String deviceSecret,
final PageRequestDTO pageRequest) {
final PageRequest pageRequest) {

User user = headerAuthValidator.validateAndGetUser(userUuid, deviceSecret);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.todaysound.todaysound_server.domain.subscription.dto.response.KeywordListResponseDto;
import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionCreationResponseDto;
import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionResponse;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import com.todaysound.todaysound_server.global.exception.CustomErrorResponse;
import com.todaysound.todaysound_server.global.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -105,7 +105,7 @@ public interface SubscriptionApi {
)
})
List<SubscriptionResponse> getMySubscriptions(
@ModelAttribute PageRequestDTO pageRequest,
@ModelAttribute PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionResponse;
import com.todaysound.todaysound_server.domain.subscription.service.SubscriptionCommandService;
import com.todaysound.todaysound_server.domain.subscription.service.SubscriptionQueryService;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -27,7 +27,7 @@ public class SubscriptionController implements SubscriptionApi {

// μ‚¬μš©μžμ˜ ꡬ독을 νŽ˜μ΄μ§€λ„€μ΄μ…˜(ν•œ νŽ˜μ΄μ§€ size 만큼)ν•΄μ„œ κ°€μ Έμ˜΄.
@GetMapping()
public List<SubscriptionResponse> getMySubscriptions(@ModelAttribute final PageRequestDTO pageRequest,
public List<SubscriptionResponse> getMySubscriptions(@ModelAttribute final PageRequest pageRequest,
@RequestHeader("X-User-ID") String userUuid,
@RequestHeader("X-Device-Secret") String deviceSecret) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.todaysound.todaysound_server.domain.subscription.repository.SubscriptionRepository;
import com.todaysound.todaysound_server.domain.user.entity.User;
import com.todaysound.todaysound_server.domain.user.validator.HeaderAuthValidator;
import com.todaysound.todaysound_server.global.dto.PageRequestDTO;
import com.todaysound.todaysound_server.global.dto.PageRequest;
import lombok.RequiredArgsConstructor;

@Service
Expand All @@ -23,7 +23,7 @@ public class SubscriptionQueryService {
private final KeywordRepository keywordRepository;
private final HeaderAuthValidator headerAuthValidator;

public List<SubscriptionResponse> getMySubscriptions(final PageRequestDTO pageRequest,
public List<SubscriptionResponse> getMySubscriptions(final PageRequest pageRequest,
final String userUuid, final String deviceSecret) {

// 헀더 인증 검증 및 μ‚¬μš©μž νšλ“
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.todaysound.todaysound_server.global.dto;

public record PageRequestDTO(Long page, Integer size) {
public record PageRequest(Long page, Integer size) {
private static final Integer DEFAULT_SIZE = 5;

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.todaysound.todaysound_server.domain.feed.controller;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.willReturn;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
import static org.springframework.restdocs.request.RequestDocumentation.queryParameters;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO;
import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse;
import com.todaysound.todaysound_server.support.DocumentationTestSupport;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.web.servlet.ResultActions;

class FeedControllerTest extends DocumentationTestSupport {


@Test
void ν”Όλ“œ_λͺ©λ‘μ„_μ‘°νšŒν•©λ‹ˆλ‹€() throws Exception {
// given
PageRequest request = PageRequest.of(0, 10);

FeedResponseDTO response1 = new FeedResponseDTO(1L, "ν”Όλ“œ λ‚΄μš©", "μž‘μ„±μž 이름", "2024-06-01T12:00:00", "fe", "1μ‹œκ°„ μ „");
FeedResponseDTO response2 = new FeedResponseDTO(2L, "또 λ‹€λ₯Έ ν”Όλ“œ λ‚΄μš©", "λ‹€λ₯Έ μž‘μ„±μž", "2024-06-01T11:30:00", "fe2",
"2μ‹œκ°„ μ „");
FeedResponseDTO response3 = new FeedResponseDTO(3L, "μ„Έ 번째 ν”Όλ“œ λ‚΄μš©", "μ„Έ 번째 μž‘μ„±μž", "2024-06-01T10:00:00", "fe3",
"3μ‹œκ°„ μ „");

List<FeedResponseDTO> responseList = List.of(response1, response2, response3);

given(feedQueryService.findFeeds(anyString(), anyString(), any())).willReturn(responseList);

// when
ResultActions result = mockMvc.perform(
get("/api/feeds").header("X-User-Id", "test-user-id").header("X-Device-Secret", "test-device-secret")
.param("page", String.valueOf(request.getPageNumber()))
.param("size", String.valueOf(request.getPageSize())));
// then
result.andExpect(status().isOk()).andDo(restDocsHandler.document(
queryParameters(parameterWithName("page").description("νŽ˜μ΄μ§€ 번호 (0λΆ€ν„° μ‹œμž‘)"),
parameterWithName("size").description("νŽ˜μ΄μ§€ 크기")),
responseFields(fieldWithPath("errorCode").description("응닡 μ½”λ“œ"),
fieldWithPath("message").description("응닡 λ©”μ‹œμ§€"), fieldWithPath("result").description("ν”Όλ“œ λͺ©λ‘"),
fieldWithPath("result[].subscriptionId").description("ꡬ독 ID"),
fieldWithPath("result[].alias").description("ꡬ독 별칭"),
fieldWithPath("result[].summaryTitle").description("μš”μ•½ 제λͺ©"),
fieldWithPath("result[].summaryContent").description("μš”μ•½ λ‚΄μš©"),
fieldWithPath("result[].postUrl").description("μ—°κ²° url"),
fieldWithPath("result[].timeAgo").description("ν”Όλ“œ μž‘μ„± ν›„ κ²½κ³Ό μ‹œκ°„"))));
}


@Test
void ν™ˆ_ν”Όλ“œ_λͺ©λ‘μ„_μ‘°νšŒν•©λ‹ˆλ‹€() throws Exception {
// given

HomeFeedResponse response1 = new HomeFeedResponse(1L, "ν”Όλ“œ λ‚΄μš©", "μž‘μ„±μž 이름", "2024-06-01T12:00:00", "fe", "1μ‹œκ°„ μ „");
HomeFeedResponse response2 = new HomeFeedResponse(2L, "또 λ‹€λ₯Έ ν”Όλ“œ λ‚΄μš©", "λ‹€λ₯Έ μž‘μ„±μž", "2024-06-01T11:30:00", "fe2",
"2μ‹œκ°„ μ „");
HomeFeedResponse response3 = new HomeFeedResponse(3L, "μ„Έ 번째 ν”Όλ“œ λ‚΄μš©", "μ„Έ 번째 μž‘μ„±μž", "2024-06-01T10:00:00", "fe3",
"3μ‹œκ°„ μ „");

List<HomeFeedResponse> responseList = List.of(response1, response2, response3);

given(feedQueryService.findFeedsForHome(anyString(), anyString())).willReturn(responseList);

// when
ResultActions result = mockMvc.perform(get("/api/feeds/home").header("X-User-Id", "test-user-id")
.header("X-Device-Secret", "test-device-secret"));
// then
result.andExpect(status().isOk()).andDo(restDocsHandler.document(
responseFields(fieldWithPath("errorCode").description("응닡 μ½”λ“œ"),
fieldWithPath("message").description("응닡 λ©”μ‹œμ§€"), fieldWithPath("result").description("ν”Όλ“œ λͺ©λ‘"),
fieldWithPath("result[].subscriptionId").description("ꡬ독 ID"),
fieldWithPath("result[].alias").description("ꡬ독 별칭"),
fieldWithPath("result[].summaryTitle").description("μš”μ•½ 제λͺ©"),
fieldWithPath("result[].summaryContent").description("μš”μ•½ λ‚΄μš©"),
fieldWithPath("result[].postUrl").description("μ—°κ²° url"),
fieldWithPath("result[].timeAgo").description("ν”Όλ“œ μž‘μ„± ν›„ κ²½κ³Ό μ‹œκ°„"))));
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,35 @@
package com.todaysound.todaysound_server.support;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.todaysound.todaysound_server.domain.feed.controller.FeedController;
import com.todaysound.todaysound_server.domain.feed.service.FeedQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.Import;
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;

@WebMvcTest(controllers = {

})
@Import({
RestDocsConfig.class,
FeedController.class,
})
@Import({RestDocsConfig.class,})
@AutoConfigureRestDocs
@AutoConfigureMockMvc(addFilters = false)
public class DocumentationTestSupport {

@Autowired
protected RestDocumentationResultHandler restDocsHandler;
@Autowired
protected RestDocumentationResultHandler restDocsHandler;

@Autowired
protected MockMvc mockMvc;

@Autowired
protected MockMvc mockMvc;
@Autowired
protected ObjectMapper objectMapper;

@Autowired
protected ObjectMapper objectMapper;
@MockitoBean
protected FeedQueryService feedQueryService;

}