From 40e7ccd8d50430f7e4cfb7f87a0d966f7a0f7b29 Mon Sep 17 00:00:00 2001 From: hs12 Date: Tue, 9 Jan 2024 20:08:35 +0900 Subject: [PATCH 01/20] =?UTF-8?q?feat=20:=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java b/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java index e6e4fe70..69a96e14 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java +++ b/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java @@ -68,7 +68,7 @@ public Waiting(int waitingNumber, int peopleCount, Member member, Shop shop) { } public void decreasePostponeRemainingCount() { - if (remainingPostponeCount <= 0) { + if (remainingPostponeCount == 0) { throw new BadRequestCustomException(POSTPONE_REMAINING_CNT_0); } remainingPostponeCount--; From 57e95274aacc02df7d6645832f6f00d9e1e6b7df Mon Sep 17 00:00:00 2001 From: hs12 Date: Tue, 9 Jan 2024 22:25:20 +0900 Subject: [PATCH 02/20] =?UTF-8?q?feat=20:=20memberId=20=EB=8C=80=EC=8B=A0?= =?UTF-8?q?=20member=20=EA=B0=9D=EC=B2=B4=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EB=A1=9C=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberWaitingController.java | 27 +++++------ .../waiting/service/MemberWaitingService.java | 12 ++--- .../MemberWaitingControllerTest.java | 46 +++++++++++++------ .../service/MemberWaitingServiceTest.java | 12 ++--- 4 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java b/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java index 7e757e41..003d6511 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java @@ -1,5 +1,7 @@ package com.prgrms.catchtable.waiting.controller; +import com.prgrms.catchtable.common.login.LogIn; +import com.prgrms.catchtable.member.domain.Member; import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; import com.prgrms.catchtable.waiting.dto.response.MemberWaitingHistoryListResponse; import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; @@ -32,32 +34,31 @@ public ResponseEntity createWaiting(@PathVariable("shopId return ResponseEntity.ok(response); } - @PatchMapping("/{memberId}") + @PatchMapping public ResponseEntity postponeWaiting( - @PathVariable("memberId") Long memberId) { - MemberWaitingResponse response = memberWaitingService.postponeWaiting(memberId); + @LogIn Member member) { + MemberWaitingResponse response = memberWaitingService.postponeWaiting(member); return ResponseEntity.ok(response); } - @DeleteMapping("/{memberId}") + @DeleteMapping public ResponseEntity cancelWaiting( - @PathVariable("memberId") Long memberId) { - MemberWaitingResponse response = memberWaitingService.cancelWaiting(memberId); + @LogIn Member member) { + MemberWaitingResponse response = memberWaitingService.cancelWaiting(member); return ResponseEntity.ok(response); } - @GetMapping("/{memberId}") + @GetMapping public ResponseEntity getWaiting( - @PathVariable("memberId") Long memberId) { - MemberWaitingResponse response = memberWaitingService.getWaiting(memberId); + @LogIn Member member) { + MemberWaitingResponse response = memberWaitingService.getWaiting(member); return ResponseEntity.ok(response); } - @GetMapping("/all/{memberId}") + @GetMapping("/all") public ResponseEntity getMemberWaitingHistory( - @PathVariable("memberId") Long memberId) { - MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory( - memberId); + @LogIn Member member) { + MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory(member); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java b/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java index b740f60b..29f58426 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java +++ b/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java @@ -66,8 +66,7 @@ public MemberWaitingResponse createWaiting(Long shopId, Long memberId, } @Transactional - public MemberWaitingResponse postponeWaiting(Long memberId) { - Member member = getMemberEntity(memberId); + public MemberWaitingResponse postponeWaiting(Member member) { Waiting waiting = getWaitingEntityInProgress(member); Shop shop = waiting.getShop(); @@ -80,8 +79,7 @@ public MemberWaitingResponse postponeWaiting(Long memberId) { } @Transactional - public MemberWaitingResponse cancelWaiting(Long memberId) { - Member member = getMemberEntity(memberId); + public MemberWaitingResponse cancelWaiting(Member member) { Waiting waiting = getWaitingEntityInProgress(member); Shop shop = waiting.getShop(); @@ -92,8 +90,7 @@ public MemberWaitingResponse cancelWaiting(Long memberId) { } @Transactional(readOnly = true) - public MemberWaitingResponse getWaiting(Long memberId) { - Member member = getMemberEntity(memberId); + public MemberWaitingResponse getWaiting(Member member) { Waiting waiting = getWaitingEntityInProgress(member); Shop shop = waiting.getShop(); @@ -103,8 +100,7 @@ public MemberWaitingResponse getWaiting(Long memberId) { } @Transactional(readOnly = true) - public MemberWaitingHistoryListResponse getMemberWaitingHistory(Long memberId) { - Member member = getMemberEntity(memberId); + public MemberWaitingHistoryListResponse getMemberWaitingHistory(Member member) { List waitings = waitingRepository.findWaitingWithMember(member); return toMemberWaitingListResponse(waitings); } diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java index d1bf241b..380875af 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java @@ -1,5 +1,6 @@ package com.prgrms.catchtable.waiting.controller; +import static com.prgrms.catchtable.common.Role.MEMBER; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.CANCELED; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.COMPLETED; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; @@ -16,6 +17,7 @@ import com.prgrms.catchtable.common.base.BaseIntegrationTest; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; +import com.prgrms.catchtable.jwt.token.Token; import com.prgrms.catchtable.member.MemberFixture; import com.prgrms.catchtable.member.domain.Member; import com.prgrms.catchtable.member.repository.MemberRepository; @@ -35,6 +37,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.http.HttpHeaders; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; @@ -130,8 +133,9 @@ void createWaiting() throws Exception { @Test void postponeWaiting() throws Exception { //when, then - mockMvc.perform(patch("/waitings/{memberId}", member2.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(patch("/waitings") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member2))) .andExpect(status().isOk()) .andExpect(jsonPath("$.shopId").value(shop.getId())) .andExpect(jsonPath("$.shopName").value(shop.getName())) @@ -144,8 +148,9 @@ void postponeWaiting() throws Exception { @DisplayName("맨 뒤의 멤버가 웨이팅 지연 API 호출 시 예외를 반환한다.") @Test void postponeWaiting_fails() throws Exception { - mockMvc.perform(patch("/waitings/{memberId}", member3.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(patch("/waitings") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member3))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message").value("이미 맨뒤라 웨이팅을 미룰 수 없습니다.")) .andDo(MockMvcResultHandlers.print()); @@ -158,8 +163,9 @@ void postponeWaiting_fails() throws Exception { void postponeWaiting_fails2() throws Exception { ReflectionTestUtils.setField(waiting2, "remainingPostponeCount", 0); waitingRepository.save(waiting2); - mockMvc.perform(patch("/waitings/{memberId}", member2.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(patch("/waitings") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member2))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message").value("이미 두 차례 대기를 미뤘습니다.")) .andDo(MockMvcResultHandlers.print()); @@ -169,8 +175,9 @@ void postponeWaiting_fails2() throws Exception { @Test void cancelWaiting() throws Exception { //when, then - mockMvc.perform(delete("/waitings/{memberId}", member1.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(delete("/waitings") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member1))) .andExpect(status().isOk()) .andExpect(jsonPath("$.shopId").value(shop.getId())) .andExpect(jsonPath("$.shopName").value(shop.getName())) @@ -190,14 +197,15 @@ void cancelWaiting() throws Exception { @Test void getWaiting() throws Exception { //when, then - mockMvc.perform(get("/waitings/{memberId}", member3.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(get("/waitings") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member2))) .andExpect(status().isOk()) .andExpect(jsonPath("$.shopId").value(shop.getId())) .andExpect(jsonPath("$.shopName").value(shop.getName())) - .andExpect(jsonPath("$.rank").value(3L)) - .andExpect(jsonPath("$.waitingNumber").value(waiting3.getWaitingNumber())) - .andExpect(jsonPath("$.peopleCount").value(waiting3.getPeopleCount())) + .andExpect(jsonPath("$.rank").value(2L)) + .andExpect(jsonPath("$.waitingNumber").value(waiting2.getWaitingNumber())) + .andExpect(jsonPath("$.peopleCount").value(waiting2.getPeopleCount())) .andExpect(jsonPath("$.status").value(PROGRESS.getDescription())) .andDo(MockMvcResultHandlers.print()); } @@ -209,8 +217,9 @@ void getMemberWaitingHistory() throws Exception { Waiting canceledWaiting = WaitingFixture.canceledWaiting(member1, shop, 23); Waiting completedWaiting = WaitingFixture.completedWaiting(member1, shop, 233); waitingRepository.saveAll(List.of(canceledWaiting, completedWaiting)); - mockMvc.perform(get("/waitings/all/{memberId}", member1.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(get("/waitings/all") + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member1))) .andExpect(status().isOk()) .andExpect(jsonPath("$.memberWaitings", hasSize(3))) .andExpect(jsonPath("$.memberWaitings[0].waitingId").value(waiting1.getId())) @@ -222,4 +231,11 @@ void getMemberWaitingHistory() throws Exception { .andDo(MockMvcResultHandlers.print()) ; } + + private HttpHeaders getHttpHeaders(Member member) { + Token token = jwtTokenProvider.createToken(member.getEmail(), MEMBER); + httpHeaders.add("AccessToken", token.getAccessToken()); + httpHeaders.add("RefreshToken", token.getRefreshToken()); + return httpHeaders; + } } \ No newline at end of file diff --git a/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java b/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java index 01914252..027e80c4 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java @@ -87,7 +87,6 @@ void postponeWaiting() { Member member = mock(Member.class); Waiting waiting = mock(Waiting.class); - given(memberRepository.findById(1L)).willReturn(Optional.of(member)); given(waitingRepository.findByMemberAndStatusWithShop(member, PROGRESS)).willReturn( Optional.of(waiting)); given(waiting.getShop()).willReturn(shop); @@ -96,7 +95,7 @@ void postponeWaiting() { doNothing().when(waiting).decreasePostponeRemainingCount(); //when - MemberWaitingResponse response = memberWaitingService.postponeWaiting(1L); + MemberWaitingResponse response = memberWaitingService.postponeWaiting(member); //then assertAll( assertThat(response.peopleCount())::isNotNull, @@ -113,7 +112,6 @@ void cancelWaiting() { Member member = mock(Member.class); Waiting waiting = mock(Waiting.class); - given(memberRepository.findById(1L)).willReturn(Optional.of(member)); given(waitingRepository.findByMemberAndStatusWithShop(member, PROGRESS)).willReturn( Optional.of(waiting)); given(waiting.getShop()).willReturn(shop); @@ -121,7 +119,7 @@ void cancelWaiting() { doNothing().when(waiting).changeStatusCanceled(); //when - MemberWaitingResponse response = memberWaitingService.cancelWaiting(1L); + MemberWaitingResponse response = memberWaitingService.cancelWaiting(member); //then assertAll( @@ -139,13 +137,12 @@ void getWaiting() { Member member = mock(Member.class); Waiting waiting = mock(Waiting.class); - given(memberRepository.findById(1L)).willReturn(Optional.of(member)); given(waitingRepository.findByMemberAndStatusWithShop(member, PROGRESS)).willReturn( Optional.of(waiting)); given(waiting.getShop()).willReturn(shop); given(waiting.getStatus()).willReturn(PROGRESS); //when - MemberWaitingResponse response = memberWaitingService.getWaiting(1L); + MemberWaitingResponse response = memberWaitingService.getWaiting(member); //then assertAll( @@ -163,7 +160,6 @@ void getMemberAllWaiting() { Shop shop = mock(Shop.class); Waiting waiting = mock(Waiting.class); - given(memberRepository.findById(1L)).willReturn(Optional.of(member)); given(waitingRepository.findWaitingWithMember(member)).willReturn( List.of(waiting)); given(waiting.getShop()).willReturn(shop); @@ -171,7 +167,7 @@ void getMemberAllWaiting() { //when MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory( - 1L); + member); //then assertAll( From 40c7636a3c629c3c08809c7c3867a406a68a9313 Mon Sep 17 00:00:00 2001 From: hs12 Date: Tue, 9 Jan 2024 22:49:24 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat=20:=20ownerId=20=EB=8C=80=EC=8B=A0?= =?UTF-8?q?=20owner=20=EA=B0=9D=EC=B2=B4=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EB=A1=9C=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/OwnerWaitingController.java | 14 +++++++------ .../waiting/service/OwnerWaitingService.java | 8 ++------ .../OwnerWaitingControllerTest.java | 20 +++++++++++++------ .../service/OwnerWaitingServiceTest.java | 6 ++---- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java index ee3fbfec..1c802f27 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java @@ -1,5 +1,7 @@ package com.prgrms.catchtable.waiting.controller; +import com.prgrms.catchtable.common.login.LogIn; +import com.prgrms.catchtable.owner.domain.Owner; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingListResponse; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingResponse; import com.prgrms.catchtable.waiting.service.OwnerWaitingService; @@ -18,17 +20,17 @@ public class OwnerWaitingController { private final OwnerWaitingService ownerWaitingService; - @GetMapping("/{ownerId}") + @GetMapping public ResponseEntity getOwnerAllWaiting( - @PathVariable("ownerId") Long ownerId) { - OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(ownerId); + @LogIn Owner owner) { + OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(owner); return ResponseEntity.ok(response); } - @PatchMapping("/{ownerId}") + @PatchMapping public ResponseEntity entryWaiting( - @PathVariable("ownerId") Long ownerId) { - OwnerWaitingResponse response = ownerWaitingService.entryWaiting(ownerId); + @LogIn Owner owner) { + OwnerWaitingResponse response = ownerWaitingService.entryWaiting(owner); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java index 39bfff51..c489bc1e 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java +++ b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java @@ -28,9 +28,7 @@ public class OwnerWaitingService { private final OwnerRepository ownerRepository; @Transactional(readOnly = true) - public OwnerWaitingListResponse getOwnerAllWaiting(Long ownerId) { - Owner owner = ownerRepository.findById(ownerId) - .orElseThrow(() -> new BadRequestCustomException(NOT_EXIST_OWNER)); + public OwnerWaitingListResponse getOwnerAllWaiting(Owner owner) { List waitingIds = waitingLineRepository.getShopWaitingIdsInOrder( owner.getShop().getId()); List waitings = waitingRepository.findByIds(waitingIds); @@ -38,9 +36,7 @@ public OwnerWaitingListResponse getOwnerAllWaiting(Long ownerId) { } @Transactional - public OwnerWaitingResponse entryWaiting(Long ownerId) { - Owner owner = ownerRepository.findById(ownerId) - .orElseThrow(() -> new BadRequestCustomException(NOT_EXIST_OWNER)); + public OwnerWaitingResponse entryWaiting(Owner owner) { Long enteredWaitingId = waitingLineRepository.entry(owner.getShop().getId()); Waiting waiting = waitingRepository.findById(enteredWaitingId) .orElseThrow(() -> new NotFoundCustomException(WAITING_DOES_NOT_EXIST)); diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java index 9823aeed..7d6e6f97 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java @@ -1,5 +1,7 @@ package com.prgrms.catchtable.waiting.controller; +import static com.prgrms.catchtable.common.Role.MEMBER; +import static com.prgrms.catchtable.common.Role.OWNER; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.springframework.http.MediaType.APPLICATION_JSON; @@ -9,6 +11,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.prgrms.catchtable.common.base.BaseIntegrationTest; +import com.prgrms.catchtable.jwt.token.Token; import com.prgrms.catchtable.member.MemberFixture; import com.prgrms.catchtable.member.domain.Member; import com.prgrms.catchtable.member.repository.MemberRepository; @@ -48,7 +51,6 @@ class OwnerWaitingControllerTest extends BaseIntegrationTest { private StringRedisTemplate redisTemplate; private Shop shop; - private Owner owner; private Waiting waiting1, waiting2, waiting3; @@ -62,7 +64,7 @@ void setUp() { shop = ShopFixture.shopWith24(); shopRepository.save(shop); - owner = OwnerFixture.getOwner(shop); + Owner owner = OwnerFixture.getOwner(shop); ownerRepository.save(owner); waiting1 = Waiting.builder() @@ -89,6 +91,10 @@ void setUp() { waitingLineRepository.save(shop.getId(), waiting1.getId()); waitingLineRepository.save(shop.getId(), waiting2.getId()); waitingLineRepository.save(shop.getId(), waiting3.getId()); + + Token token = jwtTokenProvider.createToken(owner.getEmail(), OWNER); + httpHeaders.add("AccessToken", token.getAccessToken()); + httpHeaders.add("RefreshToken", token.getRefreshToken()); } @AfterEach @@ -104,8 +110,9 @@ void clear() { @Test void getWaiting() throws Exception { //when, then - mockMvc.perform(get("/owner/waitings/{ownerId}", owner.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(get("/owner/waitings") + .contentType(APPLICATION_JSON) + .headers(httpHeaders)) .andExpect(status().isOk()) .andExpect(jsonPath("$.shopWaitings", hasSize(3))) .andExpect(jsonPath("$.shopWaitings[0].waitingId").value(waiting1.getId())) @@ -125,8 +132,9 @@ void getWaiting() throws Exception { @Test void entryWaiting() throws Exception { //when, then - mockMvc.perform(patch("/owner/waitings/{ownerId}", owner.getId()) - .contentType(APPLICATION_JSON)) + mockMvc.perform(patch("/owner/waitings") + .contentType(APPLICATION_JSON) + .headers(httpHeaders)) .andExpect(status().isOk()) .andExpect(jsonPath("$.waitingId").value(waiting1.getId())) .andExpect(jsonPath("$.waitingNumber").value(waiting1.getWaitingNumber())) diff --git a/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java b/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java index 4d7c59ef..1c0a5c0a 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java @@ -52,7 +52,6 @@ void getOwnerAllWaiting() { Waiting waiting1 = WaitingFixture.progressWaiting(member1, shop, 1); Waiting waiting2 = WaitingFixture.progressWaiting(member2, shop, 2); - given(ownerRepository.findById(1L)).willReturn(Optional.of(owner)); given(owner.getShop()).willReturn(shop); given(shop.getId()).willReturn(1L); given(waitingLineRepository.getShopWaitingIdsInOrder(any(Long.class))).willReturn( @@ -60,7 +59,7 @@ void getOwnerAllWaiting() { given(waitingRepository.findByIds(waitingIds)).willReturn(List.of(waiting1, waiting2)); //when - OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(1L); + OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(owner); //then assertAll( @@ -85,12 +84,11 @@ void entryWaiting() { Shop shop = mock(Shop.class); Waiting waiting = WaitingFixture.progressWaiting(member, shop, 1); - given(ownerRepository.findById(1L)).willReturn(Optional.of(owner)); given(owner.getShop()).willReturn(shop); given(waitingLineRepository.entry(any(Long.class))).willReturn(1L); given(waitingRepository.findById(1L)).willReturn(Optional.of(waiting)); //when - OwnerWaitingResponse response = ownerWaitingService.entryWaiting(1L); + OwnerWaitingResponse response = ownerWaitingService.entryWaiting(owner); //then assertAll( () -> assertThat(response.waitingId()).isEqualTo(waiting.getId()), From bb4e15a088bd899c8f9981f401418c274bc2d25b Mon Sep 17 00:00:00 2001 From: hs12 Date: Tue, 9 Jan 2024 23:13:32 +0900 Subject: [PATCH 04/20] =?UTF-8?q?feat=20:=20memberId=20=EB=8C=80=EC=8B=A0?= =?UTF-8?q?=20member=20=EC=82=AC=EC=9A=A9=20=EB=B0=8F=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=95=84=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberWaitingController.java | 9 +- .../waiting/service/MemberWaitingService.java | 12 +-- .../waiting/service/OwnerWaitingService.java | 4 - .../MemberWaitingControllerDocsTest.java | 87 ------------------- .../MemberWaitingControllerTest.java | 9 +- .../service/MemberWaitingServiceTest.java | 7 +- 6 files changed, 13 insertions(+), 115 deletions(-) delete mode 100644 src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java diff --git a/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java b/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java index 003d6511..4f844d04 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java @@ -25,11 +25,11 @@ public class MemberWaitingController { private final MemberWaitingService memberWaitingService; - @PostMapping("/{shopId}/{memberId}") + @PostMapping("/{shopId}") public ResponseEntity createWaiting(@PathVariable("shopId") Long shopId, - @PathVariable("memberId") Long memberId, + @LogIn Member member, @Valid @RequestBody CreateWaitingRequest request) { - MemberWaitingResponse response = memberWaitingService.createWaiting(shopId, memberId, + MemberWaitingResponse response = memberWaitingService.createWaiting(shopId, member, request); return ResponseEntity.ok(response); } @@ -58,7 +58,8 @@ public ResponseEntity getWaiting( @GetMapping("/all") public ResponseEntity getMemberWaitingHistory( @LogIn Member member) { - MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory(member); + MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory( + member); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java b/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java index 29f58426..c7286637 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java +++ b/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java @@ -1,7 +1,6 @@ package com.prgrms.catchtable.waiting.service; import static com.prgrms.catchtable.common.exception.ErrorCode.EXISTING_MEMBER_WAITING; -import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_MEMBER; import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_PROGRESS_WAITING; import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_SHOP; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; @@ -12,7 +11,6 @@ import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; import com.prgrms.catchtable.member.domain.Member; -import com.prgrms.catchtable.member.repository.MemberRepository; import com.prgrms.catchtable.shop.domain.Shop; import com.prgrms.catchtable.shop.repository.ShopRepository; import com.prgrms.catchtable.waiting.domain.Waiting; @@ -38,14 +36,12 @@ public class MemberWaitingService { private final LocalDateTime END_DATE_TIME = LocalDateTime.of(LocalDate.now(), LocalTime.of(23, 59, 59)); private final WaitingRepository waitingRepository; - private final MemberRepository memberRepository; private final ShopRepository shopRepository; private final WaitingLineRepository waitingLineRepository; - public MemberWaitingResponse createWaiting(Long shopId, Long memberId, + public MemberWaitingResponse createWaiting(Long shopId, Member member, CreateWaitingRequest request) { // 연관 엔티티 조회 - Member member = getMemberEntity(memberId); Shop shop = getShopEntity(shopId); // 기존 waiting이 있는지 검증 @@ -112,12 +108,6 @@ private void validateIfMemberWaitingExists(Member member) { } } - public Member getMemberEntity(Long memberId) { - return memberRepository.findById(memberId).orElseThrow( - () -> new NotFoundCustomException(NOT_EXIST_MEMBER) - ); - } - public Shop getShopEntity(Long shopId) { Shop shop = shopRepository.findById(shopId).orElseThrow( () -> new NotFoundCustomException(NOT_EXIST_SHOP) diff --git a/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java index c489bc1e..4c739adf 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java +++ b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java @@ -1,14 +1,11 @@ package com.prgrms.catchtable.waiting.service; -import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_OWNER; import static com.prgrms.catchtable.common.exception.ErrorCode.WAITING_DOES_NOT_EXIST; import static com.prgrms.catchtable.waiting.dto.WaitingMapper.toOwnerWaitingListResponse; import static com.prgrms.catchtable.waiting.dto.WaitingMapper.toOwnerWaitingResponse; -import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; import com.prgrms.catchtable.owner.domain.Owner; -import com.prgrms.catchtable.owner.repository.OwnerRepository; import com.prgrms.catchtable.waiting.domain.Waiting; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingListResponse; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingResponse; @@ -25,7 +22,6 @@ public class OwnerWaitingService { private final WaitingRepository waitingRepository; private final WaitingLineRepository waitingLineRepository; - private final OwnerRepository ownerRepository; @Transactional(readOnly = true) public OwnerWaitingListResponse getOwnerAllWaiting(Owner owner) { diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java deleted file mode 100644 index 6b7a0360..00000000 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.prgrms.catchtable.waiting.controller; - -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; -import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -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.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.prgrms.catchtable.common.restdocs.RestDocsSupport; -import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; -import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; -import com.prgrms.catchtable.waiting.service.MemberWaitingService; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; - -class MemberWaitingControllerDocsTest extends RestDocsSupport { - - private final MemberWaitingService memberWaitingService = mock(MemberWaitingService.class); - - @Override - protected Object initController() { - return new MemberWaitingController(memberWaitingService); - } - - @DisplayName("웨이팅 생성 API") - @Test - void createWaiting() throws Exception { - CreateWaitingRequest request = CreateWaitingRequest - .builder() - .peopleCount(2).build(); - MemberWaitingResponse response = MemberWaitingResponse.builder() - .waitingId(201L) - .shopId(1L) - .shopName("shop1") - .waitingNumber(324) - .rank(20L) - .peopleCount(2) - .remainingPostponeCount(2) - .status("진행 중") - .build(); - - given(memberWaitingService.createWaiting(1L, 1L, request)).willReturn(response); - - mockMvc.perform(post("/waitings/{shopId}/{memberId}", 1, 1) - .contentType(APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andDo(document("waiting-create", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - requestFields( - fieldWithPath("peopleCount").type(JsonFieldType.NUMBER) - .description("인원수") - ), - responseFields( - fieldWithPath("waitingId").type(JsonFieldType.NUMBER) - .description("생성된 웨이팅 아이디"), - fieldWithPath("shopId").type(JsonFieldType.NUMBER) - .description("상점 아이디"), - fieldWithPath("shopName").type(JsonFieldType.STRING) - .description("상점 이름"), - fieldWithPath("peopleCount").type(JsonFieldType.NUMBER) - .description("인원 수"), - fieldWithPath("waitingNumber").type(JsonFieldType.NUMBER) - .description("웨이팅 고유 번호"), - fieldWithPath("rank").type(JsonFieldType.NUMBER) - .description("웨이팅 순서"), - fieldWithPath("remainingPostponeCount").type(JsonFieldType.NUMBER) - .description("대기 지연 잔여 횟수"), - fieldWithPath("status").type(JsonFieldType.STRING) - .description("대기 상태") - ) - )); - - - } -} \ No newline at end of file diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java index 380875af..ad85ee1e 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java @@ -115,9 +115,10 @@ void createWaiting() throws Exception { .peopleCount(2).build(); // when, then - mockMvc.perform(post("/waitings/{shopId}/{memberId}", shop.getId(), member4.getId()) + mockMvc.perform(post("/waitings/{shopId}", shop.getId()) .contentType(APPLICATION_JSON) - .content(asJsonString(request))) + .content(asJsonString(request)) + .headers(getHttpHeaders(member4))) .andExpect(status().isOk()) .andExpect(jsonPath("$.shopId").value(shop.getId())) .andExpect(jsonPath("$.shopName").value(shop.getName())) @@ -164,8 +165,8 @@ void postponeWaiting_fails2() throws Exception { ReflectionTestUtils.setField(waiting2, "remainingPostponeCount", 0); waitingRepository.save(waiting2); mockMvc.perform(patch("/waitings") - .contentType(APPLICATION_JSON) - .headers(getHttpHeaders(member2))) + .contentType(APPLICATION_JSON) + .headers(getHttpHeaders(member2))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message").value("이미 두 차례 대기를 미뤘습니다.")) .andDo(MockMvcResultHandlers.print()); diff --git a/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java b/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java index 027e80c4..93f1a1ed 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java @@ -11,7 +11,6 @@ import static org.mockito.Mockito.mock; import com.prgrms.catchtable.member.domain.Member; -import com.prgrms.catchtable.member.repository.MemberRepository; import com.prgrms.catchtable.shop.domain.Shop; import com.prgrms.catchtable.shop.repository.ShopRepository; import com.prgrms.catchtable.waiting.domain.Waiting; @@ -37,8 +36,6 @@ class MemberWaitingServiceTest { private WaitingRepository waitingRepository; @Mock private ShopRepository shopRepository; - @Mock - private MemberRepository memberRepository; @Mock private WaitingLineRepository waitingLineRepository; @@ -60,17 +57,17 @@ void createWaiting() { .waitingNumber(1) .peopleCount(2) .build(); + doNothing().when(shop).validateIfShopOpened(any(LocalTime.class)); given(shopRepository.findById(1L)).willReturn(Optional.of(shop)); given(shop.getId()).willReturn(1L); - given(memberRepository.findById(1L)).willReturn(Optional.of(member)); given(waitingRepository.existsByMember(member)).willReturn(false); given(waitingRepository.save(any(Waiting.class))).willReturn(waiting); given(waitingLineRepository.findRank(shop.getId(), waiting.getId())).willReturn(1L); //when - MemberWaitingResponse response = memberWaitingService.createWaiting(1L, 1L, request); + MemberWaitingResponse response = memberWaitingService.createWaiting(1L, member, request); //then assertAll( () -> assertThat(response.peopleCount()).isEqualTo(2), From c5db156cb91b35011077f344c62ad9f1b7e6079f Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 14:09:08 +0900 Subject: [PATCH 05/20] =?UTF-8?q?feat=20:=20=EB=8C=80=EA=B8=B0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EB=B3=80=EA=B2=BD=20=EB=B2=8C=ED=81=AC=20=EC=97=B0?= =?UTF-8?q?=EC=82=B0=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../waiting/repository/WaitingRepository.java | 6 ++++ .../repository/WaitingRepositoryTest.java | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java b/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java index db1c814b..3093901e 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -29,4 +30,9 @@ Optional findByMemberAndStatusWithShop(@Param("member") Member member, + "join fetch w.shop " + "join fetch w.member where w.member = :member") List findWaitingWithMember(@Param("member") Member member); + + @Modifying(clearAutomatically = true) + @Query("update Waiting w set w.status = :newStatus where w.status = :currentStatus") + void updateWaitingStatus(@Param("newStatus") WaitingStatus newStatus, + @Param("currentStatus") WaitingStatus currentStatus); } diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java index da4f7f27..fc16fd2f 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -1,7 +1,10 @@ package com.prgrms.catchtable.waiting.repository; +import static com.prgrms.catchtable.waiting.domain.WaitingStatus.CANCELED; +import static com.prgrms.catchtable.waiting.domain.WaitingStatus.COMPLETED; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import com.prgrms.catchtable.member.MemberFixture; import com.prgrms.catchtable.member.domain.Member; @@ -15,6 +18,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -124,4 +128,31 @@ void findWaitingWithMember() { assertThat(memberAllWaitings).containsExactly(canceledWaiting, completedWaiting, progressWaiting); } + + @DisplayName("벌크 연산으로 진행 중인 대기 상태를 취소 상태로 업데이트 할 수 있다.") + @Test + void test() { + //given + Waiting progressWaiting1 = WaitingFixture.progressWaiting(member1, shop, 1); + Waiting progressWaiting2 = WaitingFixture.progressWaiting(member2, shop, 2); + Waiting progressWaiting3 = WaitingFixture.progressWaiting(member3, shop, 3); + Waiting completedWaiting = WaitingFixture.completedWaiting(member3, shop, 4); + + waitingRepository.saveAll( + List.of(progressWaiting1, progressWaiting2, progressWaiting3, completedWaiting)); + //when + waitingRepository.updateWaitingStatus(CANCELED,PROGRESS); + Waiting waiting1 = waitingRepository.findById(progressWaiting1.getId()).orElseThrow(); + Waiting waiting2 = waitingRepository.findById(progressWaiting2.getId()).orElseThrow(); + Waiting waiting3 = waitingRepository.findById(progressWaiting3.getId()).orElseThrow(); + Waiting waiting4 = waitingRepository.findById(completedWaiting.getId()).orElseThrow(); + + //then + assertAll( + () -> assertThat(waiting1.getStatus()).isEqualTo(CANCELED), + () -> assertThat(waiting2.getStatus()).isEqualTo(CANCELED), + () -> assertThat(waiting3.getStatus()).isEqualTo(CANCELED), + () -> assertThat(waiting4.getStatus()).isEqualTo(COMPLETED) + ); + } } \ No newline at end of file From eadac54db34fe687da937a8e60937838073958dc Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:05:33 +0900 Subject: [PATCH 06/20] =?UTF-8?q?feat=20:=20=EB=B2=8C=ED=81=AC=20=EC=97=B0?= =?UTF-8?q?=EC=82=B0=20@=20Transactional=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/catchtable/waiting/repository/WaitingRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java b/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java index 3093901e..e1d72c76 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java @@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; public interface WaitingRepository extends JpaRepository { @@ -31,6 +32,7 @@ Optional findByMemberAndStatusWithShop(@Param("member") Member member, + "join fetch w.member where w.member = :member") List findWaitingWithMember(@Param("member") Member member); + @Transactional @Modifying(clearAutomatically = true) @Query("update Waiting w set w.status = :newStatus where w.status = :currentStatus") void updateWaitingStatus(@Param("newStatus") WaitingStatus newStatus, From a2079e0dfd2f4019638c0a3559a01eb3a522e7f2 Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:17:51 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat=20:=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../waiting/schedular/WaitingScheduler.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/prgrms/catchtable/waiting/schedular/WaitingScheduler.java diff --git a/src/main/java/com/prgrms/catchtable/waiting/schedular/WaitingScheduler.java b/src/main/java/com/prgrms/catchtable/waiting/schedular/WaitingScheduler.java new file mode 100644 index 00000000..ba4ccc51 --- /dev/null +++ b/src/main/java/com/prgrms/catchtable/waiting/schedular/WaitingScheduler.java @@ -0,0 +1,37 @@ +package com.prgrms.catchtable.waiting.schedular; + +import static com.prgrms.catchtable.waiting.domain.WaitingStatus.CANCELED; +import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; + +import com.prgrms.catchtable.waiting.repository.WaitingRepository; +import java.util.Set; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@EnableScheduling +@RequiredArgsConstructor +public class WaitingScheduler { + + private final StringRedisTemplate redisTemplate; + + private final WaitingRepository waitingRepository; + + //매일 자정 레디스 데이터 비우기 + @Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul") + public void clearRedis() { + Set keys = redisTemplate.keys("s*"); + redisTemplate.delete(keys); + } + + //매일 자정 대기 상태 바꾸기 + @Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul") + public void changeProgressStatus() { + waitingRepository.updateWaitingStatus(CANCELED, PROGRESS); + } +} From 8a22068282990a31f45116d9b90c05204dc7c44d Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:18:24 +0900 Subject: [PATCH 08/20] =?UTF-8?q?feat=20:=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=9F=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/WaitingRepositoryTest.java | 3 +- .../schedular/WaitingSchedulerTest.java | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java index fc16fd2f..48567015 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -131,7 +131,7 @@ void findWaitingWithMember() { @DisplayName("벌크 연산으로 진행 중인 대기 상태를 취소 상태로 업데이트 할 수 있다.") @Test - void test() { + void updateWaitingStatus() { //given Waiting progressWaiting1 = WaitingFixture.progressWaiting(member1, shop, 1); Waiting progressWaiting2 = WaitingFixture.progressWaiting(member2, shop, 2); @@ -142,6 +142,7 @@ void test() { List.of(progressWaiting1, progressWaiting2, progressWaiting3, completedWaiting)); //when waitingRepository.updateWaitingStatus(CANCELED,PROGRESS); + System.out.println("progressWaiting3 = " + progressWaiting3.getStatus()); Waiting waiting1 = waitingRepository.findById(progressWaiting1.getId()).orElseThrow(); Waiting waiting2 = waitingRepository.findById(progressWaiting2.getId()).orElseThrow(); Waiting waiting3 = waitingRepository.findById(progressWaiting3.getId()).orElseThrow(); diff --git a/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java b/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java new file mode 100644 index 00000000..3782170a --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java @@ -0,0 +1,46 @@ +package com.prgrms.catchtable.waiting.schedular; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +@Disabled +class WaitingSchedulerTest { + + @Autowired + private WaitingLineRepository waitingLineRepository; + + @Autowired + private StringRedisTemplate redisTemplate; + + @AfterEach + void clear(){ + redisTemplate.delete("s1"); + } + + @DisplayName("특정 시간 주기로 redis 데이터를 비울 수 있다.") + @Test + void clearRedis() throws InterruptedException { + Long shopId = 1L; + + waitingLineRepository.save(shopId, 1L); + waitingLineRepository.save(shopId, 2L); + waitingLineRepository.save(shopId, 3L); + + assertThat(waitingLineRepository.getWaitingLineSize(shopId)).isEqualTo(3); + + Thread.sleep(60*1000); + assertThat(waitingLineRepository.getWaitingLineSize(shopId)).isZero(); + + } +} \ No newline at end of file From 1e57075c6f93aea8929f1f223e4397639cfea86e Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:56:44 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat=20:=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/{album => waiting}/waiting.adoc | 0 .../MemberWaitingControllerDocsTest.java | 104 ++++++++++++++++++ 2 files changed, 104 insertions(+) rename src/docs/asciidoc/api/{album => waiting}/waiting.adoc (100%) create mode 100644 src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java diff --git a/src/docs/asciidoc/api/album/waiting.adoc b/src/docs/asciidoc/api/waiting/waiting.adoc similarity index 100% rename from src/docs/asciidoc/api/album/waiting.adoc rename to src/docs/asciidoc/api/waiting/waiting.adoc diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java new file mode 100644 index 00000000..f2b1c441 --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java @@ -0,0 +1,104 @@ +package com.prgrms.catchtable.waiting.controller; + +import static com.prgrms.catchtable.common.Role.MEMBER; +import static org.mockito.BDDMockito.given; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +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.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.prgrms.catchtable.common.restdocs.RestDocsSupport; +import com.prgrms.catchtable.jwt.token.Token; +import com.prgrms.catchtable.member.MemberFixture; +import com.prgrms.catchtable.member.domain.Member; +import com.prgrms.catchtable.member.repository.MemberRepository; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; +import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; +import com.prgrms.catchtable.waiting.service.MemberWaitingService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +class MemberWaitingControllerDocsTest extends RestDocsSupport { + + @MockBean + private MemberWaitingService memberWaitingService; + @Autowired + private MemberRepository memberRepository; + + + + @DisplayName("웨이팅 생성 API") + @Test + void createWaiting() throws Exception { + CreateWaitingRequest request = CreateWaitingRequest + .builder() + .peopleCount(2).build(); + MemberWaitingResponse response = MemberWaitingResponse.builder() + .waitingId(201L) + .shopId(1L) + .shopName("shop1") + .waitingNumber(324) + .rank(20L) + .peopleCount(2) + .remainingPostponeCount(2) + .status("진행 중") + .build(); + Member member = MemberFixture.member("test@naver.com"); + memberRepository.save(member); + given(memberWaitingService.createWaiting(1L, member, request)).willReturn(response); + + mockMvc.perform(post("/waitings/{shopId}", 1) + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + .headers(getHttpHeaders(member))) + .andExpect(status().isOk()) + .andDo(document("waiting-create", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("peopleCount").type(JsonFieldType.NUMBER) + .description("인원수") + ), + responseFields( + fieldWithPath("waitingId").type(JsonFieldType.NUMBER) + .description("생성된 웨이팅 아이디"), + fieldWithPath("shopId").type(JsonFieldType.NUMBER) + .description("상점 아이디"), + fieldWithPath("shopName").type(JsonFieldType.STRING) + .description("상점 이름"), + fieldWithPath("peopleCount").type(JsonFieldType.NUMBER) + .description("인원 수"), + fieldWithPath("waitingNumber").type(JsonFieldType.NUMBER) + .description("웨이팅 고유 번호"), + fieldWithPath("rank").type(JsonFieldType.NUMBER) + .description("웨이팅 순서"), + fieldWithPath("remainingPostponeCount").type(JsonFieldType.NUMBER) + .description("대기 지연 잔여 횟수"), + fieldWithPath("status").type(JsonFieldType.STRING) + .description("대기 상태") + ) + )); + + + } + + private HttpHeaders getHttpHeaders(Member member) { + Token token = jwtTokenProvider.createToken(member.getEmail(),MEMBER); + httpHeaders.add("AccessToken", token.getAccessToken()); + httpHeaders.add("RefreshToken", token.getRefreshToken()); + return httpHeaders; + } +} \ No newline at end of file From 7ce4b29a6e8de1f9a4403bc3f1ed67b24c5cc707 Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:57:56 +0900 Subject: [PATCH 10/20] =?UTF-8?q?feat=20:=20Security=20Security=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20RestDocsSupport?= =?UTF-8?q?=20setUp=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/restdocs/RestDocsSupport.java | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java index 381b6db1..a9ebeece 100644 --- a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java +++ b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java @@ -1,28 +1,53 @@ package com.prgrms.catchtable.common.restdocs; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; - import com.fasterxml.jackson.databind.ObjectMapper; +import com.prgrms.catchtable.jwt.provider.JwtTokenProvider; +import jakarta.servlet.ServletException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.web.MockFilterConfig; import org.springframework.restdocs.RestDocumentationContextProvider; import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import org.springframework.security.config.BeanIds; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.filter.CharacterEncodingFilter; +import org.springframework.web.filter.DelegatingFilterProxy; @ExtendWith(RestDocumentationExtension.class) +@SpringBootTest public abstract class RestDocsSupport { protected MockMvc mockMvc; - protected ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + protected ObjectMapper objectMapper; + protected HttpHeaders httpHeaders = new HttpHeaders(); + @Autowired + protected JwtTokenProvider jwtTokenProvider; @BeforeEach - void setUp(RestDocumentationContextProvider provider) { - this.mockMvc = MockMvcBuilders.standaloneSetup(initController()) - .apply(documentationConfiguration(provider)) + void setUp(final WebApplicationContext context, + final RestDocumentationContextProvider provider) throws ServletException { + DelegatingFilterProxy delegateProxyFilter = new DelegatingFilterProxy(); + delegateProxyFilter.init( + new MockFilterConfig(context.getServletContext(), BeanIds.SPRING_SECURITY_FILTER_CHAIN)); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(context) + .apply( + MockMvcRestDocumentation.documentationConfiguration(provider)) // rest docs 설정 주입 + .alwaysDo(MockMvcResultHandlers.print()) + .addFilters( + new CharacterEncodingFilter("UTF-8", true), + delegateProxyFilter + ) .build(); } - - protected abstract Object initController(); } From 7975d322c246cf08f0447e1ce16f67fd1ccc3b4b Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 17:58:40 +0900 Subject: [PATCH 11/20] =?UTF-8?q?rename=20:=20adoc=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 160506fc..63a41be5 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -12,4 +12,4 @@ endif::[] [[CatchTable-API]] == Waiting API -include::api/album/waiting.adoc[] \ No newline at end of file +include::api/waiting/waiting.adoc[] \ No newline at end of file From b4e3fbb605b36dc7e840c12322d18d5c85a9a81d Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:04:39 +0900 Subject: [PATCH 12/20] =?UTF-8?q?refactor=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EB=A9=A7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catchtable/waiting/controller/OwnerWaitingController.java | 1 - .../prgrms/catchtable/common/restdocs/RestDocsSupport.java | 4 ++-- .../waiting/controller/MemberWaitingControllerDocsTest.java | 4 +--- .../waiting/controller/OwnerWaitingControllerTest.java | 1 - .../catchtable/waiting/repository/WaitingRepositoryTest.java | 3 +-- .../catchtable/waiting/schedular/WaitingSchedulerTest.java | 4 ++-- 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java index 1c802f27..24d90864 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java @@ -9,7 +9,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java index a9ebeece..5ae7627c 100644 --- a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java +++ b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; import org.springframework.http.HttpHeaders; import org.springframework.mock.web.MockFilterConfig; import org.springframework.restdocs.RestDocumentationContextProvider; @@ -38,7 +37,8 @@ void setUp(final WebApplicationContext context, final RestDocumentationContextProvider provider) throws ServletException { DelegatingFilterProxy delegateProxyFilter = new DelegatingFilterProxy(); delegateProxyFilter.init( - new MockFilterConfig(context.getServletContext(), BeanIds.SPRING_SECURITY_FILTER_CHAIN)); + new MockFilterConfig(context.getServletContext(), + BeanIds.SPRING_SECURITY_FILTER_CHAIN)); this.mockMvc = MockMvcBuilders.webAppContextSetup(context) .apply( diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java index f2b1c441..06ddb955 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java @@ -26,7 +26,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpHeaders; -import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.transaction.annotation.Transactional; @@ -39,7 +38,6 @@ class MemberWaitingControllerDocsTest extends RestDocsSupport { private MemberRepository memberRepository; - @DisplayName("웨이팅 생성 API") @Test void createWaiting() throws Exception { @@ -96,7 +94,7 @@ void createWaiting() throws Exception { } private HttpHeaders getHttpHeaders(Member member) { - Token token = jwtTokenProvider.createToken(member.getEmail(),MEMBER); + Token token = jwtTokenProvider.createToken(member.getEmail(), MEMBER); httpHeaders.add("AccessToken", token.getAccessToken()); httpHeaders.add("RefreshToken", token.getRefreshToken()); return httpHeaders; diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java index 7d6e6f97..dbb032a0 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java @@ -1,6 +1,5 @@ package com.prgrms.catchtable.waiting.controller; -import static com.prgrms.catchtable.common.Role.MEMBER; import static com.prgrms.catchtable.common.Role.OWNER; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.hasSize; diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java index 48567015..d9ad4898 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -18,7 +18,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; -import java.util.Optional; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -141,7 +140,7 @@ void updateWaitingStatus() { waitingRepository.saveAll( List.of(progressWaiting1, progressWaiting2, progressWaiting3, completedWaiting)); //when - waitingRepository.updateWaitingStatus(CANCELED,PROGRESS); + waitingRepository.updateWaitingStatus(CANCELED, PROGRESS); System.out.println("progressWaiting3 = " + progressWaiting3.getStatus()); Waiting waiting1 = waitingRepository.findById(progressWaiting1.getId()).orElseThrow(); Waiting waiting2 = waitingRepository.findById(progressWaiting2.getId()).orElseThrow(); diff --git a/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java b/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java index 3782170a..5a9c6c44 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/schedular/WaitingSchedulerTest.java @@ -24,7 +24,7 @@ class WaitingSchedulerTest { private StringRedisTemplate redisTemplate; @AfterEach - void clear(){ + void clear() { redisTemplate.delete("s1"); } @@ -39,7 +39,7 @@ void clearRedis() throws InterruptedException { assertThat(waitingLineRepository.getWaitingLineSize(shopId)).isEqualTo(3); - Thread.sleep(60*1000); + Thread.sleep(60 * 1000); assertThat(waitingLineRepository.getWaitingLineSize(shopId)).isZero(); } From 215a83aa329f27772c1cbcb631e04fb81f4f22ec Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:46:32 +0900 Subject: [PATCH 13/20] =?UTF-8?q?feat=20:=20RestDocsConfig=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/restdocs/RestDocsConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsConfig.java diff --git a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsConfig.java b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsConfig.java new file mode 100644 index 00000000..4d8bec07 --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsConfig.java @@ -0,0 +1,20 @@ +package com.prgrms.catchtable.common.restdocs; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.restdocs.operation.preprocess.Preprocessors; + +@TestConfiguration +public class RestDocsConfig { + + @Bean + public RestDocumentationResultHandler write() { + return MockMvcRestDocumentation.document( + "{class-name}/{method-name}", + Preprocessors.preprocessRequest(Preprocessors.prettyPrint()), + Preprocessors.preprocessResponse(Preprocessors.prettyPrint()) + ); + } +} \ No newline at end of file From 6037600cdec3023faaa134c0d7237e106292534e Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:47:57 +0900 Subject: [PATCH 14/20] =?UTF-8?q?feat=20:=20RestDocs=20Config=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20member=20?= =?UTF-8?q?header=20=EA=B3=B5=ED=86=B5=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/restdocs/RestDocsSupport.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java index 5ae7627c..8b4ec69c 100644 --- a/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java +++ b/src/test/java/com/prgrms/catchtable/common/restdocs/RestDocsSupport.java @@ -1,17 +1,23 @@ package com.prgrms.catchtable.common.restdocs; +import static com.prgrms.catchtable.common.Role.MEMBER; + import com.fasterxml.jackson.databind.ObjectMapper; import com.prgrms.catchtable.jwt.provider.JwtTokenProvider; +import com.prgrms.catchtable.jwt.token.Token; +import com.prgrms.catchtable.member.domain.Member; import jakarta.servlet.ServletException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; import org.springframework.http.HttpHeaders; import org.springframework.mock.web.MockFilterConfig; import org.springframework.restdocs.RestDocumentationContextProvider; import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; import org.springframework.security.config.BeanIds; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; @@ -21,12 +27,16 @@ import org.springframework.web.filter.DelegatingFilterProxy; @ExtendWith(RestDocumentationExtension.class) +@Import(RestDocsConfig.class) @SpringBootTest public abstract class RestDocsSupport { protected MockMvc mockMvc; @Autowired protected ObjectMapper objectMapper; + + @Autowired + protected RestDocumentationResultHandler restDocs; protected HttpHeaders httpHeaders = new HttpHeaders(); @Autowired @@ -43,6 +53,7 @@ void setUp(final WebApplicationContext context, this.mockMvc = MockMvcBuilders.webAppContextSetup(context) .apply( MockMvcRestDocumentation.documentationConfiguration(provider)) // rest docs 설정 주입 + .alwaysDo(restDocs) .alwaysDo(MockMvcResultHandlers.print()) .addFilters( new CharacterEncodingFilter("UTF-8", true), @@ -50,4 +61,11 @@ void setUp(final WebApplicationContext context, ) .build(); } + + public HttpHeaders getHttpHeaders(Member member) { + Token token = jwtTokenProvider.createToken(member.getEmail(), MEMBER); + httpHeaders.add("AccessToken", token.getAccessToken()); + httpHeaders.add("RefreshToken", token.getRefreshToken()); + return httpHeaders; + } } From 97d7fa9b4e3aedc2bea74dcb1279eec3c4aab12c Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:48:43 +0900 Subject: [PATCH 15/20] =?UTF-8?q?refactor=20:=20RestdocsConfig=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberWaitingControllerDocsTest.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java index 06ddb955..ecd525ce 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java @@ -63,9 +63,7 @@ void createWaiting() throws Exception { .content(objectMapper.writeValueAsString(request)) .headers(getHttpHeaders(member))) .andExpect(status().isOk()) - .andDo(document("waiting-create", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), + .andDo(restDocs.document( requestFields( fieldWithPath("peopleCount").type(JsonFieldType.NUMBER) .description("인원수") @@ -92,11 +90,4 @@ void createWaiting() throws Exception { } - - private HttpHeaders getHttpHeaders(Member member) { - Token token = jwtTokenProvider.createToken(member.getEmail(), MEMBER); - httpHeaders.add("AccessToken", token.getAccessToken()); - httpHeaders.add("RefreshToken", token.getRefreshToken()); - return httpHeaders; - } } \ No newline at end of file From 3c6f7ab92c7e607dd7a3423b42a500c1afa0c4ab Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:49:15 +0900 Subject: [PATCH 16/20] =?UTF-8?q?rename=20:=20=EB=B3=80=EA=B2=BD=EB=90=9C?= =?UTF-8?q?=20snippet=20=ED=8F=B4=EB=8D=94=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api/waiting/waiting.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/docs/asciidoc/api/waiting/waiting.adoc b/src/docs/asciidoc/api/waiting/waiting.adoc index 7b3afde4..309f4425 100644 --- a/src/docs/asciidoc/api/waiting/waiting.adoc +++ b/src/docs/asciidoc/api/waiting/waiting.adoc @@ -3,10 +3,10 @@ ==== HTTP Request -include::{snippets}/waiting-create/http-request.adoc[] -include::{snippets}/waiting-create/request-fields.adoc[] +include::{snippets}/member-waiting-controller-docs-test/create-waiting/http-request.adoc[] +include::{snippets}/member-waiting-controller-docs-test/create-waiting/request-fields.adoc[] ==== HTTP Response -include::{snippets}/waiting-create/http-response.adoc[] -include::{snippets}/waiting-create/response-fields.adoc[] \ No newline at end of file +include::{snippets}/member-waiting-controller-docs-test/create-waiting/http-response.adoc[] +include::{snippets}/member-waiting-controller-docs-test/create-waiting/response-fields.adoc[] \ No newline at end of file From ec143df964d9153bf8256a39ea1b5c33af4c40f6 Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 18:49:48 +0900 Subject: [PATCH 17/20] =?UTF-8?q?refactor=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EB=A9=A7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberWaitingControllerDocsTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java index ecd525ce..c807c8b2 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java @@ -1,12 +1,7 @@ package com.prgrms.catchtable.waiting.controller; -import static com.prgrms.catchtable.common.Role.MEMBER; import static org.mockito.BDDMockito.given; import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; @@ -14,7 +9,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.prgrms.catchtable.common.restdocs.RestDocsSupport; -import com.prgrms.catchtable.jwt.token.Token; import com.prgrms.catchtable.member.MemberFixture; import com.prgrms.catchtable.member.domain.Member; import com.prgrms.catchtable.member.repository.MemberRepository; @@ -25,7 +19,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpHeaders; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.transaction.annotation.Transactional; From 734089be79f0eb1a09b4ea47c6b2187022dc79fb Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 20:19:53 +0900 Subject: [PATCH 18/20] =?UTF-8?q?refactor=20:=20WaitingMapper=20stream=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catchtable/waiting/dto/WaitingMapper.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java b/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java index 5620f06d..b241f5bb 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java @@ -11,8 +11,8 @@ import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingListResponse; import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingResponse; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; import lombok.NoArgsConstructor; @NoArgsConstructor(access = PRIVATE) @@ -55,11 +55,9 @@ public static MemberWaitingHistoryResponse toMemberWaitingHistoryResponse(Waitin public static MemberWaitingHistoryListResponse toMemberWaitingListResponse( List waitings) { - List list = new ArrayList<>(); - for (Waiting waiting : waitings) { - list.add(toMemberWaitingHistoryResponse(waiting)); - } - return new MemberWaitingHistoryListResponse(list); + return new MemberWaitingHistoryListResponse(waitings.stream() + .map(WaitingMapper::toMemberWaitingHistoryResponse) + .toList()); } public static OwnerWaitingResponse toOwnerWaitingResponse(Waiting waiting, Long rank) { @@ -72,11 +70,11 @@ public static OwnerWaitingResponse toOwnerWaitingResponse(Waiting waiting, Long } public static OwnerWaitingListResponse toOwnerWaitingListResponse(List waitings) { - long rank = 1L; - List list = new ArrayList<>(); - for (Waiting waiting : waitings) { - list.add(toOwnerWaitingResponse(waiting, rank++)); - } - return new OwnerWaitingListResponse(list); + AtomicLong rank = new AtomicLong(1); + return new OwnerWaitingListResponse( + waitings.stream() + .map(waiting -> toOwnerWaitingResponse(waiting, rank.getAndIncrement())) + .toList() + ); } } From 07b08878acdf2e4f4f740fe04f70e9b3dfc9ecaa Mon Sep 17 00:00:00 2001 From: hs12 Date: Wed, 10 Jan 2024 20:39:59 +0900 Subject: [PATCH 19/20] =?UTF-8?q?feat=20:=20repository=20test=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../waiting/repository/WaitingRepositoryTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java index d9ad4898..513a716b 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -5,6 +5,7 @@ import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE; import com.prgrms.catchtable.member.MemberFixture; import com.prgrms.catchtable.member.domain.Member; @@ -23,13 +24,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest -@Transactional +@DataJpaTest +@AutoConfigureTestDatabase(replace = NONE) class WaitingRepositoryTest { private final LocalDateTime START_DATE_TIME = LocalDateTime.of(LocalDate.now(), From ac4c8cbc0f4bf3fef06deec99419d42d42ad43da Mon Sep 17 00:00:00 2001 From: hs12 Date: Thu, 11 Jan 2024 14:26:08 +0900 Subject: [PATCH 20/20] =?UTF-8?q?feat=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20deleteAll=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../waiting/repository/WaitingRepositoryTest.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java index 513a716b..be6e0c1d 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -19,7 +19,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -56,13 +55,6 @@ void setUp() { shopRepository.save(shop); } - @AfterEach - void clear() { - memberRepository.deleteAll(); - waitingRepository.deleteAll(); - shopRepository.deleteAll(); - } - @DisplayName("특정 가게의 당일 대기 번호를 조회할 수 있다.") @Test void countByShopAndCreatedAtBetween() {