@eugenedrvnk

Как придерживаться разделения ответственности между репозиториями?

В приложении есть необходимость получить список юзеров с постами для каждого из юзеров:

[
  {id: 1, username: 'xyz', age: 22, posts: [{id: 1, title: 'first post'},
  {id: 2, username: 'aaa', age: 41, posts: [{id: 41, title: 'hello'},
] // и так далее...


У меня уже отдельно имплементированы репозитории где можно получить либо только юзеров, либо только посты.
Для юзкейса с получением юзеров включая в них посты, будет ли ок сначала получить юзеров и потом для них фетчить посты?

const users = await this.userRepository.findLatest();
const postsByUserIds = await this.postRepository.findByUserIds(users.map(user => user.id));
return users.map((user) => {
  return {
     ...user,
     posts: postsByUserIds(user.id)  
  }
})


Или же лучше создать в UserReposotory метод findWithPosts в котором просто дополнительно тянуть посты для каждого юзера?
Просто в этом случае тогда вроде как нарушается разделение ответственности. Но такой способ вроде выглядит проще.
А предыдущий - в плане разделения ответственности гуд, но по производительности из-за дополнительных циклов вроде бы хуже.
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
1) Используйте ORM, там эти проблемы уже решены.
2) Самый правильный вариант - получать посты по требованию (так называемый lazy loading). Я это говорю, опираясь на то предположение, что пользователь может написать тысячи постов по тысяче символов. Если постов не много и они короткие - можно получать сразу всё через JOIN.
3) Получать список пользователей вместе со список их постов в API звучит как анти-паттерн какой-то. Точно ли такой роут необходим или есть возможность получить посты для выбранного пользователя отдельно?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект
21 нояб. 2024, в 19:09
5000 руб./за проект