From 2f924d875cf9653f189974645756924cb3955893 Mon Sep 17 00:00:00 2001 From: Araozu Date: Wed, 4 Oct 2023 16:54:25 -0500 Subject: [PATCH] [Classroom][BE] Code for course enrollment --- backend/src/controller/classroom/mod.rs | 12 ++++++- backend/src/main.rs | 1 + backend/src/model/classroom_user.rs | 6 ++++ backend/src/online_classroom/mod.rs | 1 + .../src/online_classroom/register_course.rs | 33 +++++++++++++++++++ backend/src/online_classroom/session.rs | 30 ++++++++++++++++- 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 backend/src/online_classroom/register_course.rs diff --git a/backend/src/controller/classroom/mod.rs b/backend/src/controller/classroom/mod.rs index 8d455e2..0aa37ce 100644 --- a/backend/src/controller/classroom/mod.rs +++ b/backend/src/controller/classroom/mod.rs @@ -1,9 +1,10 @@ use crate::{ json_result::JsonResult, - model::classroom_user::ClassroomPersonCreate, + model::classroom_user::{ClassroomPersonCreate, ClassroomCourseRegistration}, online_classroom::{create_user::create, get_courses::ClassroomCourse}, }; use rocket::{http::Status, serde::json::Json}; +use crate::online_classroom::register_course::register_course; #[options("/classroom/user")] pub fn create_user_options() -> Status { @@ -25,3 +26,12 @@ pub async fn get_courses(user_id: i32) -> (Status, Json return (Status::InternalServerError, JsonResult::err(err)), } } + + +#[post("/classroom/course/", format = "json", data = "")] +pub async fn register_course_contr(user_id: i32, data: Json) -> (Status, Json>) { + match register_course(user_id, &data.surname_first_letter, &data.courses).await { + Ok(()) => return (Status::Ok, JsonResult::ok(())), + Err(err) => return (Status::InternalServerError, JsonResult::err(err)), + } +} diff --git a/backend/src/main.rs b/backend/src/main.rs index 06df1db..23c4f9d 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -62,6 +62,7 @@ async fn rocket() -> _ { controller::classroom::create_user_options, controller::classroom::create_user, controller::classroom::get_courses, + controller::classroom::register_course_contr, ], ) } diff --git a/backend/src/model/classroom_user.rs b/backend/src/model/classroom_user.rs index a1f2318..1552761 100644 --- a/backend/src/model/classroom_user.rs +++ b/backend/src/model/classroom_user.rs @@ -18,3 +18,9 @@ pub struct ClassroomPersonCreate { pub person_username: String, pub person_password: String, } + +#[derive(Debug, Deserialize)] +pub struct ClassroomCourseRegistration { + pub surname_first_letter: String, + pub courses: Vec, +} diff --git a/backend/src/online_classroom/mod.rs b/backend/src/online_classroom/mod.rs index eaf70c7..30f8b8f 100644 --- a/backend/src/online_classroom/mod.rs +++ b/backend/src/online_classroom/mod.rs @@ -6,6 +6,7 @@ use self::session::ensure_session; pub mod create_user; pub mod get_courses; +pub mod register_course; mod session; pub mod user; diff --git a/backend/src/online_classroom/register_course.rs b/backend/src/online_classroom/register_course.rs new file mode 100644 index 0000000..2b095dd --- /dev/null +++ b/backend/src/online_classroom/register_course.rs @@ -0,0 +1,33 @@ +use scraper::{Html, Selector}; + +pub async fn register_course( + user_id: i32, + surname_first_letter: &String, + courses: &Vec, +) -> Result<(), String> { + let courses_uri = courses + .iter() + .map(|course| format!("CourseList%5B%5D={}", course)) + .collect::>() + .join("&"); + + let request_body = format!( + "form_sent=1&firstLetterUser={}&firstLetterCourse=&UserList%5B%5D={}&{}", + surname_first_letter, user_id, courses_uri + ); + + let response_html = super::session::register_courses_request( + "/main/admin/subscribe_user2course.php".into(), + request_body, + ) + .await?; + + let success_selector = Selector::parse(".alert.alert-success").unwrap(); + + let fragment = Html::parse_document(&response_html); + + match fragment.select(&success_selector).next() { + Some(_) => Ok(()), + None => Err("Error registrando curso".into()), + } +} diff --git a/backend/src/online_classroom/session.rs b/backend/src/online_classroom/session.rs index f87100b..76c9fc2 100644 --- a/backend/src/online_classroom/session.rs +++ b/backend/src/online_classroom/session.rs @@ -64,7 +64,7 @@ pub async fn create_user_request(url: String, body: String) -> Result Result Result { + let classroom_url = std::env::var("CLASSROOM_URL").expect("CLASSROOM_URL env var is not set!"); + + ensure_session().await?; + + // Get the stored client + let jar = SESSION_COOKIE.read().unwrap().jar.clone(); + + let uri = format!("{}{}", classroom_url, url); + + let response = Request::post(uri) + .header("Content-Type", "application/x-www-form-urlencoded") + .cookie_jar(jar) + .body(body) + .or_else(|err| Err(format!("Error creating request: {:?}", err)))? + .send(); + + let mut response = match response { + Ok(r) => r, + Err(err) => return Err(format!("Error sending request: {:?}", err)), + }; + + match response.text() { + Ok(t) => Ok(t), + Err(err) => Err(format!("Error getting text from response: {:?}", err)), + } +} + /// Makes sure that the session cookie is set, and that it is valid pub async fn ensure_session() -> Result<(), String> { let last_usage_time = SESSION_TIME.read().unwrap().clone();