Ejemplo n.º 1
0
        public async Task <ListContext> GetAsync(GetEntitiesRequestModel request)
        {
            var collection = await _collectionResolver.ResolveSetupAsync(request.CollectionAlias);

            var variant    = collection.GetEntityVariant(request.VariantAlias);
            var repository = _repositoryResolver.GetRepository(collection);

            var requestedEntityVariantIsDefaultVariant = variant.Alias == collection.EntityVariant.Alias;

            var parent = request is GetEntitiesOfParentRequestModel parentRequest ? await _parentService.GetParentAsync(parentRequest.ParentPath) : default;

            var relatedEntity = (request as GetEntitiesOfRelationRequestModel)?.Related;

            var protoEntity = await _concurrencyService.EnsureCorrectConcurrencyAsync(() => repository.NewAsync(new ViewContext(collection.Alias, parent), collection.EntityVariant.Type));

            var newEntity = requestedEntityVariantIsDefaultVariant
                ? protoEntity
                : await _concurrencyService.EnsureCorrectConcurrencyAsync(() => repository.NewAsync(new ViewContext(collection.Alias, parent), variant.Type));

            await _authService.EnsureAuthorizedUserAsync(request.UsageType, protoEntity);

            await _dataViewResolver.ApplyDataViewToViewAsync(request.View);

            var action = (request.UsageType & ~(UsageType.List)) switch
            {
                UsageType.Add when relatedEntity != null => () => repository.GetAllNonRelatedAsync(new RelatedViewContext(relatedEntity !, collection.Alias, parent), request.View),
                _ when relatedEntity != null => () => repository.GetAllRelatedAsync(new RelatedViewContext(relatedEntity !, collection.Alias, parent), request.View),
                _ when relatedEntity == null => () => repository.GetAllAsync(new ViewContext(collection.Alias, parent), request.View),

                _ => default(Func <Task <IEnumerable <IEntity> > >)
            };

            if (action == default)
            {
                throw new InvalidOperationException($"UsageType {request.UsageType} is invalid for this method");
            }

            var isRoot = parent == null || request.IsEmbedded;

            var protoEditContextUsage = request.UsageType | (isRoot ? UsageType.Root : UsageType.NotRoot);

            var protoEditContext = new FormEditContext(request.CollectionAlias, collection.RepositoryAlias, collection.EntityVariant.Alias, protoEntity, parent, protoEditContextUsage | UsageType.List, collection.Validators, _serviceProvider);
            var newEditContext   = new FormEditContext(request.CollectionAlias, collection.RepositoryAlias, variant.Alias, newEntity, parent, request.UsageType | UsageType.Node, collection.Validators, _serviceProvider);

            var existingEntities = await _concurrencyService.EnsureCorrectConcurrencyAsync(action);

            return(new ListContext(
                       request.CollectionAlias,
                       protoEditContext,
                       parent,
                       request.UsageType,
                       ConvertEditContexts(request, protoEditContext, newEditContext, existingEntities),
                       _serviceProvider));
        }
Ejemplo n.º 2
0
        public async Task <EntitiesResponseModel> GetAsync(GetEntitiesRequestModel request)
        {
            var subjectRepository = _repositoryResolver.GetRepository(request.RepositoryAlias);

            var parentPath = request is GetEntitiesOfParentRequestModel parentRequest ? parentRequest.ParentPath
                : request is GetEntitiesOfRelationRequestModel relationRequest ? relationRequest.Related.ParentPath
                : default;
            var parent = await _parentService.GetParentAsync(ParentPath.TryParse(parentPath));

            var related = default(IRelated);

            if (request is GetEntitiesOfRelationRequestModel relatedRequest)
            {
                var relatedRepository = _repositoryResolver.GetRepository(relatedRequest.Related.RepositoryAlias ?? throw new ArgumentNullException());
                var relatedEntity     = await relatedRepository.GetByIdAsync(relatedRequest.Related.Id ?? throw new ArgumentNullException(), new ViewContext(null, default))
                                        ?? throw new NotFoundException("Could not find related entity");

                related = new RelatedEntity(parent, relatedEntity, relatedRequest.Related.RepositoryAlias);
            }

            var protoEntity = await subjectRepository.NewAsync(new ViewContext(null, parent), default);

            await _authService.EnsureAuthorizedUserAsync(request.UsageType, protoEntity);

            await _dataViewResolver.ApplyDataViewToViewAsync(request.View);

            var action = (request.UsageType & ~(UsageType.List)) switch
            {
                UsageType.Add when related != null => async() => await subjectRepository.GetAllNonRelatedAsync(new RelatedViewContext(related, null, default), request.View),
                _ when related != null => async() => await subjectRepository.GetAllRelatedAsync(new RelatedViewContext(related, null, default), request.View),
                _ when related == null => async() => await subjectRepository.GetAllAsync(new ViewContext(null, parent), request.View),

                _ => default(Func <Task <IEnumerable <IEntity> > >)
            };

            if (action == default)
            {
                throw new InvalidOperationException($"UsageType {request.UsageType} is invalid for this method");
            }

            var entities = await action.Invoke();

            return(new EntitiesResponseModel
            {
                Entities = entities,
                MoreDataAvailable = request.View.MoreDataAvailable
            });
        }
    }