summaryrefslogtreecommitdiff
path: root/src/lib.rs
blob: d7f7b98aca7e20cead26e2c620984cf1f1a2c695 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#![feature(proc_macro_hygiene)]
#![feature(decl_macro)]
#[macro_use]
extern crate rocket;
use rocket::response;
use rocket::State;
use rocket_contrib::templates::Template;
use std::collections::HashMap;

mod strava;

#[derive(Debug)]
pub struct Config {
    pub client_id: String,
    pub client_secret: String,
    pub base_url: String,
}

#[get("/")]
fn index() -> Template {
    let mut context = HashMap::new();
    context.insert("parent", "layout");
    context.insert("message", "Hello, World");
    Template::render("index", context)
}

#[get("/link_strava_callback?<code>")]
fn link_strava_callback(config: State<Config>, code: String) -> String {
    strava::exchange_token(&config.client_id, &config.client_secret, &code);
    "OK".to_string()
}

#[get("/link_strava")]
fn link_strava(config: State<Config>) -> response::Redirect {
    response::Redirect::to(
        format!(
            concat!(
                "https://www.strava.com/oauth/authorize?",
                "client_id={}&",
                "response_type=code&",
                "redirect_uri={}&",
                "approval_prompt=force&",
                "scope=read",
            ),
            config.client_id,
            format!("{}/link_strava_callback", config.base_url))
    )
}

pub fn start_server(config: Config) {
    rocket::ignite()
        .manage(config)
        .mount("/", routes![index, link_strava, link_strava_callback])
        .attach(Template::fairing())
        .launch();
}