Exemplo n.º 1
0
        public async Task <List <ValidationIssue> > ValidateDataElement(Instance instance, DataType dataType, DataElement dataElement)
        {
            _logger.LogInformation($"Validation of data element {dataElement.Id} of instance {instance.Id}");

            // Todo. Figure out where to get this from
            Dictionary <string, Dictionary <string, string> > serviceText = new Dictionary <string, Dictionary <string, string> >();

            List <ValidationIssue> messages = new List <ValidationIssue>();

            if (dataElement.ContentType == null)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.MissingContentType,
                    DataElementId = dataElement.Id,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = ServiceTextHelper.GetServiceText(
                        ValidationIssueCodes.DataElementCodes.MissingContentType, serviceText, null, "nb")
                };
                messages.Add(message);
            }
            else
            {
                string contentTypeWithoutEncoding = dataElement.ContentType.Split(";")[0];

                if (dataType.AllowedContentTypes.All(ct => !ct.Equals(contentTypeWithoutEncoding, StringComparison.OrdinalIgnoreCase)))
                {
                    ValidationIssue message = new ValidationIssue
                    {
                        InstanceId    = instance.Id,
                        DataElementId = dataElement.Id,
                        Code          = ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed,
                        Severity      = ValidationIssueSeverity.Error,
                        Description   = ServiceTextHelper.GetServiceText(
                            ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed, serviceText, null, "nb")
                    };
                    messages.Add(message);
                }
            }

            if (dataType.MaxSize.HasValue && dataType.MaxSize > 0 && (long)dataType.MaxSize * 1024 * 1024 < dataElement.Size)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    DataElementId = dataElement.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.DataElementTooLarge,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = ServiceTextHelper.GetServiceText(
                        ValidationIssueCodes.DataElementCodes.DataElementTooLarge, serviceText, null, "nb")
                };
                messages.Add(message);
            }

            if (dataType.AppLogic != null)
            {
                Type    modelType            = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
                Guid    instanceGuid         = Guid.Parse(instance.Id.Split("/")[1]);
                string  app                  = instance.AppId.Split("/")[1];
                int     instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);
                dynamic data                 = _dataService.GetFormData(instanceGuid, modelType, instance.Org, app, instanceOwnerPartyId, Guid.Parse(dataElement.Id));

                var context = new ValidationContext(data);
                List <System.ComponentModel.DataAnnotations.ValidationResult> validationResults = new List <System.ComponentModel.DataAnnotations.ValidationResult>();
                bool isValid = await _altinnApp.RunValidation(data.Result, modelType, validationResults);

                isValid = Validator.TryValidateObject(data, context, validationResults, true) && isValid;

                if (!isValid)
                {
                    messages.AddRange(MapModelStateToIssueList(instance, validationResults, dataElement.Id, dataElement.DataType, serviceText));
                }
            }

            return(messages);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Method that maps the MVC Model state to the ApiResult for the client.
        /// </summary>
        /// <param name="modelState">The model state.</param>
        /// <param name="apiResult">The api result.</param>
        /// <param name="serviceContext">The service context.</param>
        private void MapModelStateToApiResultForClient(ModelStateDictionary modelState, ApiResult apiResult, ServiceContext serviceContext)
        {
            apiResult.ValidationResult = new ApiValidationResult
            {
                Messages = new Dictionary <string, ApiValidationMessages>()
            };

            bool containsErrors   = false;
            bool containsWarnings = false;

            foreach (string modelKey in modelState.Keys)
            {
                ModelState.TryGetValue(modelKey, out ModelStateEntry entry);

                if (entry != null && entry.ValidationState == ModelValidationState.Invalid)
                {
                    foreach (ModelError error in entry.Errors)
                    {
                        if (error.ErrorMessage.StartsWith(_generalSettings.SoftValidationPrefix))
                        {
                            containsWarnings = true;

                            // Remove prefix for soft validation
                            string errorMesssage = error.ErrorMessage.Substring(9);
                            if (apiResult.ValidationResult.Messages.ContainsKey(modelKey))
                            {
                                apiResult.ValidationResult.Messages[modelKey].Warnings.Add(ServiceTextHelper.GetServiceText(errorMesssage, serviceContext.ServiceText, null, "nb-NO"));
                            }
                            else
                            {
                                apiResult.ValidationResult.Messages.Add(modelKey, new ApiValidationMessages
                                {
                                    Errors   = new List <string>(),
                                    Warnings = new List <string>
                                    {
                                        ServiceTextHelper.GetServiceText(errorMesssage, serviceContext.ServiceText, null, "nb-NO")
                                    }
                                });
                            }
                        }
                        else
                        {
                            containsErrors = true;
                            if (apiResult.ValidationResult.Messages.ContainsKey(modelKey))
                            {
                                apiResult.ValidationResult.Messages[modelKey].Errors.Add(ServiceTextHelper.GetServiceText(error.ErrorMessage, serviceContext.ServiceText, null, "nb-NO"));
                            }
                            else
                            {
                                apiResult.ValidationResult.Messages.Add(modelKey, new ApiValidationMessages
                                {
                                    Errors = new List <string>
                                    {
                                        ServiceTextHelper.GetServiceText(error.ErrorMessage, serviceContext.ServiceText, null, "nb-NO")
                                    },
                                    Warnings = new List <string>(),
                                });
                            }
                        }
                    }
                }
            }

            if (containsErrors)
            {
                apiResult.Status = ApiStatusType.ContainsError;
            }
            else if (containsWarnings)
            {
                apiResult.Status = ApiStatusType.ContainsWarnings;
            }
        }