dapr-labs icon indicating copy to clipboard operation
dapr-labs copied to clipboard

CoffeeShop on Spin with Dapr

Open thangchung opened this issue 1 year ago • 7 comments

Refs: https://www.thorsten-hans.com/how-to-blog-backends-with-spin-and-fermyon-cloud/

#[http_component]
fn handle_blog_apis_rust(req: Request) -> Result<Response> {
  let mut router = spin_sdk::http::Router::default();
  router.post("/contact", requests::process_contact_request);
  router.post("/sponsor", requests::process_sponsor_request);
  router.post("/subscriptions", newsletter::subscribe);
  router.get("/search", search::search);
  router.add("/...", http::Method::OPTIONS, cors::process_preflight);
  router.handle(req)
}
pub(crate) fn search(req: Request, _params: Params) -> Result<Response>{
  println!("[SEARCH]: Endpoint invoked");
  let Some(search_term) = get_query_string_parameter(req.uri(), "query") else {
    println!("[Error]: Could not find search term");
    return Ok(http::Response::builder()
      .status(http::StatusCode::BAD_REQUEST)
      .body(None)?);
  };
  println!("[SEARCH]: Endpoint invoked with '{}'", &search_term);

  let Ok(search_url) = config::get(CFG_NAME_SEARCH_URL) else {
    println!("[Error]: Could not find Azure Search Service URL");
    return Ok(http::Response::builder()
      .status(http::StatusCode::INTERNAL_SERVER_ERROR)
      .body(None)?);
  };

  let Ok(search_api_key) = config::get(CFG_NAME_SEARCH_API_TOKEN) else {
    println!("[Error]: Could not find Azure Search API Key");
    return Ok(http::Response::builder()
      .status(http::StatusCode::INTERNAL_SERVER_ERROR)
      .body(None)?);
  };

  let query_string = build_azure_search_query_string(search_term.as_str());
   
   
  let req = http::Request::builder()
    .method(http::Method::GET)
    .header(http::header::ACCEPT, "application/json")
    .header(http::header::CONTENT_TYPE, "application/json")
    .header("api-key", search_api_key)
    .uri(format!("{}{}", search_url, query_string))
    .body(None)?;

  match spin_sdk::outbound_http::send_request(req) {
    Ok(r) => {
      println!("[SEARCH]: Will respond with search results");
      Ok(builder_with_cors(r.status())
      .body(r.body().clone())?)
    },
    Err(e) => {
      println!("[Error]: Did not receive successful response from Azure Search Service ({})", e);
      Ok(http::Response::builder()
      .status(http::StatusCode::INTERNAL_SERVER_ERROR)
      .body(None)?)
    },
  }
}

thangchung avatar May 21 '23 13:05 thangchung