Что есть сейчас:
Эндпоинт для комментариев, который отдает по n (стандартно 10) комментариев, отвечающих условиям запроса, общее число число комментариев и две ссылки для пагинации на следующие и предыдущие n комментариев.
Комментарии связанны друг с другом через nulluble ключ parentId. Каждый комментарий содержит поле, указывающее на количество всех потомков, независимо от уровня вложенности и коллекцию самих потомков, которые подгружаются по необходимости (код коллекции ниже).
На фронте я получаю первые n корневых комментариев (где parentId null) и по нажатию на кнопку подгружаю следующие.
export class Collection<T> extends ArrayCollection<T>
{
protected query: Query<T>|null;
protected countResults: Number|null;
public isLoading: boolean;
constructor(query: Query<T> = null) {
super();
this.query = query
this.countResults = null
this.isLoading = false
}
async load(): Promise<void> {
if (this.isLoading) return ;
this.isLoading = true
if (this.hasMore) {
const result = await this.query.execute()
if (result) {
this.query = result.next
this.countResults = result.count
this.push(... result.results)
} else {
this.query = null
}
}
this.isLoading = false;
}
get hasMore() {
return this.query !== null
}
get count(): Number
{
if (!this.countResults) return 0
return this.countResults
}
async loadAll(): Promise<void> {
while (this.hasMore) await this.load()
}
}
При добавлении нового комментария он прилетает с сервера по вебсокетам обратно во фронт и добавляется в соответствующую коллекцию (зависит от уровня вложенности). Но при загрузке всех комментариев из одной коллекции это ведет к удвоению новых комментариев на фронте, т.к. он уже прилетел по сокетам.
Плюс не знаю как лучше подгружать дочерние комментарии грузить коллекцию по уровням или рекурсией тянуть все дочерние комментарии ( и как тогда быть с пагинацией и рендорингом).