use config;
use db_objects::*;
#[derive(Debug)]
pub enum SignupResult {
SignedUp,
EmailTaken,
UsernameTaken,
UserLoggedIn,
EmptyFields,
}
pub trait MedalConnection {
fn reconnect(config: &config::Config) -> Self;
fn dbtype(&self) -> &'static str;
fn migration_already_applied(&self, name: &str) -> bool;
fn apply_migration(&mut self, name: &str, contents: &str);
fn code_exists(&self, code: &str) -> bool;
fn get_session(&self, key: &str) -> Option<SessionUser>;
fn new_session(&self, key: &str) -> SessionUser;
fn session_set_activity_dates(&self, session_id: i32, account_created: Option<time::Timespec>,
last_login: Option<time::Timespec>, last_activity: Option<time::Timespec>);
fn save_session(&self, session: SessionUser);
fn get_session_or_new(&self, key: &str) -> Result<SessionUser, ()>;
fn get_user_by_id(&self, user_id: i32) -> Option<SessionUser>;
fn get_user_and_group_by_id(&self, user_id: i32) -> Option<(SessionUser, Option<Group>)>;
fn set_webauthn_passkey_registration(&self, user_id: i32, passkey_registration: &str);
fn get_webauthn_passkey_registration(&self, user_id: i32) -> Option<String>;
fn check_webauthn_cred_id_in_use(&self, cred_id: &str) -> bool;
fn add_webauthn_passkey(&self, user_id: i32, cred_id: &str, passkey: &str, name: &str) -> i32;
fn delete_webauthn_passkey(&self, session_id: i32, passkey_id: i32);
fn get_webauthn_passkey_names_for_user(&self, user_id: i32) -> Vec<(i32, String)>;
fn get_all_webauthn_passkeys(&self) -> Vec<String>;
fn get_all_webauthn_credentials(&self) -> Vec<String>;
fn store_webauthn_auth_challenge(&self, challenge: &str, authentication: &str) -> i32;
fn get_webauthn_auth_challenge_by_id(&self, auth_id: i32) -> Option<String>;
fn login(&self, session: Option<&str>, username: &str, password: &str) -> Result<String, ()>;
fn login_with_code(&self, session: Option<&str>, logincode: &str) -> Result<String, ()>;
fn login_with_key(&self, session: Option<&str>, cred_id: &str) -> Result<String, ()>;
fn login_foreign(&self, session: Option<&str>, provider_id: &str, foreign_id: &str,
_: (bool, bool, &str, &str, Option<i32>, &Option<String>))
-> Result<(String, Option<time::Timespec>), ()>;
fn create_user_with_groupcode(&self, session: Option<&str>, groupcode: &str) -> Result<String, ()>;
fn update_or_create_group_with_users(&self, group: Group, admin: i32);
fn add_admin_to_group(&self, group: &mut Group, admin: i32);
fn logout(&self, session: &str);
fn signup(&self, session_token: &str, username: &str, email: &str, password_hash: String, salt: &str)
-> SignupResult;
fn load_submission(&self, session: &SessionUser, task: i32, subtask: Option<&str>) -> Option<Submission>;
fn get_all_submissions(&self, session_id: i32, task: i32, subtask: Option<&str>) -> Vec<Submission>;
fn submit_submission(&self, submission: Submission);
fn get_grade_by_submission(&self, submission_id: i32) -> Grade;
fn get_contest_groups_grades(&self, session_id: i32, contest_id: i32)
-> (Vec<String>, Vec<(Group, Vec<(UserInfo, Vec<Grade>)>)>);
fn get_taskgroup_user_grade(&self, session_id: i32, taskgroup_id: i32) -> Grade;
fn get_contest_user_grades(&self, session_id: i32, contest_id: i32) -> Vec<Grade>;
fn export_contest_results_to_file(&self, contest_id: i32, taskgroups_ids: &[(i32, String)], filename: &str);
fn insert_contest_annotations(&self, contest_id: i32, annotations: Vec<(i32, Option<String>)>) -> i32;
fn get_submission_by_id_complete_shallow_contest(&self, submission_id: i32)
-> Option<(Submission, Task, Taskgroup, Contest)>;
fn get_contest_list(&self) -> Vec<Contest>;
fn get_contest_list_with_group_member_participations(&self, session_id: i32) -> Vec<Contest>;
fn get_contest_by_id(&self, contest_id: i32) -> Option<Contest>;
fn get_contest_by_id_partial(&self, contest_id: i32) -> Option<Contest>;
fn get_contest_by_id_complete(&self, contest_id: i32) -> Option<Contest>;
fn get_participation(&self, session_id: i32, contest_id: i32) -> Option<Participation>;
fn get_own_participation(&self, session: &str, contest_id: i32) -> Option<Participation>;
fn get_all_participations_complete(&self, session_id: i32) -> Vec<(Participation, Contest)>;
fn count_all_stars(&self, session_id: i32) -> i32;
fn count_all_stars_by_contest(&self, session_id: i32) -> Vec<(i32, i32)>;
fn has_participation_by_contest_file(&self, session_id: i32, location: &str, filename: &str) -> bool;
fn new_participation(&self, session: &str, contest_id: i32) -> Result<Participation, ()>;
fn get_task_by_id(&self, task_id: i32) -> Option<Task>;
fn get_task_by_id_complete(&self, task_id: i32) -> Option<(Task, Taskgroup, Contest)>;
fn get_submission_to_validate(&self, tasklocation: &str, subtask: Option<&str>) -> i32;
fn find_next_submission_to_validate(&self, userid: i32, taskgroupid: i32);
fn add_group(&self, group: &mut Group);
fn save_group(&self, group: &mut Group);
fn get_groups(&self, session_id: i32) -> Vec<Group>;
fn get_groups_complete(&self, session_id: i32) -> Vec<Group>;
fn get_group(&self, session_id: i32) -> Option<Group>;
fn group_has_protected_participations(&self, session_id: i32) -> bool;
fn get_group_complete(&self, group_id: i32) -> Option<Group>;
fn delete_user(&self, user_id: i32);
fn delete_all_users_for_group(&self, group_id: i32);
fn delete_group(&self, group_id: i32);
fn delete_participation(&self, user_id: i32, contest_id: i32);
fn remove_old_users_and_groups(&self, maxstudentage: time::Timespec, maxteacherage: Option<time::Timespec>,
maxage: Option<time::Timespec>)
-> Result<(i32, i32, i32, i32), ()>;
fn count_temporary_sessions(&self, maxage: time::Timespec) -> i32;
fn remove_temporary_sessions(&self, maxage: time::Timespec, limit: Option<u32>);
fn get_search_users(
&self, _: (Option<i32>, Option<String>, Option<String>, Option<String>, Option<String>, Option<String>))
-> Result<Vec<(i32, Option<String>, Option<String>, Option<String>, Option<String>, Option<String>)>,
Vec<(i32, String, String, String)>>;
fn get_debug_information(&self) -> String;
fn reset_all_contest_visibilities(&self);
fn reset_all_taskgroup_visibilities(&self);
}
pub trait MedalObject<T: MedalConnection> {
fn save(&mut self, conn: &T);
}