示例#1
0
        public static int GetPartitionKey(this IDicomRequestContext dicomRequestContext)
        {
            EnsureArg.IsNotNull(dicomRequestContext, nameof(dicomRequestContext));

            var partitionKey = dicomRequestContext.DataPartitionEntry?.PartitionKey;

            EnsureArg.IsTrue(partitionKey.HasValue, nameof(partitionKey));
            return(partitionKey.Value);
        }
示例#2
0
        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);
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            EnsureArg.IsNotNull(context, nameof(context));
            IDicomRequestContext dicomRequestContext = _dicomRequestContextAccessor.DicomRequestContext;

            dicomRequestContext.RouteName = context.ActionDescriptor?.AttributeRouteInfo?.Name;

            // Set StudyInstanceUid, SeriesInstanceUid, and SopInstanceUid based on the route data
            RouteData routeData = context.RouteData;

            if (routeData?.Values != null)
            {
                // Try to get StudyInstanceUid
                if (routeData.Values.TryGetValue(KnownActionParameterNames.StudyInstanceUid, out object studyInstanceUid))
                {
                    dicomRequestContext.StudyInstanceUid = studyInstanceUid.ToString();

                    // Try to get SeriesInstanceUid only if StudyInstanceUid was successfully fetched.
                    if (routeData.Values.TryGetValue(KnownActionParameterNames.SeriesInstanceUid, out object seriesInstanceUid))
                    {
                        dicomRequestContext.SeriesInstanceUid = seriesInstanceUid.ToString();

                        // Try to get SopInstanceUid only if StudyInstanceUid and SeriesInstanceUid were fetched successfully.
                        if (routeData.Values.TryGetValue(KnownActionParameterNames.SopInstanceUid, out object sopInstanceUid))
                        {
                            dicomRequestContext.SopInstanceUid = sopInstanceUid.ToString();
                        }
                    }
                }
            }

            if (context.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
            {
                dicomRequestContext.AuditEventType = _auditEventTypeMapping.GetAuditEventType(
                    controllerActionDescriptor.ControllerName,
                    controllerActionDescriptor.ActionName);
            }

            base.OnActionExecuting(context);
        }