| 688 | } |
| 689 | |
| 690 | async fn get_random_dev_addr( |
| 691 | &self, |
| 692 | request: Request<api::GetRandomDevAddrRequest>, |
| 693 | ) -> Result<Response<api::GetRandomDevAddrResponse>, Status> { |
| 694 | let req = request.get_ref(); |
| 695 | |
| 696 | let dev_eui = if !req.dev_eui.is_empty() { |
| 697 | Some(EUI64::from_str(&req.dev_eui).map_err(|e| e.status())?) |
| 698 | } else { |
| 699 | None |
| 700 | }; |
| 701 | |
| 702 | let tenant_id = if !req.tenant_id.is_empty() { |
| 703 | Some(Uuid::from_str(&req.tenant_id).map_err(|e| e.status())?) |
| 704 | } else { |
| 705 | None |
| 706 | }; |
| 707 | |
| 708 | let t = if let Some(dev_eui) = dev_eui { |
| 709 | self.validator |
| 710 | .validate( |
| 711 | request.extensions(), |
| 712 | validator::ValidateDeviceAccess::new(validator::Flag::Read, dev_eui), |
| 713 | ) |
| 714 | .await?; |
| 715 | |
| 716 | tenant::get_for_dev_eui(dev_eui) |
| 717 | .await |
| 718 | .map_err(|e| e.status())? |
| 719 | } else if let Some(tenant_id) = tenant_id { |
| 720 | self.validator |
| 721 | .validate( |
| 722 | request.extensions(), |
| 723 | validator::ValidateTenantAccess::new(validator::Flag::Read, tenant_id), |
| 724 | ) |
| 725 | .await?; |
| 726 | |
| 727 | tenant::get(&tenant_id).await.map_err(|e| e.status())? |
| 728 | } else { |
| 729 | return Err(Status::invalid_argument( |
| 730 | "either dev_addr or tenant_id must be set", |
| 731 | )); |
| 732 | }; |
| 733 | |
| 734 | Ok(Response::new(api::GetRandomDevAddrResponse { |
| 735 | dev_addr: get_random_dev_addr(&t.get_dev_addr_prefixes()).to_string(), |
| 736 | })) |
| 737 | } |
| 738 | |
| 739 | async fn get_metrics( |
| 740 | &self, |