| 125 | } |
| 126 | |
| 127 | async fn update( |
| 128 | &self, |
| 129 | request: Request<api::UpdateGatewayRequest>, |
| 130 | ) -> Result<Response<()>, Status> { |
| 131 | let req_gw = match &request.get_ref().gateway { |
| 132 | Some(v) => v, |
| 133 | None => { |
| 134 | return Err(Status::invalid_argument("gateway is missing")); |
| 135 | } |
| 136 | }; |
| 137 | let gw_id = EUI64::from_str(&req_gw.gateway_id).map_err(|e| e.status())?; |
| 138 | |
| 139 | self.validator |
| 140 | .validate( |
| 141 | request.extensions(), |
| 142 | validator::ValidateGatewayAccess::new(validator::Flag::Update, gw_id), |
| 143 | ) |
| 144 | .await?; |
| 145 | |
| 146 | let (lat, lon, alt) = match &req_gw.location { |
| 147 | Some(v) => (v.latitude, v.longitude, v.altitude as f32), |
| 148 | None => (0.0, 0.0, 0.0), |
| 149 | }; |
| 150 | |
| 151 | // update |
| 152 | let _ = gateway::update(gateway::Gateway { |
| 153 | gateway_id: gw_id, |
| 154 | name: req_gw.name.clone(), |
| 155 | description: req_gw.description.clone(), |
| 156 | latitude: lat, |
| 157 | longitude: lon, |
| 158 | altitude: alt, |
| 159 | tags: fields::KeyValue::new(req_gw.tags.clone()), |
| 160 | stats_interval_secs: req_gw.stats_interval as i32, |
| 161 | downlink_priority: req_gw.downlink_priority as i16, |
| 162 | ..Default::default() |
| 163 | }) |
| 164 | .await |
| 165 | .map_err(|e| e.status())?; |
| 166 | |
| 167 | let mut resp = Response::new(()); |
| 168 | resp.metadata_mut() |
| 169 | .insert("x-log-gateway_id", req_gw.gateway_id.parse().unwrap()); |
| 170 | |
| 171 | Ok(resp) |
| 172 | } |
| 173 | |
| 174 | async fn delete( |
| 175 | &self, |