Beispiel #1
0
        public async Task <TreeCollectionUI?> GetCollectionAsync(string alias, ParentPath?parentPath)
        {
            var collection = _collectionResolver.ResolveSetup(alias);

            if (collection == null)
            {
                throw new InvalidOperationException($"Failed to get collection for given alias ({alias}).");
            }

            var parent = await _parentService.GetParentAsync(parentPath);

            var testEntity = await _repositoryResolver.GetRepository(collection).NewAsync(parent, collection.EntityVariant.Type);

            var canEdit = collection.ListEditor != null && await _authService.IsUserAuthorizedAsync(Operations.Update, testEntity);

            var canView = collection.ListView != null && await _authService.IsUserAuthorizedAsync(Operations.Read, testEntity);

            if (!canEdit && !canView)
            {
                return(TreeCollectionUI.None);
            }

            var tree = new TreeCollectionUI(collection.Alias, collection.Name)
            {
                EntitiesVisible     = collection.TreeView?.EntityVisibility == EntityVisibilty.Visible,
                RootVisible         = collection.TreeView?.RootVisibility == CollectionRootVisibility.Visible,
                Icon                = collection.Icon ?? "list",
                DefaultOpenEntities = collection.TreeView?.DefaultOpenEntities ?? false
            };

            if (canEdit)
            {
                tree.State = new PageStateModel
                {
                    CollectionAlias = collection.Alias,
                    PageType        = PageType.Collection,
                    ParentPath      = parentPath,
                    UsageType       = UsageType.Edit
                };
            }
            else if (canView)
            {
                tree.State = new PageStateModel
                {
                    CollectionAlias = collection.Alias,
                    PageType        = PageType.Collection,
                    ParentPath      = parentPath,
                    UsageType       = UsageType.View
                };
            }

            return(tree);
        }
Beispiel #2
0
        public async Task <TreeCollectionUI?> GetCollectionAsync(string alias, ParentPath?parentPath)
        {
            var collection = _collectionResolver.ResolveSetup(alias);

            if (collection == null)
            {
                throw new InvalidOperationException($"Failed to get collection for given alias ({alias}).");
            }

            var parent = await _parentService.GetParentAsync(parentPath);

            var isList       = collection.UsageType.HasFlag(UsageType.List);
            var isListEditor = collection.ListEditor != null;
            var isListView   = collection.ListView != null;
            var isDetails    = collection.UsageType.HasFlag(UsageType.Details) && parent?.Entity != null;

            var entity = isList
                ? await _repositoryResolver.GetRepository(collection).NewAsync(parent, collection.EntityVariant.Type)
                : await _repositoryResolver.GetRepository(collection).GetByIdAsync(parent !.Entity.Id !, parent)
                         ?? throw new InvalidOperationException($"Failed to get detail entity for given alias ({alias}) -- a detail entity should always exist.");

            var canEdit = (isList && isListEditor && await _authService.IsUserAuthorizedAsync(Operations.Update, entity)) ||
                          (isDetails && await _authService.IsUserAuthorizedAsync(Operations.Update, parent !.Entity));
            var canView = isList && isListView && await _authService.IsUserAuthorizedAsync(Operations.Read, entity);

            if (!canEdit && !canView)
            {
                return(TreeCollectionUI.None);
            }

            var tree = new TreeCollectionUI(collection.Alias, collection.RepositoryAlias, collection.Name)
            {
                EntitiesVisible     = collection.TreeView?.EntityVisibility == EntityVisibilty.Visible,
                RootVisible         = collection.TreeView?.RootVisibility == CollectionRootVisibility.Visible,
                Icon                = collection.Icon ?? "Database",
                Color               = collection.Color,
                DefaultOpenEntities = collection.TreeView?.DefaultOpenEntities ?? false
            };

            if (canEdit)
            {
                if (isList)
                {
                    tree.State = new PageStateModel
                    {
                        CollectionAlias = collection.Alias,
                        PageType        = PageType.Collection,
                        ParentPath      = parentPath,
                        UsageType       = UsageType.Edit | ((parentPath != null) ? UsageType.NotRoot : UsageType.Root)
                    };
                }
                else if (isDetails)
                {
                    var entityVariant = collection.GetEntityVariant(entity);

                    tree.State = new PageStateModel
                    {
                        CollectionAlias = collection.Alias,
                        Id           = parent !.Entity.Id,
                        PageType     = PageType.Node,
                        ParentPath   = parentPath,
                        UsageType    = UsageType.Edit,
                        VariantAlias = entityVariant.Alias
                    };
                }
            }
            else if (canView)
            {
                tree.State = new PageStateModel
                {
                    CollectionAlias = collection.Alias,
                    PageType        = PageType.Collection,
                    ParentPath      = parentPath,
                    UsageType       = UsageType.View | ((parentPath != null) ? UsageType.NotRoot : UsageType.Root)
                };
            }

            return(tree);
        }
Beispiel #3
0
        public async Task <TreeCollectionUI?> GetCollectionAsync(string alias, ParentPath?parentPath)
        {
            var collection = await _collectionResolver.ResolveSetupAsync(alias);

            if (collection == null)
            {
                throw new InvalidOperationException($"Failed to get collection for given alias ({alias}).");
            }

            var parent = await _parentService.GetParentAsync(parentPath);

            var isList       = collection.UsageType.HasFlag(UsageType.List);
            var isListEditor = collection.ListEditor != null;
            var isListView   = collection.ListView != null;
            var isDetails    = collection.UsageType.HasFlag(UsageType.Details) && parent?.Entity != null;

            var respository = _repositoryResolver.GetRepository(collection);
            var entity      = await _concurrencyService.EnsureCorrectConcurrencyAsync(async() => isList
                                                                                      ?await respository.NewAsync(new ViewContext(collection.Alias, parent), collection.EntityVariant.Type)
                                                                                      : await respository.GetByIdAsync(parent !.Entity.Id !, new ViewContext(collection.Alias, parent))
                                                                                      ?? throw new InvalidOperationException($"Failed to get detail entity for given alias ({alias}) -- a detail entity should always exist."));

            var canEdit = (isList && isListEditor && await _authService.IsUserAuthorizedAsync(Operations.Update, entity)) ||
                          (isDetails && await _authService.IsUserAuthorizedAsync(Operations.Update, parent !.Entity));
            var canView = isList && isListView && await _authService.IsUserAuthorizedAsync(Operations.Read, entity);

            if (!canEdit && !canView)
            {
                return(TreeCollectionUI.None);
            }

            var tree = new TreeCollectionUI(collection.Alias, collection.RepositoryAlias, collection.Name)
            {
                EntitiesVisible     = collection.TreeView?.EntityVisibility == EntityVisibilty.Visible,
                RootVisible         = collection.TreeView?.RootVisibility == CollectionRootVisibility.Visible,
                Icon                = collection.Icon ?? "Database",
                Color               = collection.Color,
                DefaultOpenEntities = collection.TreeView?.DefaultOpenEntities ?? false
            };

            if (canEdit)
            {
                if (isList)
                {
                    tree.NavigateTo = new NavigationState(
                        collection.Alias,
                        parentPath,
                        UsageType.Edit);
                }
                else if (isDetails)
                {
                    var entityVariant = collection.GetEntityVariant(entity);

                    tree.NavigateTo = new NavigationState(
                        collection.Alias, parentPath,
                        entityVariant.Alias,
                        parent !.Entity.Id,
                        UsageType.Edit);
                }
            }
            else if (canView)
            {
                tree.NavigateTo = new NavigationState(
                    collection.Alias,
                    parentPath,
                    UsageType.View);
            }

            return(tree);
        }