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 trong Composite Question Service như: một đối tượng chứa tất cả các thông tin của một câu hỏi CompositeQuestion bao gồm Question, Category và Option; một interface CoreCategoryService với implementation là CoreCategoryServiceImpl đảm nhận việc thao tác với Core Category Service; một interface CoreQuestionService với implementation là CoreQuestionServiceImpl đảm nhận việc thao tác với Core Question Service; một interface CoreOptionService với implementation là CoreOptionServiceImpl đảm nhận việc thao tác với Core Option Service; một interface CompositeQuestionService đảm nhận việc thao tác với các Core Service; một CompositeQuestionController định nghĩa các API của Composite Question Service sẽ bắt đầu với “/question” và thông tin của các Core Service đượ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, đầu tiên mình sẽ định nghĩa mới một method trong CoreQuestionService đảm nhận việc gọi API của Core Question Service để cập nhập question như sau:
1 |
Mono<Question> updateQuestion(String questionId, Question question); |
Implementation của method này trong class CoreQuestionServiceImpl sẽ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override public Mono<Question> updateQuestion(String questionId, Question question) { WebClient webClient = WebClient.builder() .baseUrl(getServiceUrl()) .build(); return webClient.put() .uri("/question/" + questionId) .body(BodyInserters.fromObject(question)) .retrieve() .bodyToMono(Question.class); } |
Tiếp theo mình cũng sẽ định nghĩa mới một method trong CompositeQuestionService đảm nhận việc gọi method updateQuestion() của class CoreQuestionService và combine các thông tin từ Core Category Service và Core Option Service để trả về cho người dùng sau khi cập nhập question.
Nội dung của method này như sau:
1 |
Mono<CompositeQuestion> updateQuestion(String questionId, Question question); |
Implementation của method này:
1 2 3 4 5 6 7 8 9 |
@Override public Mono<CompositeQuestion> updateQuestion(String questionId, Question question) { return coreCategoryService.findById(question.getCategoryId()) .flatMap(category -> coreQuestionService.updateQuestion(questionId, question) .flatMap(q -> coreOptionService.getOptions(q.getId()) .collectList() .map(options -> new CompositeQuestion(q.getId(), q.getDescription(), category, options))) ).subscribeOn(Schedulers.elastic()); } |
Như các bạn thấy, ở đây mình sẽ kiểm tra xem Category Id mà question này đang thuộc về có tồn tại trong hệ thống hay không bằng cách gọi tới Core Category Service để tìm kiếm Category theo id. Trong trường hợp Category này tồn tại mình mới gọi method updateQuestion() của class CoreQuestionService để cập nhập question.
Sau khi cập nhập question xong, chúng ta cần gọi qua Core Option Service để lấy tất cả các option thuộc về câu hỏi này để build kết quả trả về.
Điều cuối cùng chúng ta cần làm đó là thêm mới một method vào class CompositeQuestionController để expose một PUT request “/{id}” với data trong phần body là nội dung của question cần update.
1 2 3 4 |
@PutMapping("/{id}") public Mono<ResponseEntity<CompositeQuestion>> updateQuestion(@PathVariable(value = "id") String questionId, @RequestBody Question question) { } |
Việc chúng ta chỉ là gọi tới method updateQuestion() của class CompositeQuestionService mà thôi:
1 2 3 4 5 6 7 |
@PutMapping("/{id}") public Mono<ResponseEntity<CompositeQuestion>> updateQuestion(@PathVariable(value = "id") String questionId, @RequestBody Question question) { return compositeQuestionService.updateQuestion(questionId, question) .map(compositeQuestion -> ResponseEntity.ok(compositeQuestion)) .defaultIfEmpty(ResponseEntity.notFound().build()); } |
Ở đây, trong trường hợp không tìm thấy Category Id mà question này thuộc về, một lỗi HTTP 404 Not Found sẽ được trả về cho người dùng như các bạn thấy trong đoạn code trên.
OK, đến đây là chúng ta đã hoàn thành việc xây dựng API cập nhập question cho Composite Question Service rồi đó các bạn. Test thử xem sao nhé.
Giả sử hiện tại mình đang có những question như sau:
Nếu bây giờ mình cập nhập question đầu tiên trong danh sách trên, có id là 5ad5d9d651bd7a0aefa87fb3 thì kết quả sẽ như sau: