Task <NodeInListViewCommandResponseModel> IInteractionDispatcher <PersistRelatedEntityRequestModel, NodeInListViewCommandResponseModel> .InvokeAsync(PersistRelatedEntityRequestModel request, IPageState pageState)
 {
     return(InvokeAsync(request, new NodeInListViewCommandResponseModel(), pageState));
 }
        private async Task <T> InvokeAsync <T>(PersistEntityRequestModel request, T response, IPageState pageState)
            where T : ViewCommandResponseModel
        {
            var collection = _collectionResolver.GetCollection(request.EditContext.CollectionAlias);
            var repository = _repositoryResolver.GetRepository(collection);

            var entityVariant = collection.GetEntityVariant(request.EditContext.Entity);

            var crudType = await _buttonInteraction.ValidateButtonInteractionAsync(request);

            switch (crudType)
            {
            case CrudType.View:
                pageState.PushState(new PageStateModel
                {
                    PageType  = PageType.Node,
                    UsageType = UsageType.View,

                    CollectionAlias = request.EditContext.CollectionAlias,
                    VariantAlias    = entityVariant.Alias,
                    ParentPath      = request.EditContext.Parent?.GetParentPath(),
                    Id = request.EditContext.Entity.Id
                });
                break;

            case CrudType.Edit:
                pageState.PushState(new PageStateModel
                {
                    PageType  = PageType.Node,
                    UsageType = UsageType.Edit,

                    CollectionAlias = request.EditContext.CollectionAlias,
                    VariantAlias    = entityVariant.Alias,
                    ParentPath      = request.EditContext.Parent?.GetParentPath(),
                    Id = request.EditContext.Entity.Id
                });
                break;

            case CrudType.Update:
                await _concurrencyService.EnsureCorrectConcurrencyAsync(() => repository.UpdateAsync(request.EditContext));

                if (request.EditContext.IsReordered())
                {
                    await _concurrencyService.EnsureCorrectConcurrencyAsync(
                        () => repository.ReorderAsync(request.EditContext.ReorderedBeforeId, request.EditContext.Entity.Id !, request.EditContext.Parent));
                }

                response.RefreshIds = new[] { request.EditContext.Entity.Id ! };
Example #3
0
 Task <ListEditorCommandResponseModel> IInteractionDispatcher <PersistEntitiesRequestModel, ListEditorCommandResponseModel> .InvokeAsync(PersistEntitiesRequestModel request, IPageState pageState)
 {
     return(InvokeAsync(request, new ListEditorCommandResponseModel(), pageState));
 }
Example #4
0
        private async Task <T> InvokeAsync <T>(PersistEntitiesRequestModel request, T response, IPageState pageState)
            where T : ViewCommandResponseModel
        {
            var collection = _collectionResolver.ResolveSetup(request.ListContext.CollectionAlias);
            var repository = _repositoryResolver.GetRepository(collection);

            var(crudType, entityVariant) = await _buttonInteraction.ValidateButtonInteractionAsync(request);

            switch (crudType)
            {
            case CrudType.Create:
                if (entityVariant == null)
                {
                    throw new InvalidOperationException($"Button of type {CrudType.Create} must have an EntityVariant.");
                }
                if (response is ListViewCommandResponseModel)
                {
                    pageState.PushState(new PageStateModel
                    {
                        PageType  = PageType.Node,
                        UsageType = UsageType.New,

                        CollectionAlias = request.ListContext.CollectionAlias,
                        VariantAlias    = entityVariant.Alias,
                        ParentPath      = request.ListContext.Parent?.GetParentPath()
                    });
                }
                else
                {
                    var currentState = pageState.GetCurrentState();

                    pageState.PushState(new PageStateModel
                    {
                        PageType  = PageType.Collection,
                        UsageType = UsageType.New,

                        CollectionAlias = request.ListContext.CollectionAlias,
                        VariantAlias    = entityVariant.Alias,
                        ParentPath      = request.ListContext.Parent?.GetParentPath(),

                        // is this the best place here?
                        ActiveTab   = currentState?.ActiveTab,
                        CurrentPage = currentState?.CurrentPage ?? 1,
                        MaxPage     = currentState?.MaxPage,
                        SearchTerm  = currentState?.SearchTerm,
                    });
                }
                break;

            case CrudType.Update:
                var affectedEntities = new List <IEntity>();

                foreach (var editContext in request.ListContext.EditContexts.Where(f => f.IsModified() || f.IsReordered()))
                {
                    var innerRequest = new PersistEntityCollectionRequestModel
                    {
                        ActionId    = request.ActionId,
                        CustomData  = request.CustomData,
                        EditContext = editContext,
                        ListContext = request.ListContext
                    };

                    await _buttonInteraction.ValidateButtonInteractionAsync(innerRequest);

                    if (editContext.IsModified())
                    {
                        await _concurrencyService.EnsureCorrectConcurrencyAsync(() => repository.UpdateAsync(editContext));
                    }
                    if (editContext.IsReordered())
                    {
                        await _concurrencyService.EnsureCorrectConcurrencyAsync(
                            () => repository.ReorderAsync(editContext.ReorderedBeforeId, editContext.Entity.Id !, editContext.Parent));
                    }

                    affectedEntities.Add(editContext.Entity);
                }

                response.RefreshIds = affectedEntities.SelectNotNull(x => x.Id);
                break;

            case CrudType.None:
                response.NoOp = true;
                break;

            case CrudType.Refresh:
                break;

            case CrudType.Return:
                if (pageState.PopState() == null)
                {
                    pageState.ReplaceState(new PageStateModel
                    {
                        PageType  = PageType.Collection,
                        UsageType = collection.ListEditor == null ? UsageType.View : UsageType.Edit,

                        CollectionAlias = request.ListContext.CollectionAlias,
                        ParentPath      = request.ListContext.Parent?.GetParentPath()
                    });
                }
                break;

            case CrudType.Up:
                if (pageState.PopState() == null)
                {
                    var(newParentPath, parentCollectionAlias, parentId) = ParentPath.RemoveLevel(request.ListContext.Parent?.GetParentPath());

                    if (parentCollectionAlias == null)
                    {
                        break;
                    }

                    var parentCollection = _collectionResolver.ResolveSetup(parentCollectionAlias);

                    pageState.ReplaceState(new PageStateModel
                    {
                        PageType  = PageType.Node,
                        UsageType = parentCollection.NodeEditor == null ? UsageType.View : UsageType.Edit,

                        CollectionAlias = parentCollectionAlias,
                        ParentPath      = newParentPath,
                        VariantAlias    = collection.EntityVariant.Alias,
                        Id = parentId
                    });
                }
                break;

            case CrudType.Add when request.Related != null:
                pageState.PushState(new PageStateModel
                {
                    PageType  = PageType.Collection,
                    UsageType = UsageType.Add,

                    CollectionAlias = request.ListContext.CollectionAlias,
                    Related         = request.Related
                });
                break;

            default:
                throw new InvalidOperationException();
            }

            await _buttonInteraction.CompleteButtonInteractionAsync(request);

            return(response);
        }
        public async Task <ApiCommandResponseModel> InvokeAsync(DeleteEntityRequestModel request, IPageState pageState)
        {
            if (string.IsNullOrWhiteSpace(request.Descriptor.RepositoryAlias) ||
                string.IsNullOrWhiteSpace(request.Descriptor.Id))
            {
                throw new ArgumentNullException();
            }

            var parent = await _parentService.GetParentAsync(ParentPath.TryParse(request.Descriptor.ParentPath));

            var subjectRepository = _repositoryResolver.GetRepository(request.Descriptor.RepositoryAlias);
            var subjectEntity     = await subjectRepository.GetByIdAsync(request.Descriptor.Id, parent)
                                    ?? throw new NotFoundException("Could not find entity to delete");

            await _authService.EnsureAuthorizedUserAsync(Operations.Delete, subjectEntity);

            await subjectRepository.DeleteAsync(request.Descriptor.Id, parent);

            return(new ApiCommandResponseModel());
        }
        public async Task <ApiCommandResponseModel> InvokeAsync(PersistReorderRequestModel request, IPageState pageState)
        {
            if (string.IsNullOrWhiteSpace(request.Subject.RepositoryAlias) ||
                string.IsNullOrWhiteSpace(request.Subject.Id))
            {
                throw new ArgumentNullException();
            }

            var subjectRepository = _repositoryResolver.GetRepository(request.Subject.RepositoryAlias);

            var subjectParent = await _parentService.GetParentAsync(ParentPath.TryParse(request.Subject.ParentPath));

            var subjectEntity = await subjectRepository.GetByIdAsync(request.Subject.Id, subjectParent)
                                ?? throw new NotFoundException("Subject entity was not found");

            await _authService.EnsureAuthorizedUserAsync(Operations.Update, subjectEntity);

            await subjectRepository.ReorderAsync(request.BeforeId, request.Subject.Id, subjectParent);

            return(new ApiCommandResponseModel());
        }
Example #7
0
        public async Task <ApiCommandResponseModel> InvokeAsync(PersistEntityRequestModel request, IPageState pageState)
        {
            if (string.IsNullOrWhiteSpace(request.Descriptor.RepositoryAlias))
            {
                throw new ArgumentNullException();
            }

            var parent = await _parentService.GetParentAsync(ParentPath.TryParse(request.Descriptor.ParentPath));

            var subjectRepository = _repositoryResolver.GetRepository(request.Descriptor.RepositoryAlias);
            var referenceEntity   = (request.EntityState == EntityState.IsExisting)
                ? await subjectRepository.GetByIdAsync(request.Descriptor.Id ?? throw new InvalidOperationException("Cannot modify entity without giving an Id."), parent)
                : await subjectRepository.NewAsync(parent, request.Entity.GetType());

            if (referenceEntity == null)
            {
                throw new NotFoundException("Reference entity is null");
            }

            var usageType = UsageType.Node | (request.EntityState == EntityState.IsNew ? UsageType.New : UsageType.Edit);

            await _authService.EnsureAuthorizedUserAsync(usageType, request.Entity);

            var editContext = _editContextFactory.GetEditContextWrapper(
                usageType,
                request.EntityState,
                request.Entity,
                referenceEntity,
                parent,
                request.Relations);

            try
            {
                if (!editContext.IsValid())
                {
                    throw new InvalidEntityException();
                }

                if (request.EntityState == EntityState.IsNew)
                {
                    return(new ApiPersistEntityResponseModel
                    {
                        NewEntity = await subjectRepository.InsertAsync(editContext)
                    });
                }
                else if (request.EntityState == EntityState.IsExisting)
                {
                    await subjectRepository.UpdateAsync(editContext);

                    return(new ApiCommandResponseModel());
                }
                else
                {
                    throw new InvalidOperationException("Invalid usage type");
                }
            }
            catch (InvalidEntityException)
            {
                return(new ApiPersistEntityResponseModel
                {
                    ValidationErrors = editContext.ValidationErrors
                });
            }
        }
Example #8
0
        public async Task <ApiCommandResponseModel> InvokeAsync(PersistRelatedEntityRequestModel request, IPageState pageState)
        {
            if (string.IsNullOrWhiteSpace(request.Subject.RepositoryAlias) ||
                string.IsNullOrWhiteSpace(request.Subject.Id) ||
                string.IsNullOrWhiteSpace(request.Related.RepositoryAlias) ||
                string.IsNullOrWhiteSpace(request.Related.Id))
            {
                throw new ArgumentNullException();
            }

            var subjectRepository = _repositoryResolver.GetRepository(request.Subject.RepositoryAlias);
            var relatedRepository = _repositoryResolver.GetRepository(request.Related.RepositoryAlias);

            var subjectEntity = await subjectRepository.GetByIdAsync(request.Subject.Id, default)
                                ?? throw new NotFoundException("Subject entity was not found");

            var relatedEntity = await relatedRepository.GetByIdAsync(request.Related.Id, default)
                                ?? throw new NotFoundException("Related entity was not found");

            var parent = await _parentService.GetParentAsync(ParentPath.TryParse(request.Related.ParentPath));

            var related = new RelatedEntity(parent, relatedEntity, request.Related.RepositoryAlias);

            if (request.Action == PersistRelatedEntityRequestModel.Actions.Add)
            {
                await _authService.EnsureAuthorizedUserAsync(Operations.Add, subjectEntity);

                await subjectRepository.AddAsync(related, request.Subject.Id);
            }
            else if (request.Action == PersistRelatedEntityRequestModel.Actions.Remove)
            {
                await _authService.EnsureAuthorizedUserAsync(Operations.Remove, subjectEntity);

                await subjectRepository.AddAsync(related, request.Subject.Id);
            }

            return(new ApiCommandResponseModel());
        }
Example #9
0
 public ViewState(IPageState pageState)
 {
     PageState = pageState ?? throw new ArgumentNullException(nameof(pageState));
 }