public ActionResult Edit(NewRunData newRunData)
        {
            if (!ModelState.IsValid || (!newRunData.Distance.HasValue && !newRunData.Route.HasValue) || !newRunData.RunLogId.HasValue)
            {
                return(Json(new { Completed = false, Reason = "Please provide a valid route/distance and time." }));
            }
            if (!HttpContext.HasValidUserAccount())
            {
                return(Json(new { Completed = false, Reason = "Please create an account." }));
            }

            logger.LogInformation("Editing run event {0} for date {1}, route {2}, distance {3}, time {4}", newRunData.RunLogId, newRunData.Date, newRunData.Route, newRunData.Distance, newRunData.Time);

            var deleted     = Delete(newRunData.RunLogId.Value) as JsonResult;
            var deletedJson = deleted.Value as dynamic;

            if (!deletedJson.Completed)
            {
                return(Json(new { Completed = false, Reason = "You are not allowed to edit this event - please refresh and try again." }));
            }

            var addedItem = AddRunLogEvent(newRunData);

            if (addedItem.Item2 == null)
            {
                return(addedItem.Item1);
            }

            dynamic newRunLogEvent = addedItem.Item2;

            newRunLogEvent.ReplacesRunLogId = newRunData.RunLogId;
            MassiveDB.Current.UpdateRunLogEvent(newRunLogEvent);
            return(addedItem.Item1);
        }
Exemplo n.º 2
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            DateTime?date = null;
            DateTime parsedDate;

            Trace.TraceInformation("Parsing date: {0}", bindingContext.GetString("date"));
            if (DateTime.TryParseExact(bindingContext.GetString("date"), "ddd, d MMM yyyy HH':'mm':'ss 'UTC'", null, DateTimeStyles.AssumeUniversal, out parsedDate))
            {
                date = parsedDate.ToUniversalTime();
            }
            else if (DateTime.TryParseExact(bindingContext.GetString("date"), "ddd, d MMM yyyy HH':'mm':'ss 'GMT'", null, DateTimeStyles.AssumeUniversal, out parsedDate))
            {
                date = parsedDate;
            }

            var model = new NewRunData {
                RunLogId = bindingContext.GetLong("runLogId"),
                Date     = date,
                Distance = bindingContext.GetDouble("distance"),
                Route    = bindingContext.GetLong("route"),
                Time     = bindingContext.GetString("time"),
                Comment  = bindingContext.GetString("comment").MaxLength(1000)
            };

            if ((model.Route ?? 0) == -2)
            {
                model.NewRoute = new RouteData {
                    Distance = bindingContext.GetDouble("distance") ?? 0.0,
                    Name     = bindingContext.GetString("newRouteName"),
                    Notes    = bindingContext.GetString("newRouteNotes"),
                    Points   = bindingContext.GetString("newRoutePoints"),
                    Public   = bindingContext.GetBool("newRoutePublic")
                }
            }
            ;

            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
    }
 public ActionResult Add(NewRunData newRunData)
 {
     return(AddRunLogEvent(newRunData).Item1);
 }
        private Tuple <JsonResult, object> AddRunLogEvent(NewRunData newRunData)
        {
            if (!ModelState.IsValid || newRunData.Route.GetValueOrDefault() == 0 || (!newRunData.Distance.HasValue && !newRunData.Route.HasValue))
            {
                return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please provide a valid route/distance and time." }), (object)null));
            }
            if (!HttpContext.HasValidUserAccount(dataCache))
            {
                return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please create an account." }), (object)null));
            }

            logger.LogInformation("Creating run event for date {0}, route {1}, distance {2}, time {3}", newRunData.Date, newRunData.Route, newRunData.Distance, newRunData.Time);

            var      userUnits = HttpContext.UserDistanceUnits(dataCache);
            dynamic  route     = null;
            Distance distance  = new Distance(newRunData.Distance ?? 0, userUnits);

            if (newRunData.Route.HasValue)
            {
                var routeId = newRunData.Route.Value;
                if (routeId > 0)
                {
                    route = MassiveDB.Current.FindRoute(routeId);
                    if (route == null)
                    {
                        return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Cannot find selected route, please choose another route and try again." }), (object)null));
                    }

                    distance = new Distance((double)route.Distance, (DistanceUnits)route.DistanceUnits);
                }
                else if (routeId == -1)
                {
                    // manual distance...distance shoud be > 0
                    if (distance.BaseDistance <= 0)
                    {
                        return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please enter a distance for your run and try again." }), (object)null));
                    }
                }
                else if (routeId == -2)
                {
                    // new mapped route
                    if (newRunData.NewRoute == null)
                    {
                        return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please map a route, add a name and then add a run log event." }), (object)null));
                    }
                    if (string.IsNullOrWhiteSpace(newRunData.NewRoute.Name))
                    {
                        return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please provide a route name." }), (object)null));
                    }
                    if (string.IsNullOrWhiteSpace(newRunData.NewRoute.Points) || newRunData.NewRoute.Points == "[]")
                    {
                        return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please add some points to the new route by double-clicking the map." }), (object)null));
                    }
                    route = MassiveDB.Current.CreateRoute(HttpContext.UserAccount(dataCache), newRunData.NewRoute.Name, newRunData.NewRoute.Notes ?? "", distance, (newRunData.NewRoute.Public ?? false) ? Route.PublicRoute : Route.PrivateRoute, newRunData.NewRoute.Points);
                }
                else
                {
                    return(Tuple.Create(new JsonResult(new { Completed = false, Reason = "Please select or create a route for your run and try again." }), (object)null));
                }
            }

            var runLogEvent = MassiveDB.Current.CreateRunLogEvent(HttpContext.UserAccount(dataCache), newRunData.Date.Value, distance, route, newRunData.NormalizedTime, newRunData.Comment);
            var model       = new RunLogViewModel(HttpContext, runLogEvent, dataCache);

            return(Tuple.Create(new JsonResult(model.RunLogModels.Single().RunLogEventToJson()), (object)runLogEvent));
        }