MaterioSchemaExtension.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. namespace Drupal\materio_graphql\Plugin\GraphQL\SchemaExtension;
  3. use Drupal\graphql\GraphQL\ResolverBuilder;
  4. use Drupal\graphql\GraphQL\ResolverRegistryInterface;
  5. use Drupal\graphql\GraphQL\Response\ResponseInterface;
  6. use Drupal\graphql\Plugin\GraphQL\SchemaExtension\SdlSchemaExtensionPluginBase;
  7. use Drupal\materio_graphql\GraphQL\Response\MaterioResponse;
  8. /**
  9. * @SchemaExtension(
  10. * id = "materio_extension",
  11. * name = "Materio extension",
  12. * description = "Materio extension.",
  13. * schema = "materio"
  14. * )
  15. */
  16. class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
  17. /**
  18. * {@inheritdoc}
  19. */
  20. public function registerResolvers(ResolverRegistryInterface $registry) {
  21. $builder = new ResolverBuilder();
  22. // Materiau
  23. $registry->addFieldResolver('Query', 'materiau',
  24. $builder->produce('entity_load')
  25. ->map('type', $builder->fromValue('node'))
  26. ->map('bundles', $builder->fromValue(['materiau']))
  27. ->map('id', $builder->fromArgument('id'))
  28. );
  29. $registry->addFieldResolver('Materiau', 'id',
  30. $builder->produce('entity_id')
  31. ->map('entity', $builder->fromParent())
  32. );
  33. $registry->addFieldResolver('Materiau', 'uuid',
  34. $builder->produce('entity_uuid')
  35. ->map('entity', $builder->fromParent())
  36. );
  37. $registry->addFieldResolver('Materiau', 'title',
  38. $builder->compose(
  39. $builder->produce('entity_label')
  40. ->map('entity', $builder->fromParent())
  41. )
  42. );
  43. $registry->addFieldResolver('Materiau', 'author',
  44. $builder->compose(
  45. $builder->produce('entity_owner')
  46. ->map('entity', $builder->fromParent()),
  47. $builder->produce('entity_label')
  48. ->map('entity', $builder->fromParent())
  49. )
  50. );
  51. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  52. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  53. $registry->addFieldResolver('Materiau', 'linked_materials',
  54. $builder->compose(
  55. $builder->produce('entity_reference')
  56. ->map('entity', $builder->fromParent())
  57. ->map('field', $builder->fromValue('field_linked_materials'))
  58. )
  59. );
  60. $registry->addFieldResolver('Materiau', 'memo',
  61. $builder->produce('property_path')
  62. ->map('type', $builder->fromValue('entity:node'))
  63. ->map('value', $builder->fromParent())
  64. ->map('path', $builder->fromValue('field_memo.value'))
  65. );
  66. $registry->addFieldResolver('Materiau', 'images',
  67. $builder->produce('entity_reference')
  68. ->map('entity', $builder->fromParent())
  69. ->map('field', $builder->fromValue('field_materiau_images'))
  70. );
  71. // Article
  72. $registry->addFieldResolver('Query', 'article',
  73. $builder->produce('entity_load')
  74. ->map('type', $builder->fromValue('node'))
  75. ->map('bundles', $builder->fromValue(['article']))
  76. ->map('id', $builder->fromArgument('id'))
  77. );
  78. // $registry->addFieldResolver('ArticleResponse', 'article',
  79. // $builder->callback(function (ArticleResponse $response) {
  80. // return $response->article();
  81. // })
  82. // );
  83. $registry->addFieldResolver('Article', 'id',
  84. $builder->produce('entity_id')
  85. ->map('entity', $builder->fromParent())
  86. );
  87. $registry->addFieldResolver('Article', 'uuid',
  88. $builder->produce('entity_uuid')
  89. ->map('entity', $builder->fromParent())
  90. );
  91. $registry->addFieldResolver('Article', 'title',
  92. $builder->compose(
  93. $builder->produce('entity_label')
  94. ->map('entity', $builder->fromParent())
  95. )
  96. );
  97. $registry->addFieldResolver('Article', 'author',
  98. $builder->compose(
  99. $builder->produce('entity_owner')
  100. ->map('entity', $builder->fromParent()),
  101. $builder->produce('entity_label')
  102. ->map('entity', $builder->fromParent())
  103. )
  104. );
  105. $registry->addFieldResolver('Article', 'body',
  106. $builder->produce('property_path')
  107. ->map('type', $builder->fromValue('entity:node'))
  108. ->map('value', $builder->fromParent())
  109. ->map('path', $builder->fromValue('body.value'))
  110. );
  111. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  112. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  113. $registry->addFieldResolver('Article', 'linked_materials',
  114. $builder->compose(
  115. $builder->produce('entity_reference')
  116. ->map('entity', $builder->fromParent())
  117. ->map('field', $builder->fromValue('field_linked_materials'))
  118. )
  119. );
  120. $registry->addFieldResolver('Article', 'images',
  121. $builder->produce('entity_reference')
  122. ->map('entity', $builder->fromParent())
  123. ->map('field', $builder->fromValue('field_visuel'))
  124. );
  125. $registry->addFieldResolver('Article', 'videos',
  126. $builder->produce('property_path')
  127. ->map('type', $builder->fromValue('entity:node'))
  128. ->map('value', $builder->fromParent())
  129. ->map('path', $builder->fromValue('field_video'))
  130. );
  131. // VideoLink
  132. $registry->addFieldResolver('VideoLink', 'url',
  133. $builder->produce('property_path')
  134. ->map('type', $builder->fromValue('field_item:video_embed_field'))
  135. ->map('value', $builder->fromParent())
  136. ->map('path', $builder->fromValue('value'))
  137. );
  138. // Image
  139. $registry->addFieldResolver('Image', 'id',
  140. $builder->produce('entity_id')
  141. ->map('entity', $builder->fromParent())
  142. );
  143. $registry->addFieldResolver('Image', 'url',
  144. $builder->produce('image_url')
  145. ->map('entity', $builder->fromParent())
  146. );
  147. $registry->addFieldResolver('Image', 'alt',
  148. $builder->produce('property_path')
  149. ->map('type', $builder->fromValue('entity:node'))
  150. ->map('value', $builder->fromParent())
  151. ->map('path', $builder->fromValue('field_image.alt'))
  152. );
  153. $registry->addFieldResolver('Image', 'style_minicard',
  154. $builder->produce('image_derivative')
  155. ->map('entity', $builder->fromParent())
  156. ->map('style', $builder->fromValue('card_medium_half'))
  157. );
  158. // Response type resolver.
  159. $registry->addTypeResolver('Response', [
  160. __CLASS__,
  161. 'resolveResponse',
  162. ]);
  163. }
  164. /**
  165. * Resolves the response type.
  166. *
  167. * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
  168. * Response object.
  169. *
  170. * @return string
  171. * Response type.
  172. *
  173. * @throws \Exception
  174. * Invalid response type.
  175. */
  176. public static function resolveResponse(ResponseInterface $response): string {
  177. // Resolve content response.
  178. if ($response instanceof MateriauResponse) {
  179. return 'MateriauResponse';
  180. }
  181. throw new \Exception('Invalid response type.');
  182. }
  183. }