public virtual async Task <TResource> UpdateAsync(TId id, TResource requestEntity)
        {
            _logger.LogTrace($"Entering {nameof(UpdateAsync)}('{id}', {(requestEntity == null ? "null" : "object")}).");

            TResource databaseEntity = await _repository.Get(id).FirstOrDefaultAsync();

            if (databaseEntity == null)
            {
                string resourceId = TypeHelper.GetResourceStringId <TResource, TId>(id, _resourceFactory);
                throw new ResourceNotFoundException(resourceId, _currentRequestResource.ResourceName);
            }

            _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseEntity);
            _resourceChangeTracker.SetRequestedAttributeValues(requestEntity);

            requestEntity = IsNull(_hookExecutor) ? requestEntity : _hookExecutor.BeforeUpdate(AsList(requestEntity), ResourcePipeline.Patch).Single();

            await _repository.UpdateAsync(requestEntity, databaseEntity);

            if (!IsNull(_hookExecutor, databaseEntity))
            {
                _hookExecutor.AfterUpdate(AsList(databaseEntity), ResourcePipeline.Patch);
                _hookExecutor.OnReturn(AsList(databaseEntity), ResourcePipeline.Patch);
            }

            _repository.FlushFromCache(databaseEntity);
            TResource afterEntity = await _repository.Get(id).FirstOrDefaultAsync();

            _resourceChangeTracker.SetFinallyStoredAttributeValues(afterEntity);

            bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges();

            return(hasImplicitChanges ? afterEntity : null);
        }
        /// <inheritdoc />
        public virtual async Task <TResource> UpdateAsync(TId id, TResource requestResource)
        {
            _traceWriter.LogMethodStart(new { id, requestResource });
            if (requestResource == null)
            {
                throw new ArgumentNullException(nameof(requestResource));
            }

            TResource databaseResource = await GetPrimaryResourceById(id, false);

            _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseResource);
            _resourceChangeTracker.SetRequestedAttributeValues(requestResource);

            if (_hookExecutor != null)
            {
                requestResource = _hookExecutor.BeforeUpdate(AsList(requestResource), ResourcePipeline.Patch).Single();
            }

            await _repository.UpdateAsync(requestResource, databaseResource);

            if (_hookExecutor != null)
            {
                _hookExecutor.AfterUpdate(AsList(databaseResource), ResourcePipeline.Patch);
                _hookExecutor.OnReturn(AsList(databaseResource), ResourcePipeline.Patch);
            }

            _repository.FlushFromCache(databaseResource);
            TResource afterResource = await GetPrimaryResourceById(id, false);

            _resourceChangeTracker.SetFinallyStoredAttributeValues(afterResource);

            bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges();

            return(hasImplicitChanges ? afterResource : null);
        }
        public virtual async Task <TResource> UpdateAsync(TId id, TResource requestResource)
        {
            _logger.LogTrace($"Entering {nameof(UpdateAsync)}('{id}', {(requestResource == null ? "null" : "object")}).");

            TResource databaseResource = await GetPrimaryResourceById(id, false);

            _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseResource);
            _resourceChangeTracker.SetRequestedAttributeValues(requestResource);

            if (_hookExecutor != null)
            {
                requestResource = _hookExecutor.BeforeUpdate(AsList(requestResource), ResourcePipeline.Patch).Single();
            }

            await _repository.UpdateAsync(requestResource, databaseResource);

            if (_hookExecutor != null)
            {
                _hookExecutor.AfterUpdate(AsList(databaseResource), ResourcePipeline.Patch);
                _hookExecutor.OnReturn(AsList(databaseResource), ResourcePipeline.Patch);
            }

            _repository.FlushFromCache(databaseResource);
            TResource afterResource = await GetPrimaryResourceById(id, false);

            _resourceChangeTracker.SetFinallyStoredAttributeValues(afterResource);

            bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges();

            return(hasImplicitChanges ? afterResource : null);
        }
        public virtual async Task <TResource> UpdateAsync(TId id, TResource entity)
        {
            entity = IsNull(_hookExecutor) ? entity : _hookExecutor.BeforeUpdate(AsList(entity), ResourcePipeline.Patch).SingleOrDefault();
            entity = await _repository.UpdateAsync(entity);

            if (!IsNull(_hookExecutor, entity))
            {
                _hookExecutor.AfterUpdate(AsList(entity), ResourcePipeline.Patch);
                entity = _hookExecutor.OnReturn(AsList(entity), ResourcePipeline.Patch).SingleOrDefault();
            }
            return(entity);
        }
Beispiel #5
0
 public void BeforeUpdateResource <TResource>(TResource resource)
     where TResource : class, IIdentifiable
 {
     _resourceHookExecutor.BeforeUpdate(resource.AsList(), ResourcePipeline.Patch);
 }