MaterioSchemaExtension.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. $registry->addFieldResolver('Query', 'materiau',
  23. $builder->produce('entity_load')
  24. ->map('type', $builder->fromValue('node'))
  25. ->map('bundles', $builder->fromValue(['materiau']))
  26. ->map('id', $builder->fromArgument('id'))
  27. );
  28. // Create materiau mutation.
  29. $registry->addFieldResolver('Mutation', 'createMateriau',
  30. $builder->produce('create_materiau')
  31. ->map('data', $builder->fromArgument('data'))
  32. );
  33. $registry->addFieldResolver('MateriauResponse', 'materiau',
  34. $builder->callback(function (MateriauResponse $response) {
  35. return $response->materiau();
  36. })
  37. );
  38. $registry->addFieldResolver('MateriauResponse', 'errors',
  39. $builder->callback(function (MateriauResponse $response) {
  40. return $response->getViolations();
  41. })
  42. );
  43. $registry->addFieldResolver('Materiau', 'id',
  44. $builder->produce('entity_id')
  45. ->map('entity', $builder->fromParent())
  46. );
  47. $registry->addFieldResolver('Materiau', 'uuid',
  48. $builder->produce('entity_uuid')
  49. ->map('entity', $builder->fromParent())
  50. );
  51. $registry->addFieldResolver('Materiau', 'title',
  52. $builder->compose(
  53. $builder->produce('entity_label')
  54. ->map('entity', $builder->fromParent())
  55. )
  56. );
  57. $registry->addFieldResolver('Materiau', 'author',
  58. $builder->compose(
  59. $builder->produce('entity_owner')
  60. ->map('entity', $builder->fromParent()),
  61. $builder->produce('entity_label')
  62. ->map('entity', $builder->fromParent())
  63. )
  64. );
  65. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  66. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  67. $registry->addFieldResolver('Materiau', 'linked_materials',
  68. $builder->compose(
  69. $builder->produce('entity_reference')
  70. ->map('entity', $builder->fromParent())
  71. ->map('field', $builder->fromValue('field_linked_materials'))
  72. )
  73. );
  74. $registry->addFieldResolver('Materiau', 'memo',
  75. $builder->produce('property_path')
  76. ->map('type', $builder->fromValue('entity:node'))
  77. ->map('value', $builder->fromParent())
  78. ->map('path', $builder->fromValue('field_memo.value'))
  79. );
  80. $registry->addFieldResolver('Materiau', 'images',
  81. $builder->produce('entity_reference')
  82. ->map('entity', $builder->fromParent())
  83. ->map('field', $builder->fromValue('field_materiau_images'))
  84. );
  85. $registry->addFieldResolver('Image', 'id',
  86. $builder->produce('entity_id')
  87. ->map('entity', $builder->fromParent())
  88. );
  89. $registry->addFieldResolver('Image', 'url',
  90. $builder->produce('image_url')
  91. ->map('entity', $builder->fromParent())
  92. );
  93. $registry->addFieldResolver('Image', 'alt',
  94. $builder->produce('property_path')
  95. ->map('type', $builder->fromValue('entity:node'))
  96. ->map('value', $builder->fromParent())
  97. ->map('path', $builder->fromValue('field_image.alt'))
  98. );
  99. $registry->addFieldResolver('Image', 'style_minicard',
  100. $builder->produce('image_derivative')
  101. ->map('entity', $builder->fromParent())
  102. ->map('style', $builder->fromValue('card_medium_half'))
  103. );
  104. // Response type resolver.
  105. $registry->addTypeResolver('Response', [
  106. __CLASS__,
  107. 'resolveResponse',
  108. ]);
  109. }
  110. /**
  111. * Resolves the response type.
  112. *
  113. * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
  114. * Response object.
  115. *
  116. * @return string
  117. * Response type.
  118. *
  119. * @throws \Exception
  120. * Invalid response type.
  121. */
  122. public static function resolveResponse(ResponseInterface $response): string {
  123. // Resolve content response.
  124. if ($response instanceof MateriauResponse) {
  125. return 'MateriauResponse';
  126. }
  127. throw new \Exception('Invalid response type.');
  128. }
  129. }