Skip to content

Commit

Permalink
Merge pull request #75 from dev-hooon/feat/#74/owner-get-all-waiting-api
Browse files Browse the repository at this point in the history
feature : owner 웨이팅 조회 API 구현
  • Loading branch information
hyun2371 authored Jan 8, 2024
2 parents f017312 + 0939180 commit b398382
Show file tree
Hide file tree
Showing 25 changed files with 447 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public enum ErrorCode {


ALREADY_EXIST_OWNER("이미 존재하는 점주입니다"),
NOT_EXIST_OWNER("해당 아이디의 점주가 존재하지 않습니다."),
BAD_REQUEST_EMAIL_OR_PASSWORD("이메일 혹은 비밀번호를 확인해주세요"),
BAD_REQUEST_INPUT_GENDER_TYPE("성별 타입을 양식대로 입력해주세요");
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -23,29 +23,32 @@ public class MemberWaitingController {
private final MemberWaitingService memberWaitingService;

@PostMapping("/{shopId}/{memberId}")
public ResponseEntity<WaitingResponse> createWaiting(@PathVariable("shopId") Long shopId,
public ResponseEntity<MemberWaitingResponse> 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<WaitingResponse> postponeWaiting(
public ResponseEntity<MemberWaitingResponse> postponeWaiting(
@PathVariable("memberId") Long memberId) {
WaitingResponse response = memberWaitingService.postponeWaiting(memberId);
MemberWaitingResponse response = memberWaitingService.postponeWaiting(memberId);
return ResponseEntity.ok(response);
}

@DeleteMapping("/{memberId}")
public ResponseEntity<WaitingResponse> cancelWaiting(@PathVariable("memberId") Long memberId) {
WaitingResponse response = memberWaitingService.cancelWaiting(memberId);
public ResponseEntity<MemberWaitingResponse> cancelWaiting(
@PathVariable("memberId") Long memberId) {
MemberWaitingResponse response = memberWaitingService.cancelWaiting(memberId);
return ResponseEntity.ok(response);
}

@GetMapping("/{memberId}")
public ResponseEntity<WaitingResponse> getWaiting(@PathVariable("memberId") Long memberId) {
WaitingResponse response = memberWaitingService.getWaiting(memberId);
public ResponseEntity<MemberWaitingResponse> getWaiting(
@PathVariable("memberId") Long memberId) {
MemberWaitingResponse response = memberWaitingService.getWaiting(memberId);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -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<OwnerWaitingListResponse> getOwnerAllWaiting(
@PathVariable("ownerId") Long ownerId) {
OwnerWaitingListResponse response = ownerWaitingService.getOwnerAllWaiting(ownerId);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
28 changes: 26 additions & 2 deletions src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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())
Expand All @@ -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<Waiting> waitings) {
long rank = 1L;
List<OwnerWaitingResponse> list = new ArrayList<>();
for (Waiting waiting : waitings) {
list.add(toOwnerWaitingResponse(waiting, rank++));
}
return new OwnerWaitingListResponse(list);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.prgrms.catchtable.waiting.dto.response;

import java.util.List;
import lombok.Builder;

@Builder
public record OwnerWaitingListResponse(
List<OwnerWaitingResponse> shopWaitings
) {

}
Original file line number Diff line number Diff line change
@@ -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
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,4 +21,10 @@ public interface WaitingRepository extends JpaRepository<Waiting, Long> {
+ "where w.member = :member and w.status = :status")
Optional<Waiting> findByMemberAndStatusWithShop(@Param("member") Member member,
@Param("status") WaitingStatus status);

@Query("select w from Waiting w where w.id in :ids")
List<Waiting> findByIds(@Param("ids") List<Long> ids);

@Query("select w from Waiting w join fetch w.member where w.id = :id")
Optional<Waiting> findWaitingWithMember(@Param("id") Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -33,6 +34,11 @@ public void entry(Long shopId, Long waitingId) {
waitingLine.remove();
}

public List<Long> getShopWaitingIdsInOrder(Long shopId) {
Queue<Long> waitingLine = waitingLines.get(shopId);
return waitingLine.stream().toList();
}

public void cancel(Long shopId, Long waitingId) {
Queue<Long> waitingLine = waitingLines.get(shopId);
validateIfWaitingExists(waitingLine, waitingId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -41,6 +43,17 @@ public <K, V> Object execute(RedisOperations<K, V> operations)
});
}

public List<Long> getShopWaitingIdsInOrder(Long shopId) {
List<String> 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<>() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.prgrms.catchtable.waiting.repository.waitingline;

import java.util.List;

public interface WaitingLineRepository {

void save(Long shopId, Long waitingId);
Expand All @@ -14,5 +16,7 @@ public interface WaitingLineRepository {

Long getWaitingLineSize(Long shopId);

List<Long> getShopWaitingIdsInOrder(Long shopId);

void printWaitingLine(Long shopId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);

Expand All @@ -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);

Expand All @@ -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);

Expand Down
Original file line number Diff line number Diff line change
@@ -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<Long> waitingIds = waitingLineRepository.getShopWaitingIdsInOrder(
owner.getShop().getId());
List<Waiting> waitings = waitingRepository.findByIds(waitingIds);
return toOwnerWaitingListResponse(waitings);
}
}
Loading

0 comments on commit b398382

Please sign in to comment.