| 422 | } |
| 423 | |
| 424 | async fn update_user( |
| 425 | &self, |
| 426 | request: Request<api::UpdateTenantUserRequest>, |
| 427 | ) -> Result<Response<()>, Status> { |
| 428 | let req_user = match &request.get_ref().tenant_user { |
| 429 | Some(v) => v, |
| 430 | None => { |
| 431 | return Err(Status::invalid_argument("tenant_user is missing")); |
| 432 | } |
| 433 | }; |
| 434 | let tenant_id = Uuid::from_str(&req_user.tenant_id).map_err(|e| e.status())?; |
| 435 | let user_id = Uuid::from_str(&req_user.user_id).map_err(|e| e.status())?; |
| 436 | |
| 437 | self.validator |
| 438 | .validate( |
| 439 | request.extensions(), |
| 440 | validator::ValidateTenantUserAccess::new( |
| 441 | validator::Flag::Update, |
| 442 | tenant_id, |
| 443 | user_id, |
| 444 | ), |
| 445 | ) |
| 446 | .await?; |
| 447 | |
| 448 | let tu = tenant::TenantUser { |
| 449 | tenant_id: tenant_id.into(), |
| 450 | user_id: user_id.into(), |
| 451 | is_admin: req_user.is_admin, |
| 452 | is_device_admin: req_user.is_device_admin, |
| 453 | is_gateway_admin: req_user.is_gateway_admin, |
| 454 | ..Default::default() |
| 455 | }; |
| 456 | |
| 457 | let dps: Vec<tenant::TenantUserDeviceProfile> = req_user |
| 458 | .device_profiles |
| 459 | .iter() |
| 460 | .map(|dp| tenant::TenantUserDeviceProfile { |
| 461 | user_id: user_id.into(), |
| 462 | device_profile_id: Uuid::from_str(&dp.device_profile_id) |
| 463 | .unwrap_or_default() |
| 464 | .into(), |
| 465 | ..Default::default() |
| 466 | }) |
| 467 | .collect(); |
| 468 | |
| 469 | let apps: Vec<tenant::TenantUserApplication> = req_user |
| 470 | .applications |
| 471 | .iter() |
| 472 | .map(|app| tenant::TenantUserApplication { |
| 473 | user_id: user_id.into(), |
| 474 | application_id: Uuid::from_str(&app.application_id) |
| 475 | .unwrap_or_default() |
| 476 | .into(), |
| 477 | is_read_only: app.is_read_only, |
| 478 | ..Default::default() |
| 479 | }) |
| 480 | .collect(); |
| 481 | |