MaterioSchemaExtension.php 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639
  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. use Drupal\Core\Url;
  9. // use CommerceGuys\Addressing\Country\CountryRepository;
  10. use Symfony\Component\DependencyInjection\ContainerInterface;
  11. use Drupal\Core\Extension\ModuleHandlerInterface;
  12. use CommerceGuys\Addressing\Country\CountryRepositoryInterface;
  13. use GraphQL\Error\Error;
  14. /**
  15. * @SchemaExtension(
  16. * id = "materio_extension",
  17. * name = "Materio extension",
  18. * description = "Materio extension.",
  19. * schema = "materio"
  20. * )
  21. */
  22. class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
  23. /**
  24. * The country repository.
  25. *
  26. * @var \CommerceGuys\Addressing\Country\CountryRepositoryInterface
  27. */
  28. protected $countryRepository;
  29. public function __construct( array $configuration, $pluginId, array $pluginDefinition, ModuleHandlerInterface $moduleHandler, CountryRepositoryInterface $country_repository) {
  30. parent::__construct($configuration, $pluginId, $pluginDefinition, $moduleHandler);
  31. $this->countryRepository = $country_repository;
  32. }
  33. /**
  34. * {@inheritdoc}
  35. *
  36. * @codeCoverageIgnore
  37. */
  38. public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
  39. return new static(
  40. $configuration,
  41. $plugin_id,
  42. $plugin_definition,
  43. $container->get('module_handler'),
  44. $container->get('address.country_repository')
  45. );
  46. }
  47. /**
  48. * {@inheritdoc}
  49. */
  50. public function registerResolvers(ResolverRegistryInterface $registry) {
  51. $builder = new ResolverBuilder();
  52. $this->addRouteResolver($registry, $builder);
  53. $this->addMateriau($registry, $builder);
  54. $this->addNote($registry, $builder);
  55. $this->addSearchResult($registry, $builder);
  56. $this->addSample($registry, $builder);
  57. $this->addArticle($registry, $builder);
  58. $this->addThematique($registry, $builder);
  59. $this->addCompany($registry, $builder);
  60. $this->addProduct($registry, $builder);
  61. $this->addVariation($registry, $builder);
  62. $this->addPrice($registry, $builder);
  63. $this->addAddress($registry, $builder);
  64. $this->addCountry($registry, $builder);
  65. $this->addFilefield($registry, $builder);
  66. $this->addFile($registry, $builder);
  67. $this->addDate($registry, $builder);
  68. $this->addLink($registry, $builder);
  69. $this->addShowroom($registry, $builder);
  70. $this->addTag($registry, $builder);
  71. $this->addThesaurus($registry, $builder);
  72. $this->addVideolink($registry, $builder);
  73. $this->addImage($registry, $builder);
  74. // Response type resolver.
  75. $registry->addTypeResolver('Response', [
  76. __CLASS__,
  77. 'resolveResponse',
  78. ]);
  79. }
  80. // ___ _
  81. // | _ \___ _ _| |_ ___
  82. // | / _ \ || | _/ -_)
  83. // |_|_\___/\_,_|\__\___|
  84. protected function addRouteResolver(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  85. // Tell GraphQL how to resolve types of a common interface.
  86. $registry->addTypeResolver('NodeInterface', function ($value) {
  87. $path = explode('\\', get_class($value));
  88. $class = array_pop($path);
  89. if ($class === 'Node') {
  90. switch ($value->bundle()) {
  91. case 'article': return 'Article';
  92. case 'materiau': return 'Materiau';
  93. case 'thematique': return 'Thematique';
  94. }
  95. }
  96. throw new Error('Could not resolve content type.');
  97. });
  98. $registry->addFieldResolver('Query', 'route',
  99. $builder->compose(
  100. $builder->callBack(function($parent, $args){
  101. $t="t";
  102. return $parent;
  103. }),
  104. $builder->produce('route_load')
  105. ->map('path', $builder->fromArgument('path')),
  106. $builder->callBack(function($parent, $args){
  107. $t="t";
  108. return $parent;
  109. }),
  110. $builder->produce('route_entity')
  111. ->map('url', $builder->fromParent())
  112. ->map('language', $builder->fromArgument('lang')),
  113. $builder->callBack(function($parent, $args){
  114. $t="t";
  115. return $parent;
  116. })
  117. ));
  118. }
  119. // __ __ _ _
  120. // | \/ |__ _| |_ ___ _ _(_)__ _ _ _
  121. // | |\/| / _` | _/ -_) '_| / _` | || |
  122. // |_| |_\__,_|\__\___|_| |_\__,_|\_,_|
  123. protected function addMateriau(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  124. // $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
  125. $registry->addFieldResolver('Query', 'materiau',
  126. $builder->produce('entity_load')
  127. ->map('type', $builder->fromValue('node'))
  128. ->map('bundles', $builder->fromValue(['materiau']))
  129. ->map('id', $builder->fromArgument('id'))
  130. ->map('language', $builder->fromArgument('lang'))
  131. );
  132. $registry->addFieldResolver('Query', 'materiaux',
  133. $builder->produce('entity_load_multiple')
  134. ->map('type', $builder->fromValue('node'))
  135. // ->map('bundles', $builder->fromValue(['materiau']))
  136. ->map('ids', $builder->fromArgument('ids'))
  137. ->map('language', $builder->fromArgument('lang'))
  138. );
  139. $registry->addFieldResolver('Materiau', 'id',
  140. $builder->produce('entity_id')
  141. ->map('entity', $builder->fromParent())
  142. );
  143. $registry->addFieldResolver('Materiau', 'uuid',
  144. $builder->produce('entity_uuid')
  145. ->map('entity', $builder->fromParent())
  146. );
  147. $registry->addFieldResolver('Materiau', 'bundle',
  148. $builder->compose(
  149. $builder->produce('entity_bundle')
  150. ->map('entity', $builder->fromParent())
  151. ));
  152. $registry->addFieldResolver('Materiau', 'path',
  153. $builder->compose(
  154. $builder->produce('entity_url')
  155. ->map('entity', $builder->fromParent()),
  156. $builder->produce('url_path')
  157. ->map('url', $builder->fromParent())
  158. )
  159. );
  160. $registry->addFieldResolver('Materiau', 'title',
  161. $builder->compose(
  162. $builder->produce('entity_label')
  163. ->map('entity', $builder->fromParent())
  164. ));
  165. $registry->addFieldResolver('Materiau', 'body',
  166. $builder->produce('property_path')
  167. ->map('type', $builder->fromValue('entity:node'))
  168. ->map('value', $builder->fromParent())
  169. ->map('path', $builder->fromValue('body.value'))
  170. );
  171. $registry->addFieldResolver('Materiau', 'short_description',
  172. $builder->produce('property_path')
  173. ->map('type', $builder->fromValue('entity:node'))
  174. ->map('value', $builder->fromParent())
  175. ->map('path', $builder->fromValue('field_short_description.value'))
  176. );
  177. $registry->addFieldResolver('Materiau', 'author',
  178. $builder->compose(
  179. $builder->produce('entity_owner')
  180. ->map('entity', $builder->fromParent()),
  181. $builder->produce('entity_label')
  182. ->map('entity', $builder->fromParent())
  183. ));
  184. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  185. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  186. $registry->addFieldResolver('Materiau', 'linked_materials',
  187. // $builder->compose(
  188. // $builder->produce('entity_reference')
  189. // ->map('entity', $builder->fromParent())
  190. // ->map('field', $builder->fromValue('field_linked_materials')))
  191. $builder->compose(
  192. $builder->callback(function($parent, $args){
  193. $linkedmaterials = $parent->get('field_linked_materials')->getValue();
  194. $nids = [];
  195. foreach ($linkedmaterials as $key => $value) {
  196. $nids[] = $value['target_id'];
  197. }
  198. $lang = $parent->language()->getId();
  199. $test="test";
  200. return [
  201. "ids" => $nids,
  202. "language" => $lang
  203. ];
  204. }),
  205. $builder->produce('entity_load_multiple')
  206. ->map('type', $builder->fromValue('node'))
  207. ->map('bundles', $builder->fromValue(['materiau']))
  208. ->map('ids', $builder->callback(function($parent, $args){
  209. return $parent['ids'];
  210. }))
  211. ->map('language', $builder->callback(function($parent, $args){
  212. return $parent['language'];
  213. }))
  214. )
  215. );
  216. $registry->addFieldResolver('Materiau', 'linked_articles',
  217. // $builder->compose(
  218. // $builder->produce('entity_reference')
  219. // ->map('entity', $builder->fromParent())
  220. // ->map('field', $builder->fromValue('field_linked_articles')))
  221. $builder->compose(
  222. $builder->callback(function($parent, $args){
  223. $linkedmaterials = $parent->get('field_linked_articles')->getValue();
  224. $nids = [];
  225. foreach ($linkedmaterials as $key => $value) {
  226. $nids[] = $value['target_id'];
  227. }
  228. $lang = $parent->language()->getId();
  229. $test="test";
  230. return [
  231. "ids" => $nids,
  232. "language" => $lang
  233. ];
  234. }),
  235. $builder->produce('entity_load_multiple')
  236. ->map('type', $builder->fromValue('node'))
  237. ->map('bundles', $builder->fromValue(['materiau']))
  238. ->map('ids', $builder->callback(function($parent, $args){
  239. return $parent['ids'];
  240. }))
  241. ->map('language', $builder->callback(function($parent, $args){
  242. return $parent['language'];
  243. }))
  244. )
  245. );
  246. $registry->addFieldResolver('Materiau', 'memo',
  247. $builder->produce('property_path')
  248. ->map('type', $builder->fromValue('entity:node'))
  249. ->map('value', $builder->fromParent())
  250. ->map('path', $builder->fromValue('field_memo.value'))
  251. );
  252. $registry->addFieldResolver('Materiau', 'images',
  253. $builder->produce('entity_reference')
  254. ->map('entity', $builder->fromParent())
  255. ->map('field', $builder->fromValue('field_materiau_images'))
  256. );
  257. $registry->addFieldResolver('Materiau', 'attachments',
  258. $builder->produce('property_path')
  259. ->map('type', $builder->fromValue('entity:node'))
  260. ->map('value', $builder->fromParent())
  261. ->map('path', $builder->fromValue('field_attachments'))
  262. );
  263. $registry->addFieldResolver('Materiau', 'videos',
  264. $builder->produce('property_path')
  265. ->map('type', $builder->fromValue('entity:node'))
  266. ->map('value', $builder->fromParent())
  267. ->map('path', $builder->fromValue('field_video'))
  268. );
  269. $registry->addFieldResolver('Materiau', 'tags',
  270. $builder->produce('entity_reference')
  271. ->map('entity', $builder->fromParent())
  272. ->map('field', $builder->fromValue('field_tags'))
  273. );
  274. $registry->addFieldResolver('Materiau', 'thesaurus',
  275. $builder->produce('entity_reference')
  276. ->map('entity', $builder->fromParent())
  277. ->map('field', $builder->fromValue('field_thesaurus'))
  278. );
  279. $registry->addFieldResolver('Materiau', 'manufacturer',
  280. $builder->produce('entity_reference')
  281. ->map('entity', $builder->fromParent())
  282. ->map('field', $builder->fromValue('field_manufacturer'))
  283. );
  284. $registry->addFieldResolver('Materiau', 'distributor',
  285. $builder->produce('entity_reference')
  286. ->map('entity', $builder->fromParent())
  287. ->map('field', $builder->fromValue('field_distributor'))
  288. );
  289. // $registry->addFieldResolver('Materiau', 'famille',
  290. // $builder->produce('property_path')
  291. // ->map('type', $builder->fromValue('entity:node'))
  292. // ->map('value', $builder->fromParent())
  293. // ->map('path', $builder->fromValue('field_famille.value'))
  294. // );
  295. //
  296. // $registry->addFieldResolver('Materiau', 'index',
  297. // $builder->produce('property_path')
  298. // ->map('type', $builder->fromValue('entity:node'))
  299. // ->map('value', $builder->fromParent())
  300. // ->map('path', $builder->fromValue('field_index.value'))
  301. // );
  302. $registry->addFieldResolver('Materiau', 'reference',
  303. $builder->produce('property_path')
  304. ->map('type', $builder->fromValue('entity:node'))
  305. ->map('value', $builder->fromParent())
  306. ->map('path', $builder->fromValue('field_reference.value'))
  307. );
  308. $registry->addFieldResolver('Materiau', 'samples',
  309. $builder->produce('property_path')
  310. ->map('type', $builder->fromValue('entity:node'))
  311. ->map('value', $builder->fromParent())
  312. ->map('path', $builder->fromValue('field_samples'))
  313. );
  314. $registry->addFieldResolver('Materiau', 'note',
  315. $builder->compose(
  316. $builder->callback(function($parent, $args){
  317. // get the current user id
  318. $user = \Drupal::currentUser()->id();
  319. // get the current material id
  320. $target = $parent->id();
  321. // query the note for these user AND material (if any)
  322. // if null, UI will create it with rest api
  323. $entity_storage = \Drupal::entityTypeManager()->getStorage('node');
  324. $query = $entity_storage->getQuery()
  325. ->condition('type', 'note')
  326. ->condition('uid', $user)
  327. ->condition('field_target', $target)
  328. ->accessCheck(TRUE);
  329. $results = $query->execute();
  330. // $test="test";
  331. return array_shift($results);
  332. }),
  333. $builder->produce('entity_load')
  334. ->map('type', $builder->fromValue('node'))
  335. ->map('bundle', $builder->fromValue('note'))
  336. ->map('id', $builder->fromParent())
  337. )
  338. );
  339. $registry->addFieldResolver('Materiau', 'note_id',
  340. $builder->compose(
  341. $builder->callback(function($parent, $args){
  342. // get the current user id
  343. $user = \Drupal::currentUser()->id();
  344. // get the current material id
  345. $target = $parent->id();
  346. // query the note for these user AND material (if any)
  347. // if null, UI will create it with rest api
  348. $entity_storage = \Drupal::entityTypeManager()->getStorage('node');
  349. $query = $entity_storage->getQuery()
  350. ->condition('type', 'note')
  351. ->condition('uid', $user)
  352. ->condition('field_target', $target)
  353. ->accessCheck(TRUE);
  354. $results = $query->execute();
  355. // $test="test";
  356. return array_shift($results);
  357. }),
  358. $builder->produce('entity_load')
  359. ->map('type', $builder->fromValue('node'))
  360. ->map('bundle', $builder->fromValue('note'))
  361. ->map('id', $builder->fromParent()),
  362. $builder->produce('entity_id')
  363. ->map('entity', $builder->fromParent())
  364. )
  365. );
  366. }
  367. // _ _ _
  368. // | \| |___| |_ ___
  369. // | .` / _ \ _/ -_)
  370. // |_|\_\___/\__\___|
  371. protected function addNote(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  372. $registry->addFieldResolver('Note', 'id',
  373. $builder->produce('entity_id')
  374. ->map('entity', $builder->fromParent())
  375. );
  376. $registry->addFieldResolver('Note', 'contenu',
  377. $builder->produce('property_path')
  378. ->map('type', $builder->fromValue('entity:node'))
  379. ->map('value', $builder->fromParent())
  380. ->map('path', $builder->fromValue('field_contenu.value'))
  381. );
  382. $registry->addFieldResolver('Note', 'bundle',
  383. $builder->compose(
  384. $builder->produce('entity_bundle')
  385. ->map('entity', $builder->fromParent())
  386. ));
  387. $registry->addFieldResolver('Note', 'target',
  388. $builder->produce('property_path')
  389. ->map('type', $builder->fromValue('entity:node'))
  390. ->map('value', $builder->fromParent())
  391. ->map('path', $builder->fromValue('field_target.target_id'))
  392. );
  393. }
  394. // ___ _ ___ _ _
  395. // / __| ___ __ _ _ _ __| |_ | _ \___ ____ _| | |_
  396. // \__ \/ -_) _` | '_/ _| ' \| / -_|_-< || | | _|
  397. // |___/\___\__,_|_| \__|_||_|_|_\___/__/\_,_|_|\__|
  398. protected function addSearchResult(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  399. // Tell GraphQL how to resolve types of a common interface.
  400. $registry->addTypeResolver('SearchResultInterface', function ($value) {
  401. switch ($value->bundle()) {
  402. case 'materiau': return 'Materiau';
  403. case 'thematique': return 'Thematique';
  404. }
  405. throw new Error('Could not resolve content type.');
  406. });
  407. $registry->addFieldResolver('Query', 'searchresults',
  408. $builder->produce('entity_load_multiple')
  409. ->map('type', $builder->fromValue('node'))
  410. ->map('ids', $builder->fromArgument('ids'))
  411. ->map('language', $builder->fromArgument('lang'))
  412. );
  413. $registry->addFieldResolver('Query', 'searchresult',
  414. $builder->produce('entity_load')
  415. ->map('type', $builder->fromValue('node'))
  416. ->map('id', $builder->fromArgument('id'))
  417. ->map('language', $builder->fromArgument('lang'))
  418. );
  419. }
  420. // ___ _
  421. // / __| __ _ _ __ _ __| |___
  422. // \__ \/ _` | ' \| '_ \ / -_)
  423. // |___/\__,_|_|_|_| .__/_\___|
  424. // |_|
  425. protected function addSample(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  426. $registry->addFieldResolver('Sample', 'showroom',
  427. $builder->callback(function($parent, $args){
  428. return \Drupal\taxonomy\Entity\Term::load($parent['target_id']);
  429. })
  430. );
  431. $registry->addFieldResolver('Sample', 'location',
  432. $builder->callback(function($parent, $args){
  433. return $parent['location'];
  434. })
  435. );
  436. }
  437. // _ _ _ _
  438. // /_\ _ _| |_(_)__| |___
  439. // / _ \| '_| _| / _| / -_)
  440. // /_/ \_\_| \__|_\__|_\___|
  441. protected function addArticle(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  442. $registry->addFieldResolver('Query', 'article',
  443. $builder->produce('entity_load')
  444. ->map('type', $builder->fromValue('node'))
  445. ->map('bundles', $builder->fromValue(['article']))
  446. ->map('id', $builder->fromArgument('id'))
  447. ->map('language', $builder->fromArgument('lang'))
  448. );
  449. $registry->addFieldResolver('Article', 'id',
  450. $builder->produce('entity_id')
  451. ->map('entity', $builder->fromParent())
  452. );
  453. $registry->addFieldResolver('Article', 'uuid',
  454. $builder->produce('entity_uuid')
  455. ->map('entity', $builder->fromParent())
  456. );
  457. $registry->addFieldResolver('Article', 'path',
  458. $builder->compose(
  459. $builder->produce('entity_url')
  460. ->map('entity', $builder->fromParent()),
  461. $builder->produce('url_path')
  462. ->map('url', $builder->fromParent())
  463. )
  464. );
  465. $registry->addFieldResolver('Article', 'bundle',
  466. $builder->compose(
  467. $builder->produce('entity_bundle')
  468. ->map('entity', $builder->fromParent())
  469. ));
  470. $registry->addFieldResolver('Article', 'title',
  471. $builder->compose(
  472. $builder->produce('entity_label')
  473. ->map('entity', $builder->fromParent())
  474. ));
  475. $registry->addFieldResolver('Article', 'author',
  476. $builder->compose(
  477. $builder->produce('entity_owner')
  478. ->map('entity', $builder->fromParent()),
  479. $builder->produce('entity_label')
  480. ->map('entity', $builder->fromParent())
  481. ));
  482. $registry->addFieldResolver('Article', 'body',
  483. $builder->produce('property_path')
  484. ->map('type', $builder->fromValue('entity:node'))
  485. ->map('value', $builder->fromParent())
  486. ->map('path', $builder->fromValue('body.value'))
  487. );
  488. $registry->addFieldResolver('Article', 'memo',
  489. $builder->produce('property_path')
  490. ->map('type', $builder->fromValue('entity:node'))
  491. ->map('value', $builder->fromParent())
  492. ->map('path', $builder->fromValue('field_memo.value'))
  493. );
  494. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  495. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  496. $registry->addFieldResolver('Article', 'linked_materials',
  497. // $builder->produce('entity_reference')
  498. // ->map('entity', $builder->fromParent())
  499. // ->map('field', $builder->fromValue('field_linked_materials'))
  500. // // ->map('language', $builder->fromValue('fr')) // this is not working
  501. // // ->map('language', $builder->produce('entity_language')
  502. // // ->map('entity', $builder->fromParent())) // neither that
  503. // THIS USED TO WORK but not anymore :(
  504. // invalid language translation (fr) provided
  505. $builder->compose(
  506. $builder->callback(function($parent, $args){
  507. $linkedmaterials = $parent->get('field_linked_materials')->getValue();
  508. $nids = [];
  509. foreach ($linkedmaterials as $key => $value) {
  510. $nids[] = $value['target_id'];
  511. }
  512. $lang = $parent->language()->getId();
  513. $test="test";
  514. return [
  515. "ids" => $nids,
  516. "language" => $lang
  517. ];
  518. }),
  519. $builder->produce('entity_load_multiple')
  520. ->map('type', $builder->fromValue('node'))
  521. ->map('bundles', $builder->fromValue(['materiau']))
  522. ->map('ids', $builder->callback(function($parent, $args){
  523. return $parent['ids'];
  524. }))
  525. ->map('language', $builder->callback(function($parent, $args){
  526. return $parent['language'];
  527. }))
  528. )
  529. );
  530. $registry->addFieldResolver('Article', 'images',
  531. $builder->produce('entity_reference')
  532. ->map('entity', $builder->fromParent())
  533. ->map('field', $builder->fromValue('field_visuel'))
  534. );
  535. $registry->addFieldResolver('Article', 'videos',
  536. $builder->produce('property_path')
  537. ->map('type', $builder->fromValue('entity:node'))
  538. ->map('value', $builder->fromParent())
  539. ->map('path', $builder->fromValue('field_video'))
  540. );
  541. $registry->addFieldResolver('Article', 'tags',
  542. $builder->produce('entity_reference')
  543. ->map('entity', $builder->fromParent())
  544. ->map('field', $builder->fromValue('field_tags'))
  545. );
  546. $registry->addFieldResolver('Article', 'thesaurus',
  547. $builder->produce('entity_reference')
  548. ->map('entity', $builder->fromParent())
  549. ->map('field', $builder->fromValue('field_thesaurus'))
  550. );
  551. $registry->addFieldResolver('Article', 'showroom',
  552. $builder->compose(
  553. $builder->produce('entity_reference')
  554. ->map('entity', $builder->fromParent())
  555. ->map('field', $builder->fromValue('field_showroom')),
  556. $builder->callback(function ($items) {
  557. return $items[0];
  558. })
  559. ));
  560. $registry->addFieldResolver('Article', 'source',
  561. $builder->produce('property_path')
  562. ->map('type', $builder->fromValue('entity:node'))
  563. ->map('value', $builder->fromParent())
  564. ->map('path', $builder->fromValue('field_source'))
  565. );
  566. $registry->addFieldResolver('Article', 'date',
  567. $builder->produce('property_path')
  568. ->map('type', $builder->fromValue('entity:node'))
  569. ->map('value', $builder->fromParent())
  570. ->map('path', $builder->fromValue('field_date'))
  571. );
  572. }
  573. // _____ _ _ _
  574. // |_ _| |_ ___ _ __ __ _| |_(_)__ _ _ _ ___
  575. // | | | ' \/ -_) ' \/ _` | _| / _` | || / -_)
  576. // |_| |_||_\___|_|_|_\__,_|\__|_\__, |\_,_\___|
  577. // |_|
  578. protected function addThematique(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  579. $registry->addFieldResolver('Query', 'thematique',
  580. $builder->produce('entity_load')
  581. ->map('type', $builder->fromValue('node'))
  582. // ->map('bundles', $builder->fromValue(['thematique']))
  583. ->map('id', $builder->fromArgument('id'))
  584. ->map('language', $builder->fromArgument('lang'))
  585. );
  586. $registry->addFieldResolver('Thematique', 'id',
  587. $builder->produce('entity_id')
  588. ->map('entity', $builder->fromParent())
  589. );
  590. $registry->addFieldResolver('Thematique', 'uuid',
  591. $builder->produce('entity_uuid')
  592. ->map('entity', $builder->fromParent())
  593. );
  594. $registry->addFieldResolver('Thematique', 'path',
  595. $builder->compose(
  596. $builder->produce('entity_url')
  597. ->map('entity', $builder->fromParent()),
  598. $builder->produce('url_path')
  599. ->map('url', $builder->fromParent())
  600. )
  601. );
  602. $registry->addFieldResolver('Thematique', 'bundle',
  603. $builder->compose(
  604. $builder->produce('entity_bundle')
  605. ->map('entity', $builder->fromParent())
  606. ));
  607. $registry->addFieldResolver('Thematique', 'title',
  608. $builder->compose(
  609. $builder->produce('entity_label')
  610. ->map('entity', $builder->fromParent())
  611. ));
  612. $registry->addFieldResolver('Thematique', 'author',
  613. $builder->compose(
  614. $builder->produce('entity_owner')
  615. ->map('entity', $builder->fromParent()),
  616. $builder->produce('entity_label')
  617. ->map('entity', $builder->fromParent())
  618. ));
  619. $registry->addFieldResolver('Thematique', 'short_description',
  620. $builder->produce('property_path')
  621. ->map('type', $builder->fromValue('entity:node'))
  622. ->map('value', $builder->fromParent())
  623. ->map('path', $builder->fromValue('field_short_description.value'))
  624. );
  625. $registry->addFieldResolver('Thematique', 'body',
  626. $builder->produce('property_path')
  627. ->map('type', $builder->fromValue('entity:node'))
  628. ->map('value', $builder->fromParent())
  629. ->map('path', $builder->fromValue('body.value'))
  630. );
  631. $registry->addFieldResolver('Thematique', 'memo',
  632. $builder->produce('property_path')
  633. ->map('type', $builder->fromValue('entity:node'))
  634. ->map('value', $builder->fromParent())
  635. ->map('path', $builder->fromValue('field_memo.value'))
  636. );
  637. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  638. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  639. $registry->addFieldResolver('Thematique', 'linked_materials',
  640. // $builder->produce('entity_reference')
  641. // ->map('entity', $builder->fromParent())
  642. // ->map('field', $builder->fromValue('field_linked_materials'))
  643. $builder->compose(
  644. $builder->callback(function($parent, $args){
  645. $linkedmaterials = $parent->get('field_linked_materials')->getValue();
  646. $nids = [];
  647. foreach ($linkedmaterials as $key => $value) {
  648. $nids[] = $value['target_id'];
  649. }
  650. $lang = $parent->language()->getId();
  651. $test="test";
  652. return [
  653. "ids" => $nids,
  654. "language" => $lang
  655. ];
  656. }),
  657. $builder->produce('entity_load_multiple')
  658. ->map('type', $builder->fromValue('node'))
  659. ->map('bundles', $builder->fromValue(['materiau']))
  660. ->map('ids', $builder->callback(function($parent, $args){
  661. return $parent['ids'];
  662. }))
  663. ->map('language', $builder->callback(function($parent, $args){
  664. return $parent['language'];
  665. }))
  666. )
  667. );
  668. $registry->addFieldResolver('Thematique', 'images',
  669. $builder->produce('entity_reference')
  670. ->map('entity', $builder->fromParent())
  671. ->map('field', $builder->fromValue('field_visuel'))
  672. );
  673. $registry->addFieldResolver('Thematique', 'tags',
  674. $builder->produce('entity_reference')
  675. ->map('entity', $builder->fromParent())
  676. ->map('field', $builder->fromValue('field_tags'))
  677. );
  678. }
  679. // ___
  680. // |_ _|_ __ __ _ __ _ ___
  681. // | || ' \/ _` / _` / -_)
  682. // |___|_|_|_\__,_\__, \___|
  683. // |___/
  684. protected function addImage(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  685. $registry->addFieldResolver('Image', 'id',
  686. $builder->produce('entity_id')
  687. ->map('entity', $builder->fromParent())
  688. );
  689. $registry->addFieldResolver('Image', 'url',
  690. $builder->produce('image_url')
  691. ->map('entity', $builder->fromParent())
  692. );
  693. $registry->addFieldResolver('Image', 'alt',
  694. $builder->produce('property_path')
  695. ->map('type', $builder->fromValue('entity:node'))
  696. ->map('value', $builder->fromParent())
  697. ->map('path', $builder->fromValue('field_image.alt'))
  698. );
  699. $registry->addFieldResolver('Image', 'style_minicard',
  700. $builder->produce('image_derivative')
  701. ->map('entity', $builder->fromParent())
  702. ->map('style', $builder->fromValue('card_medium_half'))
  703. );
  704. $registry->addFieldResolver('Image', 'style_minicard_url',
  705. $builder->compose(
  706. $builder->produce('image_derivative')
  707. ->map('entity', $builder->fromParent())
  708. ->map('style', $builder->fromValue('card_medium_half')),
  709. $builder->callback(function($parent, $args){
  710. return $parent['url'];
  711. })
  712. ));
  713. $registry->addFieldResolver('Image', 'style_linkedmaterialcard',
  714. $builder->produce('image_derivative')
  715. ->map('entity', $builder->fromParent())
  716. ->map('style', $builder->fromValue('linkedmaterial_card'))
  717. );
  718. $registry->addFieldResolver('Image', 'style_linkedmaterialcard_url',
  719. $builder->compose(
  720. $builder->produce('image_derivative')
  721. ->map('entity', $builder->fromParent())
  722. ->map('style', $builder->fromValue('linkedmaterial_card')),
  723. $builder->callback(function($parent, $args){
  724. return $parent['url'];
  725. })
  726. ));
  727. $registry->addFieldResolver('Image', 'style_cardmedium',
  728. $builder->produce('image_derivative')
  729. ->map('entity', $builder->fromParent())
  730. ->map('style', $builder->fromValue('card_medium'))
  731. );
  732. $registry->addFieldResolver('Image', 'style_cardmedium_url',
  733. $builder->compose(
  734. $builder->produce('image_derivative')
  735. ->map('entity', $builder->fromParent())
  736. ->map('style', $builder->fromValue('card_medium')),
  737. $builder->callback(function($parent, $args){
  738. return $parent['url'];
  739. })
  740. ));
  741. $registry->addFieldResolver('Image', 'style_cardfull',
  742. $builder->produce('image_derivative')
  743. ->map('entity', $builder->fromParent())
  744. ->map('style', $builder->fromValue('card_full'))
  745. );
  746. $registry->addFieldResolver('Image', 'style_cardfull_url',
  747. $builder->compose(
  748. $builder->produce('image_derivative')
  749. ->map('entity', $builder->fromParent())
  750. ->map('style', $builder->fromValue('card_full')),
  751. $builder->callback(function($parent, $args){
  752. return $parent['url'];
  753. })
  754. ));
  755. $registry->addFieldResolver('Image', 'style_articlecardmedium',
  756. $builder->produce('image_derivative')
  757. ->map('entity', $builder->fromParent())
  758. ->map('style', $builder->fromValue('article_card_medium'))
  759. );
  760. $registry->addFieldResolver('Image', 'style_articlecardmedium_url',
  761. $builder->compose(
  762. $builder->produce('image_derivative')
  763. ->map('entity', $builder->fromParent())
  764. ->map('style', $builder->fromValue('article_card_medium')),
  765. $builder->callback(function($parent, $args){
  766. return $parent['url'];
  767. })
  768. ));
  769. $registry->addFieldResolver('Image', 'style_hd',
  770. $builder->produce('image_derivative')
  771. ->map('entity', $builder->fromParent())
  772. ->map('style', $builder->fromValue('hd'))
  773. );
  774. $registry->addFieldResolver('Image', 'style_hd_url',
  775. $builder->compose(
  776. $builder->produce('image_derivative')
  777. ->map('entity', $builder->fromParent())
  778. ->map('style', $builder->fromValue('hd')),
  779. $builder->callback(function($parent, $args){
  780. return $parent['url'];
  781. })
  782. ));
  783. $registry->addFieldResolver('Image', 'style_showroomhome',
  784. $builder->produce('image_derivative')
  785. ->map('entity', $builder->fromParent())
  786. ->map('style', $builder->fromValue('home_showroom'))
  787. );
  788. $registry->addFieldResolver('Image', 'style_showroomhome_url',
  789. $builder->compose(
  790. $builder->produce('image_derivative')
  791. ->map('entity', $builder->fromParent())
  792. ->map('style', $builder->fromValue('home_showroom')),
  793. $builder->callback(function($parent, $args){
  794. return $parent['url'];
  795. })
  796. ));
  797. }
  798. // __ ___ _ _ _ _
  799. // \ \ / (_)__| |___ ___| | (_)_ _ | |__
  800. // \ V /| / _` / -_) _ \ |__| | ' \| / /
  801. // \_/ |_\__,_\___\___/____|_|_||_|_\_\
  802. protected function addVideolink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  803. $registry->addFieldResolver('VideoLink', 'url',
  804. $builder->produce('property_path')
  805. ->map('type', $builder->fromValue('field_item:video_embed_field'))
  806. ->map('value', $builder->fromParent())
  807. ->map('path', $builder->fromValue('value'))
  808. );
  809. }
  810. // _____ _
  811. // |_ _| |_ ___ ___ __ _ _ _ _ _ _ _ ___
  812. // | | | ' \/ -_|_-</ _` | || | '_| || (_-<
  813. // |_| |_||_\___/__/\__,_|\_,_|_| \_,_/__/
  814. protected function addThesaurus(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  815. $registry->addFieldResolver('Query', 'thesaurus',
  816. $builder->produce('entity_load')
  817. ->map('type', $builder->fromValue('taxonomy_term'))
  818. ->map('bundles', $builder->fromValue(['thesaurus']))
  819. ->map('id', $builder->fromArgument('id'))
  820. );
  821. $registry->addFieldResolver('Thesaurus', 'id',
  822. $builder->produce('entity_id')
  823. ->map('entity', $builder->fromParent())
  824. );
  825. $registry->addFieldResolver('Thesaurus', 'uuid',
  826. $builder->produce('entity_uuid')
  827. ->map('entity', $builder->fromParent())
  828. );
  829. $registry->addFieldResolver('Thesaurus', 'name',
  830. $builder->produce('entity_label')
  831. ->map('entity', $builder->fromParent())
  832. );
  833. }
  834. // _____
  835. // |_ _|_ _ __ _
  836. // | |/ _` / _` |
  837. // |_|\__,_\__, |
  838. // |___/
  839. protected function addTag(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  840. $registry->addFieldResolver('Query', 'tag',
  841. $builder->produce('entity_load')
  842. ->map('type', $builder->fromValue('taxonomy_term'))
  843. ->map('bundles', $builder->fromValue(['tags']))
  844. ->map('id', $builder->fromArgument('id'))
  845. );
  846. $registry->addFieldResolver('Tag', 'id',
  847. $builder->produce('entity_id')
  848. ->map('entity', $builder->fromParent())
  849. );
  850. $registry->addFieldResolver('Tag', 'uuid',
  851. $builder->produce('entity_uuid')
  852. ->map('entity', $builder->fromParent())
  853. );
  854. $registry->addFieldResolver('Tag', 'name',
  855. $builder->produce('entity_label')
  856. ->map('entity', $builder->fromParent())
  857. );
  858. }
  859. // ___ _
  860. // / __| |_ _____ __ ___ _ ___ ___ _ __
  861. // \__ \ ' \/ _ \ V V / '_/ _ \/ _ \ ' \
  862. // |___/_||_\___/\_/\_/|_| \___/\___/_|_|_|
  863. protected function addShowroom(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  864. $registry->addFieldResolver('Query', 'allshowrooms',
  865. $builder->compose(
  866. $builder->callback(function($parent, $arg){
  867. $entity_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
  868. $query = $entity_storage->getQuery()
  869. ->condition('vid', ['showroom'], 'IN')
  870. ->sort('tid')
  871. ->accessCheck(TRUE);
  872. $results = $query->execute();
  873. return $results;
  874. }),
  875. $builder->produce('entity_load_multiple')
  876. ->map('type', $builder->fromValue('taxonomy_term'))
  877. ->map('ids', $builder->fromParent())
  878. ->map('language', $builder->fromArgument('lang'))
  879. )
  880. );
  881. $registry->addFieldResolver('Query', 'showroom',
  882. $builder->produce('entity_load')
  883. ->map('type', $builder->fromValue('taxonomy_term'))
  884. ->map('bundles', $builder->fromValue(['showroom']))
  885. ->map('id', $builder->fromArgument('id'))
  886. ->map('language', $builder->fromArgument('lang'))
  887. );
  888. $registry->addFieldResolver('Showroom', 'id',
  889. $builder->produce('entity_id')
  890. ->map('entity', $builder->fromParent())
  891. );
  892. $registry->addFieldResolver('Showroom', 'uuid',
  893. $builder->produce('entity_uuid')
  894. ->map('entity', $builder->fromParent())
  895. );
  896. $registry->addFieldResolver('Showroom', 'name',
  897. $builder->produce('entity_label')
  898. ->map('entity', $builder->fromParent())
  899. );
  900. $registry->addFieldResolver('Showroom', 'description',
  901. $builder->callback(function($parent, $args){
  902. return $parent->getDescription();
  903. })
  904. );
  905. $registry->addFieldResolver('Showroom', 'email',
  906. $builder->produce('property_path')
  907. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  908. ->map('value', $builder->fromParent())
  909. ->map('path', $builder->fromValue('field_public_email.value'))
  910. );
  911. $registry->addFieldResolver('Showroom', 'address',
  912. $builder->produce('property_path')
  913. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  914. ->map('value', $builder->fromParent())
  915. ->map('path', $builder->fromValue('field_public_address'))
  916. );
  917. $registry->addFieldResolver('Showroom', 'phone',
  918. $builder->produce('property_path')
  919. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  920. ->map('value', $builder->fromParent())
  921. ->map('path', $builder->fromValue('field_public_phone.value'))
  922. );
  923. $registry->addFieldResolver('Showroom', 'images',
  924. $builder->produce('entity_reference')
  925. ->map('entity', $builder->fromParent())
  926. ->map('field', $builder->fromValue('field_visuels'))
  927. );
  928. $registry->addFieldResolver('Showroom', 'website',
  929. $builder->produce('property_path')
  930. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  931. ->map('value', $builder->fromParent())
  932. ->map('path', $builder->fromValue('field_website'))
  933. );
  934. $registry->addFieldResolver('Showroom', 'country',
  935. $builder->produce('property_path')
  936. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  937. ->map('value', $builder->fromParent())
  938. ->map('path', $builder->fromValue('field_public_address'))
  939. );
  940. }
  941. // _ _ _
  942. // | | (_)_ _ | |__
  943. // | |__| | ' \| / /
  944. // |____|_|_||_|_\_\
  945. protected function addLink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  946. $registry->addFieldResolver('Link', 'url',
  947. $builder->callback(function ($parent, $args) {
  948. return isset($parent[0]) ? $parent[0]['uri'] : null;
  949. })
  950. );
  951. $registry->addFieldResolver('Link', 'title',
  952. $builder->callback(function ($parent, $args) {
  953. return isset($parent[0]) ? $parent[0]['title'] : null;
  954. })
  955. );
  956. }
  957. // ___ _
  958. // | \ __ _| |_ ___
  959. // | |) / _` | _/ -_)
  960. // |___/\__,_|\__\___|
  961. protected function addDate(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  962. $registry->addFieldResolver('Date', 'start',
  963. $builder->callback(function ($parent, $args) {
  964. return isset($parent[0]) ? $parent[0]['value'] : null;
  965. })
  966. );
  967. $registry->addFieldResolver('Date', 'end',
  968. $builder->callback(function ($parent, $args) {
  969. return isset($parent[0]) ? $parent[0]['end_value'] : null;
  970. })
  971. );
  972. }
  973. // ___ _ _ __ _ _ _
  974. // | __(_) |___ / _(_)___| |__| |
  975. // | _|| | / -_) _| / -_) / _` |
  976. // |_| |_|_\___|_| |_\___|_\__,_|
  977. protected function addFilefield(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  978. $registry->addFieldResolver('Filefield', 'description',
  979. $builder->callback(function ($parent, $args) {
  980. return $parent['description'];
  981. })
  982. );
  983. $registry->addFieldResolver('Filefield', 'file',
  984. $builder->callback(function ($parent, $args) {
  985. return \Drupal\file\Entity\File::load($parent['target_id']);
  986. })
  987. );
  988. }
  989. // ___ _ _
  990. // | __(_) |___
  991. // | _|| | / -_)
  992. // |_| |_|_\___|
  993. protected function addFile(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  994. $registry->addFieldResolver('File', 'url',
  995. $builder->callback(function ($parent, $args) {
  996. // $fileuri = $parent->getFileUri();
  997. $url = $parent->createFileUrl();
  998. // return $parent->url();
  999. return $url;
  1000. })
  1001. );
  1002. $registry->addFieldResolver('File', 'filesize',
  1003. $builder->callback(function ($parent, $args) {
  1004. return $parent->getSize();
  1005. })
  1006. );
  1007. $registry->addFieldResolver('File', 'filemime',
  1008. $builder->callback(function ($parent, $args) {
  1009. return $parent->getMimeType();
  1010. })
  1011. );
  1012. $registry->addFieldResolver('File', 'filename',
  1013. $builder->callback(function ($parent, $args) {
  1014. return $parent->getFilename();
  1015. })
  1016. );
  1017. $registry->addFieldResolver('File', 'fid',
  1018. $builder->callback(function ($parent, $args) {
  1019. return $parent->id();
  1020. })
  1021. );
  1022. $registry->addFieldResolver('File', 'uuid',
  1023. $builder->callback(function ($parent, $args) {
  1024. return $parent->uuid();
  1025. })
  1026. );
  1027. }
  1028. // _ _ _
  1029. // /_\ __| |__| |_ _ ___ ______
  1030. // / _ \/ _` / _` | '_/ -_|_-<_-<
  1031. // /_/ \_\__,_\__,_|_| \___/__/__/
  1032. protected function addAddress(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1033. // $addr_fields = [
  1034. // 'langcode',
  1035. // 'country_code',
  1036. // 'administrative_area',
  1037. // 'locality',
  1038. // 'dependent_locality',
  1039. // 'postal_code',
  1040. // 'sorting_code',
  1041. // 'address_line1',
  1042. // 'address_line2',
  1043. // 'organization',
  1044. // 'given_name',
  1045. // 'additional_name',
  1046. // 'family_name'
  1047. // ];
  1048. //
  1049. // foreach ($addr_fields as $key => $value) {
  1050. // $registry->addFieldResolver('Address', $value,
  1051. // $builder->callback(function ($parent, $args) {
  1052. // return $parent[0][$value];
  1053. // })
  1054. // );
  1055. // }
  1056. $registry->addFieldResolver('Address', 'langcode',
  1057. $builder->callback(function ($parent, $args) {
  1058. return $parent[0]['langcode'];
  1059. })
  1060. );
  1061. $registry->addFieldResolver('Address', 'country_code',
  1062. $builder->callback(function ($parent, $args) {
  1063. return $parent[0]['country_code'];
  1064. })
  1065. );
  1066. $registry->addFieldResolver('Address', 'administrative_area',
  1067. $builder->callback(function ($parent, $args) {
  1068. return $parent[0]['administrative_area'];
  1069. })
  1070. );
  1071. $registry->addFieldResolver('Address', 'locality',
  1072. $builder->callback(function ($parent, $args) {
  1073. return $parent[0]['locality'];
  1074. })
  1075. );
  1076. $registry->addFieldResolver('Address', 'dependent_locality',
  1077. $builder->callback(function ($parent, $args) {
  1078. return $parent[0]['dependent_locality'];
  1079. })
  1080. );
  1081. $registry->addFieldResolver('Address', 'postal_code',
  1082. $builder->callback(function ($parent, $args) {
  1083. return $parent[0]['postal_code'];
  1084. })
  1085. );
  1086. $registry->addFieldResolver('Address', 'sorting_code',
  1087. $builder->callback(function ($parent, $args) {
  1088. return $parent[0]['sorting_code'];
  1089. })
  1090. );
  1091. $registry->addFieldResolver('Address', 'address_line1',
  1092. $builder->callback(function ($parent, $args) {
  1093. return $parent[0]['address_line1'];
  1094. })
  1095. );
  1096. $registry->addFieldResolver('Address', 'address_line2',
  1097. $builder->callback(function ($parent, $args) {
  1098. return $parent[0]['address_line2'];
  1099. })
  1100. );
  1101. $registry->addFieldResolver('Address', 'organization',
  1102. $builder->callback(function ($parent, $args) {
  1103. return $parent[0]['organization'];
  1104. })
  1105. );
  1106. $registry->addFieldResolver('Address', 'given_name',
  1107. $builder->callback(function ($parent, $args) {
  1108. return $parent[0]['given_name'];
  1109. })
  1110. );
  1111. $registry->addFieldResolver('Address', 'additional_name',
  1112. $builder->callback(function ($parent, $args) {
  1113. return $parent[0]['additional_name'];
  1114. })
  1115. );
  1116. $registry->addFieldResolver('Address', 'family_name',
  1117. $builder->callback(function ($parent, $args) {
  1118. return $parent[0]['family_name'];
  1119. })
  1120. );
  1121. }
  1122. // ____ _
  1123. // / ___|___ _ _ _ __ | |_ _ __ _ _
  1124. // | | / _ \| | | | '_ \| __| '__| | | |
  1125. // | |__| (_) | |_| | | | | |_| | | |_| |
  1126. // \____\___/ \__,_|_| |_|\__|_| \__, |
  1127. // |___/
  1128. protected function addCountry(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1129. $registry->addFieldResolver('Country', 'country_code',
  1130. $builder->callback(function ($parent, $args) {
  1131. return $parent[0]['country_code'];
  1132. })
  1133. );
  1134. $registry->addFieldResolver('Country', 'country_name',
  1135. $builder->callback(function ($parent, $args) {
  1136. $cc = $parent[0]['country_code'];
  1137. $countries = $this->countryRepository->getList();
  1138. $cn = isset($countries[$cc]) ? $countries[$cc] : $cc;
  1139. return $cn;
  1140. })
  1141. );
  1142. }
  1143. // ___
  1144. // / __|___ _ __ _ __ __ _ _ _ _ _
  1145. // | (__/ _ \ ' \| '_ \/ _` | ' \ || |
  1146. // \___\___/_|_|_| .__/\__,_|_||_\_, |
  1147. // |_| |__/
  1148. protected function addCompany(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1149. $registry->addFieldResolver('Query', 'company',
  1150. $builder->produce('entity_load')
  1151. ->map('type', $builder->fromValue('taxonomy_term'))
  1152. ->map('bundles', $builder->fromValue(['company']))
  1153. ->map('id', $builder->fromArgument('id'))
  1154. );
  1155. $registry->addFieldResolver('Company', 'id',
  1156. $builder->produce('entity_id')
  1157. ->map('entity', $builder->fromParent())
  1158. );
  1159. $registry->addFieldResolver('Company', 'uuid',
  1160. $builder->produce('entity_uuid')
  1161. ->map('entity', $builder->fromParent())
  1162. );
  1163. $registry->addFieldResolver('Company', 'name',
  1164. $builder->produce('entity_label')
  1165. ->map('entity', $builder->fromParent())
  1166. );
  1167. $registry->addFieldResolver('Company', 'description',
  1168. $builder->callback(function($parent, $args){
  1169. return $parent->getDescription();
  1170. })
  1171. );
  1172. // TODO: property_path helper
  1173. // $props = [
  1174. // [
  1175. // "res" => "attachments",
  1176. // "type" => "entity:taxonomy_term",
  1177. // "path" => "field_attachments",
  1178. // ]
  1179. // ]
  1180. // foreach ($props as $key => $value) {
  1181. // $registry->addFieldResolver('Company', $value['res'],
  1182. // $builder->produce('property_path')
  1183. // ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1184. // ->map('value', $builder->fromParent())
  1185. // ->map('path', $builder->fromValue('field_attachments'))
  1186. // );
  1187. // }
  1188. $registry->addFieldResolver('Company', 'attachments',
  1189. $builder->produce('property_path')
  1190. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1191. ->map('value', $builder->fromParent())
  1192. ->map('path', $builder->fromValue('field_attachments'))
  1193. );
  1194. $registry->addFieldResolver('Company', 'memo',
  1195. $builder->produce('property_path')
  1196. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1197. ->map('value', $builder->fromParent())
  1198. ->map('path', $builder->fromValue('field_memo.value'))
  1199. );
  1200. $registry->addFieldResolver('Company', 'note',
  1201. $builder->produce('property_path')
  1202. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1203. ->map('value', $builder->fromParent())
  1204. ->map('path', $builder->fromValue('field_note.value'))
  1205. );
  1206. $registry->addFieldResolver('Company', 'website',
  1207. $builder->produce('property_path')
  1208. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1209. ->map('value', $builder->fromParent())
  1210. ->map('path', $builder->fromValue('field_website'))
  1211. );
  1212. $registry->addFieldResolver('Company', 'departement',
  1213. $builder->produce('property_path')
  1214. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1215. ->map('value', $builder->fromParent())
  1216. ->map('path', $builder->fromValue('field_departement.value'))
  1217. );
  1218. $registry->addFieldResolver('Company', 'email',
  1219. $builder->produce('property_path')
  1220. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1221. ->map('value', $builder->fromParent())
  1222. ->map('path', $builder->fromValue('field_public_email.value'))
  1223. );
  1224. $registry->addFieldResolver('Company', 'address',
  1225. $builder->produce('property_path')
  1226. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1227. ->map('value', $builder->fromParent())
  1228. ->map('path', $builder->fromValue('field_public_address'))
  1229. );
  1230. $registry->addFieldResolver('Company', 'country',
  1231. $builder->produce('property_path')
  1232. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1233. ->map('value', $builder->fromParent())
  1234. ->map('path', $builder->fromValue('field_public_address'))
  1235. );
  1236. $registry->addFieldResolver('Company', 'phone',
  1237. $builder->produce('property_path')
  1238. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1239. ->map('value', $builder->fromParent())
  1240. ->map('path', $builder->fromValue('field_public_phone.value'))
  1241. );
  1242. $registry->addFieldResolver('Company', 'infos',
  1243. $builder->produce('property_path')
  1244. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  1245. ->map('value', $builder->fromParent())
  1246. ->map('path', $builder->fromValue('field_infos_from_company.value'))
  1247. );
  1248. }
  1249. protected function addProduct(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1250. $registry->addFieldResolver('Query', 'product',
  1251. $builder->produce('entity_load')
  1252. ->map('type', $builder->fromValue('commerce_product'))
  1253. // ->map('bundles', $builder->fromValue(['materiau']))
  1254. ->map('id', $builder->fromArgument('id'))
  1255. ->map('language', $builder->fromArgument('lang'))
  1256. );
  1257. $registry->addFieldResolver('Query', 'products',
  1258. $builder->produce('entity_load_multiple')
  1259. ->map('type', $builder->fromValue('commerce_product'))
  1260. // ->map('bundles', $builder->fromValue(['materiau']))
  1261. ->map('ids', $builder->fromArgument('ids'))
  1262. ->map('language', $builder->fromArgument('lang'))
  1263. );
  1264. $registry->addFieldResolver('Product', 'id',
  1265. $builder->produce('entity_id')
  1266. ->map('entity', $builder->fromParent())
  1267. );
  1268. $registry->addFieldResolver('Product', 'uuid',
  1269. $builder->produce('entity_uuid')
  1270. ->map('entity', $builder->fromParent())
  1271. );
  1272. $registry->addFieldResolver('Product', 'bundle',
  1273. $builder->produce('entity_bundle')
  1274. ->map('entity', $builder->fromParent())
  1275. );
  1276. $registry->addFieldResolver('Product', 'path',
  1277. $builder->compose(
  1278. $builder->produce('entity_url')
  1279. ->map('entity', $builder->fromParent()),
  1280. $builder->produce('url_path')
  1281. ->map('url', $builder->fromParent())
  1282. )
  1283. );
  1284. $registry->addFieldResolver('Product', 'title',
  1285. $builder->compose(
  1286. $builder->produce('entity_label')
  1287. ->map('entity', $builder->fromParent())
  1288. ));
  1289. $registry->addFieldResolver('Product', 'body',
  1290. $builder->produce('property_path')
  1291. ->map('type', $builder->fromValue('entity:commerce_product'))
  1292. ->map('value', $builder->fromParent())
  1293. ->map('path', $builder->fromValue('body.value'))
  1294. );
  1295. $registry->addFieldResolver('Product', 'price_description',
  1296. $builder->produce('property_path')
  1297. ->map('type', $builder->fromValue('entity:commerce_product'))
  1298. ->map('value', $builder->fromParent())
  1299. ->map('path', $builder->fromValue('field_price_description.value'))
  1300. );
  1301. // TODO: match the right language
  1302. $registry->addFieldResolver('Product', 'variations',
  1303. // $builder->produce('entity_reference')
  1304. // ->map('entity', $builder->fromParent())
  1305. // ->map('field', $builder->fromValue('variations'))
  1306. $builder->compose(
  1307. $builder->callback(function($parent, $args){
  1308. $variations = $parent->get('variations')->getValue();
  1309. $ids = [];
  1310. foreach ($variations as $key => $value) {
  1311. $ids[] = $value['target_id'];
  1312. }
  1313. $lang = $parent->language()->getId();
  1314. return [
  1315. "ids" => $ids,
  1316. "language" => $lang
  1317. ];
  1318. }),
  1319. $builder->produce('entity_load_multiple')
  1320. ->map('type', $builder->fromValue('commerce_product_variation'))
  1321. // ->map('bundles', $builder->fromValue(['materiau']))
  1322. ->map('ids', $builder->callback(function($parent, $args){
  1323. return $parent['ids'];
  1324. }))
  1325. ->map('language', $builder->callback(function($parent, $args){
  1326. return $parent['language'];
  1327. }))
  1328. )
  1329. );
  1330. }
  1331. protected function addVariation(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1332. // $registry->addFieldResolver('Query', 'product',
  1333. // $builder->produce('entity_load')
  1334. // ->map('type', $builder->fromValue('commerce_product_variation'))
  1335. // // ->map('bundles', $builder->fromValue(['materiau']))
  1336. // ->map('id', $builder->fromArgument('id'))
  1337. // );
  1338. // $registry->addFieldResolver('Query', 'product',
  1339. // $builder->produce('entity_load_multiple')
  1340. // ->map('type', $builder->fromValue('product'))
  1341. // // ->map('bundles', $builder->fromValue(['materiau']))
  1342. // ->map('ids', $builder->fromArgument('ids'))
  1343. // );
  1344. $registry->addFieldResolver('Variation', 'id',
  1345. $builder->produce('entity_id')
  1346. ->map('entity', $builder->fromParent())
  1347. );
  1348. $registry->addFieldResolver('Variation', 'uuid',
  1349. $builder->produce('entity_uuid')
  1350. ->map('entity', $builder->fromParent())
  1351. );
  1352. $registry->addFieldResolver('Variation', 'bundle',
  1353. $builder->produce('entity_bundle')
  1354. ->map('entity', $builder->fromParent())
  1355. );
  1356. $registry->addFieldResolver('Variation', 'path',
  1357. $builder->compose(
  1358. $builder->produce('entity_url')
  1359. ->map('entity', $builder->fromParent()),
  1360. $builder->produce('url_path')
  1361. ->map('url', $builder->fromParent())
  1362. )
  1363. );
  1364. $registry->addFieldResolver('Variation', 'title',
  1365. $builder->compose(
  1366. $builder->produce('entity_label')
  1367. ->map('entity', $builder->fromParent())
  1368. ));
  1369. $registry->addFieldResolver('Variation', 'description',
  1370. $builder->produce('property_path')
  1371. ->map('type', $builder->fromValue('entity:commerce_product_variation'))
  1372. ->map('value', $builder->fromParent())
  1373. ->map('path', $builder->fromValue('field_description.value'))
  1374. );
  1375. $registry->addFieldResolver('Variation', 'subscription_type',
  1376. $builder->produce('property_path')
  1377. ->map('type', $builder->fromValue('entity:commerce_product_variation'))
  1378. ->map('value', $builder->fromParent())
  1379. ->map('path', $builder->fromValue('subscription_type.value'))
  1380. );
  1381. $registry->addFieldResolver('Variation', 'sku',
  1382. $builder->produce('property_path')
  1383. ->map('type', $builder->fromValue('entity:commerce_product_variation'))
  1384. ->map('value', $builder->fromParent())
  1385. ->map('path', $builder->fromValue('sku.value'))
  1386. );
  1387. $registry->addFieldResolver('Variation', 'price',
  1388. $builder->produce('property_path')
  1389. ->map('type', $builder->fromValue('entity:commerce_product_variation'))
  1390. ->map('value', $builder->fromParent())
  1391. ->map('path', $builder->fromValue('price'))
  1392. );
  1393. // product_id
  1394. // list_price
  1395. // billing_schedule
  1396. // license_expiration
  1397. // license_type
  1398. // field_multiple
  1399. }
  1400. protected function addPrice(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  1401. $registry->addFieldResolver('Price', 'value',
  1402. $builder->compose(
  1403. $builder->callback(function($parent, $args){
  1404. return $parent[0]['number'];
  1405. })
  1406. ));
  1407. $registry->addFieldResolver('Price', 'currency',
  1408. $builder->compose(
  1409. $builder->callback(function($parent, $args){
  1410. return $parent[0]['currency_code'];
  1411. })
  1412. ));
  1413. }
  1414. /**
  1415. * Resolves the response type.
  1416. *
  1417. * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
  1418. * Response object.
  1419. *
  1420. * @return string
  1421. * Response type.
  1422. *
  1423. * @throws \Exception
  1424. * Invalid response type.
  1425. */
  1426. public static function resolveResponse(ResponseInterface $response): string {
  1427. // Resolve content response.
  1428. if ($response instanceof MateriauResponse) {
  1429. return 'MateriauResponse';
  1430. }
  1431. throw new \Exception('Invalid response type.');
  1432. }
  1433. }