strava_data/
activities_api.rs1use 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}