diff --git a/src/main.rs b/src/main.rs index c3dc8f6..9dff811 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ -use derive_more::{FromStr, FromStrError}; -use rocket::State; #[macro_use] extern crate rocket; - +use derive_more::FromStr; +use derive_more::FromStrError; use rocket::request::FromParam; use rocket::response::Responder; use rocket::tokio::time::{sleep, Duration}; +use rocket::State; use rocket_dyn_templates::Template; use std::sync::OnceLock; use twba_common::init_tracing; @@ -51,8 +51,9 @@ async fn main() -> Result<(), MainError> { .mount( "/services/", routes![ - services::service, - services::service_info, + services::service_index, + services::task_edit, + services::service_edit, services::update_progress, services::increment_progress, services::increment_task_progress, diff --git a/src/services.rs b/src/services.rs index 15bedbb..e9ec8ab 100644 --- a/src/services.rs +++ b/src/services.rs @@ -1,11 +1,16 @@ use crate::DatabaseConnection; -use crate::{AvailableServices, ResponderError}; +use crate::ResponderError; +use rocket::form::Form; use rocket::State; use rocket_dyn_templates::{context, Template}; -use twba_common::prelude::twba_local_db::prelude::{Services, Tasks}; +use twba_common::prelude::twba_local_db::prelude::Services; +use twba_common::prelude::twba_local_db::prelude::ServicesModel; +use twba_common::prelude::twba_local_db::prelude::Tasks; +use twba_common::prelude::twba_local_db::prelude::TasksModel; use twba_common::prelude::twba_local_db::re_exports::sea_orm::ActiveModelTrait; use twba_common::prelude::twba_local_db::re_exports::sea_orm::ActiveValue; -use twba_common::prelude::twba_local_db::re_exports::sea_orm::{EntityTrait, IntoActiveModel}; +use twba_common::prelude::twba_local_db::re_exports::sea_orm::EntityTrait; +use twba_common::prelude::twba_local_db::re_exports::sea_orm::IntoActiveModel; async fn get_services(db: &DatabaseConnection) -> Result, ResponderError> { let mut list = vec![]; @@ -41,6 +46,11 @@ pub struct Service { last_update: String, } +#[derive(serde::Serialize, FromForm)] +pub struct IdValueForm { + id: i32, + value: T, +} #[derive(serde::Serialize)] pub struct Task { id: i32, @@ -50,12 +60,37 @@ pub struct Task { max_progress: i32, } -#[get("//info")] -pub(super) fn service_info(service: AvailableServices) -> String { - format!("Here is some info about the service: name: {service}") +#[post("/edit-service", data = "")] +pub async fn service_edit( + db: &State, + data: Form>, +) -> Result<(), ResponderError> { + let data = data.into_inner(); + let model = get_service_by_id(data.id, db.inner()).await?; + let mut model = model.into_active_model(); + let name_value: String = data.value; + model.name = ActiveValue::Set(name_value); + model.save(db.inner()).await?; + Ok(()) } +#[post("/edit-task", data = "")] +pub async fn task_edit( + db: &State, + data: Form>, +) -> Result<(), ResponderError> { + let data = data.into_inner(); + let model = get_task_by_id(data.id, db.inner()).await?; + let mut model = model.into_active_model(); + let description: String = data.value; + model.description = ActiveValue::Set(Some(description)); + model.save(db.inner()).await?; + Ok(()) +} + #[get("/")] -pub(super) async fn service(db: &State) -> Result { +pub(super) async fn service_index( + db: &State, +) -> Result { let services = get_services(db.inner()).await?; Ok(Template::render( @@ -80,6 +115,15 @@ pub async fn increment_task_progress( db: &State, ) -> Result<(), ResponderError> { let db = db.inner(); + let task = get_task_by_id(task, db).await?; + let progress = task.progress; + let mut task = task.into_active_model(); + task.progress = ActiveValue::Set(progress + 1); + task.save(db).await?; + Ok(()) +} + +async fn get_task_by_id(task: i32, db: &DatabaseConnection) -> Result { let task = Tasks::find_by_id(task) .one(db) .await? @@ -87,12 +131,9 @@ pub async fn increment_task_progress( table: "Tasks", key: format!("{task}"), })?; - let progress = task.progress; - let mut task = task.into_active_model(); - task.progress = ActiveValue::Set(progress + 1); - task.save(db).await?; - Ok(()) + Ok(task) } + #[post("//increment-progress/")] pub async fn increment_progress( service: i32, @@ -101,14 +142,7 @@ pub async fn increment_progress( ) -> Result<(), ResponderError> { let db = db_state.inner(); - let service = - Services::find_by_id(service) - .one(db) - .await? - .ok_or(ResponderError::DbEntityNotFound { - table: "Services", - key: format!("{service}"), - })?; + let service = get_service_by_id(service, db).await?; let datetime = chrono::offset::Utc::now().to_rfc3339(); @@ -120,6 +154,22 @@ pub async fn increment_progress( service.save(db).await?; Ok(()) } + +async fn get_service_by_id( + service: i32, + db: &DatabaseConnection, +) -> Result { + let service = + Services::find_by_id(service) + .one(db) + .await? + .ok_or(ResponderError::DbEntityNotFound { + table: "Services", + key: format!("{service}"), + })?; + Ok(service) +} + #[get("/update_progress")] pub async fn update_progress(db: &State) -> Result { let services = get_services(db.inner()).await?; diff --git a/templates/services-overview.html.tera b/templates/services-overview.html.tera index 8c53c64..e0e356c 100644 --- a/templates/services-overview.html.tera +++ b/templates/services-overview.html.tera @@ -5,6 +5,7 @@ Services and Tasks +
@@ -13,14 +14,62 @@
+ + +
hi
+ +