using System; using System.Collections.Generic; using System.Linq; using AudibleApi.Common; namespace InternalUtilities { public interface IValidator { IEnumerable Validate(IEnumerable items); } public class LibraryValidator : IValidator { public IEnumerable Validate(IEnumerable items) { var exceptions = new List(); if (items.Any(i => string.IsNullOrWhiteSpace(i.ProductId))) exceptions.Add(new ArgumentException($"Collection contains item(s) with null or blank {nameof(Item.ProductId)}", nameof(items))); if (items.Any(i => i.DateAdded < new DateTime(1980, 1, 1))) exceptions.Add(new ArgumentException($"Collection contains item(s) with invalid {nameof(Item.DateAdded)}", nameof(items))); return exceptions; } } public class BookValidator : IValidator { public IEnumerable Validate(IEnumerable items) { var exceptions = new List(); // a book having no authors is rare but allowed if (items.Any(i => string.IsNullOrWhiteSpace(i.ProductId))) exceptions.Add(new ArgumentException($"Collection contains item(s) with blank {nameof(Item.ProductId)}", nameof(items))); if (items.Any(i => string.IsNullOrWhiteSpace(i.Title))) exceptions.Add(new ArgumentException($"Collection contains item(s) with blank {nameof(Item.Title)}", nameof(items))); return exceptions; } } public class CategoryValidator : IValidator { public IEnumerable Validate(IEnumerable items) { var exceptions = new List(); var distinct = items.GetCategoriesDistinct(); if (distinct.Any(s => s.CategoryId is null)) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Categories)} with null {nameof(Ladder.CategoryId)}", nameof(items))); if (distinct.Any(s => s.CategoryName is null)) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Categories)} with null {nameof(Ladder.CategoryName)}", nameof(items))); return exceptions; } } public class ContributorValidator : IValidator { public IEnumerable Validate(IEnumerable items) { var exceptions = new List(); if (items.GetAuthorsDistinct().Any(a => string.IsNullOrWhiteSpace(a.Name))) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Authors)} with null {nameof(Person.Name)}", nameof(items))); if (items.GetNarratorsDistinct().Any(a => string.IsNullOrWhiteSpace(a.Name))) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Narrators)} with null {nameof(Person.Name)}", nameof(items))); return exceptions; } } public class SeriesValidator : IValidator { public IEnumerable Validate(IEnumerable items) { var exceptions = new List(); var distinct = items.GetSeriesDistinct(); if (distinct.Any(s => s.SeriesId is null)) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Series)} with null {nameof(AudibleApi.Common.Series.SeriesId)}", nameof(items))); if (distinct.Any(s => s.SeriesName is null)) exceptions.Add(new ArgumentException($"Collection contains {nameof(Item.Series)} with null {nameof(AudibleApi.Common.Series.SeriesName)}", nameof(items))); return exceptions; } } }