use std::str::FromStr;
use self::rss::Guid;
use serde::Deserialize;
+use strum::ParseError;
#[derive(Deserialize)]
pub struct Params {
sort: Option<String>,
}
+enum RequestType {
+ All,
+ Community,
+ User,
+}
+
+pub fn get_all_feed(info: web::Query<Params>) -> HttpResponse<Body> {
+ let sort_type = get_sort_type(info);
+ if sort_type.is_err() {
+ return HttpResponse::BadRequest().finish();
+ }
+
+ let result = get_feed_internal(&sort_type.unwrap(), RequestType::All, None);
+ return match result {
+ Ok(rss) => HttpResponse::Ok()
+ .content_type("application/rss+xml")
+ .body(rss),
+ Err(_) => HttpResponse::InternalServerError().finish(),
+ };
+}
+
pub fn get_feed(path: web::Path<(char, String)>, info: web::Query<Params>) -> HttpResponse<Body> {
- let sort_query = info.sort.clone().unwrap_or(SortType::Hot.to_string());
- let sort_type: SortType = match SortType::from_str(&sort_query) {
- Ok(sort) => sort,
- Err(_) => return HttpResponse::BadRequest().finish(),
+ let sort_type = get_sort_type(info);
+ if sort_type.is_err() {
+ return HttpResponse::BadRequest().finish();
+ }
+
+ let request_type = match path.0 {
+ 'u' => RequestType::User,
+ 'c' => RequestType::Community,
+ _ => return HttpResponse::NotFound().finish(),
};
- let result = get_feed_internal(path, &sort_type);
+ let result = get_feed_internal(&sort_type.unwrap(), request_type, Some(path.1.clone()));
if result.is_ok() {
let rss = result.unwrap();
return HttpResponse::Ok()
}
}
-fn get_feed_internal(info: web::Path<(char, String)>, sort_type: &SortType) -> Result<String, Error> {
+fn get_sort_type(info: web::Query<Params>) -> Result<SortType, ParseError> {
+ let sort_query = info.sort.clone().unwrap_or(SortType::Hot.to_string());
+ return SortType::from_str(&sort_query);
+}
+
+fn get_feed_internal(sort_type: &SortType, request_type: RequestType, name: Option<String>)
+ -> Result<String, Error> {
let conn = establish_connection();
let mut community_id: Option<i32> = None;
let mut creator_id: Option<i32> = None;
- match info.0 {
- 'c' => community_id = Some(Community::read_from_name(&conn,info.1.clone())?.id),
- 'u' => creator_id = Some(User_::find_by_email_or_username(&conn,&info.1)?.id),
- _ => return Err(Error::NotFound),
+ match request_type {
+ RequestType::All =>(),
+ RequestType::Community => community_id = Some(Community::read_from_name(&conn,name.unwrap())?.id),
+ RequestType::User => creator_id = Some(User_::find_by_email_or_username(&conn,&name.unwrap())?.id),
}
let post = PostView::list(&conn,