strava_data/
activities_api.rs

1use log::debug;
2use reqwest::{Client, StatusCode};
3use std::rc::Rc;
4
5use crate::configuration::Configuration;
6use crate::models::DetailedActivity;
7
8pub struct ActivitiesApi {
9    configuration: Rc<Configuration>,
10}
11
12impl ActivitiesApi {
13    pub fn new(configuration: Rc<Configuration>) -> ActivitiesApi {
14        ActivitiesApi { configuration }
15    }
16
17    pub async fn get_activity_by_id(
18        &self,
19        id: i64,
20        access_token: &String,
21    ) -> Result<Option<DetailedActivity>, Box<dyn std::error::Error + Send + Sync + 'static>> {
22        debug!("get_activity_by_id {}", id);
23        let url = format!("{}/activities/{id}", self.configuration.base_path, id = id);
24        let authorization = format!("Bearer {}", access_token);
25        let res = Client::new()
26            .get(url.as_str())
27            .header("Authorization", authorization)
28            .send()
29            .await?;
30
31        if res.status() != StatusCode::OK {
32            if res.status() == StatusCode::NOT_FOUND {
33                log::warn!("activity {} not found", id);
34                return Ok(None);
35            }
36            log::error!("{:?}", res);
37            return Err(From::from("Error code not ok"));
38        }
39
40        let activity = res.json::<DetailedActivity>().await?;
41        Ok(Some(activity))
42    }
43
44    pub async fn get_logged_in_athlete_activities(
45        &self,
46        before: i32,
47        after: i32,
48        page: i32,
49        per_page: i32,
50        access_token: &String,
51    ) -> Result<Vec<DetailedActivity>, Box<dyn std::error::Error + Send + Sync + 'static>> {
52        debug!("get_logged_in_athlete_activities");
53        let url = format!(
54            "{}/athlete/activities?before={}&after={}&page={}&per_page={}",
55            self.configuration.base_path, before, after, page, per_page
56        );
57        let authorization = format!("Bearer {}", access_token);
58        let res = Client::new()
59            .get(url.as_str())
60            .header("Authorization", authorization)
61            .send()
62            .await?;
63
64        if res.status() != StatusCode::OK {
65            log::error!("{:?}", res);
66            return Err(From::from("Error code not ok"));
67        }
68
69        let activities = res.json::<Vec<DetailedActivity>>().await?;
70        Ok(activities)
71    }
72}