summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorniliara-edu <nil.jimeno@estudiant.fjaverianas.com>2025-01-19 14:58:26 +0100
committerniliara-edu <nil.jimeno@estudiant.fjaverianas.com>2025-01-19 14:58:26 +0100
commit95b944b819d7a1320d3083929177676f93d4a3e3 (patch)
tree824e3baea0bf1f386a48ca3da587fbb334101e16 /src
parent073149464269b5fcc90e282536c1a946ad474085 (diff)
add album and artist routes
Diffstat (limited to 'src')
-rw-r--r--src/main.rs2
-rw-r--r--src/routes.rs18
-rw-r--r--src/routes/album.rs87
-rw-r--r--src/routes/artist.rs66
4 files changed, 172 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 9d6ec4f..bddb0b6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -31,6 +31,8 @@ async fn main() -> std::io::Result<()> {
.app_data(web::Data::new(app_state.clone()))
.route("/", web::get().to(root))
.service(routes::song::song)
+ .service(routes::album::album)
+ .service(routes::artist::artist)
})
.bind(("127.0.0.1", 8000))?
.run()
diff --git a/src/routes.rs b/src/routes.rs
index a219da1..d984505 100644
--- a/src/routes.rs
+++ b/src/routes.rs
@@ -1,14 +1,30 @@
use serde::Serialize;
pub mod song;
+pub mod album;
+pub mod artist;
#[derive(Serialize)]
pub struct Song {
- id: Option<i32>,
name: Option<String>,
+ id: Option<i32>,
lyrics: Option<String>,
album_name: Option<String>,
album_id: Option<i32>,
artist_name: Option<String>,
artist_id: Option<i32>,
}
+
+#[derive(Serialize)]
+pub struct Album {
+ name: Option<String>,
+ id: Option<i32>,
+ artist_name: Option<String>,
+ artist_id: Option<i32>,
+}
+
+#[derive(Serialize)]
+pub struct Artist {
+ name: Option<String>,
+ id: Option<i32>,
+}
diff --git a/src/routes/album.rs b/src/routes/album.rs
new file mode 100644
index 0000000..1948339
--- /dev/null
+++ b/src/routes/album.rs
@@ -0,0 +1,87 @@
+use crate::routes::Album;
+use crate::AppState;
+use actix_web::{get, web, HttpResponse};
+use serde::Deserialize;
+
+#[derive(Deserialize)]
+struct AlbumQueryOptions {
+ id: Option<String>,
+ name: Option<String>,
+ artist: Option<String>,
+}
+
+#[get("/api/album")]
+pub async fn album(
+ app_state: web::Data<AppState>,
+ get_args: web::Query<AlbumQueryOptions>,
+) -> HttpResponse {
+ let search_attempt: sqlx::Result<Vec<Album>>;
+
+ match true {
+ _ if check_if_exists(&get_args.id) => {
+ search_attempt = sqlx::query_as!(
+ Album,
+ "SELECT album.name, album.id,
+ artist.name as artist_name, artist.id as artist_id
+ FROM album
+ INNER JOIN artist ON album.artist_id = artist.id
+ WHERE album.id=?",
+ &get_args.id,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ if check_if_exists(&get_args.name) => {
+ let new_name : String = format!("{}{}{}", "%", &get_args.name.clone().unwrap(), "%");
+ search_attempt = sqlx::query_as!(
+ Album,
+ "SELECT album.name, album.id,
+ artist.name as artist_name, artist.id as artist_id
+ FROM album
+ INNER JOIN artist ON album.artist_id = artist.id
+ WHERE LOWER(album.name) LIKE LOWER(?)",
+ new_name,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ if check_if_exists(&get_args.artist) => {
+ search_attempt = sqlx::query_as!(
+ Album,
+ "SELECT album.name, album.id,
+ artist.name as artist_name, artist.id as artist_id
+ FROM album
+ INNER JOIN artist ON album.artist_id = artist.id
+ WHERE album.artist_id=?
+ ",
+ &get_args.artist,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ => {
+ search_attempt = sqlx::query_as!(
+ Album,
+ "SELECT album.name, album.id,
+ artist.name as artist_name, artist.id as artist_id
+ FROM album
+ INNER JOIN artist ON album.artist_id = artist.id
+ ",
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ };
+
+ match search_attempt {
+ Ok(album_list) => HttpResponse::Ok().json(album_list),
+ Err(e) => HttpResponse::Ok().body(format!("{}", e)),
+ }
+}
+
+fn check_if_exists(value: &Option<String>) -> bool {
+ match value {
+ Some(_) => true,
+ None => false,
+ }
+}
diff --git a/src/routes/artist.rs b/src/routes/artist.rs
new file mode 100644
index 0000000..bf18e34
--- /dev/null
+++ b/src/routes/artist.rs
@@ -0,0 +1,66 @@
+use crate::routes::Artist;
+use crate::AppState;
+use actix_web::{get, web, HttpResponse};
+use serde::Deserialize;
+
+#[derive(Deserialize)]
+struct ArtistQueryOptions {
+ id: Option<String>,
+ name: Option<String>,
+}
+
+#[get("/api/artist")]
+pub async fn artist(
+ app_state: web::Data<AppState>,
+ get_args: web::Query<ArtistQueryOptions>,
+) -> HttpResponse {
+ let search_attempt: sqlx::Result<Vec<Artist>>;
+
+ match true {
+ _ if check_if_exists(&get_args.id) => {
+ search_attempt = sqlx::query_as!(
+ Artist,
+ "SELECT name, id
+ FROM artist
+ WHERE id=?",
+ &get_args.id,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ if check_if_exists(&get_args.name) => {
+ let new_name : String = format!("{}{}{}", "%", &get_args.name.clone().unwrap(), "%");
+ search_attempt = sqlx::query_as!(
+ Artist,
+ "SELECT name, id
+ FROM artist
+ WHERE LOWER(name) LIKE LOWER(?)",
+ new_name,
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ _ => {
+ search_attempt = sqlx::query_as!(
+ Artist,
+ "SELECT name, id
+ FROM artist
+ ",
+ )
+ .fetch_all(&app_state.pool)
+ .await;
+ }
+ };
+
+ match search_attempt {
+ Ok(artist_list) => HttpResponse::Ok().json(artist_list),
+ Err(e) => HttpResponse::Ok().body(format!("{}", e)),
+ }
+}
+
+fn check_if_exists(value: &Option<String>) -> bool {
+ match value {
+ Some(_) => true,
+ None => false,
+ }
+}