/// <summary>
        /// Intercepts a method and after invocation checks to see if the request implements ICacheable
        /// if so, the ICacheItemInvalidator is invoked to remove the item from the cache
        /// </summary>
        public virtual void Intercept(IInvocation invocation)
        {
            ArgumentValidation.ComponentNotNull(_cacheInvalidator);

            invocation.Proceed();

            _cacheInvalidator.Invalidate(invocation.ReturnValue as ICacheInvalidation);
        }
        public async Task <IHttpActionResult> Delete(string apiKey)
        {
            var tasks = new List <Task>()
            {
                _apiSettings.DeleteAsync(apiKey),
                _chaosConfigurationSettings.DeleteAsync(apiKey),
            };

            await Task.WhenAll(tasks);

            _cacheInvalidator.Invalidate(apiKey);

            return(new StatusCodeResult(HttpStatusCode.NoContent, Request));
        }
        public async Task <IHttpActionResult> Post(UpdateConfigurationRequest updateConfiguration)
        {
            var apiKey = updateConfiguration.ApiKey;

            var hostForwardSettings = await _apiSettingsData.GetByApiKeyAsync(apiKey);

            if (hostForwardSettings == null)
            {
                return(BadRequest(Constants.InvalidApiKey));
            }

            var chaosConfiguration = UpdateRequestToConfigurationConverter.ToChaosConfiguration(updateConfiguration);

            if (!chaosConfiguration.IsValid())
            {
                return(BadRequest(chaosConfiguration.ValidationErrors.AsFormattingString()));
            }

            await _chaosConfigurationSettings.CreateOrUpdateAsync(hostForwardSettings, apiKey, chaosConfiguration);

            _cacheInvalidator.Invalidate(apiKey);

            return(Created(hostForwardSettings.ForwardApiHostName, chaosConfiguration));
        }
        public CacheInvalidatorCallback(ICacheInvalidator cacheInvalidator)
        {
            _invalidator = cacheInvalidator;
            _callback = new GenericCallback((out int return_type, out jvalue return_value, IntPtr input) =>
            {
                try
                {
                    string key = (string)JavaClass.GetTypedInstance(typeof(string), jvalue.From(input).l);
                    _invalidator.Invalidate(key);

                    return_value = new jvalue();
                    return_type = 0;
                }
                catch (Exception exception)
                {
                    return_value = jvalue.CreateCBRetVal(exception);
                    return_type = 1;
                }

                return 0;
            });

            base.JObject = _constructor.construct(0, _callback);
        }