Как реализовать социальную сеть по запросу ленты с помощью Prisma 2?

У меня есть вопрос, связанный с написанием запроса канала в стиле социальных сетей, но в данном случае я использую Prisma 2. У меня есть музыкальное приложение, в котором я хотел бы отображать канал всех Albums из Artists, за которым следует User.

В моем schema.prisma есть следующие модели:

Пользователь

model User {
  id         Int      @id @default(autoincrement())
  email      String   @unique
  following  Artist[]
}

Художник

model Artist {
  id        Int     @id @default(autoincrement())
  name      String
  followers User[]
  albums    Album[]
}

Prisma создает неявную таблицу соединения с именем UserToArtist, чтобы отслеживать, когда User следует за Artist

Альбом

model Album {
  id          Int      @id @default(autoincrement())
  title       String
  date        DateTime <-- this is an ISO date string
  artists     Artist[] <-- an album can have several artists
}

Prisma создает неявную таблицу соединений с именем ArtistToAlbum, чтобы отслеживать, какие Artists связаны с определенными Albums.


Итак, как я могу создать запрос Prisma, чтобы найти все альбомы исполнителей, на которые подписан пользователь, отсортированные по Album дате? Это была моя первая попытка, но это не похоже на правильность, и альбомы не отсортированы по дате:

const results = await ctx.db.album.findMany({
  where: {
    date: {
      gt: moment().startOf('day').toISOString()
    },
    artists: {
      some: {
        followers: {
          some: {
            id: args.userId, <-- the userId for the feed
          },
        },
      },
    },
  },
  orderBy: {
    date: 'asc',
  },
})

Обратите внимание, как мне нужно отфильтровать два some операторов? Просто не кажется правильным ... Какие рекомендации вы можете дать по подобному запросу? Спасибо!


person Jordan Lewallen    schedule 18.07.2020    source источник


Ответы (1)


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

const followedArtists = await ctx.db.user.findOne({ where: { id: args.userId, } }).following()

Отсюда вы можете взять альбомы всех этих исполнителей, а затем отсортировать их в коде сервера, чтобы затем отправить обратно в качестве результата запроса.

person Rodentman87    schedule 18.07.2020