103 lines
3.6 KiB
C#
103 lines
3.6 KiB
C#
using BpsRwApp.Models;
|
|
|
|
namespace BpsRwApp.Services;
|
|
|
|
/// <summary>
|
|
/// Implementation of validation service
|
|
/// </summary>
|
|
public class ValidationService : IValidationService
|
|
{
|
|
/// <inheritdoc/>
|
|
public ValidationResult ValidateStatistics(StatisticsModel statistics)
|
|
{
|
|
if (statistics == null)
|
|
return ValidationResult.Failure("Statistics model is required");
|
|
|
|
var errors = new List<string>();
|
|
|
|
if (statistics.TotalUsers < 0)
|
|
errors.Add("Total users cannot be negative");
|
|
|
|
if (statistics.WasteCollected < 0)
|
|
errors.Add("Waste collected cannot be negative");
|
|
|
|
if (statistics.RewardsDistributed < 0)
|
|
errors.Add("Rewards distributed cannot be negative");
|
|
|
|
if (statistics.EnvironmentImpact < 0 || statistics.EnvironmentImpact > 100)
|
|
errors.Add("Environment impact must be between 0 and 100");
|
|
|
|
return errors.Any() ? ValidationResult.Failure(errors) : ValidationResult.Success();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public ValidationResult ValidateFeature(FeatureModel feature)
|
|
{
|
|
if (feature == null)
|
|
return ValidationResult.Failure("Feature model is required");
|
|
|
|
var errors = new List<string>();
|
|
|
|
var titleValidation = ValidateRequiredString(feature.Title, "Title", 100);
|
|
if (!titleValidation.IsValid)
|
|
errors.AddRange(titleValidation.Errors);
|
|
|
|
var descriptionValidation = ValidateRequiredString(feature.Description, "Description", 500);
|
|
if (!descriptionValidation.IsValid)
|
|
errors.AddRange(descriptionValidation.Errors);
|
|
|
|
var iconValidation = ValidateRequiredString(feature.Icon, "Icon", 10);
|
|
if (!iconValidation.IsValid)
|
|
errors.AddRange(iconValidation.Errors);
|
|
|
|
return errors.Any() ? ValidationResult.Failure(errors) : ValidationResult.Success();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public ValidationResult ValidateDateRange(DateTime startDate, DateTime endDate)
|
|
{
|
|
var errors = new List<string>();
|
|
|
|
if (startDate > endDate)
|
|
errors.Add("Start date cannot be greater than end date");
|
|
|
|
if (startDate > DateTime.UtcNow)
|
|
errors.Add("Start date cannot be in the future");
|
|
|
|
if (endDate > DateTime.UtcNow)
|
|
errors.Add("End date cannot be in the future");
|
|
|
|
var maxRangeDays = 365; // 1 year maximum
|
|
if ((endDate - startDate).Days > maxRangeDays)
|
|
errors.Add($"Date range cannot exceed {maxRangeDays} days");
|
|
|
|
return errors.Any() ? ValidationResult.Failure(errors) : ValidationResult.Success();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public ValidationResult ValidateRequiredString(string? value, string fieldName, int maxLength = int.MaxValue)
|
|
{
|
|
var errors = new List<string>();
|
|
|
|
if (string.IsNullOrWhiteSpace(value))
|
|
errors.Add($"{fieldName} is required");
|
|
else if (value.Length > maxLength)
|
|
errors.Add($"{fieldName} cannot exceed {maxLength} characters");
|
|
|
|
return errors.Any() ? ValidationResult.Failure(errors) : ValidationResult.Success();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public ValidationResult ValidateNumericRange(decimal value, string fieldName, decimal minValue = 0, decimal maxValue = decimal.MaxValue)
|
|
{
|
|
var errors = new List<string>();
|
|
|
|
if (value < minValue)
|
|
errors.Add($"{fieldName} cannot be less than {minValue}");
|
|
|
|
if (value > maxValue)
|
|
errors.Add($"{fieldName} cannot be greater than {maxValue}");
|
|
|
|
return errors.Any() ? ValidationResult.Failure(errors) : ValidationResult.Success();
|
|
}
|
|
} |