#[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)?)
},
}
}