| 300 | } |
| 301 | |
| 302 | async fn get_by_profile_id( |
| 303 | &self, |
| 304 | request: Request<api::GetDeviceProfileByProfileIdRequest>, |
| 305 | ) -> Result<Response<api::GetDeviceProfileByProfileIdResponse>, Status> { |
| 306 | let req = request.get_ref(); |
| 307 | |
| 308 | self.validator |
| 309 | .validate( |
| 310 | request.extensions(), |
| 311 | validator::ValidateDeviceProfilesAccess::new(validator::Flag::List, None, true), |
| 312 | ) |
| 313 | .await?; |
| 314 | |
| 315 | let dp = |
| 316 | device_profile::get_by_profile_id(req.vendor_id as i32, req.vendor_profile_id as i32) |
| 317 | .await |
| 318 | .map_err(|e| e.status())?; |
| 319 | let abp_params = dp.abp_params.clone().unwrap_or_default(); |
| 320 | let class_b_params = dp.class_b_params.clone().unwrap_or_default(); |
| 321 | let class_c_params = dp.class_c_params.clone().unwrap_or_default(); |
| 322 | let relay_params = dp.relay_params.clone().unwrap_or_default(); |
| 323 | |
| 324 | let mut resp = Response::new(api::GetDeviceProfileByProfileIdResponse { |
| 325 | device_profile: Some(api::DeviceProfile { |
| 326 | id: dp.id.to_string(), |
| 327 | tenant_id: dp.tenant_id.map(|v| v.to_string()).unwrap_or_default(), |
| 328 | name: dp.name, |
| 329 | description: dp.description, |
| 330 | region: dp.region.to_proto().into(), |
| 331 | mac_version: dp.mac_version.to_proto().into(), |
| 332 | reg_params_revision: dp.reg_params_revision.to_proto().into(), |
| 333 | adr_algorithm_id: dp.adr_algorithm_id, |
| 334 | payload_codec_runtime: dp.payload_codec_runtime.to_proto().into(), |
| 335 | payload_codec_script: dp.payload_codec_script, |
| 336 | flush_queue_on_activate: dp.flush_queue_on_activate, |
| 337 | uplink_interval: dp.uplink_interval as u32, |
| 338 | device_status_req_interval: dp.device_status_req_interval as u32, |
| 339 | supports_otaa: dp.supports_otaa, |
| 340 | supports_class_b: dp.supports_class_b, |
| 341 | supports_class_c: dp.supports_class_c, |
| 342 | class_b_timeout: class_b_params.timeout as u32, |
| 343 | class_b_ping_slot_periodicity: class_b_params.ping_slot_periodicity as u32, |
| 344 | class_b_ping_slot_dr: class_b_params.ping_slot_dr as u32, |
| 345 | class_b_ping_slot_freq: class_b_params.ping_slot_freq as u32, |
| 346 | class_b_downlink_only: class_b_params.class_b_downlink_only, |
| 347 | class_c_timeout: class_c_params.timeout as u32, |
| 348 | abp_rx1_delay: abp_params.rx1_delay as u32, |
| 349 | abp_rx1_dr_offset: abp_params.rx1_dr_offset as u32, |
| 350 | abp_rx2_dr: abp_params.rx2_dr as u32, |
| 351 | abp_rx2_freq: abp_params.rx2_freq as u32, |
| 352 | tags: dp.tags.into_hashmap(), |
| 353 | measurements: dp |
| 354 | .measurements |
| 355 | .into_hashmap() |
| 356 | .iter() |
| 357 | .map(|(k, v)| { |
| 358 | ( |
| 359 | k.to_string(), |