public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            object loadedValue;

            try
            {
                ForEachAsyncDelegate <object> forEachAsync = ItemQueryHelper.DefaultForEachAsync; // TODO get from item?
                loadedValue = await ScalarFieldHelper.LoadScalarValueAsync(_fieldReader, item.Query, forEachAsync);
            }
            catch (Exception ex)
            {
                throw new ConfirmOnlyValueLoadException(ex, deserializedValue);
            }

            // TODO find a more efficient way. Possibly generic values too?

            if (loadedValue.Equals(deserializedValue))
            {
                return;
            }

            if (_fieldReader.FieldType.IsEnum)
            {
                loadedValue = Convert.ToInt64(loadedValue);
            }

            if (loadedValue.ToString() == deserializedValue.ToString())
            {
                return;
            }

            throw new InvalidOperationException("Cannot set the '" + _fieldName + "' field. Given value must be equal to the current value.");
        }
Пример #2
0
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            await item.LoadAsync(); // TODO: and do we want to load items within the set function?

            TValue newValue = ConversionUtility.CleverConvertValue <TValue>(deserializedValue);

            _setterAction(item.LoadedItem, newValue);
        }
Пример #3
0
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            TNav navValue = ConversionUtility.ConvertValue <TNav>(deserializedValue);

            await item.LoadAsync();

            _setter.SetNavItem(item.LoadedItem, navValue);
        }
Пример #4
0
 public IRestResource GetFullResource(string fieldName, IDeferredItem <TItem> item, IDataTransaction dataTransaction)
 {
     if (!_implementations.FullResourceFactories.ContainsKey(fieldName))
     {
         return(null); // TODO scalar?
     }
     return(_implementations.FullResourceFactories[fieldName].Get(_stem).GetFullResource(item, dataTransaction));
 }
        public NavigationCollectionRepository(IDeferredItem <TParent> parentItem, Expression <Func <TParent, TCollection> > navExpression, INavigationSetter <TParent, TCollection> setter)
        {
            _parentItem    = parentItem;
            _navExpression = navExpression;
            _setter        = setter;

            _castedExpression = Expression.Lambda <Func <TParent, IEnumerable <TNav> > >(_navExpression.Body, _navExpression.Parameters);
        }
        public virtual bool CanEditField(IDeferredItem <TItem> item, INamedField <TItem> field)
        {
            Func <IRestUser, bool> authorizePredicate = GetFieldAuthorizePredicate(field.Name);

            if (authorizePredicate != null)
            {
                return(authorizePredicate.Invoke(_stem.User)); // TODO: item
            }
            return(AllowAllChecker.CanEditField(item, field));
        }
        public virtual bool CanGetItem(IDeferredItem <TItem> item)
        {
            Expression <Func <TItem, bool> > permissionPredicate = GetPermissionPredicate(ItemPermission.Read);

            if (permissionPredicate != null)
            {
                return(item.Query.Any(permissionPredicate));
            }

            return(AllowAllChecker.CanGetItem(item));
        }
        public virtual bool CanDeleteItem(IDeferredItem <TItem> item)
        {
            var permissionPredicate = GetPermissionPredicate(ItemPermission.Delete);

            if (permissionPredicate != null)
            {
                return(item.Query.Any(permissionPredicate));
            }

            return(AllowAllChecker.CanDeleteItem(item));
        }
        public IRestResource GetFullResource(IDeferredItem <TItem> item, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            var eventWrapper = new DataEventWrapper <TNav>(dataTransaction, navRepository);

            eventWrapper.TryWrapEvents(_navTools.RepoEvents);

            var context = new FullEngineContext <TNav>(eventWrapper.Transaction, eventWrapper.Repository, _subContext);

            return(new EngineRestCollection <TNav>(context));
        }
Пример #10
0
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            await item.LoadAsync();

            if (item.LoadedItem == null)
            {
                throw new ArgumentNullException(nameof(item.LoadedItem), "Cannot set field value for this item because the item is null.");
            }

            object convertedValue = ConversionUtility.ConvertValue(deserializedValue, _propertyInfo.PropertyType);

            _propertyInfo.SetValue(item.LoadedItem, convertedValue);
        }
Пример #11
0
        public EngineRestItem([NotNull] IEngineContext <TItem> context, [NotNull] IDeferredItem <TItem> item)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            _context = context;
            _item    = item;
        }
        public IRestItem GetItem(string identifier)
        {
            _context.Transaction.StartTransaction();

            // create item using only the identifier info given to the dictionary.
            IDeferredItem <TItem> item = EngineIdentiferUtility.GetIdentifiedItem(_context, _namedReferenceInfo, identifier);

            if (!_context.AuthorizationChecker.CanGetItem(item))
            {
                throw new NotAuthorizedForItemException(AuthorizableVerb.Get);
            }

            return(new EngineRestItem <TItem>(_context, item));
        }
Пример #13
0
        public IRestResource GetFullResource(IDeferredItem <TItem> item, IDataTransaction dataTransaction)
        {
            //TNav navItem = _navTools.NavExpression.Compile().Invoke(item.LoadedItem);
            //var itemRepository = new LoadedItemRepository<TNav>(navItem);
            IQueryableSingle <TNav> navigationQuery = item.Query.Select(_navTools.NavExpression).SingleDefferred();
            var itemRepository = new QueryableSingleRepository <TNav>(navigationQuery);

            var eventWrapper = new DataEventWrapper <TNav>(dataTransaction, itemRepository);

            eventWrapper.TryWrapEvents(_navTools.RepoEvents);

            var context         = new FullEngineContext <TNav>(eventWrapper.Transaction, eventWrapper.Repository, _engineSubContext);
            var deferredNavItem = new RepositoryDeferredItem <TNav>(itemRepository);

            return(new EngineRestItem <TNav>(context, deferredNavItem));
        }
Пример #14
0
        public EngineRestScalar([NotNull] IEngineContext <TItem> context, [NotNull] IDeferredItem <TItem> item, [NotNull] INamedField <TItem> field)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (field == null)
            {
                throw new ArgumentNullException(nameof(field));
            }

            _context = context;
            _item    = item;
            _field   = field;
        }
Пример #15
0
        public IRestItem GetItem(string identifier, string identifierName = null)
        {
            _context.Transaction.StartTransaction();

            IIdentifierInfo <TItem> identifierInfo = _context.Identifiers.GetInfo(identifierName);

            if (identifierInfo == null)
            {
                throw new IdentifierNotFoundException(identifierName);
            }

            IDeferredItem <TItem> item = EngineIdentiferUtility.GetIdentifiedItem(_context, identifierInfo, identifier);

            if (!_context.AuthorizationChecker.CanGetItem(item))
            {
                throw new NotAuthorizedForItemException(AuthorizableVerb.Get);
            }

            return(new EngineRestItem <TItem>(_context, item));
        }
Пример #16
0
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationItemRepository <TItem, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            var itemData = new RestItemData(deserializedValue);

            var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext);
            DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync);

            try
            {
                IDataTransaction transaction  = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ?
                var            navContext     = new FullEngineContext <TNav>(transaction, navRepository, _subContext);
                var            navEngineItem  = new EngineRestItem <TNav>(navContext, deferredItem);
                Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData);
            }
            catch (RestApiException ex)
            {
                throw new SubWriterException(ex, item);
            }
        }
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            IDataTransaction transaction = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ?
            var navContext = new FullEngineContext <TNav>(transaction, navRepository, _subContext);

            var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext);

            IEnumerable deserializedCollection = (IEnumerable)deserializedValue;  // todo null ?

            foreach (object deserializedItem in deserializedCollection)
            {
                var itemData = new RestItemData(deserializedItem);

                DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync);

                var            navEngineItem  = new EngineRestItem <TNav>(navContext, deferredItem);
                Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData);
            }

            // TODO: remove items that were not located?
        }
Пример #18
0
        public async Task SetMappedValuesAsync([NotNull] IDeferredItem <TItem> deferredItem, [NotNull] RestItemData itemData)
        {
            foreach (KeyValuePair <string, object> kvp in itemData)
            {
                if (!_fieldProvider.FieldExists(kvp.Key))
                {
                    throw new FieldNotFoundException(kvp.Key, false);
                }

                IFieldWriter <TItem> fieldWriter = _fieldProvider.GetWriter(kvp.Key);
                if (fieldWriter == null)
                {
                    throw new FieldOperationNotAllowedException(kvp.Key, FieldOperation.Write);
                }

                var namedField = new NamedField <TItem>(kvp.Key, _fieldProvider);
                if (!_authChecker.CanEditField(deferredItem, namedField))
                {
                    throw new NotAuthorizedForFieldException(AuthorizableVerb.Edit, kvp.Key);
                }

                await fieldWriter.SetValueAsync(deferredItem, kvp.Value, _dataTransaction);
            }
        }
Пример #19
0
 public FieldAuthChecker(IFieldProvider <TItem> fieldProvider, IAuthorizationChecker <TItem> authChecker, IDeferredItem <TItem> item)
 {
     _fieldProvider = fieldProvider;
     _authChecker   = authChecker;
     _item          = item;
 }
Пример #20
0
 public EngineRestPoco([NotNull] IEngineContext <TItem> context, [NotNull] IDeferredItem <TItem> item, [NotNull] INamedField <TItem> field) : base(context, item, field)
 {
 }
 public NavigationItemRepository(IDeferredItem <TParent> parentItem, Expression <Func <TParent, TNav> > navExpression, INavigationSetter <TParent, TNav> setter)
 {
     _parentItem    = parentItem;
     _navExpression = navExpression;
     _setter        = setter;
 }
Пример #22
0
 public bool CanEditField(IDeferredItem <Artist> item, INamedField <Artist> field)
 {
     throw new NotImplementedException();
 }
Пример #23
0
 public bool CanDeleteItem(IDeferredItem <Artist> itemQuery)
 {
     throw new NotImplementedException();
 }
Пример #24
0
 public IRestResource GetFullResource(string fieldName, IDeferredItem <TItem> item, IDataTransaction dataTransaction)
 {
     return(_fieldModels[fieldName].ResourceGetter?.GetFullResource(item, dataTransaction));
 }
 public bool CanEditItem(IDeferredItem <TItem> item)
 {
     return(true);
 }
 public bool CanDeleteItem(IDeferredItem <TItem> item)
 {
     return(true);
 }
 public bool CanEditField(IDeferredItem <TItem> item, INamedField <TItem> field)
 {
     return(true);
 }
Пример #28
0
 public IRestResource GetFullResource(string fieldName, IDeferredItem <TItem> item, IDataTransaction dataTransaction)
 {
     return(null);
 }
 public IRestResource GetFullResource(string fieldName, IDeferredItem <TItem> item, IDataTransaction dataTransaction)
 {
     return(GetThing(fieldName, m => m.GetFullResource(fieldName, item, dataTransaction)));
 }