public void Initialize()
 {
     _result       = new WorkflowDataValidationResult();
     _propertyType = new PropertyType {
         PrimitiveType = PropertyPrimitiveType.Text
     };
 }
 public void Initialize()
 {
     _result       = new WorkflowDataValidationResult();
     _propertyType = new PropertyType {
         PrimitiveType = PropertyPrimitiveType.User
     };
     _users  = new List <SqlUser>();
     _groups = new List <SqlGroup>();
 }
Example #3
0
        public override void Validate(IePropertyChangeAction action, PropertyType propertyType, WorkflowDataValidationResult result)
        {
            if (!action.ValidValues.IsEmpty())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotChoicePropertyValidValuesNotApplicable
                });
                return;
            }

            if (action.PropertyValue != null)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredUserPropertyPropertyValueNotApplicable
                });
                return;
            }

            var usersGroups        = action.UsersGroups?.UsersGroups;
            var isUsersGroupsEmpty = action.UsersGroups == null || usersGroups.IsEmpty() && !action.UsersGroups.IncludeCurrentUser.GetValueOrDefault();

            if (!IsPropertyRequired(propertyType.IsRequired.GetValueOrDefault(), null, true, isUsersGroupsEmpty))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredPropertyValueEmpty
                });
                return;
            }

            if (usersGroups.IsEmpty())
            {
                return;
            }

            var usersMap   = _users.ToDictionary(u => u.UserId, u => u.Login);
            var groupsMap  = _groups.ToDictionary(g => g.GroupId, g => Tuple.Create(g.Name, g.ProjectId));
            var userNames  = usersMap.Values.ToHashSet();
            var groupNames = groupsMap.Values.ToHashSet();

            if (usersGroups == null || !usersGroups.Any())
            {
                return;
            }

            var processedUserIds    = new HashSet <int>();
            var processedUserNames  = new HashSet <string>();
            var processedGroupIds   = new HashSet <int>();
            var processedGroupNames = new HashSet <string>();

            foreach (var userGroup in usersGroups)
            {
                if (userGroup.IsGroup.GetValueOrDefault())
                {
                    // Update Name where Id is present (to null if Id is not found)
                    if (!_ignoreIds && userGroup.Id.HasValue)
                    {
                        Tuple <string, int?> nameProject;
                        if (!groupsMap.TryGetValue(userGroup.Id.Value, out nameProject))
                        {
                            result.Errors.Add(new WorkflowDataValidationError
                            {
                                Element   = action.PropertyName,
                                ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionGroupNotFoundById
                            });
                            return;
                        }

                        if (processedGroupIds.Contains(userGroup.Id.Value))
                        {
                            result.Errors.Add(new WorkflowDataValidationError
                            {
                                Element   = action.PropertyName,
                                ErrorCode = WorkflowDataValidationErrorCodes
                                            .PropertyChangeActionDuplicateUserOrGroupFound
                            });
                            return;
                        }

                        processedGroupIds.Add(userGroup.Id.Value);

                        userGroup.Name = nameProject.Item1;
                    }

                    if (!groupNames.Contains(Tuple.Create(userGroup.Name, userGroup.GroupProjectId)))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionGroupNotFoundByName
                        });
                        return;
                    }

                    if (_ignoreIds)
                    {
                        if (processedGroupNames.Contains(userGroup.Name))
                        {
                            result.Errors.Add(new WorkflowDataValidationError
                            {
                                Element   = action.PropertyName,
                                ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDuplicateUserOrGroupFound
                            });
                            return;
                        }

                        processedGroupNames.Add(userGroup.Name);
                    }
                }
                else
                {
                    // Update Name where Id is present (to null if Id is not found)
                    if (!_ignoreIds && userGroup.Id.HasValue)
                    {
                        string name;
                        if (!usersMap.TryGetValue(userGroup.Id.Value, out name))
                        {
                            result.Errors.Add(new WorkflowDataValidationError
                            {
                                Element   = action.PropertyName,
                                ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionUserNotFoundById
                            });
                            return;
                        }

                        if (processedUserIds.Contains(userGroup.Id.Value))
                        {
                            result.Errors.Add(new WorkflowDataValidationError
                            {
                                Element   = action.PropertyName,
                                ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDuplicateUserOrGroupFound
                            });
                            return;
                        }

                        processedUserIds.Add(userGroup.Id.Value);

                        userGroup.Name = name;
                    }

                    if (!userNames.Contains(userGroup.Name))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionUserNotFoundByName
                        });
                        return;
                    }

                    if (processedUserNames.Contains(userGroup.Name))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDuplicateUserOrGroupFound
                        });
                        return;
                    }

                    processedUserNames.Add(userGroup.Name);
                }
            }
        }
        public override void Validate(IePropertyChangeAction action, PropertyType propertyType, WorkflowDataValidationResult result)
        {
            if (action.UsersGroups != null)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotUserPropertyUsersGroupsNotApplicable
                });
                return;
            }

            if (!IsPropertyRequired(propertyType.IsRequired.GetValueOrDefault(), action.PropertyValue, action.ValidValues.IsEmpty(), true))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredPropertyValueEmpty
                });
                return;
            }

            if (!propertyType.IsMultipleAllowed.GetValueOrDefault() && action.ValidValues?.Count > 1)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionChoicePropertyMultipleValidValuesNotAllowed
                });
                return;
            }

            if (propertyType.IsValidated.GetValueOrDefault() &&
                !string.IsNullOrEmpty(action.PropertyValue) &&
                action.ValidValues.IsEmpty())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionChoiceValueSpecifiedAsNotValidated
                });
                return;
            }

            if (action.ValidValues == null || !action.ValidValues.Any())
            {
                return;
            }

            var validValuesMap   = propertyType.ValidValues.ToDictionary(vv => vv.Id, vv => vv.Value);
            var validValueValues = validValuesMap.Values.ToHashSet();

            var processedValidValueIds    = new HashSet <int>();
            var processedValidValueValues = new HashSet <string>();

            foreach (var validValue in action.ValidValues)
            {
                // Update Name where Id is present (to null if Id is not found)
                if (!_ignoreIds && validValue.Id.HasValue)
                {
                    string value;
                    if (!validValuesMap.TryGetValue(validValue.Id.Value, out value))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionValidValueNotFoundById
                        });
                        return;
                    }

                    if (processedValidValueIds.Contains(validValue.Id.Value))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDuplicateValidValueFound
                        });
                        return;
                    }

                    processedValidValueIds.Add(validValue.Id.Value);

                    validValue.Value = value;
                }

                if (!validValueValues.Contains(validValue.Value))
                {
                    result.Errors.Add(new WorkflowDataValidationError
                    {
                        Element   = action.PropertyName,
                        ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionValidValueNotFoundByValue
                    });
                    return;
                }

                if (_ignoreIds)
                {
                    if (processedValidValueValues.Contains(validValue.Value))
                    {
                        result.Errors.Add(new WorkflowDataValidationError
                        {
                            Element   = action.PropertyName,
                            ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDuplicateValidValueFound
                        });
                        return;
                    }

                    processedValidValueValues.Add(validValue.Value);
                }
            }
        }
 public abstract void Validate(IePropertyChangeAction action, PropertyType propertyType, WorkflowDataValidationResult result);
        public override void Validate(IePropertyChangeAction action, PropertyType propertyType,
                                      WorkflowDataValidationResult result)
        {
            if (!action.ValidValues.IsEmpty())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes
                                .PropertyChangeActionNotChoicePropertyValidValuesNotApplicable
                });
                return;
            }

            if (action.UsersGroups != null)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes
                                .PropertyChangeActionNotUserPropertyUsersGroupsNotApplicable
                });
                return;
            }

            if (!IsPropertyRequired(propertyType.IsRequired.GetValueOrDefault(), action.PropertyValue, true, true))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredPropertyValueEmpty
                });
                return;
            }

            if (string.IsNullOrWhiteSpace(action.PropertyValue))
            {
                return;
            }

            // For "Today+/-{the number of days)" date format we do not validate Min and Max constraints.
            int relativeToTodayDays;

            if (int.TryParse(action.PropertyValue, out relativeToTodayDays))
            {
                return;
            }

            DateTime dateValue;

            if (!DateTime.TryParseExact(action.PropertyValue, WorkflowConstants.Iso8601DateFormat,
                                        CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionInvalidDateFormat
                });
                return;
            }

            if (dateValue.Date < MinAllowedDate)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDateOutOfRange
                });
            }

            if (!propertyType.IsValidated.HasValue || !propertyType.IsValidated.Value)
            {
                return;
            }

            if (dateValue.Date < propertyType.MinDate.Value.Date || dateValue.Date > propertyType.MaxDate.Value.Date)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionDateOutOfRange
                });
            }
        }
Example #7
0
        public override void Validate(IePropertyChangeAction action, PropertyType propertyType, WorkflowDataValidationResult result)
        {
            if (!action.ValidValues.IsEmpty())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotChoicePropertyValidValuesNotApplicable
                });
                return;
            }

            if (action.UsersGroups != null)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotUserPropertyUsersGroupsNotApplicable
                });
                return;
            }

            if (!IsPropertyRequired(propertyType.IsRequired.GetValueOrDefault(), action.PropertyValue, true, true))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredPropertyValueEmpty
                });
            }
        }
        public override void Validate(IePropertyChangeAction action, PropertyType propertyType, WorkflowDataValidationResult result)
        {
            if (!action.ValidValues.IsEmpty())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotChoicePropertyValidValuesNotApplicable
                });
                return;
            }

            if (action.UsersGroups != null)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNotUserPropertyUsersGroupsNotApplicable
                });
                return;
            }

            if (!IsPropertyRequired(propertyType.IsRequired.GetValueOrDefault(), action.PropertyValue, true, true))
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionRequiredPropertyValueEmpty
                });
                return;
            }

            decimal numberValue;

            if (!decimal.TryParse(action.PropertyValue, NumberStyles.Number, CultureInfo.InvariantCulture, out numberValue))
            {
                if (!string.IsNullOrWhiteSpace(action.PropertyValue))
                {
                    result.Errors.Add(new WorkflowDataValidationError
                    {
                        Element   = action.PropertyName,
                        ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionInvalidNumberFormat
                    });
                    return;
                }
            }

            if (!propertyType.IsValidated.GetValueOrDefault() ||
                string.IsNullOrWhiteSpace(action.PropertyValue))
            {
                return;
            }

            var index         = action.PropertyValue.IndexOf(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator, StringComparison.Ordinal);
            var decimalPlaces = index == -1 ? 0 : action.PropertyValue.Length - index - 1;

            if (decimalPlaces > propertyType.DecimalPlaces.GetValueOrDefault())
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionInvalidNumberDecimalPlaces
                });
                return;
            }

            if (numberValue < propertyType.MinNumber.Value || numberValue > propertyType.MaxNumber.Value)
            {
                result.Errors.Add(new WorkflowDataValidationError
                {
                    Element   = action.PropertyName,
                    ErrorCode = WorkflowDataValidationErrorCodes.PropertyChangeActionNumberOutOfRange
                });
            }
        }