public async Task <ActionResult> AddDistanceActivity([FromBody] DistanceActivity activity) { var eventProps = GetDefaultCustomProperties(); try { activity.UserObjectId = ClaimsHelper.GetUserObjectIdClaim((ClaimsIdentity)HttpContext.User.Identity); await Database.AddDistanceActivityAsync(activity).ConfigureAwait(false); eventProps.Add("ActivityType", nameof(DistanceActivity)); eventProps.Add("DistanceType", activity.Type.ToString()); eventProps.Add("ActivityPurpose", activity.Purpose.ToString()); eventProps.Add("ActivityDate", activity.Date.ToString()); Logger.TrackEvent(EventNames.NewDistanceActivitySubmitted, eventProps); } catch (ClaimsValidationException ex) { eventProps.Add("User.Claims", ex.GetClaims()); Logger.TrackEvent(EventNames.ClaimsValidationError, eventProps); return(Unauthorized()); } catch (ModelValidationException ex) { return(BadRequest(ex.Message)); } catch (Exception ex) { Logger.TrackException(ex); return(StatusCode(StatusCodes.Status500InternalServerError)); } return(Ok()); }
public async Task AddDistanceActivityAsync(DistanceActivity activity) { // model validation if (activity == null) { throw new ModelValidationException(nameof(activity) + " must be provided."); } if (activity.UserObjectId == Guid.Empty) { throw new ModelValidationException(nameof(activity.UserObjectId) + " must be provided."); } if (activity.Date == DateTime.MinValue) { throw new ModelValidationException(nameof(activity.Date) + " must be provided."); } if (string.IsNullOrWhiteSpace(activity.Duration)) { throw new ModelValidationException(nameof(activity.Duration) + " must be provided."); } if (activity.DistanceInMeters == int.MinValue) { throw new ModelValidationException(nameof(activity.DistanceInMeters) + " must be provided."); } // convert the timespan type (system.text.json doesn't support it yet) var validTimespan = TimeSpan.TryParse(activity.Duration, out TimeSpan parsedTs); if (!validTimespan) { throw new ModelValidationException(nameof(activity.Duration) + " must be provided."); } using (SqlConnection sqlcon = new SqlConnection(DatabaseConnectionString)) { await sqlcon.OpenAsync().ConfigureAwait(false); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = sqlcon; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "dbo.AddDistanceActivity"; cmd.Parameters.AddWithValue("@UserObjectId", activity.UserObjectId); cmd.Parameters.AddWithValue("@Date", activity.Date); cmd.Parameters.AddWithValue("@Type", activity.Type); cmd.Parameters.AddWithValue("@Purpose", activity.Purpose); cmd.Parameters.AddWithValue("@Surface", activity.Surface); cmd.Parameters.AddWithValue("@Duration", parsedTs.Ticks); cmd.Parameters.AddWithValue("@DistanceInMeters", activity.DistanceInMeters); cmd.Parameters.AddWithValue("@AverageIntensity", activity.AverageIntensity); cmd.Parameters.AddWithValue("@ElevationGain", activity.ElevationGain); cmd.Parameters.AddWithValue("@ElevationLoss", activity.ElevationLoss); if (activity.Notes != null) { cmd.Parameters.AddWithValue("@Notes", activity.Notes); } await cmd.ExecuteNonQueryAsync().ConfigureAwait(false); } } }