Использование prisma клиента с определителями отношений
Я использую Prisma клиент в моем сервере GraphQL.
Следуя рекомендациям, я сделал слой распознавателя просто тонким слоем, который делегирует фактическую выборку данных уровню доступа к данным. Уровень доступа к данным также выполняет такие вещи, как авторизация и кэширование на уровне запросов с использованием загрузчика данных.
Я не могу найти хороший способ извлечения отношений сущностей в этой настройке, потому что клиент 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();
}
Это не очень хорошая реализация по нескольким причинам:
- Я уже принесла квартиру, так как она существует в тайнике, но я не могу использовать ее повторно, потому что мне нужно снова забрать квартиру, чтобы добраться до здания.
- Для каждого отношения в квартире мне нужно будет реализовать специальную функцию, подобную этой, для извлечения этого конкретного отношения с помощью apartemntId. Это расточительно и упускает из виду призму реализации большинства запросов для меня.
Есть ли лучший способ реализовать это, что мне не хватает?
Я знаю, что привязка к призме решит эту проблему, но:
- Клиент Prisma кажется более современным способом использования primsa.
- В целях авторизации клиент Prisma гораздо более мощный.