using System.Collections.Generic; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Pf2e.Database.Model.Base.Targets; namespace Pf2e.Scrapper.Importers.Implementations.Aonprd.Helpers; /// /// Класс-помощник, хранящий необходимые глобальные данные. /// public class AonprdBuilderGlobals { /// /// Цель внешних ссылок Архивов Нефисов. /// public ExternalTarget AonprdTarget { get; set; } = null!; /// /// Словарь идентификаторов источников. /// public Dictionary SourceIds { get; } = []; /// /// Словарь идентификаторов признаков. /// public Dictionary TraitIds { get; } = []; /// /// Список идентификаторов сущностей, которые нужно игнорировать при обработке. /// public List Ignore { get; } = []; /// /// Словарей суффиксов для сущностей /// public Dictionary SlugSuffixes { get; } = []; /// /// Словарь допольнительных проверок связей. /// Ключ - устаревшая сущность, значение - обновлённая. /// public Dictionary LegacyRemasterExtra { get; } = []; /// /// Словарь сущностей, которые нужно слить с другой/другими. /// Ключ - пропускаемая сущность. Значение - целевая сущность. /// public Dictionary MergeSources { get; } = []; /// /// Словарь сущностей, которые нужно слить с другой/другими. /// Ключ - пропускаемая сущность. Значение - целевая сущность. /// public Dictionary SubclassGroups { get; } = []; /// /// Конструктор класса . /// public AonprdBuilderGlobals() { using StreamReader fileReader = new("Resources\\ImportAdaptation.json"); JObject? json = JObject .Parse(fileReader.ReadToEnd()) .SelectToken("Aonprd") ?.ToObject(); if (json is not null) { Ignore = json.SelectToken("Ignore")?.ToObject>() ?? []; SlugSuffixes = JsonToDictionary(json, "SlugSuffixes"); LegacyRemasterExtra = JsonToDictionary(json, "LegacyRemasterExtra"); MergeSources = JsonToDictionary(json, "MergeSources"); SubclassGroups = JsonToDictionary(json, "SubclassGroups"); } } /// /// Получить суффикс для ссылки. /// /// Идентификатор Aonprd. /// Суффикс для ссылки или пустая строка. public string GetSlugSuffix(string id) { return SlugSuffixes.TryGetValue(id, out string? slug) ? $"-{slug}" : string.Empty; } /// /// Преобразовать JSON-объект в словарь. /// /// Исходный JSON-объект. /// Путь к токену в JSON. /// Результирующий словарь. public static Dictionary JsonToDictionary(JObject json, string tokenPath) { return json.SelectToken(tokenPath)?.ToObject>() ?? []; } } /* Проверка уникальности: SELECT E.type, E.slug, COUNT(*), string_agg(E.id::text, ', ' ORDER BY E.id), string_agg(EE.external_id::text, ', ' ORDER BY E.id) FROM public.entities AS E INNER JOIN public.entity_externals AS EE ON EE.entity_id = E.id GROUP BY E.type, E.slug HAVING COUNT(*) > 1 AND E.type NOT IN ('rule', 'action') */