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