Add sql transactions
This commit is contained in:
parent
455ca50695
commit
9823511b62
9 changed files with 171 additions and 138 deletions
src/handlers/v1
|
@ -14,12 +14,13 @@ use crate::app_state::AppState;
|
|||
|
||||
#[get("/relays")]
|
||||
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_relays = DbRelay::get_all(&mut pool_conn).await?;
|
||||
let db_relays = DbRelay::get_all(&mut tx).await?;
|
||||
|
||||
let relays: Vec<Relay> = convert_db_list(&mut pool_conn, db_relays)?;
|
||||
let relays: Vec<Relay> = convert_db_list(&mut tx, db_relays)?;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().json(relays))
|
||||
}
|
||||
|
||||
|
@ -28,16 +29,17 @@ pub async fn tagged(
|
|||
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 (tag,) = path.into_inner();
|
||||
let tag_db = DbTag::get_by_tag(&mut pool_conn, &tag)
|
||||
let tag_db = DbTag::get_by_tag(&mut tx, &tag)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let db_relays = DbRelay::get_by_tag(&mut pool_conn, &tag_db).await?;
|
||||
let relays: Vec<Relay> = convert_db_list(&mut pool_conn, db_relays)?;
|
||||
let db_relays = DbRelay::get_by_tag(&mut tx, &tag_db).await?;
|
||||
let relays: Vec<Relay> = convert_db_list(&mut tx, db_relays)?;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().json(relays))
|
||||
}
|
||||
|
||||
|
@ -46,18 +48,20 @@ pub async fn index_for_controller(
|
|||
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 (controller_uid,) = path.into_inner();
|
||||
let uid = EmgauwaUid::try_from(controller_uid.as_str())?;
|
||||
|
||||
let controller = DbController::get_by_uid(&mut pool_conn, &uid)
|
||||
let controller = DbController::get_by_uid(&mut tx, &uid)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let db_relays = controller.get_relays(&mut pool_conn).await?;
|
||||
let db_relays = controller.get_relays(&mut tx).await?;
|
||||
|
||||
let relays: Vec<Relay> = convert_db_list(&mut pool_conn, db_relays)?;
|
||||
let relays: Vec<Relay> = convert_db_list(&mut tx, db_relays)?;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().json(relays))
|
||||
}
|
||||
|
||||
|
@ -66,20 +70,22 @@ pub async fn show_for_controller(
|
|||
pool: web::Data<Pool<Sqlite>>,
|
||||
path: web::Path<(String, i64)>,
|
||||
) -> Result<HttpResponse, EmgauwaError> {
|
||||
let mut pool_conn = pool.acquire().await?;
|
||||
let mut tx = pool.begin().await?;
|
||||
|
||||
let (controller_uid, relay_num) = path.into_inner();
|
||||
let uid = EmgauwaUid::try_from(controller_uid.as_str())?;
|
||||
|
||||
let controller = DbController::get_by_uid(&mut pool_conn, &uid)
|
||||
let controller = DbController::get_by_uid(&mut tx, &uid)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let relay = DbRelay::get_by_controller_and_num(&mut pool_conn, &controller, relay_num)
|
||||
let relay = DbRelay::get_by_controller_and_num(&mut tx, &controller, relay_num)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let return_relay = Relay::from_db_model(&mut pool_conn, relay)?;
|
||||
let return_relay = Relay::from_db_model(&mut tx, relay)?;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().json(return_relay))
|
||||
}
|
||||
|
||||
|
@ -90,32 +96,32 @@ pub async fn update_for_controller(
|
|||
path: web::Path<(String, i64)>,
|
||||
data: web::Json<RequestRelayUpdate>,
|
||||
) -> Result<HttpResponse, EmgauwaError> {
|
||||
let mut pool_conn = pool.acquire().await?;
|
||||
let mut tx = pool.begin().await?;
|
||||
|
||||
let (controller_uid, relay_num) = path.into_inner();
|
||||
let uid = EmgauwaUid::try_from(controller_uid.as_str())?;
|
||||
|
||||
let controller = DbController::get_by_uid(&mut pool_conn, &uid)
|
||||
let controller = DbController::get_by_uid(&mut tx, &uid)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let mut relay = DbRelay::get_by_controller_and_num(&mut pool_conn, &controller, relay_num)
|
||||
let mut relay = DbRelay::get_by_controller_and_num(&mut tx, &controller, relay_num)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
if let Some(name) = &data.name {
|
||||
relay = relay.update(&mut pool_conn, name.as_str()).await?;
|
||||
relay = relay.update(&mut tx, name.as_str()).await?;
|
||||
}
|
||||
|
||||
if let Some(schedule_uids) = &data.schedules {
|
||||
if schedule_uids.len() == 7 {
|
||||
let mut schedules = Vec::new();
|
||||
for s_uid in schedule_uids {
|
||||
schedules.push(s_uid.get_schedule(&mut pool_conn).await?);
|
||||
schedules.push(s_uid.get_schedule(&mut tx).await?);
|
||||
}
|
||||
|
||||
DbJunctionRelaySchedule::set_schedules(
|
||||
&mut pool_conn,
|
||||
&mut tx,
|
||||
&relay,
|
||||
schedules.iter().collect(),
|
||||
)
|
||||
|
@ -124,9 +130,9 @@ pub async fn update_for_controller(
|
|||
}
|
||||
|
||||
if let Some(s_uid) = &data.active_schedule {
|
||||
let schedule = s_uid.get_schedule(&mut pool_conn).await?;
|
||||
let schedule = s_uid.get_schedule(&mut tx).await?;
|
||||
DbJunctionRelaySchedule::set_schedule(
|
||||
&mut pool_conn,
|
||||
&mut tx,
|
||||
&relay,
|
||||
&schedule,
|
||||
utils::get_weekday(),
|
||||
|
@ -135,12 +141,12 @@ pub async fn update_for_controller(
|
|||
}
|
||||
|
||||
if let Some(tags) = &data.tags {
|
||||
relay.set_tags(&mut pool_conn, tags.as_slice()).await?;
|
||||
relay.set_tags(&mut tx, tags.as_slice()).await?;
|
||||
}
|
||||
|
||||
let relay = relay.reload(&mut pool_conn).await?;
|
||||
let relay = relay.reload(&mut tx).await?;
|
||||
|
||||
let return_relay = Relay::from_db_model(&mut pool_conn, relay)?;
|
||||
let return_relay = Relay::from_db_model(&mut tx, relay)?;
|
||||
|
||||
app_state
|
||||
.send(app_state::Action {
|
||||
|
@ -149,6 +155,7 @@ pub async fn update_for_controller(
|
|||
})
|
||||
.await??;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().json(return_relay))
|
||||
}
|
||||
|
||||
|
@ -159,16 +166,16 @@ pub async fn pulse(
|
|||
path: web::Path<(String, i64)>,
|
||||
data: web::Json<RequestRelayPulse>,
|
||||
) -> Result<HttpResponse, EmgauwaError> {
|
||||
let mut pool_conn = pool.acquire().await?;
|
||||
let mut tx = pool.begin().await?;
|
||||
|
||||
let (controller_uid, relay_num) = path.into_inner();
|
||||
let uid = EmgauwaUid::try_from(controller_uid.as_str())?;
|
||||
|
||||
let controller = DbController::get_by_uid(&mut pool_conn, &uid)
|
||||
let controller = DbController::get_by_uid(&mut tx, &uid)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
let relay = DbRelay::get_by_controller_and_num(&mut pool_conn, &controller, relay_num)
|
||||
let relay = DbRelay::get_by_controller_and_num(&mut tx, &controller, relay_num)
|
||||
.await?
|
||||
.ok_or(DatabaseError::NotFound)?;
|
||||
|
||||
|
@ -181,5 +188,6 @@ pub async fn pulse(
|
|||
})
|
||||
.await??;
|
||||
|
||||
tx.commit().await?;
|
||||
Ok(HttpResponse::Ok().finish()) // TODO add a message?
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue