Questions Management – Composite Question Service – Xây dựng API lấy tất cả question

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.

Composite Service sẽ có nhiệm vụ kết nối đến các Core Service để lấy dữ liệu, combine hoặc transform những dữ liệu đó tuỳ theo nhu cầu của người dùng rồi trả về cho họ. Do đó, trước khi xây dựng API lấy tất cả question cho Composite Question Service, có mấy việc chúng ta phải làm trước như sau:

Vì Composite Question Service sẽ thao tác liên quan đến các category, các question và cả những option nên mình sẽ thêm các đối tượng model cho từng loại để chứa thông tin của chúng như sau:

Category:

Question:

Option:

Ở đây, chúng ta sẽ có 1 đối tượng chứa tất cả các thông tin về 1 question, category mà question này thuộc về và các lựa chọn của nó nên mình cũng sẽ thêm mới một đối tượng CompositeQuestion như sau:

Vì Composite Question Service sẽ gọi đến Core Category Service để lấy thông tin về category, đến Core Question Service để lấy thông tin về question, đến Core Option Service để lấy option nên mình sẽ thêm mới trong tập tin application.properties thông tin về chúng như sau:

Để handle việc gọi tới Core Category Service, mình sẽ tạo một interface tên là CoreCategoryService:

với implementation là CoreCategoryServiceImpl:

Để handle việc gọi tới Core Question Service, mình sẽ tạo một interface tên là CoreQuestionService:

với implementation là CoreQuestionServiceImpl:

Để handle việc gọi tới Core Option Service, mình sẽ tạo một interface tên là CoreOptionService:

với implementation là CoreOptionServiceImpl:

Mình sẽ chạy service này sử dụng port 8181 nên mình cũng sẽ thêm property server.port trong tập tin application.properties như sau:

OK, mọi thứ chuẩn bị đã xong, bây giờ mình sẽ đi vào phần chính của bài viết này các bạn nhé!



Đầu tiên, mình sẽ tạo mới một controller tên là CompositeQuestionController với nội dung như sau:

Với khai báo trên, mình cũng đã expose các API cho phần Composite Question Service với request URL bắt đầu là “/question”.

Tiếp theo mình sẽ tạo mới một CompositeQuestionService để handle tất cả các thao tác liên quan đến Composite Question Service.

Thao tác đầu tiên sẽ là tìm và combine thông tin của tất cả các câu hỏi đang có trong hệ thống.

Thông tin này bao gồm tất cả các câu hỏi, category mà các câu hỏi đó thuộc về và những lựa chọn dành cho câu hỏi đó. Chúng ta sẽ sử dụng đối tượng CompositeQuestion mà chúng ta đã khai báo ở trên để chứa tất cả những thông tin này. Cụ thể mình sẽ thêm mới một abstract method vào class CompositeQuestionService như sau:

Với phương thức findAllQuestions(), đầu tiên chúng ta cần gọi tới Core Question Service để lấy tất cả các câu hỏi đang có trong hệ thống. Bởi vì thông tin từ Core Question Service chỉ có Category ID với nội dung của câu hỏi mà thôi nên chúng ta cần gọi tới Core Category Service để tìm thông tin về category theo ID và gọi tới Core Option Service để lấy tất cả các lựa chọn của câu hỏi đó theo Question ID. Đó là tất cả những thứ chúng ta cần làm đối với method findAllQuestions().

Để hiện thực được phương thức findAllQuestions() trên, đầu tiên chúng ta cần gọi tới Core Question Service để lấy tất cả các câu hỏi đang có trong hệ thống bằng cách thêm mới một method trong CoreQuestionService:

với phần implementation trong class CoreQuestionServiceImpl như sau:

Tiếp theo chúng ta sẽ gọi tới Core Category Service để tìm thông tin về category theo ID bằng cách thêm mới một method trong class CoreCategoryService:

với phần implementation trong class CoreCategoryServiceImpl như sau:

Cuối cùng thì chúng ta sẽ gọi tới Core Option Service để lấy tất cả các options của câu hỏi này theo Question ID bằng cách thêm mới một method trong class CoreOptionService:

với phần implementation trong class CoreOptionServiceImpl như sau:

OK, bây giờ chúng ta sẽ hiện thực phương thức findAllQuestions() các bạn nhé.

Chúng ta sẽ inject 3 class service CoreCategoryService, CoreQuestionService và CoreOptionService vào trước:

Trong phương thức findAllQuestion(), đầu tiên chúng ta sẽ gọi Core Question Service trước:

Ứng với mỗi item mà Core Question Service trả về với phương thức trên, chúng ta sẽ sử dụng item đó để tìm kiếm thông tin của category và các option sử dụng phương thức flatMap() như sau:

Ở đây, mình có sử dụng phương thức collectList() để trả về một danh sách các option, phương thức map để build đối tượng Composite mà chúng ta cần. Một điều lưu ý nữa, vì quá trình gọi qua Core Category Service và Core Option Service cần thời gian để xử lý nên mình đã cho chạy quá trình này trên một thread khác sử dụng phương thức subscribeOn().

Đ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 GET request “/all”:

rồi khai báo autowire đối tượng CompositeQuestionService vào:

để có thể sử dụng phương thức findAllQuestions() mà chúng ta đã tạo ra ở trên:

OK, đến đây là chúng ta đã hoàn thành việc xây dựng API lấy tất cả question cho Composite Question Service rồi đó các bạn. Test thử xem sao nhé.

Questions Management – Composite Question Service – Xây dựng API lấy tất cả question

5/5 - (1 bình chọn)

4 thoughts on “Questions Management – Composite Question Service – Xây dựng API lấy tất cả question

  1. Theo mình nghĩ ở đây là đối tượng chứa tất cả thông tin của 1 question, bao gồm category của nó, các option của nó như đúng đối tượng bạn tạo thì đúng hơn, đó lá suy nghĩ của mình nếu có gì chưa đúng bạn giải thích giúp thêm, cám ơn bạn.

    1. Trong câu của mình cũng có đề cập về “câu hỏi là gì” đó bạn! Nhưng mà suy nghĩ lại có vẻ cách diễn đạt của bạn hay hơn nên mình sẽ sửa lại. Thanks bạn nhé! 🙂

  2. Theo mình trong câu này “Ở đây, chúng ta sẽ có 1 đối tượng chứa tất cả các thông tin về category, câu hỏi là gì và các lựa chọn của nó nên mình cũng sẽ thêm mới một đối tượng CompositeQuestion như sau:”

    Nên sửa “thông tin về category” thành “thông tin về question”

Add Comment