public async override Task OnActionExecutionAsync()

in src/Microsoft.Health.Dicom.Api/Features/Filters/PopulateDataPartitionFilterAttribute.cs [50:89]


        public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            EnsureArg.IsNotNull(context, nameof(context));
            IDicomRequestContext dicomRequestContext = _dicomRequestContextAccessor.RequestContext;
            RouteData routeData = context.RouteData;
            var routeName = context.ActionDescriptor?.AttributeRouteInfo?.Name;

            var routeContainsPartition = routeData.Values.TryGetValue(KnownActionParameterNames.PartitionName, out object value);

            if (!_isPartitionEnabled && routeContainsPartition) throw new DataPartitionsFeatureDisabledException();

            if (_isPartitionEnabled && !routeContainsPartition) throw new DataPartitionsMissingPartitionException();

            if (_isPartitionEnabled)
            {
                var partitionName = value?.ToString();

                PartitionNameValidator.Validate(partitionName);

                var partitionResponse = await _mediator.GetPartitionAsync(partitionName);

                if (partitionResponse?.PartitionEntry != null)
                {
                    dicomRequestContext.DataPartitionEntry = partitionResponse.PartitionEntry;
                }
                // Only for STOW, we create partition based on the request.
                // For all other requests, we validate whether it exists and process based on the result
                else if (_storeRouteNames.Contains(routeName))
                {
                    var response = await _mediator.AddPartitionAsync(partitionName);
                    dicomRequestContext.DataPartitionEntry = response.PartitionEntry;
                }
                else
                {
                    throw new DataPartitionsNotFoundException(partitionName);
                }
            }

            await base.OnActionExecutionAsync(context, next);
        }