Я ищу элегантное решение для древовидной структуры
Я максимально упрощу его, но реальная структура намного сложнее, чем эта
type LeafComponent {
someData
}
type NodeComponent {
renderComponents: [Component!]!
}
union Component = LeafComponent | NodeComponent
тогда у нас есть сущность root, которая похожа на NodeComponent, но также содержит каталог компонентов. Компоненты создаются пользователем, поэтому у нас есть каталог, и затем их можно сделать видимыми или невидимыми - поэтому у нас также есть renderComponents.
Итак, сущность в No SQL db выглядит так:
{
masterId: 123456,
catalog: [
{ id: 1, type: 'Node', renderComponentIds: [2, 3] },
{ id: 2, type: 'Leaf' },
{ id: 3, type: 'Node', renderComponentIds: [5] }
{ id: 4, type: 'Leaf' },
{ id: 5, type: 'Leaf' }
],
renderComponentIds: [1, 4]
}
А теперь - какой хороший способ преобразовать ссылку ID внутри NodeComponent в сам компонент, чтобы вы могли иметь запрос вроде
renderComponents {
...on LeafComponent {
someData
}
...on NodeComponent {
renderComponents {
...etc.
}
}
}
}
На первом уровне это легко, потому что рядом с renderComponents у меня есть каталог, поэтому я просто нахожу идентификатор в каталоге и возвращаю компонент с идентификатором
@ResolveProperty('renderComponents', _returns => [Component])
async renderComponents(@Parent() root: Root): Promise<Component[]> {
return root.renderComponentIds.map(id => root.catalog.find(comp => comp.id = id));
}
, но когда я начинаю работать с вложением через настраиваемый Resolver of NodeComponent - я потеряете каталог и не сможете легко преобразовать идентификаторы в компоненты. Есть ли простой и умный способ отправить каталог всем NodeComponents или мне нужно go через объект, который я получаю из базы данных, и внедрить этот каталог во всех дочерних элементов, у которых есть renderComponentIds? Есть ли способ обмениваться данными между резолверами - я на 100% уверен, что у меня есть каталог, поскольку я всегда обращаюсь ко всей структуре, которая хранится в БД как к единому объекту - я просто использую идентификаторы, чтобы уменьшить структуру.