| 134 | } |
| 135 | |
| 136 | async fn list_devices( |
| 137 | &self, |
| 138 | request: Request<api::ListRelayDevicesRequest>, |
| 139 | ) -> Result<Response<api::ListRelayDevicesResponse>, Status> { |
| 140 | let req = request.get_ref(); |
| 141 | let relay_dev_eui = EUI64::from_str(&req.relay_dev_eui).map_err(|e| e.status())?; |
| 142 | |
| 143 | self.validator |
| 144 | .validate( |
| 145 | request.extensions(), |
| 146 | validator::ValidateDeviceAccess::new(validator::Flag::Read, relay_dev_eui), |
| 147 | ) |
| 148 | .await?; |
| 149 | |
| 150 | let filters = relay::DeviceFilters { |
| 151 | relay_dev_eui: Some(relay_dev_eui), |
| 152 | }; |
| 153 | |
| 154 | let count = relay::get_device_count(&filters) |
| 155 | .await |
| 156 | .map_err(|e| e.status())?; |
| 157 | let items = relay::list_devices(req.limit as i64, req.offset as i64, &filters) |
| 158 | .await |
| 159 | .map_err(|e| e.status())?; |
| 160 | |
| 161 | let mut resp = Response::new(api::ListRelayDevicesResponse { |
| 162 | total_count: count as u32, |
| 163 | result: items |
| 164 | .iter() |
| 165 | .map(|d| api::RelayDeviceListItem { |
| 166 | dev_eui: d.dev_eui.to_string(), |
| 167 | name: d.name.clone(), |
| 168 | created_at: Some(helpers::datetime_to_prost_timestamp(&d.created_at)), |
| 169 | }) |
| 170 | .collect(), |
| 171 | }); |
| 172 | |
| 173 | resp.metadata_mut() |
| 174 | .insert("x-log-relay_dev_eui", req.relay_dev_eui.parse().unwrap()); |
| 175 | Ok(resp) |
| 176 | } |
| 177 | } |
| 178 | |
| 179 | #[cfg(test)] |