]> Untitled Git - lemmy.git/commitdiff
Add feed for all
authorFelix Ableitner <me@nutomic.com>
Sun, 1 Dec 2019 19:01:38 +0000 (20:01 +0100)
committerFelix Ableitner <me@nutomic.com>
Sun, 1 Dec 2019 19:01:38 +0000 (20:01 +0100)
server/src/feeds.rs
server/src/main.rs

index f711acedb1354310e309d71ff443d1002438fb14..4cd3d9cbba4e551045a3a70ace02b0c40646814c 100644 (file)
@@ -15,20 +15,47 @@ use diesel::result::Error;
 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()
@@ -43,15 +70,21 @@ pub fn get_feed(path: web::Path<(char, String)>, info: web::Query<Params>) -> Ht
   }
 }
 
-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,
index e5536647dea318d632038006d56d9e977fe5ecf2..976f5f5d0fa1c56f7cb9640edaa519d9d6db3832 100644 (file)
@@ -206,7 +206,7 @@ fn main() {
       .route("/feeds/{type}/{name}.xml", web::get().to(feeds::get_feed))
       // TODO: probably need a different function for this (or just handle all of /feeds?
       // TODO: would be nice to use ListingType, but that doesnt include user
-      .route("/feeds/all.xml", web::get().to(feeds::get_feed))
+      .route("/feeds/all.xml", web::get().to(feeds::get_all_feed))
       // static resources
       .service(actix_files::Files::new("/static", front_end_dir()))
   })