| 289 | } |
| 290 | |
| 291 | pub async fn add_device(group_id: &Uuid, dev_eui: &EUI64) -> Result<(), Error> { |
| 292 | let mut c = get_async_db_conn().await?; |
| 293 | c.transaction::<(), Error, _>(async |c| { |
| 294 | let device_query = device::dsl::device.find(&dev_eui); |
| 295 | #[cfg(feature = "postgres")] |
| 296 | let device_query = device_query.for_update(); |
| 297 | let d: super::device::Device = device_query |
| 298 | .get_result(c) |
| 299 | .await |
| 300 | .map_err(|e| Error::from_diesel(e, dev_eui.to_string()))?; |
| 301 | |
| 302 | let fields_group_id = fields::Uuid::from(group_id); |
| 303 | |
| 304 | let multicast_group_query = multicast_group::dsl::multicast_group.find(&fields_group_id); |
| 305 | #[cfg(feature = "postgres")] |
| 306 | let multicast_group_query = multicast_group_query.for_update(); |
| 307 | let mg: MulticastGroup = multicast_group_query |
| 308 | .get_result(c) |
| 309 | .await |
| 310 | .map_err(|e| Error::from_diesel(e, group_id.to_string()))?; |
| 311 | |
| 312 | if d.application_id != mg.application_id { |
| 313 | // Device not found within the same application. |
| 314 | return Err(Error::NotFound(dev_eui.to_string())); |
| 315 | } |
| 316 | |
| 317 | let _ = diesel::insert_into(multicast_group_device::table) |
| 318 | .values(( |
| 319 | multicast_group_device::multicast_group_id.eq(&fields_group_id), |
| 320 | multicast_group_device::dev_eui.eq(&dev_eui), |
| 321 | multicast_group_device::created_at.eq(Utc::now()), |
| 322 | )) |
| 323 | .execute(c) |
| 324 | .await |
| 325 | .map_err(|e| Error::from_diesel(e, "".into()))?; |
| 326 | Ok(()) |
| 327 | }) |
| 328 | .await?; |
| 329 | info!(multicast_group_id = %group_id, dev_eui = %dev_eui, "Device added to multicast-group"); |
| 330 | Ok(()) |
| 331 | } |
| 332 | |
| 333 | pub async fn remove_device(group_id: &Uuid, dev_eui: &EUI64) -> Result<(), Error> { |
| 334 | let ra = diesel::delete( |