| 119 | } |
| 120 | |
| 121 | async fn update( |
| 122 | &self, |
| 123 | request: Request<api::UpdateTenantRequest>, |
| 124 | ) -> Result<Response<()>, Status> { |
| 125 | let req_tenant = match &request.get_ref().tenant { |
| 126 | Some(v) => v, |
| 127 | None => { |
| 128 | return Err(Status::invalid_argument("tenant is missing")); |
| 129 | } |
| 130 | }; |
| 131 | let tenant_id = Uuid::from_str(&req_tenant.id).map_err(|e| e.status())?; |
| 132 | |
| 133 | self.validator |
| 134 | .validate( |
| 135 | request.extensions(), |
| 136 | validator::ValidateTenantAccess::new(validator::Flag::Update, tenant_id), |
| 137 | ) |
| 138 | .await?; |
| 139 | |
| 140 | let mut dev_addr_prefixes = vec![]; |
| 141 | for p in &req_tenant.dev_addr_prefixes { |
| 142 | let prefix = DevAddrPrefix::from_str(p).map_err(|e| { |
| 143 | Status::invalid_argument(format!("Invalid DevAddr prefix: {}, error: {}", p, e)) |
| 144 | })?; |
| 145 | dev_addr_prefixes.push(Some(prefix)); |
| 146 | } |
| 147 | |
| 148 | // update |
| 149 | let _ = tenant::update(tenant::Tenant { |
| 150 | id: tenant_id.into(), |
| 151 | name: req_tenant.name.clone(), |
| 152 | description: req_tenant.description.clone(), |
| 153 | can_have_gateways: req_tenant.can_have_gateways, |
| 154 | max_device_count: req_tenant.max_device_count as i32, |
| 155 | max_gateway_count: req_tenant.max_gateway_count as i32, |
| 156 | private_gateways_up: req_tenant.private_gateways_up, |
| 157 | private_gateways_down: req_tenant.private_gateways_down, |
| 158 | tags: fields::KeyValue::new(req_tenant.tags.clone()), |
| 159 | dev_addr_prefixes: fields::DevAddrPrefixVec::new(dev_addr_prefixes), |
| 160 | ..Default::default() |
| 161 | }) |
| 162 | .await |
| 163 | .map_err(|e| e.status())?; |
| 164 | |
| 165 | let mut resp = Response::new(()); |
| 166 | resp.metadata_mut() |
| 167 | .insert("x-log-tenant_id", req_tenant.id.parse().unwrap()); |
| 168 | |
| 169 | Ok(resp) |
| 170 | } |
| 171 | |
| 172 | async fn delete( |
| 173 | &self, |