Limiting Visibility
때때로 사용자로부터 스키마의 요소를 숨기고 싶을 때가 있을 것이다. 예를 들면
- feature flagged 된 요소들
- 더 높은 허가를 필요로 하는 요소들
오직 이러한 필드에 접근을 제한하려 한다면, 런타임에서 객체를 체크하기 위해서 field instrumentation 를 사용하는 거나, 쿼리를 실행하기 이전에 체크하기 위해 query analyzers 를 사용하는 것을 고려해볼 수 있다.
만약 필드를 완전히 숨기고 싶다면 아래를 읽어보자.
Filtering
except:
또는 only:
를 Schema.execute
에 전달하므로써 스키마의 일부분을 숨길 수 있다. 예를 들어:
# `except:` 블랙리스트 아이템 제외
filter = PermissionBlacklist.new(@current_user)
MySchema.execute(query_string, except: filter)
# OR
# `only:` 화이트리스트 아이템만 통과
filter = PermissionWhitelist.new(@current_user)
MySchema.execute(query_string, only: filter)
이 쿼리에서 몇몇의 요소들은 숨겨져 있을 것이다. 이것은 필드, 타입, arguments, enum 값 등이 아예 정의되지 않은 것처럼 다뤄질 것이라는 뜻이다.
필터는 #call(schema_member, ctx) 에 응답한닽. 해당 메서드가 참값을 리턴한다면, 스키마 멤버는 차단되거나 통과될 것이다.
예를 들어, 아래는 PermissionWhitelist
을 구현한 것이다.
class PermissionWhitelist
def initialize(person)
@person = person
end
# 만약 이것이 true 를 리턴한다면, 해당 스키마 멤버는 허용된다.
def call(schema_member, ctx)
Permissions.allowed?(person, schema_member)
end
end
schema_member
은 다음 중 하나일 것이다.
- Type (
GraphQL::BaseType
and subclasses) - Field (
GraphQL::Field
) - Argument (
GraphQL::Argument
) - Enum value (
GraphQL::EnumType::EnumValue
)
Printing a Filtered Schema
해당 필터를 스키마와 함께 출력함으로써 어떻게 필터가 해당 스키마에 적용될 것인지 볼 수 있다.
GraphQL::Schema#to_definition
는 오직 only:
과 except:
만 받는다.
example_user = User.new(permission: :admin)
filter = PermissionWhitelist.new(example_user)
defn_string = MySchema.to_definition(only: filter)
puts defn_string
# => 필터된 스키마 출력
Schema#to_definition
는 또한 context 도 받는다. 예를 들면:
context = { current_user: example_user }
puts MySchema.to_definition(only: filter, context: context)
* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.
* 출처: http://graphql-ruby.org/schema/limiting_visibility.html 일부분 발췌
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(14) Graphql-ruby - 쿼리 실행하기 (0) | 2018.12.31 |
---|---|
(13) Graphql-ruby - 루트 타입 (0) | 2018.12.31 |
(11) Graphql-ruby - Class-Based API v1.8.0 (0) | 2018.12.31 |
(10) Graphql-ruby - 스키마 테스팅 (0) | 2018.12.31 |
(9) Graphql-ruby - Generators (0) | 2018.12.31 |