コード例 #1
0
        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>();
            }
        }
コード例 #2
0
        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();
        }