Esempio n. 1
0
        public async Task <IActionResult> AssignDatasetSchema([FromBody] AssignDatasetSchemaUpdateViewModel viewModel,
                                                              [FromRoute] string specificationId)
        {
            Guard.ArgumentNotNull(viewModel.Name, nameof(viewModel.Name));
            Guard.ArgumentNotNull(viewModel.DatasetDefinitionId, nameof(viewModel.DatasetDefinitionId));
            Guard.ArgumentNotNull(viewModel.Description, nameof(viewModel.Description));

            ApiResponse <SpecificationSummary> specificationResponse =
                await _specificationsApiClient.GetSpecificationSummaryById(specificationId);

            if (specificationResponse == null || specificationResponse.StatusCode == HttpStatusCode.NotFound)
            {
                return(new NotFoundObjectResult(
                           $"Unable to get specification response. Specification Id value = {specificationId}"));
            }

            if (specificationResponse.StatusCode == HttpStatusCode.OK && specificationResponse.Content == null)
            {
                throw new InvalidOperationException(
                          $"Unable to retrieve specification model from the response. Specification Id value = {specificationId}");
            }

            bool isAuthorizedToEdit = await _authorizationHelper.DoesUserHavePermission(User,
                                                                                        specificationResponse.Content.GetSpecificationId(), SpecificationActionTypes.CanEditSpecification);

            if (!isAuthorizedToEdit)
            {
                return(new ForbidResult());
            }

            if (!string.IsNullOrWhiteSpace(viewModel.Name))
            {
                ApiResponse <DefinitionSpecificationRelationship> existingRelationshipResponse =
                    await _datasetApiClient.GetRelationshipBySpecificationIdAndName(specificationId, viewModel.Name);

                if (existingRelationshipResponse.StatusCode != HttpStatusCode.NotFound)
                {
                    this.ModelState.AddModelError(
                        $"{nameof(AssignDatasetSchemaViewModel)}.{nameof(AssignDatasetSchemaViewModel.Name)}",
                        ValidationMessages.RelationshipNameAlreadyExists);
                }
            }

            if (!ModelState.IsValid)
            {
                if (specificationResponse.StatusCode == HttpStatusCode.OK)
                {
                    SpecificationSummary specContent = specificationResponse.Content;

                    ApiResponse <IEnumerable <DatasetDefinition> > datasetResponse =
                        await _datasetApiClient.GetDatasetDefinitions();

                    if (datasetResponse == null || datasetResponse.StatusCode == HttpStatusCode.NotFound)
                    {
                        return(new NotFoundObjectResult(ErrorMessages.DatasetDefinitionNotFoundInDatasetService));
                    }

                    if (datasetResponse.StatusCode == HttpStatusCode.OK)
                    {
                        IEnumerable <DatasetDefinition> datasetDefinitionList = datasetResponse.Content;

                        if (datasetDefinitionList == null)
                        {
                            throw new InvalidOperationException(
                                      $"Unable to retrieve Dataset definition from the response. Specification Id value = {specificationId}");
                        }
                    }
                    else
                    {
                        return(new StatusCodeResult(500));
                    }
                }
            }

            CreateDefinitionSpecificationRelationshipModel datasetSchema =
                new CreateDefinitionSpecificationRelationshipModel
            {
                Name                   = viewModel.Name,
                SpecificationId        = specificationId,
                DatasetDefinitionId    = viewModel.DatasetDefinitionId,
                Description            = viewModel.Description,
                IsSetAsProviderData    = viewModel.IsSetAsProviderData,
                UsedInDataAggregations = false
            };

            ApiResponse <DefinitionSpecificationRelationship> newAssignDatasetResponse =
                await _datasetApiClient.CreateRelationship(datasetSchema);

            if (newAssignDatasetResponse?.StatusCode == HttpStatusCode.OK)
            {
                return(new OkObjectResult(true));
            }

            return(new StatusCodeResult(500));
        }