private PlotDisplayViewModel([NotNull] IReadOnlyCollection <PlotElement> plots, int?currentUserId, [CanBeNull] Character character, bool publishedOnly, PlotElementType plotElementType, IUriService uriService) { if (plots == null) { throw new ArgumentNullException(nameof(plots)); } var projectEntity = ((IProjectEntity)character ?? plots.FirstOrDefault())?.Project; var hasMasterAccess = projectEntity?.HasMasterAccess(currentUserId) ?? false; var hasPlayerAccess = character?.HasPlayerAccess(currentUserId) ?? false; if (plots.Any() && projectEntity != null && (hasMasterAccess || hasPlayerAccess || projectEntity.Details.PublishPlot)) { if (!hasMasterAccess && !publishedOnly) { throw new NoAccessToProjectException(projectEntity, currentUserId); } var linkRenderer = new JoinrpgMarkdownLinkRenderer(plots.First().Project); Func <PlotElement, PlotElementTexts> selector; if (!publishedOnly) { selector = element => element.LastVersion(); } else { selector = element => element.PublishedVersion(); } Elements = plots.Where(p => p.ElementType == plotElementType && p.IsActive == true) .Select(selector) .Where(p => p != null) .Select( p => new PlotElementViewModel(character, currentUserId, linkRenderer, p, uriService)) .MarkFirstAndLast(); HasUnready = plots.Any(element => element.ElementType == plotElementType && element.Published != element.Texts.Max(text => text.Version)); } else { Elements = Enumerable.Empty <PlotElementViewModel>(); } }
public async Task AddPlotElement(int projectId, int plotFolderId, int currentUserId, string content, string todoField, IReadOnlyCollection <int> targetGroups, IReadOnlyCollection <int> targetChars, PlotElementType elementType) { var folder = await LoadProjectSubEntityAsync <PlotFolder>(projectId, plotFolderId); folder.RequestMasterAccess(currentUserId, acl => acl.CanManagePlots); var now = DateTime.UtcNow; var characterGroups = await ProjectRepository.LoadGroups(projectId, targetGroups); if (characterGroups.Count != targetGroups.Distinct().Count()) { var missing = string.Join(", ", targetGroups.Except(characterGroups.Select(cg => cg.CharacterGroupId))); throw new Exception($"Groups {missing} doesn't belong to project"); } var plotElement = new PlotElement() { Texts = new PlotElementTexts() { Content = new MarkdownString(content), TodoField = todoField, }, CreatedDateTime = now, ModifiedDateTime = now, IsActive = true, IsCompleted = false, ProjectId = projectId, PlotFolderId = plotFolderId, TargetGroups = characterGroups, TargetCharacters = await ValidateCharactersList(projectId, targetChars), ElementType = elementType }; UnitOfWork.GetDbSet <PlotElement>().Add(plotElement); await UnitOfWork.SaveChangesAsync(); }