summaryrefslogtreecommitdiff
path: root/src/routes/song.rs
diff options
context:
space:
mode:
authorniliara-edu <nil.jimeno@estudiant.fjaverianas.com>2024-11-12 20:53:18 +0100
committerniliara-edu <nil.jimeno@estudiant.fjaverianas.com>2024-11-12 20:53:18 +0100
commit6a762589e2f557cb1b2096c6e8d888129c3e2fca (patch)
tree09f779034fa564f3b97d9fe86158b2f3acb887e1 /src/routes/song.rs
parent6d57e0d0da0bbe5461acfb0b1809f5d22a5b4fcc (diff)
basic routing for songs
Diffstat (limited to 'src/routes/song.rs')
-rw-r--r--src/routes/song.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/routes/song.rs b/src/routes/song.rs
new file mode 100644
index 0000000..f0630e9
--- /dev/null
+++ b/src/routes/song.rs
@@ -0,0 +1,56 @@
+use crate::routes::Song;
+use crate::AppState;
+use actix_web::{get, web, HttpResponse};
+use serde::Deserialize;
+
+#[derive(Deserialize)]
+struct SongQueryOptions {
+ id: Option<String>,
+ name: Option<String>,
+}
+
+#[get("/song")]
+pub async fn song(
+ app_state: web::Data<AppState>,
+ get_args: web::Query<SongQueryOptions>,
+) -> HttpResponse {
+ let search_attempt: sqlx::Result<Vec<Song>>;
+
+ match true {
+ _ if check_if_exists(&get_args.id) => {
+ search_attempt = sqlx::query_as!(
+ Song,
+ "SELECT name, lyrics FROM song WHERE id=?",
+ &get_args.id,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ if check_if_exists(&get_args.name) => {
+ search_attempt = sqlx::query_as!(
+ Song,
+ "SELECT name, lyrics FROM song WHERE LOWER(name) LIKE '%' + LOWER(?) + '%'",
+ &get_args.name,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ => {
+ search_attempt = sqlx::query_as!(Song, "SELECT name, lyrics FROM song",)
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ };
+
+ match search_attempt {
+ Ok(song_list) => HttpResponse::Ok().json(song_list),
+ Err(e) => HttpResponse::Ok().body(format!("{}", e)),
+ }
+}
+
+fn check_if_exists(value: &Option<String>) -> bool {
+ match value {
+ Some(_) => true,
+ None => false,
+ }
+}