瀏覽代碼

refactored materioSchemaExtension

Bachir Soussi Chiadmi 3 年之前
父節點
當前提交
2175e7ae2d
共有 1 個文件被更改,包括 473 次插入463 次删除
  1. 473 463
      web/modules/custom/materio_graphql/src/Plugin/GraphQL/SchemaExtension/MaterioSchemaExtension.php

+ 473 - 463
web/modules/custom/materio_graphql/src/Plugin/GraphQL/SchemaExtension/MaterioSchemaExtension.php

@@ -26,10 +26,168 @@ class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
 
     $this->addMateriau($registry, $builder);
 
- //    _       _   _    _
- //   /_\  _ _| |_(_)__| |___
- //  / _ \| '_|  _| / _| / -_)
- // /_/ \_\_|  \__|_\__|_\___|
+    $this->addArticle($registry, $builder);
+
+    $this->addCompany($registry, $builder);
+
+    $this->addAddress($registry, $builder);
+
+    $this->addFilefield($registry, $builder);
+
+    $this->addFile($registry, $builder);
+
+    $this->addDate($registry, $builder);
+
+    $this->addLink($registry, $builder);
+
+    $this->addShowroom($registry, $builder);
+
+    $this->addTag($registry, $builder);
+
+    $this->addThesaurus($registry, $builder);
+
+    $this->addVideolink($registry, $builder);
+
+    $this->addImage($registry, $builder);
+
+    // Response type resolver.
+    $registry->addTypeResolver('Response', [
+      __CLASS__,
+      'resolveResponse',
+    ]);
+  }
+
+  //  __  __      _           _
+  // |  \/  |__ _| |_ ___ _ _(_)__ _ _  _
+  // | |\/| / _` |  _/ -_) '_| / _` | || |
+  // |_|  |_\__,_|\__\___|_| |_\__,_|\_,_|
+  protected function addMateriau(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $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'))
+      );
+
+    $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'))
+      );
+
+    $registry->addFieldResolver('Materiau', 'manufacturer',
+      $builder->produce('entity_reference')
+        ->map('entity', $builder->fromParent())
+        ->map('field', $builder->fromValue('field_manufacturer'))
+      );
+
+    $registry->addFieldResolver('Materiau', 'distributor',
+      $builder->produce('entity_reference')
+        ->map('entity', $builder->fromParent())
+        ->map('field', $builder->fromValue('field_distributor'))
+      );
+
+    // field_famille
+    // field_index
+    // field_reference
+    // field_samples
+
+  }
+
+
+  //    _       _   _    _
+  //   /_\  _ _| |_(_)__| |___
+  //  / _ \| '_|  _| / _| / -_)
+  // /_/ \_\_|  \__|_\__|_\___|
+  protected function addArticle(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
     $registry->addFieldResolver('Query', 'article',
       $builder->produce('entity_load')
         ->map('type', $builder->fromValue('node'))
@@ -130,204 +288,194 @@ class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
         ->map('value', $builder->fromParent())
         ->map('path', $builder->fromValue('field_date'))
       );
+  }
 
+  //  ___
+  // |_ _|_ __  __ _ __ _ ___
+  //  | || '  \/ _` / _` / -_)
+  // |___|_|_|_\__,_\__, \___|
+  //                |___/
+  protected function addImage(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $registry->addFieldResolver('Image', 'id',
+      $builder->produce('entity_id')
+        ->map('entity', $builder->fromParent())
+      );
 
- //   ___
- //  / __|___ _ __  _ __  __ _ _ _ _  _
- // | (__/ _ \ '  \| '_ \/ _` | ' \ || |
- //  \___\___/_|_|_| .__/\__,_|_||_\_, |
- //                |_|             |__/
-    $registry->addFieldResolver('Query', 'company',
+    $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'))
+      );
+
+  }
+
+  // __   ___    _         _    _      _
+  // \ \ / (_)__| |___ ___| |  (_)_ _ | |__
+  //  \ V /| / _` / -_) _ \ |__| | ' \| / /
+  //   \_/ |_\__,_\___\___/____|_|_||_|_\_\
+  protected function addVideolink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $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'))
+      );
+  }
+
+  //  _____ _
+  // |_   _| |_  ___ ___ __ _ _  _ _ _ _  _ ___
+  //   | | | ' \/ -_|_-</ _` | || | '_| || (_-<
+  //   |_| |_||_\___/__/\__,_|\_,_|_|  \_,_/__/
+  protected function addThesaurus(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $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())
+      );
+  }
+
+  //  _____
+  // |_   _|_ _ __ _
+  //   | |/ _` / _` |
+  //   |_|\__,_\__, |
+  //           |___/
+  protected function addTag(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $registry->addFieldResolver('Query', 'tag',
      $builder->produce('entity_load')
        ->map('type', $builder->fromValue('taxonomy_term'))
-       ->map('bundles', $builder->fromValue(['company']))
+       ->map('bundles', $builder->fromValue(['tags']))
        ->map('id', $builder->fromArgument('id'))
      );
 
-    $registry->addFieldResolver('Company', 'id',
+    $registry->addFieldResolver('Tag', 'id',
      $builder->produce('entity_id')
        ->map('entity', $builder->fromParent())
      );
 
-    $registry->addFieldResolver('Company', 'uuid',
+    $registry->addFieldResolver('Tag', 'uuid',
      $builder->produce('entity_uuid')
        ->map('entity', $builder->fromParent())
      );
 
-    $registry->addFieldResolver('Company', 'name',
+    $registry->addFieldResolver('Tag', 'name',
      $builder->produce('entity_label')
        ->map('entity', $builder->fromParent())
      );
+  }
 
-    // TODO: property_path helper
-    // $props = [
-    //   [
-    //     "res" => "attachments",
-    //     "type" => "entity:taxonomy_term",
-    //     "path" => "field_attachments",
-    //   ]
-    // ]
-    // foreach ($props as $key => $value) {
-    //   $registry->addFieldResolver('Company', $value['res'],
-    //    $builder->produce('property_path')
-    //      ->map('type', $builder->fromValue('entity:taxonomy_term'))
-    //      ->map('value', $builder->fromParent())
-    //      ->map('path', $builder->fromValue('field_attachments'))
-    //    );
-    // }
-
-    $registry->addFieldResolver('Company', 'attachments',
-     $builder->produce('property_path')
-       ->map('type', $builder->fromValue('entity:taxonomy_term'))
-       ->map('value', $builder->fromParent())
-       ->map('path', $builder->fromValue('field_attachments'))
-     );
-
-    $registry->addFieldResolver('Company', 'memo',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_memo.value'))
-      );
-
-    $registry->addFieldResolver('Company', 'note',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_note.value'))
-      );
-
-    $registry->addFieldResolver('Company', 'website',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_website'))
+  //  ___ _
+  // / __| |_  _____ __ ___ _ ___  ___ _ __
+  // \__ \ ' \/ _ \ V  V / '_/ _ \/ _ \ '  \
+  // |___/_||_\___/\_/\_/|_| \___/\___/_|_|_|
+  protected function addShowroom(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $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('Company', 'departement',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_departement.value'))
+    $registry->addFieldResolver('Showroom', 'id',
+      $builder->produce('entity_id')
+        ->map('entity', $builder->fromParent())
       );
 
-    $registry->addFieldResolver('Company', 'email',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_public_email.value'))
+    $registry->addFieldResolver('Showroom', 'uuid',
+      $builder->produce('entity_uuid')
+        ->map('entity', $builder->fromParent())
       );
 
-    $registry->addFieldResolver('Company', 'address',
-      $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:taxonomy_term'))
-        ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_public_address'))
+    $registry->addFieldResolver('Showroom', 'name',
+      $builder->produce('entity_label')
+        ->map('entity', $builder->fromParent())
       );
+  }
 
-    // field_infos_from_company
-    // field_public_phone
-
-
- //    _      _    _
- //   /_\  __| |__| |_ _ ___ ______
- //  / _ \/ _` / _` | '_/ -_|_-<_-<
- // /_/ \_\__,_\__,_|_| \___/__/__/
-
-    // $addr_fields = [
-    //   'langcode',
-    //   'country_code',
-    //   'administrative_area',
-    //   'locality',
-    //   'dependent_locality',
-    //   'postal_code',
-    //   'sorting_code',
-    //   'address_line1',
-    //   'address_line2',
-    //   'organization',
-    //   'given_name',
-    //   'additional_name',
-    //   'family_name'
-    // ];
-    //
-    // foreach ($addr_fields as $key => $value) {
-    //   $registry->addFieldResolver('Address', $value,
-    //     $builder->callback(function ($parent, $args) {
-    //       return $parent[0][$value];
-    //     })
-    //   );
-    // }
-
-    $registry->addFieldResolver('Address', 'langcode',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['langcode'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'country_code',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['country_code'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'administrative_area',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['administrative_area'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'locality',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['locality'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'dependent_locality',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['dependent_locality'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'postal_code',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['postal_code'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'sorting_code',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['sorting_code'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'address_line1',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['address_line1'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'address_line2',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['address_line2'];
-      })
-    );
-    $registry->addFieldResolver('Address', 'organization',
+  //  _    _      _
+  // | |  (_)_ _ | |__
+  // | |__| | ' \| / /
+  // |____|_|_||_|_\_\
+  protected function addLink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $registry->addFieldResolver('Link', 'url',
       $builder->callback(function ($parent, $args) {
-        return $parent[0]['organization'];
+        return $parent[0]['uri'];
       })
     );
-    $registry->addFieldResolver('Address', 'given_name',
+    $registry->addFieldResolver('Link', 'title',
       $builder->callback(function ($parent, $args) {
-        return $parent[0]['given_name'];
+        return $parent[0]['title'];
       })
     );
-    $registry->addFieldResolver('Address', 'additional_name',
+  }
+
+  //  ___       _
+  // |   \ __ _| |_ ___
+  // | |) / _` |  _/ -_)
+  // |___/\__,_|\__\___|
+  protected function addDate(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $registry->addFieldResolver('Date', 'start',
       $builder->callback(function ($parent, $args) {
-        return $parent[0]['additional_name'];
+        return $parent[0]['value'];
       })
     );
-    $registry->addFieldResolver('Address', 'family_name',
+    $registry->addFieldResolver('Date', 'end',
       $builder->callback(function ($parent, $args) {
-        return $parent[0]['family_name'];
+        return $parent[0]['end_value'];
       })
     );
+  }
 
- //  ___ _ _      __ _     _    _
- // | __(_) |___ / _(_)___| |__| |
- // | _|| | / -_)  _| / -_) / _` |
- // |_| |_|_\___|_| |_\___|_\__,_|
+  //  ___ _ _      __ _     _    _
+  // | __(_) |___ / _(_)___| |__| |
+  // | _|| | / -_)  _| / -_) / _` |
+  // |_| |_|_\___|_| |_\___|_\__,_|
+  protected function addFilefield(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
     $registry->addFieldResolver('Filefield', 'description',
       $builder->callback(function ($parent, $args) {
         return $parent['description'];
@@ -338,11 +486,13 @@ class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
         return \Drupal\file\Entity\File::load($parent['target_id']);
       })
     );
+  }
 
- //  ___ _ _
- // | __(_) |___
- // | _|| | / -_)
- // |_| |_|_\___|
+  //  ___ _ _
+  // | __(_) |___
+  // | _|| | / -_)
+  // |_| |_|_\___|
+  protected function addFile(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
     $registry->addFieldResolver('File', 'url',
       $builder->callback(function ($parent, $args) {
         return $parent->url();
@@ -378,341 +528,201 @@ class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
         return $parent->uuid();
       })
     );
+  }
 
+  //    _      _    _
+  //   /_\  __| |__| |_ _ ___ ______
+  //  / _ \/ _` / _` | '_/ -_|_-<_-<
+  // /_/ \_\__,_\__,_|_| \___/__/__/
+  protected function addAddress(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    // $addr_fields = [
+    //   'langcode',
+    //   'country_code',
+    //   'administrative_area',
+    //   'locality',
+    //   'dependent_locality',
+    //   'postal_code',
+    //   'sorting_code',
+    //   'address_line1',
+    //   'address_line2',
+    //   'organization',
+    //   'given_name',
+    //   'additional_name',
+    //   'family_name'
+    // ];
+    //
+    // foreach ($addr_fields as $key => $value) {
+    //   $registry->addFieldResolver('Address', $value,
+    //     $builder->callback(function ($parent, $args) {
+    //       return $parent[0][$value];
+    //     })
+    //   );
+    // }
 
- //  ___       _
- // |   \ __ _| |_ ___
- // | |) / _` |  _/ -_)
- // |___/\__,_|\__\___|
-    $registry->addFieldResolver('Date', 'start',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['value'];
-      })
+    $registry->addFieldResolver('Address', 'langcode',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['langcode'];
+     })
     );
-    $registry->addFieldResolver('Date', 'end',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['end_value'];
-      })
+    $registry->addFieldResolver('Address', 'country_code',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['country_code'];
+     })
     );
-
-
- //  _    _      _
- // | |  (_)_ _ | |__
- // | |__| | ' \| / /
- // |____|_|_||_|_\_\
-    $registry->addFieldResolver('Link', 'url',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['uri'];
-      })
+    $registry->addFieldResolver('Address', 'administrative_area',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['administrative_area'];
+     })
     );
-    $registry->addFieldResolver('Link', 'title',
-      $builder->callback(function ($parent, $args) {
-        return $parent[0]['title'];
-      })
+    $registry->addFieldResolver('Address', 'locality',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['locality'];
+     })
     );
+    $registry->addFieldResolver('Address', 'dependent_locality',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['dependent_locality'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'postal_code',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['postal_code'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'sorting_code',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['sorting_code'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'address_line1',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['address_line1'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'address_line2',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['address_line2'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'organization',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['organization'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'given_name',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['given_name'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'additional_name',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['additional_name'];
+     })
+    );
+    $registry->addFieldResolver('Address', 'family_name',
+     $builder->callback(function ($parent, $args) {
+       return $parent[0]['family_name'];
+     })
+    );
+  }
 
 
- //  ___ _
- // / __| |_  _____ __ ___ _ ___  ___ _ __
- // \__ \ ' \/ _ \ 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())
-      );
+  //   ___
+  //  / __|___ _ __  _ __  __ _ _ _ _  _
+  // | (__/ _ \ '  \| '_ \/ _` | ' \ || |
+  //  \___\___/_|_|_| .__/\__,_|_||_\_, |
+  //                |_|             |__/
+  protected function addCompany(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
+    $registry->addFieldResolver('Query', 'company',
+     $builder->produce('entity_load')
+       ->map('type', $builder->fromValue('taxonomy_term'))
+       ->map('bundles', $builder->fromValue(['company']))
+       ->map('id', $builder->fromArgument('id'))
+     );
 
-    $registry->addFieldResolver('Showroom', 'name',
-      $builder->produce('entity_label')
-        ->map('entity', $builder->fromParent())
-      );
+    $registry->addFieldResolver('Company', 'id',
+     $builder->produce('entity_id')
+       ->map('entity', $builder->fromParent())
+     );
 
+    $registry->addFieldResolver('Company', 'uuid',
+     $builder->produce('entity_uuid')
+       ->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('Company', 'name',
+     $builder->produce('entity_label')
+       ->map('entity', $builder->fromParent())
+     );
 
-    $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())
-      );
-
-
-    $this->addThesaurus($registry, $builder);
-
-    $this->addVideolink($registry, $builder);
-
-    $this->addImage($registry, $builder);
-
-    // Response type resolver.
-    $registry->addTypeResolver('Response', [
-      __CLASS__,
-      'resolveResponse',
-    ]);
-  }
-
-
-  //  __  __      _           _
-  // |  \/  |__ _| |_ ___ _ _(_)__ _ _  _
-  // | |\/| / _` |  _/ -_) '_| / _` | || |
-  // |_|  |_\__,_|\__\___|_| |_\__,_|\_,_|
-  /**
-   * @param \Drupal\graphql\GraphQL\ResolverRegistryInterface $registry
-   * @param \Drupal\graphql\GraphQL\ResolverBuilder $builder
-   */
-  protected function addMateriau(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
-    $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())
-      );
+    // TODO: property_path helper
+    // $props = [
+    //   [
+    //     "res" => "attachments",
+    //     "type" => "entity:taxonomy_term",
+    //     "path" => "field_attachments",
+    //   ]
+    // ]
+    // foreach ($props as $key => $value) {
+    //   $registry->addFieldResolver('Company', $value['res'],
+    //    $builder->produce('property_path')
+    //      ->map('type', $builder->fromValue('entity:taxonomy_term'))
+    //      ->map('value', $builder->fromParent())
+    //      ->map('path', $builder->fromValue('field_attachments'))
+    //    );
+    // }
 
-    $registry->addFieldResolver('Materiau', 'title',
-      $builder->compose(
-        $builder->produce('entity_label')
-          ->map('entity', $builder->fromParent())
-      ));
+    $registry->addFieldResolver('Company', 'attachments',
+     $builder->produce('property_path')
+       ->map('type', $builder->fromValue('entity:taxonomy_term'))
+       ->map('value', $builder->fromParent())
+       ->map('path', $builder->fromValue('field_attachments'))
+     );
 
-    $registry->addFieldResolver('Materiau', 'body',
+    $registry->addFieldResolver('Company', 'memo',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:node'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('body.value'))
+        ->map('path', $builder->fromValue('field_memo.value'))
       );
 
-    $registry->addFieldResolver('Materiau', 'short_description',
+    $registry->addFieldResolver('Company', 'note',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:node'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_short_description.value'))
+        ->map('path', $builder->fromValue('field_note.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',
+    $registry->addFieldResolver('Company', 'website',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:node'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->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'))
+        ->map('path', $builder->fromValue('field_website'))
       );
 
-    $registry->addFieldResolver('Materiau', 'attachments',
+    $registry->addFieldResolver('Company', 'departement',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:node'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('field_attachments'))
+        ->map('path', $builder->fromValue('field_departement.value'))
       );
 
-    $registry->addFieldResolver('Materiau', 'videos',
+    $registry->addFieldResolver('Company', 'email',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('entity:node'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->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'))
-      );
-
-    $registry->addFieldResolver('Materiau', 'manufacturer',
-      $builder->produce('entity_reference')
-        ->map('entity', $builder->fromParent())
-        ->map('field', $builder->fromValue('field_manufacturer'))
-      );
-
-    $registry->addFieldResolver('Materiau', 'distributor',
-      $builder->produce('entity_reference')
-        ->map('entity', $builder->fromParent())
-        ->map('field', $builder->fromValue('field_distributor'))
-      );
-
-    // field_famille
-    // field_index
-    // field_reference
-    // field_samples
-
-  }
-
-
-  //  ___
-  // |_ _|_ __  __ _ __ _ ___
-  //  | || '  \/ _` / _` / -_)
-  // |___|_|_|_\__,_\__, \___|
-  //                |___/
-  /**
-   * @param \Drupal\graphql\GraphQL\ResolverRegistryInterface $registry
-   * @param \Drupal\graphql\GraphQL\ResolverBuilder $builder
-   */
-  protected function addImage(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
-    $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'))
+        ->map('path', $builder->fromValue('field_public_email.value'))
       );
 
-  }
-
-
-  // __   ___    _         _    _      _
-  // \ \ / (_)__| |___ ___| |  (_)_ _ | |__
-  //  \ V /| / _` / -_) _ \ |__| | ' \| / /
-  //   \_/ |_\__,_\___\___/____|_|_||_|_\_\
-  /**
-   * @param \Drupal\graphql\GraphQL\ResolverRegistryInterface $registry
-   * @param \Drupal\graphql\GraphQL\ResolverBuilder $builder
-   */
-  protected function addVideolink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
-    $registry->addFieldResolver('VideoLink', 'url',
+    $registry->addFieldResolver('Company', 'address',
       $builder->produce('property_path')
-        ->map('type', $builder->fromValue('field_item:video_embed_field'))
+        ->map('type', $builder->fromValue('entity:taxonomy_term'))
         ->map('value', $builder->fromParent())
-        ->map('path', $builder->fromValue('value'))
-      );
-  }
-
-
-  //  _____ _
-  // |_   _| |_  ___ ___ __ _ _  _ _ _ _  _ ___
-  //   | | | ' \/ -_|_-</ _` | || | '_| || (_-<
-  //   |_| |_||_\___/__/\__,_|\_,_|_|  \_,_/__/
-  /**
-   * @param \Drupal\graphql\GraphQL\ResolverRegistryInterface $registry
-   * @param \Drupal\graphql\GraphQL\ResolverBuilder $builder
-   */
-  protected function addThesaurus(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
-    $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())
+        ->map('path', $builder->fromValue('field_public_address'))
       );
 
-    $registry->addFieldResolver('Thesaurus', 'name',
-      $builder->produce('entity_label')
-        ->map('entity', $builder->fromParent())
-      );
+    // field_infos_from_company
+    // field_public_phone
   }
 
   /**