using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Cleanuparr.Domain.Entities;
namespace Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
public sealed record QueueCleanerConfig : IJobConfig
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; init; } = Guid.NewGuid();
public bool Enabled { get; set; }
public string CronExpression { get; set; } = "0 0/5 * * * ?";
///
/// Indicates whether to use the CronExpression directly or convert from a user-friendly schedule
///
public bool UseAdvancedScheduling { get; set; } = false;
public FailedImportConfig FailedImport { get; set; } = new();
public List IgnoredDownloads { get; set; } = [];
public ushort DownloadingMetadataMaxStrikes { get; set; }
public List StallRules { get; set; } = [];
public List SlowRules { get; set; } = [];
public void Validate()
{
FailedImport.Validate();
if (DownloadingMetadataMaxStrikes is > 0 and < 3)
{
throw new ValidationException("the minimum value for downloading metadata max strikes must be 3");
}
foreach (var rule in StallRules)
{
rule.Validate();
}
foreach (var rule in SlowRules)
{
rule.Validate();
}
// Check for duplicate names within each rule type
var stallNames = StallRules.Where(r => r.Enabled).Select(r => r.Name).ToList();
if (stallNames.Count != stallNames.Distinct().Count())
{
throw new Cleanuparr.Domain.Exceptions.ValidationException("Duplicate stall rule names found");
}
var slowNames = SlowRules.Where(r => r.Enabled).Select(r => r.Name).ToList();
if (slowNames.Count != slowNames.Distinct().Count())
{
throw new Cleanuparr.Domain.Exceptions.ValidationException("Duplicate slow rule names found");
}
}
}