diff --git a/build.gradle b/build.gradle index 4adfc7d..b58f065 100644 --- a/build.gradle +++ b/build.gradle @@ -32,8 +32,10 @@ dependencies { implementation 'org.hibernate.orm:hibernate-spatial:' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + // REDIS CACHE implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.boot:spring-boot-starter-cache' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' diff --git a/src/main/java/com/yscp/catchtable/application/queue/StoreQueueService.java b/src/main/java/com/yscp/catchtable/application/queue/StoreQueueService.java new file mode 100644 index 0000000..c9c2b6f --- /dev/null +++ b/src/main/java/com/yscp/catchtable/application/queue/StoreQueueService.java @@ -0,0 +1,16 @@ +package com.yscp.catchtable.application.queue; + +import com.yscp.catchtable.application.queue.dto.StoreQueueDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class StoreQueueService { + private final RedisTemplate redisTemplate; + + public void registerWaiting(StoreQueueDto storeQueueDto) { + redisTemplate.opsForZSet().add(storeQueueDto.key(), storeQueueDto.value(), storeQueueDto.score()); + } +} diff --git a/src/main/java/com/yscp/catchtable/application/queue/dto/StoreQueueDto.java b/src/main/java/com/yscp/catchtable/application/queue/dto/StoreQueueDto.java new file mode 100644 index 0000000..e6baaf4 --- /dev/null +++ b/src/main/java/com/yscp/catchtable/application/queue/dto/StoreQueueDto.java @@ -0,0 +1,24 @@ +package com.yscp.catchtable.application.queue.dto; + +import java.time.Instant; + +public record StoreQueueDto( + Long storeIdx, + String date, + String time, + String userId +) { + private static final String WAITING_KEY_FORMAT = "store:%s:waiting:%s:%s"; + + public String key() { + return String.format(WAITING_KEY_FORMAT, storeIdx, date, time); + } + + public String value() { + return userId.toString(); + } + + public double score() { + return Instant.now().toEpochMilli(); + } +} diff --git a/src/main/java/com/yscp/catchtable/application/store/mapper/StoreQueueMapper.java b/src/main/java/com/yscp/catchtable/application/store/mapper/StoreQueueMapper.java new file mode 100644 index 0000000..971772c --- /dev/null +++ b/src/main/java/com/yscp/catchtable/application/store/mapper/StoreQueueMapper.java @@ -0,0 +1,17 @@ +package com.yscp.catchtable.application.store.mapper; + +import com.yscp.catchtable.application.queue.dto.StoreQueueDto; +import com.yscp.catchtable.presentation.store.dto.StoreQueueRequestDto; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class StoreQueueMapper { + public static StoreQueueDto toQueueDto(StoreQueueRequestDto storeQueueRequestDto) { + return new StoreQueueDto( + storeQueueRequestDto.storeIdx(), + storeQueueRequestDto.date(), + storeQueueRequestDto.time(), + storeQueueRequestDto.userId() + ); + } +} diff --git a/src/main/java/com/yscp/catchtable/presentation/store/StoreQueueController.java b/src/main/java/com/yscp/catchtable/presentation/store/StoreQueueController.java new file mode 100644 index 0000000..361228e --- /dev/null +++ b/src/main/java/com/yscp/catchtable/presentation/store/StoreQueueController.java @@ -0,0 +1,22 @@ +package com.yscp.catchtable.presentation.store; + +import com.yscp.catchtable.application.queue.StoreQueueService; +import com.yscp.catchtable.application.store.mapper.StoreQueueMapper; +import com.yscp.catchtable.presentation.store.dto.StoreQueueRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +public class StoreQueueController { + private final StoreQueueService storeQueueService; + + @PostMapping("/store/reservation/enter") + public ResponseEntity enter(@RequestBody StoreQueueRequestDto storeQueueRequestDto) { + storeQueueService.registerWaiting(StoreQueueMapper.toQueueDto(storeQueueRequestDto)); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/yscp/catchtable/presentation/store/dto/StoreQueueRequestDto.java b/src/main/java/com/yscp/catchtable/presentation/store/dto/StoreQueueRequestDto.java new file mode 100644 index 0000000..95c7542 --- /dev/null +++ b/src/main/java/com/yscp/catchtable/presentation/store/dto/StoreQueueRequestDto.java @@ -0,0 +1,9 @@ +package com.yscp.catchtable.presentation.store.dto; + +public record StoreQueueRequestDto( + Long storeIdx, + String date, + String time, + String userId +) { +}