2021-01-01 12:54:13 +13:00
|
|
|
// CRATES
|
2021-01-15 07:22:50 +13:00
|
|
|
use crate::utils::{error, fetch_posts, param, prefs, Post, Preferences, request, val};
|
2021-01-03 17:50:23 +13:00
|
|
|
use actix_web::{HttpRequest, HttpResponse};
|
2021-01-01 12:54:13 +13:00
|
|
|
use askama::Template;
|
|
|
|
|
|
|
|
// STRUCTS
|
2021-01-03 19:37:54 +13:00
|
|
|
struct SearchParams {
|
|
|
|
q: String,
|
|
|
|
sort: String,
|
|
|
|
t: String,
|
|
|
|
before: String,
|
|
|
|
after: String,
|
|
|
|
restrict_sr: String,
|
|
|
|
}
|
|
|
|
|
2021-01-15 07:22:50 +13:00
|
|
|
// STRUCTS
|
|
|
|
struct Subreddit {
|
|
|
|
name: String,
|
|
|
|
url: String,
|
|
|
|
description: String,
|
|
|
|
subscribers: i64,
|
|
|
|
}
|
|
|
|
|
2021-01-01 12:54:13 +13:00
|
|
|
#[derive(Template)]
|
|
|
|
#[template(path = "search.html", escape = "none")]
|
|
|
|
struct SearchTemplate {
|
|
|
|
posts: Vec<Post>,
|
2021-01-15 07:22:50 +13:00
|
|
|
subreddits: Vec<Subreddit>,
|
2021-01-01 12:54:13 +13:00
|
|
|
sub: String,
|
2021-01-03 19:37:54 +13:00
|
|
|
params: SearchParams,
|
2021-01-09 14:35:04 +13:00
|
|
|
prefs: Preferences,
|
2021-01-01 12:54:13 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
// SERVICES
|
2021-01-03 17:50:23 +13:00
|
|
|
pub async fn find(req: HttpRequest) -> HttpResponse {
|
2021-01-01 12:54:13 +13:00
|
|
|
let path = format!("{}.json?{}", req.path(), req.query_string());
|
2021-01-02 09:33:57 +13:00
|
|
|
let sort = if param(&path, "sort").is_empty() {
|
2021-01-01 12:54:13 +13:00
|
|
|
"relevance".to_string()
|
|
|
|
} else {
|
2021-01-02 09:33:57 +13:00
|
|
|
param(&path, "sort")
|
2021-01-01 12:54:13 +13:00
|
|
|
};
|
|
|
|
let sub = req.match_info().get("sub").unwrap_or("").to_string();
|
2021-01-15 07:22:50 +13:00
|
|
|
let mut subreddits: Vec<Subreddit> = Vec::new();
|
|
|
|
|
|
|
|
if param(&path, "restrict_sr") == "" {
|
|
|
|
let subreddit_search_path = format!("/subreddits/search.json?q={}&limit=3", param(&path, "q"));
|
|
|
|
let res;
|
|
|
|
let subreddit_list;
|
|
|
|
|
|
|
|
// Send a request to the url
|
|
|
|
match request(&subreddit_search_path).await {
|
|
|
|
// If success, receive JSON in response
|
|
|
|
Ok(response) => {
|
|
|
|
res = response;
|
|
|
|
subreddit_list = res["data"]["children"].as_array();
|
|
|
|
}
|
|
|
|
// If the Reddit API returns an error, exit this function
|
|
|
|
Err(_msg) => {subreddit_list = None;}
|
|
|
|
}
|
|
|
|
|
|
|
|
// For each subreddit from subreddit list
|
|
|
|
if !subreddit_list.is_none() {
|
|
|
|
for subreddit in subreddit_list.unwrap() {
|
|
|
|
subreddits.push(Subreddit {
|
|
|
|
name: val(subreddit, "display_name_prefixed"),
|
|
|
|
url: val(subreddit, "url"),
|
|
|
|
description: val(subreddit, "public_description"),
|
|
|
|
subscribers: subreddit["data"]["subscribers"].as_u64().unwrap_or_default() as i64,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-01 12:54:13 +13:00
|
|
|
|
2021-01-02 12:28:13 +13:00
|
|
|
match fetch_posts(&path, String::new()).await {
|
2021-01-07 18:27:24 +13:00
|
|
|
Ok((posts, after)) => HttpResponse::Ok().content_type("text/html").body(
|
2021-01-03 17:50:23 +13:00
|
|
|
SearchTemplate {
|
2021-01-07 18:27:24 +13:00
|
|
|
posts,
|
2021-01-15 07:22:50 +13:00
|
|
|
subreddits,
|
2021-01-02 12:28:13 +13:00
|
|
|
sub,
|
2021-01-03 19:37:54 +13:00
|
|
|
params: SearchParams {
|
|
|
|
q: param(&path, "q"),
|
|
|
|
sort,
|
|
|
|
t: param(&path, "t"),
|
|
|
|
before: param(&path, "after"),
|
2021-01-07 18:27:24 +13:00
|
|
|
after,
|
2021-01-03 19:37:54 +13:00
|
|
|
restrict_sr: param(&path, "restrict_sr"),
|
|
|
|
},
|
2021-01-09 14:35:04 +13:00
|
|
|
prefs: prefs(req),
|
2021-01-02 12:28:13 +13:00
|
|
|
}
|
|
|
|
.render()
|
2021-01-03 17:50:23 +13:00
|
|
|
.unwrap(),
|
|
|
|
),
|
2021-01-14 16:53:52 +13:00
|
|
|
Err(msg) => error(msg).await,
|
2021-01-01 12:54:13 +13:00
|
|
|
}
|
|
|
|
}
|