summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
4 files changed, 75 insertions, 14 deletions
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,
+ }
+}