summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2020-02-11 21:11:19 +0000
committerDennis Kobert <dennis@kobert.dev>2020-02-11 21:11:19 +0000
commitdb326a4ad37f8e31a74bb7cf87b8deae1b48393e (patch)
treef75ae276951059f45d0c31dc3c2d288e1fb1d54b
parent394bcfe59485b96639c35a57e67c2331cf5c434d (diff)
Add match function
-rw-r--r--src/main.rs30
-rw-r--r--src/serve.rs62
2 files changed, 44 insertions, 48 deletions
diff --git a/src/main.rs b/src/main.rs
index b0bda1b..c99244d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -16,37 +16,18 @@ lazy_static! {
fn main() {
initialize_db().unwrap();
- //setup_db().unwrap();
println!("connected with db");
rocket::ignite()
- .mount("/", routes![serve::token, serve::get_tracks])
+ .mount(
+ "/",
+ routes![serve::token, serve::get_tracks, serve::match_users],
+ )
.launch();
}
-fn setup_db() -> Result<(), postgres::Error> {
- let name = "Ferris";
- let data = None::<&[u8]>;
- let mut client = CLIENT.lock().unwrap();
- client.execute(
- "INSERT INTO person (name, data) VALUES ($1, $2)",
- &[&name, &data],
- )?;
-
- for row in client.query("SELECT id, name, data FROM person", &[])? {
- let id: i32 = row.get(0);
- let name: &str = row.get(1);
- let data: Option<&[u8]> = row.get(2);
-
- println!("found person: {} {} {:?}", id, name, data);
- }
- Ok(())
-}
-
fn initialize_db() -> Result<(), postgres::Error> {
let mut client = CLIENT.lock().unwrap();
- let _ = client.batch_execute(
- "DROP TABLE user_track; DROP TABLE suser; DROP TABLE track;"
- );
+ let _ = client.batch_execute("DROP TABLE user_track; DROP TABLE suser; DROP TABLE track;");
client.batch_execute(
"
CREATE TABLE track (
@@ -70,4 +51,3 @@ fn initialize_db() -> Result<(), postgres::Error> {
)?;
Ok(())
}
-
diff --git a/src/serve.rs b/src/serve.rs
index babb3fe..da7076f 100644
--- a/src/serve.rs
+++ b/src/serve.rs
@@ -33,13 +33,7 @@ pub fn get_tracks(name: String, url: String) -> String {
&[&user_id],
)
.unwrap();
- let uid: i32 = client
- .query(
- "SELECT user_id FROM suser where user_name = $1;",
- &[&user_id],
- )
- .unwrap()[0]
- .get(0);
+ let uid = get_uid(user_id.as_ref(), &mut client);
drop(client);
let chunk_size = 50;
let mut playlist_index = 0;
@@ -161,20 +155,42 @@ pub fn token(name: String) -> Result<Redirect, status::Custom<String>> {
"Internal Server Error".to_owned(),
)),
}
- /*match get_token(&mut oauth) {
- Some(token_info) => {
- let client_credential = SpotifyClientCredentials::default()
- .token_info(token_info)
- .build();
- // Or set client_id and client_secret explictly
- // let client_credential = SpotifyClientCredentials::default()
- // .client_id("this-is-my-client-id")
- // .client_secret("this-is-my-client-secret")
- // .build();
- let spotify = Spotify::default()
- .client_credentials_manager(client_credential)
- .build();
- }
- None => {}
- }*/
+}
+
+fn get_uid(name: &str, client: &mut postgres::Client) -> i32 {
+ client
+ .query("SELECT user_id FROM suser where user_name = $1;", &[&name])
+ .unwrap()[0]
+ .get(0)
+}
+
+#[get("/match/<name1>/<name2>")]
+pub fn match_users(name1: String, name2: String) -> Result<String, status::Custom<String>> {
+ let mut client = crate::CLIENT.lock().unwrap();
+ let uid1 = get_uid(name1.as_ref(), &mut client);
+ let uid2 = get_uid(name2.as_ref(), &mut client);
+ let mut songs = String::new();
+ for row in client
+ .query(
+ "
+ SELECT track_id FROM user_track where user_id = $1 ORDER BY count
+ INTERSECT
+ SELECT track_id FROM user_track where user_id = $2 ORDER BY count
+ ",
+ &[&uid1, &uid2],
+ )
+ .unwrap()
+ {
+ let tid: i32 = row.get(0);
+ let song = &client
+ .query(
+ "SELECT name artist popularity FROM track where track_id = $1",
+ &[&tid],
+ )
+ .unwrap()[0];
+ let name: String = song.get(0);
+ let artist: String = song.get(1);
+ songs = format!("{}{} by {}\n", songs, name, artist);
+ }
+ Ok(songs)
}