123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- <?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;
- use Drupal\Core\Url;
- /**
- * @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();
- // __ __ _ _
- // | \/ |__ _| |_ ___ _ _(_)__ _ _ _
- // | |\/| / _` | _/ -_) '_| / _` | || |
- // |_| |_\__,_|\__\___|_| |_\__,_|\_,_|
- $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', 'body',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('body.value'))
- );
- $registry->addFieldResolver('Materiau', 'short_description',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_short_description.value'))
- );
- $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', 'linked_articles',
- $builder->compose(
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_linked_articles'))
- ));
- $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'))
- );
- $registry->addFieldResolver('Materiau', 'attachments',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_attachments'))
- // $builder->produce('entity_reference')
- // ->map('entity', $builder->fromParent())
- // ->map('field', $builder->fromValue('field_attachments'))
- );
- $registry->addFieldResolver('Materiau', 'videos',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_video'))
- );
- $registry->addFieldResolver('Materiau', 'tags',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_tags'))
- );
- $registry->addFieldResolver('Materiau', 'thesaurus',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_thesaurus'))
- );
- // field_distributor
- // field_famille
- // field_index
- // field_manufacturer
- // field_reference
- // field_samples
- // _ _ _ _
- // /_\ _ _| |_(_)__| |___
- // / _ \| '_| _| / _| / -_)
- // /_/ \_\_| \__|_\__|_\___|
- $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('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'))
- );
- $registry->addFieldResolver('Article', 'memo',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_memo.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->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'))
- );
- $registry->addFieldResolver('Article', 'tags',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_tags'))
- );
- $registry->addFieldResolver('Article', 'thesaurus',
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_thesaurus'))
- );
- $registry->addFieldResolver('Article', 'showroom',
- $builder->compose(
- $builder->produce('entity_reference')
- ->map('entity', $builder->fromParent())
- ->map('field', $builder->fromValue('field_showroom')),
- $builder->callback(function ($items) {
- return $items[0];
- })
- ));
- $registry->addFieldResolver('Article', 'source',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_source'))
- );
- $registry->addFieldResolver('Article', 'date',
- $builder->produce('property_path')
- ->map('type', $builder->fromValue('entity:node'))
- ->map('value', $builder->fromParent())
- ->map('path', $builder->fromValue('field_date'))
- );
- // ___ _ _
- // | __(_) |___
- // | _|| | / -_)
- // |_| |_|_\___|
- $registry->addFieldResolver('Filefield', 'description',
- $builder->callback(function ($parent, $args) {
- return $parent['description'];
- })
- );
- $registry->addFieldResolver('Filefield', 'file',
- // $builder->produce('entity_reference')
- // ->map('entity', $builder->fromParent())
- // ->map('field', $builder->fromValue('field_showroom'))
- $builder->callback(function ($parent, $args) {
- return \Drupal\file\Entity\File::load($parent['target_id']);
- })
- );
- $registry->addFieldResolver('File', 'url',
- $builder->callback(function ($parent, $args) {
- return $parent->url();
- })
- );
- $registry->addFieldResolver('File', 'filesize',
- $builder->callback(function ($parent, $args) {
- return $parent->getSize();
- })
- );
- $registry->addFieldResolver('File', 'filemime',
- $builder->callback(function ($parent, $args) {
- return $parent->getMimeType();
- })
- );
- $registry->addFieldResolver('File', 'filename',
- $builder->callback(function ($parent, $args) {
- return $parent->getFilename();
- })
- );
- $registry->addFieldResolver('File', 'fid',
- $builder->callback(function ($parent, $args) {
- return $parent->id();
- })
- );
- $registry->addFieldResolver('File', 'uuid',
- $builder->callback(function ($parent, $args) {
- return $parent->uuid();
- })
- );
- // ___ _
- // | \ __ _| |_ ___
- // | |) / _` | _/ -_)
- // |___/\__,_|\__\___|
- $registry->addFieldResolver('Date', 'start',
- $builder->callback(function ($parent, $args) {
- return $parent[0]['value'];
- })
- );
- $registry->addFieldResolver('Date', 'end',
- $builder->callback(function ($parent, $args) {
- return $parent[0]['end_value'];
- })
- );
- // _ _ _
- // | | (_)_ _ | |__
- // | |__| | ' \| / /
- // |____|_|_||_|_\_\
- $registry->addFieldResolver('Link', 'url',
- $builder->callback(function ($parent, $args) {
- return $parent[0]['uri'];
- })
- );
- $registry->addFieldResolver('Link', 'title',
- $builder->callback(function ($parent, $args) {
- return $parent[0]['title'];
- })
- );
- // ___ _
- // / __| |_ _____ __ ___ _ ___ ___ _ __
- // \__ \ ' \/ _ \ V V / '_/ _ \/ _ \ ' \
- // |___/_||_\___/\_/\_/|_| \___/\___/_|_|_|
- $registry->addFieldResolver('Query', 'showroom',
- $builder->produce('entity_load')
- ->map('type', $builder->fromValue('taxonomy_term'))
- ->map('bundles', $builder->fromValue(['showroom']))
- ->map('id', $builder->fromArgument('id'))
- );
- $registry->addFieldResolver('Showroom', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Showroom', 'uuid',
- $builder->produce('entity_uuid')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Showroom', 'name',
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- );
- // _____
- // |_ _|_ _ __ _
- // | |/ _` / _` |
- // |_|\__,_\__, |
- // |___/
- $registry->addFieldResolver('Query', 'tag',
- $builder->produce('entity_load')
- ->map('type', $builder->fromValue('taxonomy_term'))
- ->map('bundles', $builder->fromValue(['tags']))
- ->map('id', $builder->fromArgument('id'))
- );
- $registry->addFieldResolver('Tag', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Tag', 'uuid',
- $builder->produce('entity_uuid')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Tag', 'name',
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- );
- // _____ _
- // |_ _| |_ ___ ___ __ _ _ _ _ _ _ _ ___
- // | | | ' \/ -_|_-</ _` | || | '_| || (_-<
- // |_| |_||_\___/__/\__,_|\_,_|_| \_,_/__/
- $registry->addFieldResolver('Query', 'thesaurus',
- $builder->produce('entity_load')
- ->map('type', $builder->fromValue('taxonomy_term'))
- ->map('bundles', $builder->fromValue(['thesaurus']))
- ->map('id', $builder->fromArgument('id'))
- );
- $registry->addFieldResolver('Thesaurus', 'id',
- $builder->produce('entity_id')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Thesaurus', 'uuid',
- $builder->produce('entity_uuid')
- ->map('entity', $builder->fromParent())
- );
- $registry->addFieldResolver('Thesaurus', 'name',
- $builder->produce('entity_label')
- ->map('entity', $builder->fromParent())
- );
- // __ ___ _ _ _ _
- // \ \ / (_)__| |___ ___| | (_)_ _ | |__
- // \ V /| / _` / -_) _ \ |__| | ' \| / /
- // \_/ |_\__,_\___\___/____|_|_||_|_\_\
- $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'))
- );
- // ___
- // |_ _|_ __ __ _ __ _ ___
- // | || ' \/ _` / _` / -_)
- // |___|_|_|_\__,_\__, \___|
- // |___/
- $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'))
- );
- $registry->addFieldResolver('Image', 'style_cardmedium',
- $builder->produce('image_derivative')
- ->map('entity', $builder->fromParent())
- ->map('style', $builder->fromValue('card_medium'))
- );
- $registry->addFieldResolver('Image', 'style_cardfull',
- $builder->produce('image_derivative')
- ->map('entity', $builder->fromParent())
- ->map('style', $builder->fromValue('card_full'))
- );
- $registry->addFieldResolver('Image', 'style_articlecardmedium',
- $builder->produce('image_derivative')
- ->map('entity', $builder->fromParent())
- ->map('style', $builder->fromValue('article_card_medium'))
- );
- // 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.');
- }
- }
|