Xem toàn bộ series bài viết hướng dẫn xây dựng ứng dụng Questions Management tại đây.
Trong bài viết trước, chúng ta đã chuẩn bị tất cả các cấu hình cần thiết để có thể xây dựng API cập nhập question như: một đối tượng document Question chứa thông tin của một question, một QuestionRepository để thao tác với MongoDB, một QuestionController định nghĩa các API của Core Question Service sẽ bắt đầu với “/question” và thông tin về kết nối đến MongoDB server được cấu hình trong tập tin application.properties. Bây giờ, chúng ta sẽ tiến hành xây dựng API để này các bạn nhé!
Để xây dựng API cập nhập question, mình sẽ thêm mới một method để expose một PUT request “{id}” với id là id của question mà chúng ta cần cập nhập. Chúng ta cũng cần định nghĩa thêm phần body data là nội dung mới của question mà chúng ta sẽ cập nhập như sau:
1 2 3 4 5 6 |
@PutMapping("/{id}") public Mono<ResponseEntity<Question>> updateQuestion( @PathVariable(value = "id") String questionId, @RequestBody Question question) { } |
Các bước để cập nhập một question bao gồm:
Đầu tiên, chúng ta cần kiểm tra là question mà chúng ta cần cập nhập có tồn tại hay không dựa vào id mà người dùng truyền vào.
Spring Data MongoDB Reactive đã hỗ trợ cho chúng ta phương thức để tìm kiếm theo id nên chúng ta chỉ cần gọi để sử dụng mà thôi.
1 |
questionRepository.findById(questionId) |
Trong trường hợp question này tồn tại thì chúng ta sẽ sử dụng các thông tin được truyền trong phần body data để cập nhập thông tin trong database:
1 2 3 4 5 6 7 |
questionRepository.findById(questionId) .flatMap(existingQuestion -> { existingQuestion.setCategoryId(question.getCategoryId()); existingQuestion.setDescription(question.getDescription()); return questionRepository.save(existingQuestion); }) |
Sau đó thì trả về cho người dùng thông tin mới của question này sau khi đã cập nhập vào database với HTTP status code là 200 OK.
1 2 3 4 5 6 7 8 |
questionRepository.findById(questionId) .flatMap(existingQuestion -> { existingQuestion.setCategoryId(question.getCategoryId()); existingQuestion.setDescription(question.getDescription()); return questionRepository.save(existingQuestion); }) .map(updatedQuestion -> new ResponseEntity<>(updatedQuestion, HttpStatus.OK)) |
Trong trường hợp question này không tồn tại trong database thì chúng ta sẽ trả về kết quả HTTP status code là 404 Not Found.
1 2 3 4 5 6 7 8 9 |
questionRepository.findById(questionId) .flatMap(existingQuestion -> { existingQuestion.setCategoryId(question.getCategoryId()); existingQuestion.setDescription(question.getDescription()); return questionRepository.save(existingQuestion); }) .map(updatedQuestion -> new ResponseEntity<>(updatedQuestion, HttpStatus.OK)) .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND)); |
Toàn bộ nội dung của phương thức updateQuestion() lúc này sẽ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@PutMapping("/{id}") public Mono<ResponseEntity<Question>> updateQuestion( @PathVariable(value = "id") String questionId, @RequestBody Question question) { return questionRepository.findById(questionId) .flatMap(existingQuestion -> { existingQuestion.setCategoryId(question.getCategoryId()); existingQuestion.setDescription(question.getDescription()); return questionRepository.save(existingQuestion); }) .map(updatedQuestion -> new ResponseEntity<>(updatedQuestion, HttpStatus.OK)) .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND)); } |
Đến đây thì chúng ta đã hoàn thành việc xây dựng API để cập nhập một question cho Core Question Service, hãy test thử xem sao nhé các bạn.
Giả sử hiện tại trong database mình đang có những question sau:
thì khi mình request để cập nhập question với id là 5b73593785ddfe03c26a11ea, kết quả sẽ là: