Slide 1

Slide 1 text

GraphQL on Ruby @joe_re

Slide 2

Slide 2 text

Who am I? twitter: @joe_re github: @joe­re freee という五反田の会社で働いています スタックはフロントエンド寄り

Slide 3

Slide 3 text

前回から西日暮里.rb の オー ガナイザやらせて もらっています!

Slide 4

Slide 4 text

ふつつかものですが どうぞよろしくお願いします

Slide 5

Slide 5 text

GraphQL http://graphql.org/

Slide 6

Slide 6 text

GraqhQL is 何? Facebook が開発しているクエリ言語 クライアント・ サー バ間でのデー タのやりとりを宣言的に 記述するためのもの REST API と比べて、 サー バ側のロジックの重複を減らすこ とができて、 効率的にデー タの取得が可能 強い型制約をShema に持たせられる

Slide 7

Slide 7 text

Query { u s e r ( i d : 3 5 0 0 4 0 1 ) { i d , n a m e , i s V i e w e r F r i e n d , p r o f i l e P i c t u r e ( s i z e : 5 0 ) { u r i , w i d t h , h e i g h t } } } Response { " u s e r " : { " i d " : 3 5 0 0 4 0 1 , " n a m e " : " J i n g C h e n " , " i s V i e w e r F r i e n d " : t r u e , " p r o f i l e P i c t u r e " : { " u r i " : " h t t p : / / s o m e u r l . c d n / p i c . j p g " , " w i d t h " : 5 0 , " h e i g h t " : 5 0 } } }

Slide 8

Slide 8 text

Ruby 実装あるぞ!

Slide 9

Slide 9 text

というわけで試してみた (Demo) https://github.com/joe­re/sample­graphql­on­ruby

Slide 10

Slide 10 text

実装どんな感じになるの??

Slide 11

Slide 11 text

Definition of GraphQL's Shema(Query) P o s t T y p e = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " P o s t " d e s c r i p t i o n " A b l o g e n t r y " f i e l d : i d , ! t y p e s . I D , " T h e u n i q u e I D f o r t h i s p o s t " f i e l d : t i t l e , ! t y p e s . S t r i n g , " T h e t i t l e o f t h i s p o s t " f i e l d : b o d y , ! t y p e s . S t r i n g , " T h e b o d y o f t h i s p o s t " f i e l d : c o m m e n t s , - > { ! t y p e s [ ! C o m m e n t T y p e ] } , " R e s p o n s e s t o t h i s p o s t " e n d C o m m e n t T y p e = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " C o m m e n t " d e s c r i p t i o n " A r e p l y t o a p o s t " f i e l d : i d , ! t y p e s . I D , " T h e u n i q u e I D o f t h i s c o m m e n t " f i e l d : b o d y , ! t y p e s . S t r i n g , " T h e c o n t e n t o f t h i s c o m m e n t " f i e l d : p o s t , ! P o s t T y p e , " T h e p o s t t h i s c o m m e n t r e p l i e s t o " e n d Q u e r y R o o t = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " Q u e r y " d e s c r i p t i o n " T h e q u e r y r o o t f o r t h i s s c h e m a " f i e l d : p o s t d o t y p e P o s t T y p e d e s c r i p t i o n " F i n d a P o s t b y i d " a r g u m e n t : i d , ! t y p e s . I D r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { P o s t . f i n d ( a r g u m e n t s [ " i d " ] ) } e n d e n d

Slide 12

Slide 12 text

Definition of GraphQL's Shema(Mutation) C r e a t e P o s t F i e l d = G r a p h Q L : : F i e l d . d e f i n e d o | f | f . t y p e P o s t T y p e f . d e s c r i p t i o n ' C r e a t e a p o s t ' f . a r g u m e n t : t i t l e , ! t y p e s . S t r i n g f . a r g u m e n t : b o d y , ! t y p e s . S t r i n g f . r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { P o s t . c r e a t e ( t i t l e : a r g u m e n t s [ : t i t l e ] , b o d y : a r g u m e n t s [ : b o d y ] ) } e n d C r e a t e C o m m e n t F i e l d = G r a p h Q L : : F i e l d . d e f i n e d o | f | f . t y p e C o m m e n t T y p e f . d e s c r i p t i o n ' C r e a t e a c o m m e n t ' f . a r g u m e n t : p o s t _ i d , ! t y p e s . I D f . a r g u m e n t : b o d y , ! t y p e s . S t r i n g f . r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { C o m m e n t . c r e a t e ( p o s t _ i d : a r g u m e n t s [ : p o s t _ i d ] , b o d y : a r g u m e n t s [ : b o d y ] ) } e n d M u t a t i o n R o o t = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e ' M u t a t i o n ' d e s c r i p t i o n ' T h e r o o t f o r m u t a t i o n s i n t h i s s c h e m a ' f i e l d : c r e a t e P o s t , f i e l d : C r e a t e P o s t F i e l d f i e l d : c r e a t e C o m m e n t , f i e l d : C r e a t e C o m m e n t F i e l d e n d

Slide 13

Slide 13 text

Create Shema & Using S c h e m a = G r a p h Q L : : S c h e m a . n e w ( q u e r y : Q u e r y R o o t , m u t a t i o n : M u t a t i o n R o o t ) S c h e m a . e x e c u t e ( ' { p o s t ( i d : 1 ) { i d , t i t l e , c o m m e n t s { b o d y } } } ' )

Slide 14

Slide 14 text

やってみた感触 ActiveRecord と組み合わせても普通に使える ( 最適ではない感もあるけど、 何がいいのかまだ分からん) GraphQL の活用例は絶望的にまだ少ない ここまでなら割と簡単に動かせた Rails でGraphQL サー バ立てたり、 特定のエンドポイントで GraphQL 解釈できるようにするのは楽にできそう

Slide 15

Slide 15 text

そもそもがクライアント・ サー バ間での デー タ通信を簡略化するためのものなので クライアントがないとなんとも言えない

Slide 16

Slide 16 text

というわけで次回予告! GraphQL on Ruby on Rails with Relay!

Slide 17

Slide 17 text

ありがとうございました!