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);
}