namespace TeleWave.Domain.Library; /// /// Вариант написания жанра для сопоставления с внешними источниками. Хранит уже нормализованное /// значение (см. ), поэтому поиск — это точное сравнение, без LIKE и без /// приведения регистра на стороне БД. /// /// Формы значения: числовой идентификатор провайдера (tmdb:28) либо имя жанра на любом языке /// (action, боевик, sci-fi). Один жанр справочника собирает под собой сколько /// угодно вариантов — так «Action» и «Action & Adventure» из TMDb сводятся к одному «Боевику». /// public class GenreAlias { public Guid Id { get; private set; } public Guid GenreId { get; private set; } /// Нормализованное значение — уникально по всему справочнику. public string Value { get; private set; } = string.Empty; private GenreAlias() { } internal static GenreAlias Create(Guid genreId, string value) => new() { Id = Guid.NewGuid(), GenreId = genreId, Value = Normalize(value), }; /// Приводит написание к каноничному виду: нижний регистр, схлопнутые пробелы, без краёв. public static string Normalize(string? value) { if (string.IsNullOrWhiteSpace(value)) return string.Empty; var trimmed = value.Trim().ToLowerInvariant(); return string.Join( ' ', trimmed.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ); } /// Псевдоним по идентификатору жанра во внешнем источнике (tmdb:28). public static string ProviderKey(string provider, string externalId) => Normalize($"{provider}:{externalId}"); }