Skip to content

Commit

Permalink
Merge pull request #96 from dev-hooon/feat/#94/waiting-schedular
Browse files Browse the repository at this point in the history
feat : 웨이팅 스케줄러 구현
  • Loading branch information
hyun2371 authored Jan 11, 2024
2 parents 1ae2f38 + ac4c8cb commit 18da479
Show file tree
Hide file tree
Showing 20 changed files with 325 additions and 155 deletions.
12 changes: 0 additions & 12 deletions src/docs/asciidoc/api/album/waiting.adoc

This file was deleted.

12 changes: 12 additions & 0 deletions src/docs/asciidoc/api/waiting/waiting.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[[waiting-create]]
=== 웨이팅 등록

==== HTTP Request

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}/member-waiting-controller-docs-test/create-waiting/http-response.adoc[]
include::{snippets}/member-waiting-controller-docs-test/create-waiting/response-fields.adoc[]
2 changes: 1 addition & 1 deletion src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ endif::[]
[[CatchTable-API]]
== Waiting API

include::api/album/waiting.adoc[]
include::api/waiting/waiting.adoc[]
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -23,41 +25,41 @@ public class MemberWaitingController {

private final MemberWaitingService memberWaitingService;

@PostMapping("/{shopId}/{memberId}")
@PostMapping("/{shopId}")
public ResponseEntity<MemberWaitingResponse> 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);
}

@PatchMapping("/{memberId}")
@PatchMapping
public ResponseEntity<MemberWaitingResponse> 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<MemberWaitingResponse> 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<MemberWaitingResponse> 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<MemberWaitingHistoryListResponse> getMemberWaitingHistory(
@PathVariable("memberId") Long memberId) {
@LogIn Member member) {
MemberWaitingHistoryListResponse response = memberWaitingService.getMemberWaitingHistory(
memberId);
member);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
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;
import lombok.RequiredArgsConstructor;
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;

Expand All @@ -18,17 +19,17 @@ public class OwnerWaitingController {

private final OwnerWaitingService ownerWaitingService;

@GetMapping("/{ownerId}")
@GetMapping
public ResponseEntity<OwnerWaitingListResponse> 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<OwnerWaitingResponse> entryWaiting(
@PathVariable("ownerId") Long ownerId) {
OwnerWaitingResponse response = ownerWaitingService.entryWaiting(ownerId);
@LogIn Owner owner) {
OwnerWaitingResponse response = ownerWaitingService.entryWaiting(owner);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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--;
Expand Down
22 changes: 10 additions & 12 deletions src/main/java/com/prgrms/catchtable/waiting/dto/WaitingMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -55,11 +55,9 @@ public static MemberWaitingHistoryResponse toMemberWaitingHistoryResponse(Waitin

public static MemberWaitingHistoryListResponse toMemberWaitingListResponse(
List<Waiting> waitings) {
List<MemberWaitingHistoryResponse> 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) {
Expand All @@ -72,11 +70,11 @@ public static OwnerWaitingResponse toOwnerWaitingResponse(Waiting waiting, Long
}

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);
AtomicLong rank = new AtomicLong(1);
return new OwnerWaitingListResponse(
waitings.stream()
.map(waiting -> toOwnerWaitingResponse(waiting, rank.getAndIncrement()))
.toList()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
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;
import org.springframework.transaction.annotation.Transactional;

public interface WaitingRepository extends JpaRepository<Waiting, Long> {

Expand All @@ -29,4 +31,10 @@ Optional<Waiting> findByMemberAndStatusWithShop(@Param("member") Member member,
+ "join fetch w.shop "
+ "join fetch w.member where w.member = :member")
List<Waiting> 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,
@Param("currentStatus") WaitingStatus currentStatus);
}
Original file line number Diff line number Diff line change
@@ -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<String> keys = redisTemplate.keys("s*");
redisTemplate.delete(keys);
}

//매일 자정 대기 상태 바꾸기
@Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul")
public void changeProgressStatus() {
waitingRepository.updateWaitingStatus(CANCELED, PROGRESS);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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이 있는지 검증
Expand All @@ -66,8 +62,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();
Expand All @@ -80,8 +75,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();
Expand All @@ -92,8 +86,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();
Expand All @@ -103,8 +96,7 @@ public MemberWaitingResponse getWaiting(Long memberId) {
}

@Transactional(readOnly = true)
public MemberWaitingHistoryListResponse getMemberWaitingHistory(Long memberId) {
Member member = getMemberEntity(memberId);
public MemberWaitingHistoryListResponse getMemberWaitingHistory(Member member) {
List<Waiting> waitings = waitingRepository.findWaitingWithMember(member);
return toMemberWaitingListResponse(waitings);
}
Expand All @@ -116,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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -25,22 +22,17 @@ 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));
public OwnerWaitingListResponse getOwnerAllWaiting(Owner owner) {
List<Long> waitingIds = waitingLineRepository.getShopWaitingIdsInOrder(
owner.getShop().getId());
List<Waiting> waitings = waitingRepository.findByIds(waitingIds);
return toOwnerWaitingListResponse(waitings);
}

@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));
Expand Down
Original file line number Diff line number Diff line change
@@ -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())
);
}
}
Loading

0 comments on commit 18da479

Please sign in to comment.