Communiquer avec le service ratings

Dans reviews.rs

Nouveaux imports

use actix_web::client::ClientRequest;
use actix_web::HttpMessage;

Récupérer les ratings

Définir la structure du json

#[derive(Debug, Deserialize)]
pub struct RatingsResponse {
    id: i32,
    pub ratings: HashMap<String, i32>,
}

Appeler le service

Remplacer l'assignation de ratings par:

let ratings = ClientRequest::get(&format!("{}/ratings/{}", ::CONFIG.ratings_url, product_id))
    .finish()
    .unwrap()
    .send()
    .map_err(error::Error::from)
    .and_then(move |resp| {
        resp.json()
            .from_err()
            .and_then(|ratings: RatingsResponse| Ok(ratings.ratings))
    })
    .or_else(|err| {
        // in case of error, log it and continue with an empty list of ratings
        error!("{:?}", err);
        Ok(HashMap::new())
    });

Et remplacer

build_response_from_ratings(ratings).responder()

par

ratings.and_then(build_response_from_ratings).responder()

Sauvegarder un nouveau rating

Appeler le service

Remplacer

state
    .db
    .send(db::SaveReview {
        review: review_to_save,
    })
    .from_err()
    .and_then(move |_| Ok(HttpResponse::Ok().json(review.clone())))
    .responder()

par:

ClientRequest::post(&format!("{}/ratings/{}", ::CONFIG.ratings_url, product_id))
    .json(review.clone())
    .unwrap()
    .send()
    .map(|_| ())
    .or_else(|err| {
        // in case of error, log it and ignore it
        error!("{:?}", err);
        Ok(())
    })
    .and_then(move |_| {
        state
            .db
            .send(db::SaveReview {
                review: review_to_save,
            })
            .from_err()
            .and_then(move |_| Ok(HttpResponse::Ok().json(review.clone())))
    })
    .responder()

Résultat

Les ratings sont maintenant dispo quand on demande des avis, et l'application ratings a loggé qu'elle a été appellée

curl localhost:9081/reviews/0
{
   "reviews" : [
      {
         "rating" : {
            "stars" : 5,
            "color" : "blue"
         },
         "text" : "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!",
         "reviewer" : "Reviewer1"
      },
      {
         "reviewer" : "Reviewer2",
         "rating" : {
            "color" : "blue",
            "stars" : 4
         },
         "text" : "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."
      }
   ],
   "id" : 0
}
{"msg":"requesting ratings for product 0","level":"INFO","ts":"2018-04-20T00:52:35.348631+02:00","logger":"app"}
{"msg":"[RESPONSE][d65d721f-b0d4-4689-a1fd-7b455fedd76d][HTTP/1.1][200 OK][755µs]","level":"INFO","ts":"2018-04-20T00:52:35.348900+02:00","logger":"app"}

À la sauvegarde d'un avis, la note est sauvegardée dans l'application ratings

curl localhost:9081/reviews/3 -H 'Content-Type: application/json' -d '{"reviewer":"moi","rating":3,"text":"mon avis"}'
{"reviewer":"moi","text":"mon avis","rating":3}

curl localhost:9081/reviews/3
{
   "reviews" : [
      {
         "reviewer" : "moi",
         "text" : "mon avis",
         "rating" : {
            "color" : "yellow",
            "stars" : 3
         }
      }
   ],
   "id" : 3
}
{"msg":"saving new rating NewRating { reviewer: \"moi\", rating: 3 } for product 3","level":"INFO","ts":"2018-04-20T01:00:22.008725+02:00","logger":"app"}
{"msg":"[RESPONSE][4c0951b3-f302-4759-9458-506a6b1a9f97][HTTP/1.1][200 OK][822µs]","level":"INFO","ts":"2018-04-20T01:00:22.009032+02:00","logger":"app"}