MaterioSchemaExtension.php 47 KB

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