diff options
Diffstat (limited to 'src/importer.rs')
-rw-r--r-- | src/importer.rs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/importer.rs b/src/importer.rs index e1f73e2..ab77837 100644 --- a/src/importer.rs +++ b/src/importer.rs @@ -1,3 +1,4 @@ +use diesel::PgConnection; use std::sync::mpsc::channel; use std::sync::mpsc::Receiver; use std::sync::mpsc::Sender; @@ -5,12 +6,14 @@ use std::sync::Arc; use std::sync::Mutex; use std::sync::RwLock; use threadpool::ThreadPool; -use diesel::PgConnection; +use chrono::Utc; +use crate::error::Error; use crate::db; -use crate::strava; use crate::models; +use crate::strava; use crate::strava::StravaApi; +use crate::Params; pub const WORKERS: usize = 10; pub const EMPTY_PARAMS: &[(&str, &str)] = &[]; @@ -29,12 +32,26 @@ struct ImporterState { rx: Arc<Mutex<Receiver<Command>>>, } +fn get_or_refresh_token<Strava: strava::StravaApi>(strava: &Strava, conn: &PgConnection, user: &models::User) -> Result<models::StravaToken, Error> { + let mut token = db::get_strava_token(&conn, &user).expect("FIX"); + + if token.expires_at < Utc::now() { + info!("refresh expired token: {:?}", token.expires_at); + let new_token = strava.refresh_token(&From::from(&token))?; + new_token.update_model(&mut token); + } + + Ok(token) +} + fn import_strava_user(state: ImporterState, user: models::User) { let strava = state.strava.read().expect("FIX"); let conn = state.conn.lock().expect("FIX"); - let token = db::get_strava_token(&conn, &user).expect("FIX"); - let result = strava.get("/athlete/activities", &token.access_token, EMPTY_PARAMS).expect("ok"); - info!("Imported user. Got result: {:#?}", result); + let token = get_or_refresh_token(&*strava, &conn, &user).expect("FIX"); + let result = strava + .get("/athlete/activities", &token.access_token, EMPTY_PARAMS) + .expect("ok"); + info!("import_strava_user: Got result: {:#?}", result); } fn handle_command(state: ImporterState, command: Command) { @@ -65,12 +82,13 @@ fn receive_commands(state: ImporterState) { } } -pub fn run(pool: ThreadPool, conn: PgConnection) -> Sender<Command> { +pub fn run(pool: ThreadPool, conn: PgConnection, params: &Params) -> Sender<Command> { let (tx, rx0) = channel(); let state = ImporterState { pool: pool.clone(), conn: Arc::new(Mutex::new(conn)), - strava: Arc::new(RwLock::new(strava::StravaImpl::new())), + strava: Arc::new(RwLock::new(strava::StravaImpl::new( + params.strava_client_id.clone(), params.strava_client_secret.clone()))), rx: Arc::new(Mutex::new(rx0)), }; pool.execute(move || receive_commands(state)); |