diff --git a/simplq/src/main/java/me/simplq/controller/TokenController.java b/simplq/src/main/java/me/simplq/controller/TokenController.java index 0b1d7ea..36d978f 100644 --- a/simplq/src/main/java/me/simplq/controller/TokenController.java +++ b/simplq/src/main/java/me/simplq/controller/TokenController.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import me.simplq.controller.model.token.CreateTokenRequest; import me.simplq.controller.model.token.MyTokensResponse; +import me.simplq.controller.model.token.PatchTokenRequest; import me.simplq.controller.model.token.TokenDeleteResponse; import me.simplq.controller.model.token.TokenDetailResponse; import me.simplq.controller.model.token.TokenNotifyResponse; @@ -10,6 +11,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; 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.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -57,4 +59,10 @@ public ResponseEntity deleteToken(@PathVariable("tokenId") public ResponseEntity notifyToken(@PathVariable("tokenId") String tokenId) { return ResponseEntity.ok(tokenService.notifyToken(tokenId)); } + + @PatchMapping(path = "/token/{tokenId}") + public ResponseEntity patchToken( + @PathVariable("tokenId") String tokenId, @RequestBody PatchTokenRequest patchTokenRequest) { + return ResponseEntity.ok(tokenService.patchToken(tokenId, patchTokenRequest)); + } } diff --git a/simplq/src/main/java/me/simplq/controller/model/token/PatchTokenRequest.java b/simplq/src/main/java/me/simplq/controller/model/token/PatchTokenRequest.java new file mode 100644 index 0000000..b5ca4af --- /dev/null +++ b/simplq/src/main/java/me/simplq/controller/model/token/PatchTokenRequest.java @@ -0,0 +1,8 @@ +package me.simplq.controller.model.token; + +import lombok.Data; + +@Data +public class PatchTokenRequest { + String queueId; +} diff --git a/simplq/src/main/java/me/simplq/service/TokenService.java b/simplq/src/main/java/me/simplq/service/TokenService.java index dbbb4de..ffd4301 100644 --- a/simplq/src/main/java/me/simplq/service/TokenService.java +++ b/simplq/src/main/java/me/simplq/service/TokenService.java @@ -1,6 +1,7 @@ package me.simplq.service; import java.util.Comparator; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import me.simplq.constants.QueueStatus; @@ -8,6 +9,7 @@ import me.simplq.controller.advices.LoggedInUserInfo; import me.simplq.controller.model.token.CreateTokenRequest; import me.simplq.controller.model.token.MyTokensResponse; +import me.simplq.controller.model.token.PatchTokenRequest; import me.simplq.controller.model.token.TokenDeleteResponse; import me.simplq.controller.model.token.TokenDetailResponse; import me.simplq.controller.model.token.TokenNotifyResponse; @@ -35,10 +37,7 @@ public class TokenService { @Transactional public TokenDetailResponse getToken(String tokenId) { - return TokenDetailResponse.fromEntity( - tokenRepository - .findById(tokenId) - .orElseThrow(SQInvalidRequestException::tokenNotFoundException)); + return getTokenDetailInternal(tokenId); } /** Get token by queueId and the contact number */ @@ -142,4 +141,35 @@ public MyTokensResponse getMyTokens() { token.getTokenCreationTimestamp())) .collect(Collectors.toList())); } + + @Transactional + public TokenDetailResponse patchToken(String tokenId, PatchTokenRequest patchTokenRequest) { + Optional.ofNullable(patchTokenRequest.getQueueId()) + .ifPresent(newQueueId -> addTokenToQueue(tokenId, newQueueId)); + return getTokenDetailInternal(tokenId); + } + + private void addTokenToQueue(String tokenId, String newQueueId) { + queueRepository + .findById(newQueueId) + .map( + newQueue -> + tokenRepository + .findById(tokenId) + .map( + token -> { + token.setQueue(newQueue); + tokenRepository.save(token); + return token; + }) + .orElseThrow(SQInvalidRequestException::tokenNotFoundException)) + .orElseThrow(SQInvalidRequestException::queueNotFoundException); + } + + private TokenDetailResponse getTokenDetailInternal(String tokenId) { + return TokenDetailResponse.fromEntity( + tokenRepository + .findById(tokenId) + .orElseThrow(SQInvalidRequestException::tokenNotFoundException)); + } }