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."); }
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); }
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); }
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)); }
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); }
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)); }
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)); }
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; }
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)); }
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? }
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); } }
public FieldAuthChecker(IFieldProvider <TItem> fieldProvider, IAuthorizationChecker <TItem> authChecker, IDeferredItem <TItem> item) { _fieldProvider = fieldProvider; _authChecker = authChecker; _item = item; }
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; }
public bool CanEditField(IDeferredItem <Artist> item, INamedField <Artist> field) { throw new NotImplementedException(); }
public bool CanDeleteItem(IDeferredItem <Artist> itemQuery) { throw new NotImplementedException(); }
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); }
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))); }