From efc419e5df3f95ab24f53837e0e453d774bed027 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Tue, 20 Jul 2021 12:36:19 +0200 Subject: [PATCH] Add random endpoint --- src/v1/routes.rs | 25 +++++++++++++++++++++++++ src/v1/sql.rs | 17 +++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/v1/routes.rs b/src/v1/routes.rs index b357bca..e4de376 100644 --- a/src/v1/routes.rs +++ b/src/v1/routes.rs @@ -102,6 +102,30 @@ async fn users(db_pool: web::Data) -> impl Responder { } } +#[get("/v1/random")] +async fn random(params: web::Query, db_pool: web::Data) -> impl Responder { + let q = Meme::get_random(params.0, db_pool.get_ref()).await; + match q { + Ok(random) => HttpResponse::Ok().json(MemeResponse { + status: 200, + error: None, + meme: Some(random) + }), + Err(err) => match err { + Error::RowNotFound => HttpResponse::NotFound().json(MemeResponse { + status: 404, + error: Some(String::from("Meme not found")), + meme: None + }), + _ => HttpResponse::InternalServerError().json(MemeResponse { + status: 500, + error: Some(String::from("Internal Server Error")), + meme: None + }) + } + } +} + //TODO: Implement random meme endpoint //TODO: Implement upload endpoint @@ -112,4 +136,5 @@ pub fn init(cfg: &mut web::ServiceConfig) { cfg.service(categories); cfg.service(user); cfg.service(users); + cfg.service(random); } diff --git a/src/v1/sql.rs b/src/v1/sql.rs index 0cf9769..c1f5edd 100644 --- a/src/v1/sql.rs +++ b/src/v1/sql.rs @@ -45,6 +45,23 @@ impl Meme { Ok(q) } + pub async fn get_random(params: MemeFilterQuery, pool: &MySqlPool) -> Result { + let q: Meme = sqlx::query("SELECT memes.id, user, filename, category, name, UNIX_TIMESTAMP(timestamp) AS ts FROM memes, users WHERE memes.user = users.id AND (category LIKE ? AND name LIKE ? AND filename LIKE ?) ORDER BY RAND()") + .bind(params.category.unwrap_or(String::from("%"))) + .bind(format!("%{}%", params.user.unwrap_or(String::from("")))) + .bind(format!("%{}%", params.search.unwrap_or(String::from("")))) + .map(|row: MySqlRow| Meme::from(DBMeme { + id: row.get("id"), + filename: row.get("filename"), + user: row.get("name"), + userdir: row.get("user"), + category: row.get("category"), + timestamp: row.get("ts"), + })) + .fetch_one(pool).await?; + Ok(q) + } + } impl From for Meme {