Оставайтесь DRY и Type-Safe с помощью шаблона предварительной выборки для приложений с поддержкой Prisma

Нам нравится использовать Prisma от Graphcool и GraphQL (graphql-yoga) в Smidyo, но недостатком является то, что они оба являются молодыми технологиями. Так что кажется, что некоторые вещи еще не совсем понятны. Похоже, что нет единого мнения о том, что является наилучшей практикой. Итак, вот наш вывод!

При внесении наших изменений и запросов все очень быстро становилось подробным. Представьте себе уже зарегистрированного пользователя. У вас есть мутации для

  • изменение информации о пользователе
  • изменение электронной почты пользователя
  • изменение пароля пользователя
  • и т.п.

Всем им нужен преобразователь, и все эти преобразователи должны сначала получить пользователя из Prisma для проверки и т. Д. Поэтому вместо того, чтобы делать это для каждой функции преобразователя, писать разные вспомогательные функции для всех типов данных, я представляю вы "шаблон предварительной выборки". Это позволяет вам предварительно выбрать определенные узлы базы данных Prisma и вставить их в контекст.

Прочтите комментарии, чтобы понять, что здесь делается. По сути, мы просто берем стандартные функции распознавателя, но мы «оборачиваем» их и запускаем перед ними предварительные выборки и внедряем их результат в контекст.

Как видите, вы также можете выбрать, хотите ли вы выдавать ошибку, если предварительная выборка прошла успешно или нет.

Если вы хотите узнать больше о типобезопасных преобразователях - ознакомьтесь с этой статьей!

Итак, как нам это реализовать? Это один из примеров:

Это пример мутации для удаления компании, администратором которой является пользователь.

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

Два средства предварительной выборки предоставляют пароль компании и пользователя для проверки в объекте Context. Но только если пользователь авторизован на это, в противном случае мы выдаем AuthError, указанную в свойстве throwIfNone.

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

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

Если вы нашли это полезным, не забудьте хлопнуть в ладоши! 👏 Может быть, даже дать последователям Smidyo Codex?

Вы можете найти меня в твиттере @kankki (или в комментариях), если у вас есть идеи, как улучшить эту систему / шаблон.