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)); }
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; }
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)); }
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)); } } }