use serde::{Deserialize, Serialize};
use snafu::{ensure, whatever};
use crate::{
errors,
errors::mycqu::MyCQUResult,
mycqu::utils::{access::get_oauth_token, mycqu_request_handler},
session::{Client, Session, access_info::MyCQUAccessInfo},
sso::access_services,
utils::{
ApiModel,
consts::{MYCQU_API_USER_URL, MYCQU_SERVICE_URL},
},
};
pub mod course;
pub mod enroll;
pub mod exam;
pub mod score;
mod utils;
#[cfg(test)]
mod tests;
pub async fn access_mycqu(client: &Client, session: &mut Session) -> MyCQUResult<()> {
ensure!(session.is_login, errors::NotLoginSnafu {});
whatever!(
access_services(client, session, MYCQU_SERVICE_URL).await,
"Unexpected SSOError happened"
);
let auth_token = get_oauth_token(client, session).await?;
session.access_infos.mycqu_access_info = Some(MyCQUAccessInfo {
auth_header: auth_token,
});
Ok(())
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub struct User {
pub name: String,
#[serde(alias = "username")]
pub id: String,
pub code: String,
#[serde(alias = "type")]
pub role: String,
pub email: Option<String>,
#[serde(alias = "phoneNumber")]
pub phone_number: Option<String>,
}
impl ApiModel for User {}
impl User {
pub async fn fetch_self(client: &Client, session: &Session) -> MyCQUResult<Self> {
let res =
mycqu_request_handler(client, session, |client| client.get(MYCQU_API_USER_URL)).await?;
Ok(res.json::<Self>().await?)
}
}