summaryrefslogtreecommitdiff
path: root/src/importer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/importer.rs')
-rw-r--r--src/importer.rs32
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));