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