Add get_ and update_device to fuota storage + add return_msg.

The return_msg (text) field can be used to capture errors, e.g. when the
end-device failed to setup the multicast-group.
This commit is contained in:
Orne Brocaar 2025-02-19 09:34:17 +00:00
parent e75b62f335
commit b1e6c97942
5 changed files with 46 additions and 3 deletions

View File

@ -31,11 +31,11 @@ create table fuota_deployment_device (
dev_eui bytea not null references device on delete cascade,
created_at timestamp with time zone not null,
updated_at timestamp with time zone not null,
mc_group_setup_completed_at timestamp with time zone null,
mc_session_completed_at timestamp with time zone null,
frag_session_setup_completed_at timestamp with time zone null,
frag_status_completed_at timestamp with time zone null,
return_msg text not null,
primary key (fuota_deployment_id, dev_eui)
);

View File

@ -31,11 +31,11 @@ create table fuota_deployment_device (
dev_eui blob not null references device on delete cascade,
created_at datetime not null,
updated_at datetime not null,
mc_group_setup_completed_at datetime null,
mc_session_completed_at datetime null,
frag_session_setup_completed_at datetime null,
frag_status_completed_at datetime null,
return_msg text not null,
primary key (fuota_deployment_id, dev_eui)
);

View File

@ -101,6 +101,7 @@ pub struct FuotaDeploymentDevice {
pub mc_session_completed_at: Option<DateTime<Utc>>,
pub frag_session_setup_completed_at: Option<DateTime<Utc>>,
pub frag_status_completed_at: Option<DateTime<Utc>>,
pub return_msg: String,
}
impl Default for FuotaDeploymentDevice {
@ -116,6 +117,7 @@ impl Default for FuotaDeploymentDevice {
mc_session_completed_at: None,
frag_session_setup_completed_at: None,
frag_status_completed_at: None,
return_msg: "".into(),
}
}
}
@ -304,7 +306,7 @@ pub async fn add_devices(fuota_deployment_id: Uuid, dev_euis: Vec<EUI64>) -> Res
let res = diesel::insert_into(fuota_deployment_device::table)
.values(&FuotaDeploymentDevice {
fuota_deployment_id: fuota_deployment_id.into(),
dev_eui: dev_eui,
dev_eui,
..Default::default()
})
.execute(&mut get_async_db_conn().await?)
@ -349,6 +351,39 @@ pub async fn get_devices(
.map_err(|e| Error::from_diesel(e, "".into()))
}
pub async fn get_device(
fuota_deployment_id: Uuid,
dev_eui: EUI64,
) -> Result<FuotaDeploymentDevice, Error> {
fuota_deployment_device::dsl::fuota_deployment_device
.find((&fields::Uuid::from(fuota_deployment_id), &dev_eui))
.first(&mut get_async_db_conn().await?)
.await
.map_err(|e| Error::from_diesel(e, dev_eui.to_string()))
}
pub async fn update_device(d: FuotaDeploymentDevice) -> Result<FuotaDeploymentDevice, Error> {
let d: FuotaDeploymentDevice = diesel::update(
fuota_deployment_device::dsl::fuota_deployment_device
.find((&d.fuota_deployment_id, &d.dev_eui)),
)
.set((
fuota_deployment_device::updated_at.eq(Utc::now()),
fuota_deployment_device::mc_group_setup_completed_at.eq(&d.mc_group_setup_completed_at),
fuota_deployment_device::mc_session_completed_at.eq(&d.mc_session_completed_at),
fuota_deployment_device::frag_session_setup_completed_at
.eq(&d.frag_session_setup_completed_at),
fuota_deployment_device::frag_status_completed_at.eq(&d.frag_status_completed_at),
fuota_deployment_device::return_msg.eq(&d.return_msg),
))
.get_result(&mut get_async_db_conn().await?)
.await
.map_err(|e| Error::from_diesel(e, d.dev_eui.to_string()))?;
info!(fuota_deployment_id = %d.fuota_deployment_id, dev_eui = %d.dev_eui, "FUOTA deployment device updated");
Ok(d)
}
pub async fn remove_devices(fuota_deployment_id: Uuid, dev_euis: Vec<EUI64>) -> Result<(), Error> {
diesel::delete(
fuota_deployment_device::table
@ -842,6 +877,12 @@ mod test {
assert_eq!(dev.dev_eui, devices[0].dev_eui);
assert_eq!(d.id, devices[0].fuota_deployment_id);
// get device
let mut fuota_d = get_device(d.id.into(), dev.dev_eui).await.unwrap();
fuota_d.return_msg = "Error: kaboom".into();
let fuota_d = update_device(fuota_d).await.unwrap();
assert_eq!("Error: kaboom", fuota_d.return_msg);
// remove devices
remove_devices(d.id.into(), vec![dev.dev_eui])
.await

View File

@ -226,6 +226,7 @@ diesel::table! {
mc_session_completed_at -> Nullable<Timestamptz>,
frag_session_setup_completed_at -> Nullable<Timestamptz>,
frag_status_completed_at -> Nullable<Timestamptz>,
return_msg -> Text,
}
}

View File

@ -202,6 +202,7 @@ diesel::table! {
mc_session_completed_at -> Nullable<TimestamptzSqlite>,
frag_session_setup_completed_at -> Nullable<TimestamptzSqlite>,
frag_status_completed_at -> Nullable<TimestamptzSqlite>,
return_msg -> Text,
}
}