Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions src/endpoints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use axum::{
Json,
};
use futures::future::join_all;
use http::HeaderMap;
use indexmap::IndexMap;
use serde::Serialize;
use tower_sessions::Session;
Expand Down Expand Up @@ -193,11 +194,18 @@ pub struct Region {

pub async fn get_region(
session: Session,
headers: HeaderMap,
State(server_state): State<ServerState>,
OriginalUri(original_uri): OriginalUri,
Path(github_login): Path<String>,
) -> Result<Json<Region>, Error> {
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
let sheets_client = sheets_client(
&session,
server_state.clone(),
headers,
original_uri.clone(),
)
.await?;
let trainees = get_trainees(
sheets_client,
&server_state.config.github_email_mapping_sheet_id,
Expand All @@ -222,11 +230,18 @@ pub struct AttendanceResponse {

pub async fn fetch_attendance(
session: Session,
headers: HeaderMap,
State(server_state): State<ServerState>,
OriginalUri(original_uri): OriginalUri,
) -> Result<Json<AttendanceResponse>, Error> {
let all_courses = &server_state.config.courses;
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
let sheets_client = sheets_client(
&session,
server_state.clone(),
headers,
original_uri.clone(),
)
.await?;

let mut courses: CourseAttendance = BTreeMap::new();
let mut register_futures = Vec::new();
Expand Down
20 changes: 17 additions & 3 deletions src/frontend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use axum::{
response::{Html, IntoResponse, Response},
};
use futures::future::join_all;
use http::{header::CONTENT_TYPE, StatusCode, Uri};
use http::{header::CONTENT_TYPE, HeaderMap, StatusCode, Uri};
use serde::Deserialize;
use tower_sessions::Session;

Expand Down Expand Up @@ -95,11 +95,18 @@ struct CourseScheduleWithBatchMetadata {

pub async fn get_trainee_batch(
session: Session,
headers: HeaderMap,
State(server_state): State<ServerState>,
OriginalUri(original_uri): OriginalUri,
Path((course, batch_github_slug)): Path<(String, String)>,
) -> Result<Html<String>, Error> {
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
let sheets_client = sheets_client(
&session,
server_state.clone(),
headers,
original_uri.clone(),
)
.await?;
let github_org = &server_state.config.github_org;
let course_schedule = server_state
.config
Expand Down Expand Up @@ -182,11 +189,18 @@ impl TraineeBatchTemplate {

pub async fn get_reviewers(
session: Session,
headers: HeaderMap,
State(server_state): State<ServerState>,
OriginalUri(original_uri): OriginalUri,
Path(course): Path<String>,
) -> Result<Html<String>, Error> {
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
let sheets_client = sheets_client(
&session,
server_state.clone(),
headers,
original_uri.clone(),
)
.await?;
let mut is_staff = true;
let mut staff_details = get_reviewer_staff_info(
sheets_client,
Expand Down
25 changes: 20 additions & 5 deletions src/sheets.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use anyhow::Context;
use http::Uri;
use http::{HeaderMap, Uri};
use sheets::{spreadsheets::Spreadsheets, types::CellData};
use tower_sessions::Session;

Expand Down Expand Up @@ -35,12 +35,27 @@ pub(crate) fn cell_date(cell: &CellData) -> Result<chrono::NaiveDate, anyhow::Er
pub(crate) async fn sheets_client(
session: &Session,
server_state: ServerState,
headers: HeaderMap,
original_uri: Uri,
) -> Result<SheetsClient, Error> {
let maybe_token: Option<String> = session
.get(GoogleScope::Sheets.token_session_key())
.await
.context("Session load error")?;
const AUTHORIZATION_HEADER: &str = "x-authorization-google";
let maybe_token = if let Some(auth_header) = headers.get(AUTHORIZATION_HEADER) {
let token = match auth_header.to_str() {
Ok(s) => Some(s.to_string()),
Err(e) => {
return Err(Error::UserFacing(format!(
"Invalid {} header: {}",
AUTHORIZATION_HEADER, e
)))
}
};
token
} else {
session
.get(GoogleScope::Sheets.token_session_key())
.await
.context("Session load error")?
};

let redirect_endpoint = redirect_endpoint(&server_state);

Expand Down