123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?php
- namespace Drupal\materio_graphql\Plugin\GraphQL\SchemaExtension;
- use Drupal\graphql\GraphQL\ResolverBuilder;
- use Drupal\graphql\GraphQL\ResolverRegistryInterface;
- use Drupal\graphql\GraphQL\Response\ResponseInterface;
- use Drupal\graphql\Plugin\GraphQL\SchemaExtension\SdlSchemaExtensionPluginBase;
- use Drupal\materio_graphql\GraphQL\Response\MaterioResponse;
- /**
- * @SchemaExtension(
- * id = "materio_extension",
- * name = "Materio extension",
- * description = "Materio extension.",
- * schema = "materio"
- * )
- */
- class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
- /**
- * {@inheritdoc}
- */
- public function registerResolvers(ResolverRegistryInterface $registry) {
- $builder = new ResolverBuilder();
- // Materiau
- $registry->addFieldResolver('Query', 'materiau',
- $builder->produce('entity_load')
- ->map('type', $builder->fromValue('node'))
- ->map('bundles', $builder->fromValue(['materiau']))
- ->map('id', $builder->fromArgument('id'))
- );
-
- $registry->addFieldResolver('Materiau', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Materiau', 'uuid',
- $builder->produce('entity_uuid')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Materiau', 'title',
- $builder->compose(
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- )
- );
- $registry->addFieldResolver('Materiau', 'author',
- $builder->compose(
- $builder->produce('entity_owner')
- ->map('entity', $builder->fromParent()),
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- )
- );
- // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
- // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
- $registry->addFieldResolver('Materiau', 'linked_materials',
- $builder->compose(
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_linked_materials'))
- )
- );
- $registry->addFieldResolver('Materiau', 'memo',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_memo.value'))
- );
- $registry->addFieldResolver('Materiau', 'images',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_materiau_images'))
- );
- // Article
- $registry->addFieldResolver('Query', 'article',
- $builder->produce('entity_load')
- ->map('type', $builder->fromValue('node'))
- ->map('bundles', $builder->fromValue(['article']))
- ->map('id', $builder->fromArgument('id'))
- );
- // $registry->addFieldResolver('ArticleResponse', 'article',
- // $builder->callback(function (ArticleResponse $response) {
- // return $response->article();
- // })
- // );
- $registry->addFieldResolver('Article', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Article', 'uuid',
- $builder->produce('entity_uuid')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Article', 'title',
- $builder->compose(
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- )
- );
- $registry->addFieldResolver('Article', 'author',
- $builder->compose(
- $builder->produce('entity_owner')
- ->map('entity', $builder->fromParent()),
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- )
- );
- $registry->addFieldResolver('Article', 'body',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('body.value'))
- );
- // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
- // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
- $registry->addFieldResolver('Article', 'linked_materials',
- $builder->compose(
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_linked_materials'))
- )
- );
- $registry->addFieldResolver('Article', 'images',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_visuel'))
- );
- $registry->addFieldResolver('Article', 'videos',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_video'))
- );
- // VideoLink
- $registry->addFieldResolver('VideoLink', 'url',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('field_item:video_embed_field'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('value'))
- );
- // Image
- $registry->addFieldResolver('Image', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Image', 'url',
- $builder->produce('image_url')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Image', 'alt',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_image.alt'))
- );
- $registry->addFieldResolver('Image', 'style_minicard',
- $builder->produce('image_derivative')
- ->map('entity', $builder->fromParent())
- ->map('style', $builder->fromValue('card_medium_half'))
- );
- // Response type resolver.
- $registry->addTypeResolver('Response', [
- __CLASS__,
- 'resolveResponse',
- ]);
- }
- /**
- * Resolves the response type.
- *
- * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
- * Response object.
- *
- * @return string
- * Response type.
- *
- * @throws \Exception
- * Invalid response type.
- */
- public static function resolveResponse(ResponseInterface $response): string {
- // Resolve content response.
- if ($response instanceof MateriauResponse) {
- return 'MateriauResponse';
- }
- throw new \Exception('Invalid response type.');
- }
- }
|