| 299 | } |
| 300 | |
| 301 | async fn add_user( |
| 302 | &self, |
| 303 | request: Request<api::AddTenantUserRequest>, |
| 304 | ) -> Result<Response<()>, Status> { |
| 305 | let req_user = match &request.get_ref().tenant_user { |
| 306 | Some(v) => v, |
| 307 | None => { |
| 308 | return Err(Status::invalid_argument("tenant_user is missing")); |
| 309 | } |
| 310 | }; |
| 311 | let tenant_id = Uuid::from_str(&req_user.tenant_id).map_err(|e| e.status())?; |
| 312 | let user_id = user::get_by_email(&req_user.email) |
| 313 | .await |
| 314 | .map_err(|e| e.status())? |
| 315 | .id; |
| 316 | |
| 317 | self.validator |
| 318 | .validate( |
| 319 | request.extensions(), |
| 320 | validator::ValidateTenantUsersAccess::new(validator::Flag::Create, tenant_id), |
| 321 | ) |
| 322 | .await?; |
| 323 | |
| 324 | let tu = tenant::TenantUser { |
| 325 | user_id, |
| 326 | tenant_id: tenant_id.into(), |
| 327 | is_admin: req_user.is_admin, |
| 328 | is_device_admin: req_user.is_device_admin, |
| 329 | is_gateway_admin: req_user.is_gateway_admin, |
| 330 | ..Default::default() |
| 331 | }; |
| 332 | |
| 333 | let dps: Vec<tenant::TenantUserDeviceProfile> = req_user |
| 334 | .device_profiles |
| 335 | .iter() |
| 336 | .map(|dp| tenant::TenantUserDeviceProfile { |
| 337 | user_id, |
| 338 | device_profile_id: Uuid::from_str(&dp.device_profile_id) |
| 339 | .unwrap_or_default() |
| 340 | .into(), |
| 341 | ..Default::default() |
| 342 | }) |
| 343 | .collect(); |
| 344 | |
| 345 | let apps: Vec<tenant::TenantUserApplication> = req_user |
| 346 | .applications |
| 347 | .iter() |
| 348 | .map(|app| tenant::TenantUserApplication { |
| 349 | user_id, |
| 350 | application_id: Uuid::from_str(&app.application_id) |
| 351 | .unwrap_or_default() |
| 352 | .into(), |
| 353 | is_read_only: app.is_read_only, |
| 354 | ..Default::default() |
| 355 | }) |
| 356 | .collect(); |
| 357 | |
| 358 | let _ = tenant::add_user(tu, &dps, &apps) |