public async Task <IActionResult> PostAsync([FromBody] RouteArgs args)
        {
            ValidateRouteArgs(args);

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (!UserPermissions.IsAllowedToCreate(User.Identity, args.Status))
            {
                return(Forbid());
            }

            // validation passed, emit event
            var ev = new RouteCreated
            {
                Id         = _entityIndex.NextId(ResourceType.Route),
                UserId     = User.Identity.GetUserIdentity(),
                Properties = args,
                Timestamp  = DateTimeOffset.Now
            };

            await _eventStore.AppendEventAsync(ev);

            return(Created($"{Request.Scheme}://{Request.Host}/api/Routes/{ev.Id}", ev.Id));
        }
        private void Bot_RouteCalculated(object sender, RouteArgs args)
        {
            var rover = (DuckieBot)sender;

            _visitedNodes.Add(new Navigation.Point(rover.CurrentX, rover.CurrentY));
            _plannedRoute = args.Route;
            _plannedNext  = args.NextPoint;
            Application.Current.Dispatcher.Invoke(() => {
                DrawMap(_map);
            });
        }
Beispiel #3
0
 public Route(RouteArgs args)
 {
     Title       = args.Title;
     Description = args.Description;
     Duration    = args.Duration;
     Distance    = args.Distance;
     Image.Id    = args.Image;
     Audio.Id    = args.Audio;
     Exhibits.Add(args.Exhibits?.Select(id => (BsonValue)id));
     Status = args.Status;
     Tags.Add(args.Tags?.Select(id => (BsonValue)id));
 }
        private void ValidateRouteArgs(RouteArgs args)
        {
            if (args == null)
            {
                return;
            }

            // ensure referenced image exists
            if (args.Image != null && !_mediaIndex.IsImage(args.Image.Value))
            {
                ModelState.AddModelError(nameof(args.Image),
                                         ErrorMessages.ImageNotFound(args.Image.Value));
            }

            // ensure referenced audio exists
            if (args.Audio != null && !_mediaIndex.IsAudio(args.Audio.Value))
            {
                ModelState.AddModelError(nameof(args.Audio),
                                         ErrorMessages.AudioNotFound(args.Audio.Value));
            }

            // ensure referenced exhibits exist
            if (args.Exhibits != null)
            {
                var invalidIds = args.Exhibits
                                 .Where(id => !_entityIndex.Exists(ResourceType.Exhibit, id))
                                 .ToList();

                foreach (var id in invalidIds)
                {
                    ModelState.AddModelError(nameof(args.Exhibits),
                                             ErrorMessages.ContentNotFound(ResourceType.Exhibit, id));
                }
            }

            // ensure referenced tags exist
            if (args.Tags != null)
            {
                var invalidIds = args.Tags
                                 .Where(id => !_entityIndex.Exists(ResourceType.Tag, id))
                                 .ToList();

                foreach (var id in invalidIds)
                {
                    ModelState.AddModelError(nameof(args.Tags),
                                             ErrorMessages.ContentNotFound(ResourceType.Tag, id));
                }
            }
        }
        public async Task <IActionResult> PutAsync(int id, [FromBody] RouteArgs args)
        {
            ValidateRouteArgs(args);

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (!_entityIndex.Exists(ResourceType.Route, id))
            {
                return(NotFound());
            }

            if (!UserPermissions.IsAllowedToEdit(User.Identity, args.Status, _entityIndex.Owner(ResourceType.Route, id)))
            {
                return(Forbid());
            }

            var oldStatus = _entityIndex.Status(ResourceType.Route, id).GetValueOrDefault();

            if (args.Status == ContentStatus.Unpublished && oldStatus != ContentStatus.Published)
            {
                return(BadRequest(ErrorMessages.CannotBeUnpublished(ResourceType.Route)));
            }

            // validation passed, emit event
            var ev = new RouteUpdated
            {
                Id         = id,
                UserId     = User.Identity.GetUserIdentity(),
                Properties = args,
                Timestamp  = DateTimeOffset.Now,
            };

            await _eventStore.AppendEventAsync(ev);

            return(StatusCode(204));
        }