diff --git a/src/main/java/com/prgrms/catchtable/common/exception/ErrorCode.java b/src/main/java/com/prgrms/catchtable/common/exception/ErrorCode.java index a0b3afe4..b301f2e7 100644 --- a/src/main/java/com/prgrms/catchtable/common/exception/ErrorCode.java +++ b/src/main/java/com/prgrms/catchtable/common/exception/ErrorCode.java @@ -31,6 +31,7 @@ public enum ErrorCode { INTERNAL_SERVER_ERROR("내부 서버 오류입니다."), ALREADY_EXIST_OWNER("이미 존재하는 점주입니다"), + NOT_EXIST_OWNER("해당 아이디의 점주가 존재하지 않습니다."), BAD_REQUEST_EMAIL_OR_PASSWORD("이메일 혹은 비밀번호를 확인해주세요"), BAD_REQUEST_INPUT_GENDER_TYPE("성별 타입을 양식대로 입력해주세요"); 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 e7dfb94a..dac21df7 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/MemberWaitingController.java @@ -1,7 +1,7 @@ package com.prgrms.catchtable.waiting.controller; -import com.prgrms.catchtable.waiting.dto.CreateWaitingRequest; -import com.prgrms.catchtable.waiting.dto.WaitingResponse; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; +import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; import com.prgrms.catchtable.waiting.service.MemberWaitingService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -23,29 +23,32 @@ public class MemberWaitingController { private final MemberWaitingService memberWaitingService; @PostMapping("/{shopId}/{memberId}") - public ResponseEntity createWaiting(@PathVariable("shopId") Long shopId, + public ResponseEntity createWaiting(@PathVariable("shopId") Long shopId, @PathVariable("memberId") Long memberId, @Valid @RequestBody CreateWaitingRequest request) { - WaitingResponse response = memberWaitingService.createWaiting(shopId, memberId, request); + MemberWaitingResponse response = memberWaitingService.createWaiting(shopId, memberId, + request); return ResponseEntity.ok(response); } @PatchMapping("/{memberId}") - public ResponseEntity postponeWaiting( + public ResponseEntity postponeWaiting( @PathVariable("memberId") Long memberId) { - WaitingResponse response = memberWaitingService.postponeWaiting(memberId); + MemberWaitingResponse response = memberWaitingService.postponeWaiting(memberId); return ResponseEntity.ok(response); } @DeleteMapping("/{memberId}") - public ResponseEntity cancelWaiting(@PathVariable("memberId") Long memberId) { - WaitingResponse response = memberWaitingService.cancelWaiting(memberId); + public ResponseEntity cancelWaiting( + @PathVariable("memberId") Long memberId) { + MemberWaitingResponse response = memberWaitingService.cancelWaiting(memberId); return ResponseEntity.ok(response); } @GetMapping("/{memberId}") - public ResponseEntity getWaiting(@PathVariable("memberId") Long memberId) { - WaitingResponse response = memberWaitingService.getWaiting(memberId); + public ResponseEntity getWaiting( + @PathVariable("memberId") Long memberId) { + MemberWaitingResponse response = memberWaitingService.getWaiting(memberId); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java new file mode 100644 index 00000000..c907e0d9 --- /dev/null +++ b/src/main/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingController.java @@ -0,0 +1,25 @@ +package com.prgrms.catchtable.waiting.controller; + +import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingListResponse; +import com.prgrms.catchtable.waiting.service.OwnerWaitingService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RequestMapping("owner/waitings") +@RestController +public class OwnerWaitingController { + + private final OwnerWaitingService ownerWaitingService; + + @GetMapping("/{ownerId}") + public ResponseEntity getOwnerAllWaiting( + @PathVariable("ownerId") Long ownerId) { + OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(ownerId); + return ResponseEntity.ok(response); + } +} 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 e953c7bc..f9ea780b 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java +++ b/src/main/java/com/prgrms/catchtable/waiting/domain/Waiting.java @@ -1,10 +1,8 @@ package com.prgrms.catchtable.waiting.domain; -import static com.prgrms.catchtable.common.exception.ErrorCode.CAN_NOT_COMPLETE_WAITING; import static com.prgrms.catchtable.common.exception.ErrorCode.POSTPONE_REMAINING_CNT_0; 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.NO_SHOW; import static com.prgrms.catchtable.waiting.domain.WaitingStatus.PROGRESS; import static jakarta.persistence.ConstraintMode.NO_CONSTRAINT; import static jakarta.persistence.EnumType.STRING; @@ -77,14 +75,10 @@ public void decreasePostponeRemainingCount() { remainingPostponeCount--; } - public void completeWaiting() { - if (status == NO_SHOW || status == CANCELED) { - throw new BadRequestCustomException(CAN_NOT_COMPLETE_WAITING); - } + public void changeStatusCompleted() { status = COMPLETED; } - public void changeStatusCanceled() { status = CANCELED; } 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 5a11c521..75c0e134 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java @@ -5,6 +5,12 @@ import com.prgrms.catchtable.member.domain.Member; import com.prgrms.catchtable.shop.domain.Shop; import com.prgrms.catchtable.waiting.domain.Waiting; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; +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 lombok.NoArgsConstructor; @NoArgsConstructor(access = PRIVATE) @@ -21,8 +27,8 @@ public static Waiting toWaiting(CreateWaitingRequest request, int waitingNumber, } // entity -> dto - public static WaitingResponse toWaitingResponse(Waiting waiting, Long rank) { - return WaitingResponse.builder() + public static MemberWaitingResponse toWaitingResponse(Waiting waiting, Long rank) { + return MemberWaitingResponse.builder() .waitingId(waiting.getId()) .shopId(waiting.getShop().getId()) .shopName(waiting.getShop().getName()) @@ -33,4 +39,22 @@ public static WaitingResponse toWaitingResponse(Waiting waiting, Long rank) { .status(waiting.getStatus().getDescription()) .build(); } + + public static OwnerWaitingResponse toOwnerWaitingResponse(Waiting waiting, Long rank) { + return OwnerWaitingResponse.builder() + .waitingId(waiting.getId()) + .waitingNumber(waiting.getWaitingNumber()) + .rank(rank) + .peopleCount(waiting.getPeopleCount()) + .build(); + } + + 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); + } } diff --git a/src/main/java/com/prgrms/catchtable/waiting/dto/CreateWaitingRequest.java b/src/main/java/com/prgrms/catchtable/waiting/dto/request/CreateWaitingRequest.java similarity index 80% rename from src/main/java/com/prgrms/catchtable/waiting/dto/CreateWaitingRequest.java rename to src/main/java/com/prgrms/catchtable/waiting/dto/request/CreateWaitingRequest.java index 4b9f9205..09a05a70 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/dto/CreateWaitingRequest.java +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/request/CreateWaitingRequest.java @@ -1,4 +1,4 @@ -package com.prgrms.catchtable.waiting.dto; +package com.prgrms.catchtable.waiting.dto.request; import jakarta.validation.constraints.Positive; import lombok.Builder; diff --git a/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingResponse.java b/src/main/java/com/prgrms/catchtable/waiting/dto/response/MemberWaitingResponse.java similarity index 69% rename from src/main/java/com/prgrms/catchtable/waiting/dto/WaitingResponse.java rename to src/main/java/com/prgrms/catchtable/waiting/dto/response/MemberWaitingResponse.java index 969c8e8c..eaba99df 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/dto/WaitingResponse.java +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/response/MemberWaitingResponse.java @@ -1,9 +1,9 @@ -package com.prgrms.catchtable.waiting.dto; +package com.prgrms.catchtable.waiting.dto.response; import lombok.Builder; @Builder -public record WaitingResponse( +public record MemberWaitingResponse( Long waitingId, Long shopId, String shopName, diff --git a/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingListResponse.java b/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingListResponse.java new file mode 100644 index 00000000..d02d6e81 --- /dev/null +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingListResponse.java @@ -0,0 +1,11 @@ +package com.prgrms.catchtable.waiting.dto.response; + +import java.util.List; +import lombok.Builder; + +@Builder +public record OwnerWaitingListResponse( + List shopWaitings +) { + +} diff --git a/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingResponse.java b/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingResponse.java new file mode 100644 index 00000000..e3c04197 --- /dev/null +++ b/src/main/java/com/prgrms/catchtable/waiting/dto/response/OwnerWaitingResponse.java @@ -0,0 +1,13 @@ +package com.prgrms.catchtable.waiting.dto.response; + +import lombok.Builder; + +@Builder +public record OwnerWaitingResponse( + Long waitingId, + int waitingNumber, + Long rank, + int peopleCount +) { + +} 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 3ae6e878..d07b806c 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/WaitingRepository.java @@ -5,6 +5,7 @@ import com.prgrms.catchtable.waiting.domain.Waiting; import com.prgrms.catchtable.waiting.domain.WaitingStatus; import java.time.LocalDateTime; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -20,4 +21,10 @@ public interface WaitingRepository extends JpaRepository { + "where w.member = :member and w.status = :status") Optional findByMemberAndStatusWithShop(@Param("member") Member member, @Param("status") WaitingStatus status); + + @Query("select w from Waiting w where w.id in :ids") + List findByIds(@Param("ids") List ids); + + @Query("select w from Waiting w join fetch w.member where w.id = :id") + Optional findWaitingWithMember(@Param("id") Long id); } diff --git a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepository.java b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepository.java index 090ef8e6..3b0b8e11 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepository.java @@ -7,6 +7,7 @@ import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Queue; @@ -33,6 +34,11 @@ public void entry(Long shopId, Long waitingId) { waitingLine.remove(); } + public List getShopWaitingIdsInOrder(Long shopId) { + Queue waitingLine = waitingLines.get(shopId); + return waitingLine.stream().toList(); + } + public void cancel(Long shopId, Long waitingId) { Queue waitingLine = waitingLines.get(shopId); validateIfWaitingExists(waitingLine, waitingId); diff --git a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepository.java b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepository.java index a3407dc6..e1124b5e 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepository.java @@ -5,6 +5,8 @@ import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; @@ -41,6 +43,17 @@ public Object execute(RedisOperations operations) }); } + public List getShopWaitingIdsInOrder(Long shopId) { + List waitingIds = redisTemplate.opsForList().range("s" + shopId, 0, -1); + if (waitingIds == null) { + throw new BadRequestCustomException(WAITING_DOES_NOT_EXIST); + } + Collections.reverse(waitingIds); + return new ArrayList<>(waitingIds.stream() + .map(Long::parseLong) + .toList()); + } + public void entry(Long shopId, Long waitingId) { validateIfWaitingExists(shopId, waitingId); redisTemplate.execute(new SessionCallback<>() { diff --git a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/WaitingLineRepository.java b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/WaitingLineRepository.java index f80a9d5f..20960a0f 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/WaitingLineRepository.java +++ b/src/main/java/com/prgrms/catchtable/waiting/repository/waitingline/WaitingLineRepository.java @@ -1,5 +1,7 @@ package com.prgrms.catchtable.waiting.repository.waitingline; +import java.util.List; + public interface WaitingLineRepository { void save(Long shopId, Long waitingId); @@ -14,5 +16,7 @@ public interface WaitingLineRepository { Long getWaitingLineSize(Long shopId); + List getShopWaitingIdsInOrder(Long shopId); + void printWaitingLine(Long shopId); } 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 4025e774..631dad9f 100644 --- a/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java +++ b/src/main/java/com/prgrms/catchtable/waiting/service/MemberWaitingService.java @@ -15,8 +15,8 @@ import com.prgrms.catchtable.shop.domain.Shop; import com.prgrms.catchtable.shop.repository.ShopRepository; import com.prgrms.catchtable.waiting.domain.Waiting; -import com.prgrms.catchtable.waiting.dto.CreateWaitingRequest; -import com.prgrms.catchtable.waiting.dto.WaitingResponse; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; +import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; import com.prgrms.catchtable.waiting.repository.WaitingRepository; import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; import java.time.LocalDate; @@ -39,7 +39,7 @@ public class MemberWaitingService { private final ShopRepository shopRepository; private final WaitingLineRepository waitingLineRepository; - public WaitingResponse createWaiting(Long shopId, Long memberId, + public MemberWaitingResponse createWaiting(Long shopId, Long memberId, CreateWaitingRequest request) { // 연관 엔티티 조회 Member member = getMemberEntity(memberId); @@ -63,7 +63,7 @@ public WaitingResponse createWaiting(Long shopId, Long memberId, } @Transactional - public WaitingResponse postponeWaiting(Long memberId) { + public MemberWaitingResponse postponeWaiting(Long memberId) { Member member = getMemberEntity(memberId); Waiting waiting = getWaitingEntityInProgress(member); @@ -77,7 +77,7 @@ public WaitingResponse postponeWaiting(Long memberId) { } @Transactional - public WaitingResponse cancelWaiting(Long memberId) { + public MemberWaitingResponse cancelWaiting(Long memberId) { Member member = getMemberEntity(memberId); Waiting waiting = getWaitingEntityInProgress(member); @@ -89,7 +89,7 @@ public WaitingResponse cancelWaiting(Long memberId) { } @Transactional(readOnly = true) - public WaitingResponse getWaiting(Long memberId) { + public MemberWaitingResponse getWaiting(Long memberId) { Member member = getMemberEntity(memberId); Waiting waiting = getWaitingEntityInProgress(member); diff --git a/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java new file mode 100644 index 00000000..d99c5300 --- /dev/null +++ b/src/main/java/com/prgrms/catchtable/waiting/service/OwnerWaitingService.java @@ -0,0 +1,35 @@ +package com.prgrms.catchtable.waiting.service; + +import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_OWNER; +import static com.prgrms.catchtable.waiting.dto.WaitingMapper.toOwnerWaitingListResponse; + +import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; +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.repository.WaitingRepository; +import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Service +public class OwnerWaitingService { + + private final WaitingRepository waitingRepository; + private final WaitingLineRepository waitingLineRepository; + private final OwnerRepository ownerRepository; + + @Transactional(readOnly = true) + public OwnerWaitingListResponse getOwnerAllWaiting(Long ownerId) { + Owner owner = ownerRepository.findById(ownerId) + .orElseThrow(() -> new BadRequestCustomException(NOT_EXIST_OWNER)); + List waitingIds = waitingLineRepository.getShopWaitingIdsInOrder( + owner.getShop().getId()); + List waitings = waitingRepository.findByIds(waitingIds); + return toOwnerWaitingListResponse(waitings); + } +} diff --git a/src/test/java/com/prgrms/catchtable/owner/fixture/OwnerFixture.java b/src/test/java/com/prgrms/catchtable/owner/fixture/OwnerFixture.java index 54089c3c..bc360e20 100644 --- a/src/test/java/com/prgrms/catchtable/owner/fixture/OwnerFixture.java +++ b/src/test/java/com/prgrms/catchtable/owner/fixture/OwnerFixture.java @@ -1,7 +1,8 @@ package com.prgrms.catchtable.owner.fixture; +import static com.prgrms.catchtable.member.domain.Gender.MALE; + import com.prgrms.catchtable.common.data.shop.ShopData; -import com.prgrms.catchtable.member.domain.Gender; import com.prgrms.catchtable.owner.domain.Owner; import com.prgrms.catchtable.owner.dto.request.JoinOwnerRequest; import com.prgrms.catchtable.owner.dto.request.LoginOwnerRequest; @@ -9,8 +10,6 @@ import java.time.LocalDate; import org.springframework.test.util.ReflectionTestUtils; -import static com.prgrms.catchtable.member.domain.Gender.MALE; - public class OwnerFixture { @@ -29,7 +28,21 @@ public static Owner getOwner(String email, String password) { return owner; } - public static JoinOwnerRequest getJoinOwnerRequest(String email, String password){ + public static Owner getOwner(Shop shop) { + Owner owner = Owner.builder() + .name("ownerA") + .email("email") + .password("password") + .phoneNumber("010-3462-2480") + .gender(MALE) + .dateBirth(LocalDate.of(2000, 9, 13)) + .build(); + ReflectionTestUtils.setField(shop, "id", 1L); + owner.insertShop(shop); + return owner; + } + + public static JoinOwnerRequest getJoinOwnerRequest(String email, String password) { return JoinOwnerRequest.builder() .name("ownerA") .email(email) @@ -40,7 +53,7 @@ public static JoinOwnerRequest getJoinOwnerRequest(String email, String password .build(); } - public static LoginOwnerRequest getLoginOwnerRequest(String email, String password){ + public static LoginOwnerRequest getLoginOwnerRequest(String email, String password) { return LoginOwnerRequest.builder() .email(email) .password(password) 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 64e7fca8..6b7a0360 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerDocsTest.java @@ -14,8 +14,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.prgrms.catchtable.common.restdocs.RestDocsSupport; -import com.prgrms.catchtable.waiting.dto.CreateWaitingRequest; -import com.prgrms.catchtable.waiting.dto.WaitingResponse; +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; @@ -37,7 +37,7 @@ void createWaiting() throws Exception { CreateWaitingRequest request = CreateWaitingRequest .builder() .peopleCount(2).build(); - WaitingResponse response = WaitingResponse.builder() + MemberWaitingResponse response = MemberWaitingResponse.builder() .waitingId(201L) .shopId(1L) .shopName("shop1") 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 1627b23b..062c6098 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/MemberWaitingControllerTest.java @@ -21,7 +21,7 @@ import com.prgrms.catchtable.shop.fixture.ShopFixture; import com.prgrms.catchtable.shop.repository.ShopRepository; import com.prgrms.catchtable.waiting.domain.Waiting; -import com.prgrms.catchtable.waiting.dto.CreateWaitingRequest; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; import com.prgrms.catchtable.waiting.repository.WaitingRepository; import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; import java.util.List; diff --git a/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java new file mode 100644 index 00000000..a006ccde --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/waiting/controller/OwnerWaitingControllerTest.java @@ -0,0 +1,123 @@ +package com.prgrms.catchtable.waiting.controller; + +import static org.hamcrest.Matchers.hasSize; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.prgrms.catchtable.common.base.BaseIntegrationTest; +import com.prgrms.catchtable.member.MemberFixture; +import com.prgrms.catchtable.member.domain.Member; +import com.prgrms.catchtable.member.repository.MemberRepository; +import com.prgrms.catchtable.owner.domain.Owner; +import com.prgrms.catchtable.owner.fixture.OwnerFixture; +import com.prgrms.catchtable.owner.repository.OwnerRepository; +import com.prgrms.catchtable.shop.domain.Shop; +import com.prgrms.catchtable.shop.fixture.ShopFixture; +import com.prgrms.catchtable.shop.repository.ShopRepository; +import com.prgrms.catchtable.waiting.domain.Waiting; +import com.prgrms.catchtable.waiting.repository.WaitingRepository; +import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; + +class OwnerWaitingControllerTest extends BaseIntegrationTest { + + @Autowired + private MemberRepository memberRepository; + @Autowired + private WaitingRepository waitingRepository; + + @Autowired + private OwnerRepository ownerRepository; + + @Autowired + private WaitingLineRepository waitingLineRepository; + @Autowired + private ShopRepository shopRepository; + @Autowired + private StringRedisTemplate redisTemplate; + + private Member member1, member2, member3; + private Shop shop; + private Owner owner; + private Waiting waiting1, waiting2, waiting3; + private List waitings; + + + @BeforeEach + void setUp() { + member1 = MemberFixture.member("test1@naver.com"); + member2 = MemberFixture.member("test2@naver.com"); + member3 = MemberFixture.member("test3@naver.com"); + memberRepository.saveAll(List.of(member1, member2, member3)); + + shop = ShopFixture.shopWith24(); + shopRepository.save(shop); + + owner = OwnerFixture.getOwner(shop); + ownerRepository.save(owner); + + waiting1 = Waiting.builder() + .member(member1) + .shop(shop) + .waitingNumber(1) + .peopleCount(2) + .build(); + waiting2 = Waiting.builder() + .member(member2) + .shop(shop) + .waitingNumber(2) + .peopleCount(2) + .build(); + + waiting3 = Waiting.builder() + .member(member3) + .shop(shop) + .waitingNumber(3) + .peopleCount(2) + .build(); + + waitings = waitingRepository.saveAll(List.of(waiting1, waiting2, waiting3)); + waitingLineRepository.save(shop.getId(), waiting1.getId()); + waitingLineRepository.save(shop.getId(), waiting2.getId()); + waitingLineRepository.save(shop.getId(), waiting3.getId()); + } + + @AfterEach + void clear() { + redisTemplate.delete("s" + shop.getId()); + memberRepository.deleteAll(); + shopRepository.deleteAll(); + ownerRepository.deleteAll(); + waitingRepository.deleteAll(); + } + + @DisplayName("웨이팅 조회 API를 호출할 수 있다.") + @Test + void getWaiting() throws Exception { + //when, then + mockMvc.perform(get("/owner/waitings/{ownerId}", owner.getId()) + .contentType(APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.shopWaitings", hasSize(3))) + .andExpect(jsonPath("$.shopWaitings[0].waitingId").value(waiting1.getId())) + .andExpect( + jsonPath("$.shopWaitings[0].waitingNumber").value(waiting1.getWaitingNumber())) + .andExpect(jsonPath("$.shopWaitings[0].rank").value(1L)) + .andExpect(jsonPath("$.shopWaitings[0].peopleCount").value(waiting1.getPeopleCount())) + .andExpect(jsonPath("$.shopWaitings[1].waitingId").value(waiting2.getId())) + .andExpect( + jsonPath("$.shopWaitings[1].waitingNumber").value(waiting2.getWaitingNumber())) + .andExpect(jsonPath("$.shopWaitings[1].rank").value(2L)) + .andExpect(jsonPath("$.shopWaitings[1].peopleCount").value(waiting2.getPeopleCount())) + ; + } + +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/catchtable/waiting/fixture/WaitingFixture.java b/src/test/java/com/prgrms/catchtable/waiting/fixture/WaitingFixture.java index b27f5164..399bf936 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/fixture/WaitingFixture.java +++ b/src/test/java/com/prgrms/catchtable/waiting/fixture/WaitingFixture.java @@ -17,8 +17,7 @@ public static Waiting waiting(Member member, Shop shop, int waitingNumber) { public static Waiting completedWaiting(Member member, Shop shop, int waitingNumber) { Waiting waiting = waiting(member, shop, waitingNumber); - waiting.completeWaiting(); + waiting.changeStatusCompleted(); return waiting; } - } \ No newline at end of file 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 235d142b..91d68de5 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/WaitingRepositoryTest.java @@ -14,6 +14,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -40,7 +41,6 @@ class WaitingRepositoryTest { private ShopRepository shopRepository; private Shop shop; private Member member1, member2, member3; - private Waiting yesterdayWaiting, completedWaiting, normalWaiting; @BeforeEach void setUp() { @@ -63,9 +63,9 @@ void clear() { @DisplayName("특정 가게의 당일 대기 번호를 조회할 수 있다.") @Test void countByShopAndCreatedAtBetween() { - yesterdayWaiting = WaitingFixture.waiting(member1, shop, 1); - completedWaiting = WaitingFixture.completedWaiting(member2, shop, 2); - normalWaiting = WaitingFixture.waiting(member3, shop, 3); + Waiting yesterdayWaiting = WaitingFixture.waiting(member1, shop, 1); + Waiting completedWaiting = WaitingFixture.completedWaiting(member2, shop, 2); + Waiting normalWaiting = WaitingFixture.waiting(member3, shop, 3); waitingRepository.saveAll(List.of(yesterdayWaiting, completedWaiting, normalWaiting)); ReflectionTestUtils.setField(yesterdayWaiting, "createdAt", @@ -78,4 +78,18 @@ void countByShopAndCreatedAtBetween() { //then assertThat(count).isEqualTo(2L); //waiting2, waiting3 } + + @DisplayName("멤버의 아이디 리스트로 Waiting을 조회 가능하다.") + @Test + void findByIdsWithMember() { + Waiting waiting1 = WaitingFixture.waiting(member1, shop, 1); + Waiting waiting2 = WaitingFixture.waiting(member2, shop, 2); + Waiting waiting3 = WaitingFixture.waiting(member3, shop, 3); + waitingRepository.saveAll(List.of(waiting1, waiting2, waiting3)); + List waitingIds = List.of(waiting1.getId(), waiting2.getId(), waiting3.getId()); + //when + List waitings = waitingRepository.findByIds(waitingIds); + //then + Assertions.assertThat(waitings).containsExactly(waiting1, waiting2, waiting3); + } } \ No newline at end of file diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepositoryTest.java index 1f40cc8c..5be42490 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/BasicWaitingLineRepositoryTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; +import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -112,4 +113,20 @@ void cancel() { .isEqualTo(2); } + @DisplayName("특정 가게의 웨이팅 아이디를 rank 순으로 가져온다.") + @Test + void getShopWaitingIdOrder() { + //given + Long shopId = 1L; + repository.save(shopId, 1L); + repository.save(shopId, 2L); + repository.save(shopId, 3L); + //when + List waitingIds = repository.getShopWaitingIdsInOrder(shopId); + //then + assertThat(waitingIds.get(0)).isEqualTo(1L); + assertThat(waitingIds.get(1)).isEqualTo(2L); + assertThat(waitingIds.get(2)).isEqualTo(3L); + } + } \ No newline at end of file diff --git a/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepositoryTest.java b/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepositoryTest.java index 57b18eaf..15c2e311 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepositoryTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/repository/waitingline/RedisWaitingLineRepositoryTest.java @@ -5,6 +5,7 @@ import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException; import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException; +import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -119,4 +120,19 @@ void cancel() { assertThat(repository.findRank(1L, 3L)) .isEqualTo(2); } + + @DisplayName("특정 가게의 웨이팅 아이디를 rank 순으로 가져온다.") + @Test + void getShopWaitingIdOrder() { + //given + Long shopId = 1L; + repository.save(shopId, 1L); + repository.save(shopId, 2L); + repository.save(shopId, 3L); + //when + List waitingIds = repository.getShopWaitingIdsInOrder(shopId); + //then + System.out.println("waitingIds = " + waitingIds); + assertThat(waitingIds.get(0)).isEqualTo(1L); + } } \ 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 d5a1d959..bcc35fc0 100644 --- a/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java +++ b/src/test/java/com/prgrms/catchtable/waiting/service/MemberWaitingServiceTest.java @@ -15,8 +15,8 @@ import com.prgrms.catchtable.shop.domain.Shop; import com.prgrms.catchtable.shop.repository.ShopRepository; import com.prgrms.catchtable.waiting.domain.Waiting; -import com.prgrms.catchtable.waiting.dto.CreateWaitingRequest; -import com.prgrms.catchtable.waiting.dto.WaitingResponse; +import com.prgrms.catchtable.waiting.dto.request.CreateWaitingRequest; +import com.prgrms.catchtable.waiting.dto.response.MemberWaitingResponse; import com.prgrms.catchtable.waiting.repository.WaitingRepository; import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; import java.time.LocalTime; @@ -68,7 +68,7 @@ void createWaiting() { given(waitingLineRepository.findRank(shop.getId(), waiting.getId())).willReturn(1L); //when - WaitingResponse response = memberWaitingService.createWaiting(1L, 1L, request); + MemberWaitingResponse response = memberWaitingService.createWaiting(1L, 1L, request); //then assertAll( () -> assertThat(response.peopleCount()).isEqualTo(2), @@ -94,7 +94,7 @@ void postponeWaiting() { doNothing().when(waiting).decreasePostponeRemainingCount(); //when - WaitingResponse response = memberWaitingService.postponeWaiting(1L); + MemberWaitingResponse response = memberWaitingService.postponeWaiting(1L); //then assertAll( assertThat(response.peopleCount())::isNotNull, @@ -119,7 +119,7 @@ void cancelWaiting() { doNothing().when(waiting).changeStatusCanceled(); //when - WaitingResponse response = memberWaitingService.cancelWaiting(1L); + MemberWaitingResponse response = memberWaitingService.cancelWaiting(1L); //then assertAll( @@ -129,7 +129,7 @@ void cancelWaiting() { ); } - @DisplayName("웨이팅를 조회할 수 있다.") + @DisplayName("점주의 웨이팅를 조회할 수 있다.") @Test void getWaiting() { //given @@ -143,10 +143,14 @@ void getWaiting() { given(waiting.getShop()).willReturn(shop); given(waiting.getStatus()).willReturn(PROGRESS); //when - WaitingResponse response = memberWaitingService.getWaiting(1L); + MemberWaitingResponse response = memberWaitingService.getWaiting(1L); //then - + assertAll( + assertThat(response.peopleCount())::isNotNull, + assertThat(response.rank())::isNotNull, + assertThat(response.waitingNumber())::isNotNull + ); } diff --git a/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java b/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java new file mode 100644 index 00000000..d2ce0887 --- /dev/null +++ b/src/test/java/com/prgrms/catchtable/waiting/service/OwnerWaitingServiceTest.java @@ -0,0 +1,74 @@ +package com.prgrms.catchtable.waiting.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; + +import com.prgrms.catchtable.member.domain.Member; +import com.prgrms.catchtable.owner.domain.Owner; +import com.prgrms.catchtable.owner.repository.OwnerRepository; +import com.prgrms.catchtable.shop.domain.Shop; +import com.prgrms.catchtable.waiting.domain.Waiting; +import com.prgrms.catchtable.waiting.dto.response.OwnerWaitingListResponse; +import com.prgrms.catchtable.waiting.fixture.WaitingFixture; +import com.prgrms.catchtable.waiting.repository.WaitingRepository; +import com.prgrms.catchtable.waiting.repository.waitingline.WaitingLineRepository; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class OwnerWaitingServiceTest { + + @Mock + private OwnerRepository ownerRepository; + + @Mock + private WaitingRepository waitingRepository; + + @Mock + private WaitingLineRepository waitingLineRepository; + + @InjectMocks + private OwnerWaitingService ownerWaitingService; + + @DisplayName("owner의 waiting 목록을 모두 가져온다.") + @Test + void getOwnerAllWaiting() { + //given + List waitingIds = List.of(1L, 2L); + Member member1 = mock(Member.class); + Member member2 = mock(Member.class); + Owner owner = mock(Owner.class); + Shop shop = mock(Shop.class); + Waiting waiting1 = WaitingFixture.waiting(member1, shop, 1); + Waiting waiting2 = WaitingFixture.waiting(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( + waitingIds); + given(waitingRepository.findByIds(waitingIds)).willReturn(List.of(waiting1, waiting2)); + + //when + OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(1L); + + //then + assertThat(response.shopWaitings()).hasSize(2); + + assertThat(response.shopWaitings().get(0).waitingId()).isEqualTo(waiting1.getId()); + assertThat(response.shopWaitings().get(0).waitingNumber()).isEqualTo( + waiting1.getWaitingNumber()); + + assertThat(response.shopWaitings().get(1).waitingId()).isEqualTo(waiting2.getId()); + assertThat(response.shopWaitings().get(1).waitingNumber()).isEqualTo( + waiting2.getWaitingNumber()); + } +} \ No newline at end of file