Skip to content

Commit

Permalink
add post route to timetable for service workers
Browse files Browse the repository at this point in the history
Sxyntheon committed Jun 22, 2024
1 parent ba697e6 commit 4d1a2e2
Showing 3 changed files with 125 additions and 2 deletions.
120 changes: 120 additions & 0 deletions backend/src/api/get_timetable_serviceworker.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
use actix_identity::Identity;
use actix_web::{web::{self}, Responder, Result};
use log::{debug, error};
use serde::{Deserialize, Serialize};
use surrealdb::sql::Thing;

use crate::{
api::response::Response, api_wrapper::{
untis_client::UntisClient, utils::{FormattedLesson, TimetableParameter}
}, models::{
model::{DBConnection, CRUD}, user_model::User
}, prelude::Error, utils::time::{format_for_untis, get_this_friday, get_this_monday}, GlobalUntisData
};

#[derive(Serialize)]
struct TimetableResponse {
lessons: Vec<FormattedLesson>,
}

#[derive(Deserialize)]
pub struct TimetableQuery {
from: Option<String>,
until: Option<String>,
}

#[derive(Deserialize)]
pub struct ServiceWorkerQuery {
jsessionid: Option<String>,
}

pub async fn get_timetable_serviceworker(
id: Option<Identity>, query: web::Query<TimetableQuery>, data: web::Json<ServiceWorkerQuery>, untis_data: web::Data<GlobalUntisData>,
db: web::Data<DBConnection>,
) -> Result<impl Responder> {
if id.is_none() {
return Ok(web::Json(Response::new_error(403, "Not logged in".to_string())));
}

let jsessionid = match data.jsessionid.clone() {
Some(session_cookie) => session_cookie,
None => return Ok(Response::new_error(403, "No JSESSIONID provided".to_string()).into()),
};

let pot_user: Option<User> = User::get_from_id(
db.clone(),
match id.unwrap().id() {
Ok(i) => {
let split = i.split_once(':');
if split.is_some() {
Thing::from(split.unwrap())
} else {
error!("ID in session_cookie is wrong???");
return Ok(Response::new_error(500, "There was an error trying to get your id".to_string()).into());
}
}
Err(e) => {
error!("Error getting Identity id\n{e}");
return Ok(Response::new_error(500, "There was an error trying to get your id".to_string()).into());
}
},
)
.await?;

let user = match pot_user {
Some(u) => u,
None => {
debug!("Deleted(?) User tried to log in with old session token");
return Ok(Response::new_error(404, "This account doesn't exist!".to_string()).into());
}
};

if !user.verified {
return Ok(Response::new_error(
403,
"Account not verified! Check your E-Mails for a verification link".to_string(),
)
.into());
}

let untis = match UntisClient::unsafe_init(
jsessionid,
user.person_id.try_into().expect("the database to not store numbers bigger than u16"),
5,
"the-schedule".into(),
untis_data.school.clone(),
untis_data.subdomain.clone(),
db,
)
.await
{
Ok(u) => u,
Err(e) => {
if let Error::Reqwest(_) = e {
return Ok(Response::new_error(400, "You done fucked up".into()).into());
} else if let Error::UntisError(body) = e {
return Ok(Response::new_error(500, "Untis done fucked up ".to_string() + &body).into());
}
else {
return Ok(Response::new_error(500, "Some mysterious guy done fucked up".into()).into());
}
}
};

let from = match query.from.clone() {
Some(from) => from,
None => format_for_untis(get_this_monday()),
};
let until = match query.until.clone() {
Some(until) => until,
None => format_for_untis(get_this_friday()),
};

let timetable = match untis.clone().get_timetable(TimetableParameter::default(untis, from, until)).await {
Ok(timetable) => timetable,
Err(err) => {
return Ok(Response::new_error(500, "Untis done fucked up ".to_string() + &err.to_string()).into());
}
};
Ok(Response::new_success(TimetableResponse { lessons: timetable }).into())
}
3 changes: 2 additions & 1 deletion backend/src/api/mod.rs
Original file line number Diff line number Diff line change
@@ -15,4 +15,5 @@ pub mod logout_all;
pub mod register;
pub mod resend_mail;
pub mod response;
pub mod verified;
pub mod verified;
pub mod get_timetable_serviceworker;
4 changes: 3 additions & 1 deletion backend/src/main.rs
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ mod models;
mod prelude;
mod utils;

use crate::get_timetable_serviceworker::get_timetable_serviceworker;
use std::{
collections::HashMap, env, fs, io::{self, BufReader}
};
@@ -26,7 +27,7 @@ use actix_web::{
cookie::{time::Duration, Key}, middleware::Logger, web::{self, Data}, App, HttpResponse, HttpServer
};
use api::{
change_email::change_email_get, change_password::change_password_post, change_untis_data::change_untis_data_post, check_session::check_session_get, delete::delete_post, forgot_password::forgot_password_post, gdpr_data_compliance::gdpr_data_compliance_get, get_lernbueros::get_lernbueros, get_timetable::get_timetable, get_free_rooms::get_free_rooms, link::{
change_email::change_email_get, change_password::change_password_post, change_untis_data::change_untis_data_post, check_session::check_session_get, delete::delete_post, forgot_password::forgot_password_post, gdpr_data_compliance::gdpr_data_compliance_get, get_lernbueros::get_lernbueros, get_timetable::get_timetable, get_timetable_serviceworker, link::{
check_uuid::check_uuid_get, email_change::email_change_post, email_reset::email_reset_post, password::reset_password_post, verify::verify_get
}, login::login_post, logout::logout_post, logout_all::logout_all_post, register::register_post, resend_mail::resend_mail_get, verified::verified_get
};
@@ -206,6 +207,7 @@ async fn main() -> io::Result<()> {
.service(web::resource("/delete").route(web::post().to(delete_post)))
.service(web::resource("/check_session").route(web::get().to(check_session_get)))
.service(web::resource("/get_timetable").route(web::get().to(get_timetable)))
.service(web::resource("/get_timetable_serviceworker").route(web::post().to(get_timetable_serviceworker)))
.service(web::resource("/get_lernbueros").route(web::get().to(get_lernbueros)))
.service(web::resource("/get_free_rooms").route(web::get().to(get_free_rooms)))
.service(web::resource("/change_email").route(web::get().to(change_email_get)))

0 comments on commit 4d1a2e2

Please sign in to comment.