...
 
Commits (2)
...@@ -74,6 +74,22 @@ fn fill_user_data(session: &SessionUser, data: &mut json_val::Map<String, serde_ ...@@ -74,6 +74,22 @@ fn fill_user_data(session: &SessionUser, data: &mut json_val::Map<String, serde_
data.insert("parent".to_string(), to_json(&"base")); data.insert("parent".to_string(), to_json(&"base"));
} }
fn fill_oauth_data((self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>),
data: &mut json_val::Map<String, serde_json::Value>)
{
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
}
fn grade_to_string(grade: i32) -> String { fn grade_to_string(grade: i32) -> String {
match grade { match grade {
0 => "Noch kein Schüler".to_string(), 0 => "Noch kein Schüler".to_string(),
...@@ -90,7 +106,7 @@ fn grade_to_string(grade: i32) -> String { ...@@ -90,7 +106,7 @@ fn grade_to_string(grade: i32) -> String {
} }
pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>, pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>,
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>)) oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> (String, json_val::Map<String, json_val::Value>) -> (String, json_val::Map<String, json_val::Value>)
{ {
let mut data = json_val::Map::new(); let mut data = json_val::Map::new();
...@@ -103,23 +119,13 @@ pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>, ...@@ -103,23 +119,13 @@ pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>,
} }
} }
let mut oauth_links: Vec<(String, String, String)> = Vec::new(); fill_oauth_data(oauth_infos, &mut data);
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
data.insert("parent".to_string(), to_json(&"base")); data.insert("parent".to_string(), to_json(&"base"));
("index".to_owned(), data) ("index".to_owned(), data)
} }
pub fn status<T: MedalConnection>(conn: &T) -> String { conn.get_debug_information() } pub fn status<T: MedalConnection>(conn: &T, _: ()) -> String { conn.get_debug_information() }
pub fn debug<T: MedalConnection>(conn: &T, session_token: Option<String>) pub fn debug<T: MedalConnection>(conn: &T, session_token: Option<String>)
-> (String, json_val::Map<String, json_val::Value>) { -> (String, json_val::Map<String, json_val::Value>) {
...@@ -172,7 +178,7 @@ pub enum ContestVisibility { ...@@ -172,7 +178,7 @@ pub enum ContestVisibility {
} }
pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str, pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str,
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>), oauth_infos: (Option<String>, Option<Vec<OauthProvider>>),
visibility: ContestVisibility) visibility: ContestVisibility)
-> MedalValue -> MedalValue
{ {
...@@ -185,17 +191,7 @@ pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str, ...@@ -185,17 +191,7 @@ pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str,
data.insert("can_start".to_string(), to_json(&true)); data.insert("can_start".to_string(), to_json(&true));
} }
let mut oauth_links: Vec<(String, String, String)> = Vec::new(); fill_oauth_data(oauth_infos, &mut data);
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
let now = time::get_time(); let now = time::get_time();
let v: Vec<ContestInfo> = let v: Vec<ContestInfo> =
...@@ -280,8 +276,11 @@ fn check_contest_constraints(session: &SessionUser, contest: &Contest) -> Contes ...@@ -280,8 +276,11 @@ fn check_contest_constraints(session: &SessionUser, contest: &Contest) -> Contes
grade_matching } grade_matching }
} }
pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token: &str, query_string: Option<String>) pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token: &str,
-> MedalValueResult { query_string: Option<String>,
oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> MedalValueResult
{
let session = conn.get_session_or_new(&session_token); let session = conn.get_session_or_new(&session_token);
let contest = conn.get_contest_by_id_complete(contest_id); let contest = conn.get_contest_by_id_complete(contest_id);
...@@ -295,7 +294,10 @@ pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token ...@@ -295,7 +294,10 @@ pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token
public: contest.public }; public: contest.public };
let mut data = json_val::Map::new(); let mut data = json_val::Map::new();
data.insert("parent".to_string(), to_json(&"base"));
data.insert("empty".to_string(), to_json(&"empty"));
data.insert("contest".to_string(), to_json(&ci)); data.insert("contest".to_string(), to_json(&ci));
fill_oauth_data(oauth_infos, &mut data);
let constraints = check_contest_constraints(&session, &contest); let constraints = check_contest_constraints(&session, &contest);
...@@ -484,7 +486,7 @@ pub fn start_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_toke ...@@ -484,7 +486,7 @@ pub fn start_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_toke
} }
pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String), pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>)) oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> Result<String, MedalValue> -> Result<String, MedalValue>
{ {
let (username, password) = login_data; let (username, password) = login_data;
...@@ -497,17 +499,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String), ...@@ -497,17 +499,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
data.insert("username".to_string(), to_json(&username)); data.insert("username".to_string(), to_json(&username));
data.insert("parent".to_string(), to_json(&"base")); data.insert("parent".to_string(), to_json(&"base"));
let mut oauth_links: Vec<(String, String, String)> = Vec::new(); fill_oauth_data(oauth_infos, &mut data);
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
Err(("login".to_owned(), data)) Err(("login".to_owned(), data))
} }
...@@ -515,7 +507,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String), ...@@ -515,7 +507,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
} }
pub fn login_with_code<T: MedalConnection>( pub fn login_with_code<T: MedalConnection>(
conn: &T, code: &str, (self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>)) conn: &T, code: &str, oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> Result<Result<String, String>, (String, json_val::Map<String, json_val::Value>)> { -> Result<Result<String, String>, (String, json_val::Map<String, json_val::Value>)> {
match conn.login_with_code(None, &code) { match conn.login_with_code(None, &code) {
Ok(session_token) => Ok(Ok(session_token)), Ok(session_token) => Ok(Ok(session_token)),
...@@ -527,17 +519,7 @@ pub fn login_with_code<T: MedalConnection>( ...@@ -527,17 +519,7 @@ pub fn login_with_code<T: MedalConnection>(
data.insert("code".to_string(), to_json(&code)); data.insert("code".to_string(), to_json(&code));
data.insert("parent".to_string(), to_json(&"base")); data.insert("parent".to_string(), to_json(&"base"));
let mut oauth_links: Vec<(String, String, String)> = Vec::new(); fill_oauth_data(oauth_infos, &mut data);
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
Err(("login".to_owned(), data)) Err(("login".to_owned(), data))
} }
......
...@@ -297,16 +297,9 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response> ...@@ -297,16 +297,9 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
// hier ggf. Daten aus dem Request holen // hier ggf. Daten aus dem Request holen
let config = req.get::<Read<SharedConfiguration>>().unwrap(); let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone()); let oauth_infos = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = {
// hier ggf. Daten aus dem Request holen
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
// Antwort erstellen und zurücksenden let (template, mut data) = with_conn![core::index, C, req, session_token, oauth_infos];
core::index(&*conn, session_token, (self_url, oauth_providers))
};
/*if let Some(server_message) = &config.server_message { /*if let Some(server_message) = &config.server_message {
data.insert("server_message".to_string(), to_json(&server_message)); data.insert("server_message".to_string(), to_json(&server_message));
...@@ -321,12 +314,7 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response> ...@@ -321,12 +314,7 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
fn dbstatus<C>(req: &mut Request) -> IronResult<Response> fn dbstatus<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static { where C: MedalConnection + std::marker::Send + 'static {
let status = { let status = with_conn![core::status, C, req, ()];
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
core::status(&*conn)
};
let mut resp = Response::new(); let mut resp = Response::new();
resp.set_mut(status).set_mut(status::Ok); resp.set_mut(status).set_mut(status::Ok);
...@@ -337,12 +325,7 @@ fn debug<C>(req: &mut Request) -> IronResult<Response> ...@@ -337,12 +325,7 @@ fn debug<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static { where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.get_session_token(); let session_token = req.get_session_token();
let (template, data) = { let (template, data) = with_conn![core::debug, C, req, session_token];
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
core::debug(&*conn, session_token)
};
let mut resp = Response::new(); let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok); resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
...@@ -415,55 +398,17 @@ fn contests<C>(req: &mut Request) -> IronResult<Response> ...@@ -415,55 +398,17 @@ fn contests<C>(req: &mut Request) -> IronResult<Response>
Ok(resp) Ok(resp)
} }
fn opencontests<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.require_session_token()?;
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = with_conn![core::show_contests,
C,
req,
&session_token,
(self_url, oauth_providers),
core::ContestVisibility::Open];
config.server_message.as_ref().map(|sm| data.insert("server_message".to_string(), to_json(&sm)));
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
Ok(resp)
}
fn currentcontests<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.require_session_token()?;
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = with_conn![core::show_contests,
C,
req,
&session_token,
(self_url, oauth_providers),
core::ContestVisibility::Current];
config.server_message.as_ref().map(|sm| data.insert("server_message".to_string(), to_json(&sm)));
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
Ok(resp)
}
fn contest<C>(req: &mut Request) -> IronResult<Response> fn contest<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static { where C: MedalConnection + std::marker::Send + 'static {
let contest_id = req.expect_int::<i32>("contestid")?; let contest_id = req.expect_int::<i32>("contestid")?;
let session_token = req.require_session_token()?; let session_token = req.require_session_token()?;
let query_string = req.url.query().map(|s| s.to_string()); let query_string = req.url.query().map(|s| s.to_string());
let (template, data) = with_conn![core::show_contest, C, req, contest_id, &session_token, query_string].aug(req)?; let config = req.get::<Read<SharedConfiguration>>().unwrap();
let oauth_infos = (config.self_url.clone(), config.oauth_providers.clone());
let (template, data) =
with_conn![core::show_contest, C, req, contest_id, &session_token, query_string, oauth_infos].aug(req)?;
let mut resp = Response::new(); let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok); resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
...@@ -1236,8 +1181,6 @@ pub fn start_server<C>(conn: C, config: Config) -> iron::error::HttpResult<iron: ...@@ -1236,8 +1181,6 @@ pub fn start_server<C>(conn: C, config: Config) -> iron::error::HttpResult<iron:
let router = router!( let router = router!(
greet: get "/" => greet_personal::<C>, greet: get "/" => greet_personal::<C>,
contests: get "/contest/" => contests::<C>, contests: get "/contest/" => contests::<C>,
contestsopen: get "/contest/open/" => opencontests::<C>,
contestscurrent: get "/contest/current/" => currentcontests::<C>,
contest: get "/contest/:contestid" => contest::<C>, contest: get "/contest/:contestid" => contest::<C>,
contestresults: get "/contest/:contestid/result/" => contestresults::<C>, contestresults: get "/contest/:contestid/result/" => contestresults::<C>,
contestresults_download: get "/contest/:contestid/result/download" => contestresults_download::<C>, contestresults_download: get "/contest/:contestid/result/download" => contestresults_download::<C>,
......
This diff is collapsed.