public async Task AddLiftingActivityAsync(LiftingActivity 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.");
            }

            // 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.AddLiftingActivity";

                    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("@FocusArea", activity.FocusArea);
                    cmd.Parameters.AddWithValue("@Duration", parsedTs.Ticks);
                    cmd.Parameters.AddWithValue("@AverageIntensity", activity.AverageIntensity);

                    if (activity.Notes != null)
                    {
                        cmd.Parameters.AddWithValue("@Notes", activity.Notes);
                    }

                    await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
                }
            }
        }
示例#2
0
        public async Task <ActionResult> AddLiftingActivity([FromBody] LiftingActivity activity)
        {
            var eventProps = GetDefaultCustomProperties();

            try
            {
                activity.UserObjectId = ClaimsHelper.GetUserObjectIdClaim((ClaimsIdentity)HttpContext.User.Identity);

                await Database.AddLiftingActivityAsync(activity).ConfigureAwait(false);

                eventProps.Add("ActivityType", nameof(LiftingActivity));
                eventProps.Add("LiftingType", 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());
        }