summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.ignore1
-rw-r--r--Cargo.toml3
-rw-r--r--N4
-rw-r--r--src/main.rs13
-rw-r--r--src/routes.rs9
-rw-r--r--src/routes/hello.rs11
-rw-r--r--src/routes/song.rs56
7 files changed, 83 insertions, 14 deletions
diff --git a/.ignore b/.ignore
index 2ce903e..7f63ba7 100644
--- a/.ignore
+++ b/.ignore
@@ -1 +1,2 @@
scripts/populate/
+scripts/
diff --git a/Cargo.toml b/Cargo.toml
index b4a8000..0e6a598 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,10 +8,13 @@ actix-web = { version = "4.9.0"}
sqlx = { version = "0.8.2", features = ["mysql", "macros", "runtime-tokio"] }
serde = { version = "1.0.210", features = ["derive"] }
tokio = "1.40.0"
+dotenv = "0.15.0"
+serde_json = "1.0.128"
[package.metadata.scripts]
db_create = "bash ./scripts/create_db.sh"
db_populate = "bash ./scripts/populate.sh"
+db_start = "sudo systemctl start mariadb"
# db_start = "sudo docker start sqlx"
# db_start = "sudo docker stop sqlx"
# db_remove = "sudo docker rm sqlx"
diff --git a/N b/N
index a755b9a..207ae9c 100644
--- a/N
+++ b/N
@@ -1,2 +1,6 @@
+Per preparar la base de dades:
cargo install cargo-run-script
cargo-run-script db-create
+
+Sobre les rutes:
+# searchResults no s'ha implementat per falta de temps.
diff --git a/src/main.rs b/src/main.rs
index af45779..9d6ec4f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,8 +1,10 @@
-mod structs;
mod routes;
+mod structs;
use actix_web::{web, App, HttpServer};
+use dotenv::dotenv;
use sqlx::mysql::{MySqlPool, MySqlPoolOptions};
+use std::env;
#[derive(Clone)]
struct AppState {
@@ -11,9 +13,14 @@ struct AppState {
#[actix_web::main]
async fn main() -> std::io::Result<()> {
+ dotenv().ok();
let pool: MySqlPool = MySqlPoolOptions::new()
.max_connections(10)
- .connect(DB_URL)
+ .connect(
+ env::var("DATABASE_URL")
+ .expect("environment variables are *probably not setted up!!")
+ .as_str(),
+ )
.await
.unwrap();
@@ -23,7 +30,7 @@ async fn main() -> std::io::Result<()> {
App::new()
.app_data(web::Data::new(app_state.clone()))
.route("/", web::get().to(root))
- .service(routes::hello::hello_actix)
+ .service(routes::song::song)
})
.bind(("127.0.0.1", 8000))?
.run()
diff --git a/src/routes.rs b/src/routes.rs
index e69de29..6195f32 100644
--- a/src/routes.rs
+++ b/src/routes.rs
@@ -0,0 +1,9 @@
+use serde::Serialize;
+
+pub mod song;
+
+#[derive(Serialize)]
+pub struct Song {
+ name: Option<String>,
+ lyrics: Option<String>,
+}
diff --git a/src/routes/hello.rs b/src/routes/hello.rs
deleted file mode 100644
index c356081..0000000
--- a/src/routes/hello.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-use crate::AppState;
-use actix_web::{get, web, HttpResponse};
-use serde::Deserialize;
-
-#[get("/hello")]
-pub async fn hello_actix(app_state: web::Data<AppState>) -> HttpResponse {
- struct Song {
- }
-
- return HttpResponse::Ok().json(databases);
-}
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,
+ }
+}