private async Task <ActionResult> ProcessSetUnitState(UnitStateInput stateInput) { var unit = await _unitsService.GetUnitByIdAsync(stateInput.Uid); if (unit == null) { return(NotFound()); } if (unit.DepartmentId != DepartmentId) { return(Unauthorized()); } if (this.ModelState.IsValid) { try { var state = new UnitState(); state.UnitId = stateInput.Uid; state.LocalTimestamp = stateInput.Lts; if (!String.IsNullOrWhiteSpace(stateInput.Lat)) { state.Latitude = decimal.Parse(stateInput.Lat); } if (!String.IsNullOrWhiteSpace(stateInput.Lon)) { state.Longitude = decimal.Parse(stateInput.Lon); } if (!String.IsNullOrWhiteSpace(stateInput.Acc)) { state.Accuracy = decimal.Parse(stateInput.Acc); } if (!String.IsNullOrWhiteSpace(stateInput.Alt)) { state.Altitude = decimal.Parse(stateInput.Alt); } if (!String.IsNullOrWhiteSpace(stateInput.Alc)) { state.AltitudeAccuracy = decimal.Parse(stateInput.Alc); } if (!String.IsNullOrWhiteSpace(stateInput.Spd)) { state.Speed = decimal.Parse(stateInput.Spd); } if (!String.IsNullOrWhiteSpace(stateInput.Hdn)) { state.Heading = decimal.Parse(stateInput.Hdn); } state.State = (int)stateInput.Typ; state.Timestamp = stateInput.Tms ?? DateTime.UtcNow; state.Note = stateInput.Not; if (state.Latitude.HasValue && state.Longitude.HasValue) { state.GeoLocationData = string.Format("{0},{1}", state.Latitude.Value, state.Longitude.Value); } if (stateInput.Rto > 0) { state.DestinationId = stateInput.Rto; } var savedState = await _unitsService.SetUnitStateAsync(state, DepartmentId); if (stateInput.Roles != null && stateInput.Roles.Count > 0) { var unitRoles = await _unitsService.GetRolesForUnitAsync(savedState.UnitId); var roles = new List <UnitStateRole>(); foreach (var role in stateInput.Roles) { if (!string.IsNullOrWhiteSpace(role.Uid)) { var unitRole = new UnitStateRole(); unitRole.UnitStateId = savedState.UnitStateId; unitRole.UserId = role.Uid;; unitRole.UnitStateRoleId = role.Rid; if (String.IsNullOrWhiteSpace(role.Nme)) { var savedRole = unitRoles.FirstOrDefault(x => x.UnitRoleId == unitRole.UnitStateRoleId); if (savedRole != null) { unitRole.Role = savedRole.Name; } } else { unitRole.Role = role.Nme; } unitRole.IdValue = 0; unitRole.UnitStateRoleId = 0; roles.Add(unitRole); //_unitsService.AddUnitStateRoleForEvent(savedState.UnitStateId, role.Uid, role.Rid, savedState.Unit.Name, savedState.Timestamp); } } await _unitsService.AddAllUnitStateRolesAsync(roles); } //OutboundEventProvider.UnitStatusTopicHandler handler = new OutboundEventProvider.UnitStatusTopicHandler(); //handler.Handle(new UnitStatusEvent() { DepartmentId = DepartmentId, Status = savedState }); _eventAggregator.SendMessage <UnitStatusEvent>(new UnitStatusEvent() { DepartmentId = DepartmentId, Status = savedState }); if (savedState.UnitStateId > 0) { return(CreatedAtAction("SetUnitState", new { id = savedState.UnitStateId }, savedState)); } } catch (Exception ex) { Logging.LogException(ex); return(BadRequest()); } } return(BadRequest()); }