Size: a a a

GraphQL — русскоговорящее сообщество

2020 October 01

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Директивы — по сути миддлвари, только они ещё в схеме фигурируют. Обрачивают резолвер и вклиниваются либо до, либо после выполнения.
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
Точнее, вот все директивы, почти 90% кейсов покрывает, на остальные разные типы под группы:
directive @isAuthenticated on QUERY | FIELD_DEFINITION | MUTATION
directive @isAuthenticatedSub on QUERY | FIELD_DEFINITION | MUTATION
directive @hasRole(roles: [String]) on QUERY | FIELD_DEFINITION | MUTATION
directive @isOwner(type: String) on QUERY | MUTATION | FIELD_DEFINITION
directive @isOwnerOrHasRole(type: String, roles: [String]) on QUERY | MUTATION | FIELD_DEFINITION
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
Алексей Родионов
Директивы — по сути миддлвари, только они ещё в схеме фигурируют. Обрачивают резолвер и вклиниваются либо до, либо после выполнения.
Не по сути, так оно и есть)
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
type у меня это прослойка для призмы, в последней реализации уже убрал, добавив магии)
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Вот тут описана вся история, как я пришёл к своей директиве:

https://github.com/graphql-community/graphql-directive-auth/issues/17
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Олег Линьков
Не, я отказался от такого сразу. Как сделано у меня: hasRoleOrAuthor(['ADMIN', 'EDITOR'])
Ну hasRoleOrAuthor мне не нравится, потому что она не очень универсальна. Так можно наплодить много директив, специфичных именно для конкретного проекта и конкретных ролей в нём.

У меня же цель была сделать универсальную директиву, которую потом можно распространять в виде npm-пакета.
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
Да, я согласен, что это ни разу не универсально, просто в рамках реализуемого проекта начинал с shield, а когда нагрузка около 800 RPS пошла, пришлось думать, что-то лучше
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
Именно в рамках проекта, в итоге сейчас fastify с jit, подписки убраны и сокеты живут отдельно, авторизация вообще в отдельном сервисе. Зато 1100 RPS с пиковой загрузкой двух машин около 50%.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Но потом я от этой идеи ушёл.

Знакомый рассказал, что в Facebook вся валидация и авторизация описывается в резолверах. Потому что условия могут быть сложные, например, "вы должны фолловить друг друга хотя бы сутки" и т.д.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Повторяющуюся логику (переиспользуемые условия) они потом рефакторят в что-то вроде миддлварей.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
То есть во время валидации или авторизации может потребоваться ещё сходить в базу данных и т.д.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
У type-graphql в этом плане круто сделано:
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Это не директивы, а декораторы полей класса, так как это TypeScript, а не GraphQL.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
То есть по сути это code-first, а не SDL-first, но такой же наглядный как и SDL.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Да и приколько, что сами резолверы тут же можно описывать, тоже наглядно получается.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Автокомплит работает лучше, потому что это TS, а не GraphQL. В расширениях GraphQL для IDE ещё много чего нет или находится в зачаточном состоянии.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Так что пока для меня у TypeGraphQL самый лучший DX.
источник

ОЛ

Олег Линьков... in GraphQL — русскоговорящее сообщество
Я вот начал новый пет проект на type, в целом неплохо, но я хочу резолверы более тупыми оставлять с минимум логики, поэтому буду делать по сервис пути с наследованием. А авторизацию всегда выношу из проекта, когда нагрузка начинает расти, чаще всего на ней все и держится. Более того последний раз oAuth у меня на Go крутился, а gql по тунелю получал от него данные
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Сами по себе декораторы TS работают быстро, сами правила для валидации и авторизации обычно тоже простые. Зачем выносить?
источник