Использование prisma клиента с определителями отношений - PullRequest
0 голосов
/ 17 января 2019

Я использую клиент Prisma на моем сервере GraphQL.

Следуя рекомендациям, я сделал слой распознавателя просто тонким слоем, который делегирует фактическую выборку данных слою доступа к данным. Уровень доступа к данным также выполняет такие вещи, как авторизация и кэширование на уровне запросов с использованием dataloader .

Я не могу найти хороший способ извлечения отношений сущностей в этой настройке, потому что клиент prisma использует цепочку вызовов функций для объекта обещания для извлечения отношений, но, поскольку мой распознаватель не вызывает напрямую клиента prisma, он не ' у него нет доступа к обещанию клиента призмы, и поэтому он не может вызывать функции связанных отношений.

См. Следующий пример:

Пример модели данных:

type Apartment {
  id:               ID!
  floor:            Int
  building:         Building        @pgRelation(column: "building_id")
}

type Building {
  id:               ID!
  buildingNumber:   Int
}

Пример резольвера для квартиры:

module.exports = {
  Query: {
    apartment: async (parent, { where }, { apartmentDAO }) => {
      return apartmentDAO.apartment(where);
    }
  },
  Apartment: {
    building: async (parent, args, { buildingDAO }) => {
      return buildingDAO.buildingByApartmentId(parent.id);
    }
  }
};

Пример реализации buildingByApartmentId на уровне доступа к данным:

buildingByApartmentId: (apartmentId) => {
  // Some authorization logic goes here
  // Some other common data access logic goes here
  // ....
  return prismaClient.apartment({ id: apartmentId }).building();
}

Это не очень хорошая реализация по нескольким причинам:

  1. Я уже получил квартиру, так как она существует в тайнике, но я не могу использовать ее повторно, потому что мне нужно снова выбрать квартиру, чтобы добраться до здания.
  2. Для каждого отношения в квартире мне нужно будет реализовать специальную функцию, подобную этой, для извлечения этого конкретного отношения с помощью apartemntId. Это расточительно и упускает из виду призму реализации большинства запросов для меня.

Есть ли лучший способ реализовать это, которого мне не хватает?

Я знаю, что привязка к призме решит эту проблему, но:

  1. Клиент Prisma кажется более современным способом использования primsa.
  2. Для авторизации клиент prisma намного мощнее.
...