Add sql transactions

This commit is contained in:
Tobias Reisinger 2024-05-02 13:30:14 +02:00
parent 455ca50695
commit 9823511b62
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
9 changed files with 171 additions and 138 deletions
src/handlers/v1

View file

@ -14,11 +14,12 @@ use crate::app_state::AppState;
#[get("/macros")]
pub async fn index(pool: web::Data<Pool<Sqlite>>) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let db_macros = DbMacro::get_all(&mut pool_conn).await?;
let macros: Vec<Macro> = convert_db_list(&mut pool_conn, db_macros)?;
let db_macros = DbMacro::get_all(&mut tx).await?;
let macros: Vec<Macro> = convert_db_list(&mut tx, db_macros)?;
tx.commit().await?;
Ok(HttpResponse::Ok().json(macros))
}
@ -27,16 +28,18 @@ pub async fn show(
pool: web::Data<Pool<Sqlite>>,
path: web::Path<(String,)>,
) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let (macro_uid,) = path.into_inner();
let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
let db_macro = DbMacro::get_by_uid(&mut tx, &uid)
.await?
.ok_or(DatabaseError::NotFound)?;
let return_macro = Macro::from_db_model(&mut pool_conn, db_macro)?;
let return_macro = Macro::from_db_model(&mut tx, db_macro)?;
tx.commit().await?;
Ok(HttpResponse::Ok().json(return_macro))
}
@ -45,15 +48,17 @@ pub async fn add(
pool: web::Data<Pool<Sqlite>>,
data: web::Json<RequestMacroCreate>,
) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let new_macro = DbMacro::create(&mut pool_conn, EmgauwaUid::default(), &data.name).await?;
let new_macro = DbMacro::create(&mut tx, EmgauwaUid::default(), &data.name).await?;
new_macro
.set_actions(&mut pool_conn, data.actions.as_slice())
.set_actions(&mut tx, data.actions.as_slice())
.await?;
let return_macro = Macro::from_db_model(&mut pool_conn, new_macro)?;
let return_macro = Macro::from_db_model(&mut tx, new_macro)?;
tx.commit().await?;
Ok(HttpResponse::Created().json(return_macro))
}
@ -63,26 +68,28 @@ pub async fn update(
path: web::Path<(String,)>,
data: web::Json<RequestMacroUpdate>,
) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let (macro_uid,) = path.into_inner();
let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
let db_macro = DbMacro::get_by_uid(&mut tx, &uid)
.await?
.ok_or(DatabaseError::NotFound)?;
if let Some(name) = &data.name {
db_macro.update(&mut pool_conn, name).await?;
db_macro.update(&mut tx, name).await?;
}
if let Some(actions) = &data.actions {
db_macro
.set_actions(&mut pool_conn, actions.as_slice())
.set_actions(&mut tx, actions.as_slice())
.await?;
}
let return_macro = Macro::from_db_model(&mut pool_conn, db_macro)?;
let return_macro = Macro::from_db_model(&mut tx, db_macro)?;
tx.commit().await?;
Ok(HttpResponse::Ok().json(return_macro))
}
@ -91,12 +98,14 @@ pub async fn delete(
pool: web::Data<Pool<Sqlite>>,
path: web::Path<(String,)>,
) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let (macro_uid,) = path.into_inner();
let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
DbMacro::delete_by_uid(&mut pool_conn, uid).await?;
DbMacro::delete_by_uid(&mut tx, uid).await?;
tx.commit().await?;
Ok(HttpResponse::Ok().json("macro got deleted"))
}
@ -107,27 +116,27 @@ pub async fn execute(
path: web::Path<(String,)>,
query: web::Query<RequestMacroExecute>,
) -> Result<HttpResponse, EmgauwaError> {
let mut pool_conn = pool.acquire().await?;
let mut tx = pool.begin().await?;
let (macro_uid,) = path.into_inner();
let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
let db_macro = DbMacro::get_by_uid(&mut tx, &uid)
.await?
.ok_or(DatabaseError::NotFound)?;
let actions_db = match query.weekday {
None => db_macro.get_actions(&mut pool_conn).await?,
None => db_macro.get_actions(&mut tx).await?,
Some(weekday) => {
db_macro
.get_actions_weekday(&mut pool_conn, weekday)
.get_actions_weekday(&mut tx, weekday)
.await?
}
};
let mut actions: Vec<MacroAction> = convert_db_list(&mut pool_conn, actions_db)?;
let mut actions: Vec<MacroAction> = convert_db_list(&mut tx, actions_db)?;
for action in &actions {
action.execute(&mut pool_conn).await?;
action.execute(&mut tx).await?;
}
let affected_controller_uids: Vec<EmgauwaUid> = actions
@ -144,7 +153,7 @@ pub async fn execute(
if affected_relay_ids.contains(&action.relay.r.id) {
continue;
}
action.relay.reload(&mut pool_conn)?;
action.relay.reload(&mut tx)?;
affected_relays.push(action.relay.clone());
affected_relay_ids.push(action.relay.r.id);
}
@ -157,5 +166,6 @@ pub async fn execute(
.await??;
}
tx.commit().await?;
Ok(HttpResponse::Ok().finish()) // TODO add a message?
}