Exemplo n.º 1
0
        public async Task <IActionResult> PutAsync(int id, [FromBody] ExhibitPageArgs2 args)
        {
            // if font family is not specified, fallback to the configured default font family
            if (args != null && args.FontFamily == null)
            {
                args.FontFamily = _exhibitPagesConfig.Value.DefaultFontFamily;
            }

            ValidateExhibitPageArgs(args);

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

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

            // ReSharper disable once PossibleNullReferenceException (args == null is handled through ModelState.IsValid)
            if (!UserPermissions.IsAllowedToEdit(User.Identity, args.Status, _entityIndex.Owner(ResourceType.ExhibitPage, id)))
            {
                return(Forbid());
            }

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

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

            // ReSharper disable once PossibleInvalidOperationException (.Value is safe here since we know the entity exists)
            var currentPageType = _exhibitPageIndex.PageType(id).Value;

            // ReSharper disable once PossibleNullReferenceException (args == null is handled through ModelState.IsValid)
            if (currentPageType != args.Type)
            {
                return(StatusCode(422, ErrorMessages.CannotChangeExhibitPageType(currentPageType, args.Type)));
            }

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

            await _eventStore.AppendEventAsync(ev);

            return(StatusCode(204));
        }
Exemplo n.º 2
0
 public ExhibitPage(ExhibitPageArgs2 args)
 {
     Type            = args.Type;
     Title           = args.Title;
     Text            = args.Text;
     Description     = args.Description;
     FontFamily      = args.FontFamily;
     Audio.Id        = args.Audio;
     Image.Id        = args.Image;
     Images          = args.Images?.Select(img => new SliderPageImage(img)).ToList();
     HideYearNumbers = args.HideYearNumbers ?? false;
     AdditionalInformationPages.Add(args.AdditionalInformationPages?.Select(id => (BsonValue)id));
     Status = args.Status;
 }
Exemplo n.º 3
0
        public async Task <IActionResult> PostAsync([FromBody] ExhibitPageArgs2 args)
        {
            // if font family is not specified, fallback to the configured default font family
            if (args != null && args.FontFamily == null)
            {
                args.FontFamily = _exhibitPagesConfig.Value.DefaultFontFamily;
            }

            ValidateExhibitPageArgs(args);

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

            // ReSharper disable once PossibleNullReferenceException (args == null is handled through ModelState.IsValid)
            if (!UserPermissions.IsAllowedToCreate(User.Identity, args.Status))
            {
                return(Forbid());
            }

            // validation passed, emit event
            var newPageId = _entityIndex.NextId(ResourceType.ExhibitPage);

            var ev = new ExhibitPageCreated3
            {
                Id         = newPageId,
                UserId     = User.Identity.GetUserIdentity(),
                Properties = args,
                Timestamp  = DateTimeOffset.Now
            };

            await _eventStore.AppendEventAsync(ev);

            return(Created($"{Request.Scheme}://{Request.Host}/api/Exhibits/Pages/{newPageId}", newPageId));
        }
Exemplo n.º 4
0
        private void ValidateExhibitPageArgs(ExhibitPageArgs2 args)
        {
            if (args == null)
            {
                return;
            }

            // constrain properties Image, Images and HideYearNumbers to their respective page types
            if (args.Image != null && args.Type != PageType.Image_Page)
            {
                ModelState.AddModelError(nameof(args.Image),
                                         ErrorMessages.FieldNotAllowedForPageType(nameof(args.Image), args.Type));
            }

            if (args.Images != null && args.Type != PageType.Slider_Page)
            {
                ModelState.AddModelError(nameof(args.Images),
                                         ErrorMessages.FieldNotAllowedForPageType(nameof(args.Images), args.Type));
            }

            if (args.HideYearNumbers != null && args.Type != PageType.Slider_Page)
            {
                ModelState.AddModelError(nameof(args.HideYearNumbers),
                                         ErrorMessages.FieldNotAllowedForPageType(nameof(args.HideYearNumbers), args.Type));
            }

            // validate font family
            if (!_exhibitPagesConfig.Value.IsFontFamilyValid(args.FontFamily))
            {
                ModelState.AddModelError(nameof(args.FontFamily), $"Font family must be null/unspecified (which defaults to {_exhibitPagesConfig.Value.DefaultFontFamily}) or one of the following: {string.Join(", ", _exhibitPagesConfig.Value.FontFamilies)}");
            }

            // 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 slider page images exist
            if (args.Images != null)
            {
                var invalidIds = args.Images
                                 .Select(img => img.Image)
                                 .Where(id => !_mediaIndex.IsImage(id))
                                 .ToList();

                foreach (var id in invalidIds)
                {
                    ModelState.AddModelError(nameof(args.Images),
                                             ErrorMessages.ImageNotFound(id));
                }
            }

            // ensure referenced additional info pages exist
            if (args.AdditionalInformationPages != null)
            {
                var invalidIds = args.AdditionalInformationPages
                                 .Where(id => !_entityIndex.Exists(ResourceType.ExhibitPage, id))
                                 .ToList();

                foreach (var id in invalidIds)
                {
                    ModelState.AddModelError(nameof(args.AdditionalInformationPages),
                                             ErrorMessages.ExhibitPageNotFound(id));
                }
            }
        }