MaterioSchemaExtension.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  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. // Tell GraphQL how to resolve types of a common interface.
  25. $registry->addTypeResolver('NodeInterface', function ($value) {
  26. $path = explode('\\', get_class($value));
  27. $class = array_pop($path);
  28. if ($class === 'Node') {
  29. switch ($value->bundle()) {
  30. case 'article': return 'Article';
  31. case 'materiau': return 'Materiau';
  32. }
  33. }
  34. throw new Error('Could not resolve content type.');
  35. });
  36. $registry->addFieldResolver('Query', 'route',
  37. $builder->compose(
  38. $builder->produce('route_load')
  39. ->map('path', $builder->fromArgument('path')),
  40. $builder->produce('route_entity')
  41. ->map('url', $builder->fromParent())
  42. ));
  43. $this->addMateriau($registry, $builder);
  44. $this->addSearchResult($registry, $builder);
  45. $this->addSample($registry, $builder);
  46. $this->addArticle($registry, $builder);
  47. $this->addCompany($registry, $builder);
  48. $this->addAddress($registry, $builder);
  49. $this->addFilefield($registry, $builder);
  50. $this->addFile($registry, $builder);
  51. $this->addDate($registry, $builder);
  52. $this->addLink($registry, $builder);
  53. $this->addShowroom($registry, $builder);
  54. $this->addTag($registry, $builder);
  55. $this->addThesaurus($registry, $builder);
  56. $this->addVideolink($registry, $builder);
  57. $this->addImage($registry, $builder);
  58. // Response type resolver.
  59. $registry->addTypeResolver('Response', [
  60. __CLASS__,
  61. 'resolveResponse',
  62. ]);
  63. }
  64. // __ __ _ _
  65. // | \/ |__ _| |_ ___ _ _(_)__ _ _ _
  66. // | |\/| / _` | _/ -_) '_| / _` | || |
  67. // |_| |_\__,_|\__\___|_| |_\__,_|\_,_|
  68. protected function addMateriau(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  69. $registry->addFieldResolver('Query', 'materiau',
  70. $builder->produce('entity_load')
  71. ->map('type', $builder->fromValue('node'))
  72. ->map('bundles', $builder->fromValue(['materiau']))
  73. ->map('id', $builder->fromArgument('id'))
  74. );
  75. $registry->addFieldResolver('Query', 'materiaux',
  76. $builder->produce('entity_load_multiple')
  77. ->map('type', $builder->fromValue('node'))
  78. // ->map('bundles', $builder->fromValue(['materiau']))
  79. ->map('ids', $builder->fromArgument('ids'))
  80. );
  81. $registry->addFieldResolver('Materiau', 'id',
  82. $builder->produce('entity_id')
  83. ->map('entity', $builder->fromParent())
  84. );
  85. $registry->addFieldResolver('Materiau', 'uuid',
  86. $builder->produce('entity_uuid')
  87. ->map('entity', $builder->fromParent())
  88. );
  89. $registry->addFieldResolver('Materiau', 'title',
  90. $builder->compose(
  91. $builder->produce('entity_label')
  92. ->map('entity', $builder->fromParent())
  93. ));
  94. $registry->addFieldResolver('Materiau', 'body',
  95. $builder->produce('property_path')
  96. ->map('type', $builder->fromValue('entity:node'))
  97. ->map('value', $builder->fromParent())
  98. ->map('path', $builder->fromValue('body.value'))
  99. );
  100. $registry->addFieldResolver('Materiau', 'short_description',
  101. $builder->produce('property_path')
  102. ->map('type', $builder->fromValue('entity:node'))
  103. ->map('value', $builder->fromParent())
  104. ->map('path', $builder->fromValue('field_short_description.value'))
  105. );
  106. $registry->addFieldResolver('Materiau', 'author',
  107. $builder->compose(
  108. $builder->produce('entity_owner')
  109. ->map('entity', $builder->fromParent()),
  110. $builder->produce('entity_label')
  111. ->map('entity', $builder->fromParent())
  112. ));
  113. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  114. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  115. $registry->addFieldResolver('Materiau', 'linked_materials',
  116. $builder->compose(
  117. $builder->produce('entity_reference')
  118. ->map('entity', $builder->fromParent())
  119. ->map('field', $builder->fromValue('field_linked_materials'))
  120. ));
  121. $registry->addFieldResolver('Materiau', 'linked_articles',
  122. $builder->compose(
  123. $builder->produce('entity_reference')
  124. ->map('entity', $builder->fromParent())
  125. ->map('field', $builder->fromValue('field_linked_articles'))
  126. ));
  127. $registry->addFieldResolver('Materiau', 'memo',
  128. $builder->produce('property_path')
  129. ->map('type', $builder->fromValue('entity:node'))
  130. ->map('value', $builder->fromParent())
  131. ->map('path', $builder->fromValue('field_memo.value'))
  132. );
  133. $registry->addFieldResolver('Materiau', 'images',
  134. $builder->produce('entity_reference')
  135. ->map('entity', $builder->fromParent())
  136. ->map('field', $builder->fromValue('field_materiau_images'))
  137. );
  138. $registry->addFieldResolver('Materiau', 'attachments',
  139. $builder->produce('property_path')
  140. ->map('type', $builder->fromValue('entity:node'))
  141. ->map('value', $builder->fromParent())
  142. ->map('path', $builder->fromValue('field_attachments'))
  143. );
  144. $registry->addFieldResolver('Materiau', 'videos',
  145. $builder->produce('property_path')
  146. ->map('type', $builder->fromValue('entity:node'))
  147. ->map('value', $builder->fromParent())
  148. ->map('path', $builder->fromValue('field_video'))
  149. );
  150. $registry->addFieldResolver('Materiau', 'tags',
  151. $builder->produce('entity_reference')
  152. ->map('entity', $builder->fromParent())
  153. ->map('field', $builder->fromValue('field_tags'))
  154. );
  155. $registry->addFieldResolver('Materiau', 'thesaurus',
  156. $builder->produce('entity_reference')
  157. ->map('entity', $builder->fromParent())
  158. ->map('field', $builder->fromValue('field_thesaurus'))
  159. );
  160. $registry->addFieldResolver('Materiau', 'manufacturer',
  161. $builder->produce('entity_reference')
  162. ->map('entity', $builder->fromParent())
  163. ->map('field', $builder->fromValue('field_manufacturer'))
  164. );
  165. $registry->addFieldResolver('Materiau', 'distributor',
  166. $builder->produce('entity_reference')
  167. ->map('entity', $builder->fromParent())
  168. ->map('field', $builder->fromValue('field_distributor'))
  169. );
  170. // $registry->addFieldResolver('Materiau', 'famille',
  171. // $builder->produce('property_path')
  172. // ->map('type', $builder->fromValue('entity:node'))
  173. // ->map('value', $builder->fromParent())
  174. // ->map('path', $builder->fromValue('field_famille.value'))
  175. // );
  176. //
  177. // $registry->addFieldResolver('Materiau', 'index',
  178. // $builder->produce('property_path')
  179. // ->map('type', $builder->fromValue('entity:node'))
  180. // ->map('value', $builder->fromParent())
  181. // ->map('path', $builder->fromValue('field_index.value'))
  182. // );
  183. $registry->addFieldResolver('Materiau', 'reference',
  184. $builder->produce('property_path')
  185. ->map('type', $builder->fromValue('entity:node'))
  186. ->map('value', $builder->fromParent())
  187. ->map('path', $builder->fromValue('field_reference.value'))
  188. );
  189. $registry->addFieldResolver('Materiau', 'samples',
  190. $builder->produce('property_path')
  191. ->map('type', $builder->fromValue('entity:node'))
  192. ->map('value', $builder->fromParent())
  193. ->map('path', $builder->fromValue('field_samples'))
  194. );
  195. }
  196. // ___ _ ___ _ _
  197. // / __| ___ __ _ _ _ __| |_ | _ \___ ____ _| | |_
  198. // \__ \/ -_) _` | '_/ _| ' \| / -_|_-< || | | _|
  199. // |___/\___\__,_|_| \__|_||_|_|_\___/__/\_,_|_|\__|
  200. protected function addSearchResult(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  201. $registry->addFieldResolver('Query', 'searchresults',
  202. $builder->produce('entity_load_multiple')
  203. ->map('type', $builder->fromValue('node'))
  204. ->map('ids', $builder->fromArgument('ids'))
  205. );
  206. $registry->addFieldResolver('SearchResult', 'id',
  207. $builder->produce('entity_id')
  208. ->map('entity', $builder->fromParent())
  209. );
  210. $registry->addFieldResolver('SearchResult', 'bundle',
  211. $builder->produce('entity_bundle')
  212. ->map('entity', $builder->fromParent())
  213. );
  214. $registry->addFieldResolver('SearchResult', 'uuid',
  215. $builder->produce('entity_uuid')
  216. ->map('entity', $builder->fromParent())
  217. );
  218. $registry->addFieldResolver('SearchResult', 'title',
  219. $builder->compose(
  220. $builder->produce('entity_label')
  221. ->map('entity', $builder->fromParent())
  222. ));
  223. $registry->addFieldResolver('SearchResult', 'short_description',
  224. $builder->produce('property_path')
  225. ->map('type', $builder->fromValue('entity:node'))
  226. ->map('value', $builder->fromParent())
  227. ->map('path', $builder->fromValue('field_short_description.value'))
  228. );
  229. $registry->addFieldResolver('SearchResult', 'images',
  230. $builder->produce('entity_reference')
  231. ->map('entity', $builder->fromParent())
  232. ->map('field', $builder->fromValue('field_materiau_images'))
  233. );
  234. $registry->addFieldResolver('SearchResult', 'visuels',
  235. $builder->produce('entity_reference')
  236. ->map('entity', $builder->fromParent())
  237. ->map('field', $builder->fromValue('field_visuel'))
  238. );
  239. $registry->addFieldResolver('SearchResult', 'reference',
  240. $builder->produce('property_path')
  241. ->map('type', $builder->fromValue('entity:node'))
  242. ->map('value', $builder->fromParent())
  243. ->map('path', $builder->fromValue('field_reference.value'))
  244. );
  245. }
  246. // ___ _
  247. // / __| __ _ _ __ _ __| |___
  248. // \__ \/ _` | ' \| '_ \ / -_)
  249. // |___/\__,_|_|_|_| .__/_\___|
  250. // |_|
  251. protected function addSample(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  252. $registry->addFieldResolver('Sample', 'showroom',
  253. $builder->callback(function($parent, $args){
  254. return \Drupal\taxonomy\Entity\Term::load($parent['target_id']);
  255. })
  256. );
  257. $registry->addFieldResolver('Sample', 'location',
  258. $builder->callback(function($parent, $args){
  259. return $parent['location'];
  260. })
  261. );
  262. }
  263. // _ _ _ _
  264. // /_\ _ _| |_(_)__| |___
  265. // / _ \| '_| _| / _| / -_)
  266. // /_/ \_\_| \__|_\__|_\___|
  267. protected function addArticle(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  268. $registry->addFieldResolver('Query', 'article',
  269. $builder->produce('entity_load')
  270. ->map('type', $builder->fromValue('node'))
  271. ->map('bundles', $builder->fromValue(['article']))
  272. ->map('id', $builder->fromArgument('id'))
  273. );
  274. $registry->addFieldResolver('Article', 'id',
  275. $builder->produce('entity_id')
  276. ->map('entity', $builder->fromParent())
  277. );
  278. $registry->addFieldResolver('Article', 'uuid',
  279. $builder->produce('entity_uuid')
  280. ->map('entity', $builder->fromParent())
  281. );
  282. $registry->addFieldResolver('Article', 'title',
  283. $builder->compose(
  284. $builder->produce('entity_label')
  285. ->map('entity', $builder->fromParent())
  286. ));
  287. $registry->addFieldResolver('Article', 'author',
  288. $builder->compose(
  289. $builder->produce('entity_owner')
  290. ->map('entity', $builder->fromParent()),
  291. $builder->produce('entity_label')
  292. ->map('entity', $builder->fromParent())
  293. ));
  294. $registry->addFieldResolver('Article', 'body',
  295. $builder->produce('property_path')
  296. ->map('type', $builder->fromValue('entity:node'))
  297. ->map('value', $builder->fromParent())
  298. ->map('path', $builder->fromValue('body.value'))
  299. );
  300. $registry->addFieldResolver('Article', 'memo',
  301. $builder->produce('property_path')
  302. ->map('type', $builder->fromValue('entity:node'))
  303. ->map('value', $builder->fromParent())
  304. ->map('path', $builder->fromValue('field_memo.value'))
  305. );
  306. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  307. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  308. $registry->addFieldResolver('Article', 'linked_materials',
  309. $builder->produce('entity_reference')
  310. ->map('entity', $builder->fromParent())
  311. ->map('field', $builder->fromValue('field_linked_materials'))
  312. );
  313. $registry->addFieldResolver('Article', 'images',
  314. $builder->produce('entity_reference')
  315. ->map('entity', $builder->fromParent())
  316. ->map('field', $builder->fromValue('field_visuel'))
  317. );
  318. $registry->addFieldResolver('Article', 'videos',
  319. $builder->produce('property_path')
  320. ->map('type', $builder->fromValue('entity:node'))
  321. ->map('value', $builder->fromParent())
  322. ->map('path', $builder->fromValue('field_video'))
  323. );
  324. $registry->addFieldResolver('Article', 'tags',
  325. $builder->produce('entity_reference')
  326. ->map('entity', $builder->fromParent())
  327. ->map('field', $builder->fromValue('field_tags'))
  328. );
  329. $registry->addFieldResolver('Article', 'thesaurus',
  330. $builder->produce('entity_reference')
  331. ->map('entity', $builder->fromParent())
  332. ->map('field', $builder->fromValue('field_thesaurus'))
  333. );
  334. $registry->addFieldResolver('Article', 'showroom',
  335. $builder->compose(
  336. $builder->produce('entity_reference')
  337. ->map('entity', $builder->fromParent())
  338. ->map('field', $builder->fromValue('field_showroom')),
  339. $builder->callback(function ($items) {
  340. return $items[0];
  341. })
  342. ));
  343. $registry->addFieldResolver('Article', 'source',
  344. $builder->produce('property_path')
  345. ->map('type', $builder->fromValue('entity:node'))
  346. ->map('value', $builder->fromParent())
  347. ->map('path', $builder->fromValue('field_source'))
  348. );
  349. $registry->addFieldResolver('Article', 'date',
  350. $builder->produce('property_path')
  351. ->map('type', $builder->fromValue('entity:node'))
  352. ->map('value', $builder->fromParent())
  353. ->map('path', $builder->fromValue('field_date'))
  354. );
  355. }
  356. // ___
  357. // |_ _|_ __ __ _ __ _ ___
  358. // | || ' \/ _` / _` / -_)
  359. // |___|_|_|_\__,_\__, \___|
  360. // |___/
  361. protected function addImage(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  362. $registry->addFieldResolver('Image', 'id',
  363. $builder->produce('entity_id')
  364. ->map('entity', $builder->fromParent())
  365. );
  366. $registry->addFieldResolver('Image', 'url',
  367. $builder->produce('image_url')
  368. ->map('entity', $builder->fromParent())
  369. );
  370. $registry->addFieldResolver('Image', 'alt',
  371. $builder->produce('property_path')
  372. ->map('type', $builder->fromValue('entity:node'))
  373. ->map('value', $builder->fromParent())
  374. ->map('path', $builder->fromValue('field_image.alt'))
  375. );
  376. $registry->addFieldResolver('Image', 'style_minicard',
  377. $builder->produce('image_derivative')
  378. ->map('entity', $builder->fromParent())
  379. ->map('style', $builder->fromValue('card_medium_half'))
  380. );
  381. $registry->addFieldResolver('Image', 'style_cardmedium',
  382. $builder->produce('image_derivative')
  383. ->map('entity', $builder->fromParent())
  384. ->map('style', $builder->fromValue('card_medium'))
  385. );
  386. $registry->addFieldResolver('Image', 'style_cardfull',
  387. $builder->produce('image_derivative')
  388. ->map('entity', $builder->fromParent())
  389. ->map('style', $builder->fromValue('card_full'))
  390. );
  391. $registry->addFieldResolver('Image', 'style_articlecardmedium',
  392. $builder->produce('image_derivative')
  393. ->map('entity', $builder->fromParent())
  394. ->map('style', $builder->fromValue('article_card_medium'))
  395. );
  396. }
  397. // __ ___ _ _ _ _
  398. // \ \ / (_)__| |___ ___| | (_)_ _ | |__
  399. // \ V /| / _` / -_) _ \ |__| | ' \| / /
  400. // \_/ |_\__,_\___\___/____|_|_||_|_\_\
  401. protected function addVideolink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  402. $registry->addFieldResolver('VideoLink', 'url',
  403. $builder->produce('property_path')
  404. ->map('type', $builder->fromValue('field_item:video_embed_field'))
  405. ->map('value', $builder->fromParent())
  406. ->map('path', $builder->fromValue('value'))
  407. );
  408. }
  409. // _____ _
  410. // |_ _| |_ ___ ___ __ _ _ _ _ _ _ _ ___
  411. // | | | ' \/ -_|_-</ _` | || | '_| || (_-<
  412. // |_| |_||_\___/__/\__,_|\_,_|_| \_,_/__/
  413. protected function addThesaurus(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  414. $registry->addFieldResolver('Query', 'thesaurus',
  415. $builder->produce('entity_load')
  416. ->map('type', $builder->fromValue('taxonomy_term'))
  417. ->map('bundles', $builder->fromValue(['thesaurus']))
  418. ->map('id', $builder->fromArgument('id'))
  419. );
  420. $registry->addFieldResolver('Thesaurus', 'id',
  421. $builder->produce('entity_id')
  422. ->map('entity', $builder->fromParent())
  423. );
  424. $registry->addFieldResolver('Thesaurus', 'uuid',
  425. $builder->produce('entity_uuid')
  426. ->map('entity', $builder->fromParent())
  427. );
  428. $registry->addFieldResolver('Thesaurus', 'name',
  429. $builder->produce('entity_label')
  430. ->map('entity', $builder->fromParent())
  431. );
  432. }
  433. // _____
  434. // |_ _|_ _ __ _
  435. // | |/ _` / _` |
  436. // |_|\__,_\__, |
  437. // |___/
  438. protected function addTag(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  439. $registry->addFieldResolver('Query', 'tag',
  440. $builder->produce('entity_load')
  441. ->map('type', $builder->fromValue('taxonomy_term'))
  442. ->map('bundles', $builder->fromValue(['tags']))
  443. ->map('id', $builder->fromArgument('id'))
  444. );
  445. $registry->addFieldResolver('Tag', 'id',
  446. $builder->produce('entity_id')
  447. ->map('entity', $builder->fromParent())
  448. );
  449. $registry->addFieldResolver('Tag', 'uuid',
  450. $builder->produce('entity_uuid')
  451. ->map('entity', $builder->fromParent())
  452. );
  453. $registry->addFieldResolver('Tag', 'name',
  454. $builder->produce('entity_label')
  455. ->map('entity', $builder->fromParent())
  456. );
  457. }
  458. // ___ _
  459. // / __| |_ _____ __ ___ _ ___ ___ _ __
  460. // \__ \ ' \/ _ \ V V / '_/ _ \/ _ \ ' \
  461. // |___/_||_\___/\_/\_/|_| \___/\___/_|_|_|
  462. protected function addShowroom(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  463. $registry->addFieldResolver('Query', 'showroom',
  464. $builder->produce('entity_load')
  465. ->map('type', $builder->fromValue('taxonomy_term'))
  466. ->map('bundles', $builder->fromValue(['showroom']))
  467. ->map('id', $builder->fromArgument('id'))
  468. );
  469. $registry->addFieldResolver('Showroom', 'id',
  470. $builder->produce('entity_id')
  471. ->map('entity', $builder->fromParent())
  472. );
  473. $registry->addFieldResolver('Showroom', 'uuid',
  474. $builder->produce('entity_uuid')
  475. ->map('entity', $builder->fromParent())
  476. );
  477. $registry->addFieldResolver('Showroom', 'name',
  478. $builder->produce('entity_label')
  479. ->map('entity', $builder->fromParent())
  480. );
  481. $registry->addFieldResolver('Showroom', 'email',
  482. $builder->produce('property_path')
  483. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  484. ->map('value', $builder->fromParent())
  485. ->map('path', $builder->fromValue('field_public_email.value'))
  486. );
  487. $registry->addFieldResolver('Showroom', 'address',
  488. $builder->produce('property_path')
  489. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  490. ->map('value', $builder->fromParent())
  491. ->map('path', $builder->fromValue('field_public_address'))
  492. );
  493. $registry->addFieldResolver('Showroom', 'phone',
  494. $builder->produce('property_path')
  495. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  496. ->map('value', $builder->fromParent())
  497. ->map('path', $builder->fromValue('field_public_phone.value'))
  498. );
  499. }
  500. // _ _ _
  501. // | | (_)_ _ | |__
  502. // | |__| | ' \| / /
  503. // |____|_|_||_|_\_\
  504. protected function addLink(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  505. $registry->addFieldResolver('Link', 'url',
  506. $builder->callback(function ($parent, $args) {
  507. return isset($parent[0]) ? $parent[0]['uri'] : null;
  508. })
  509. );
  510. $registry->addFieldResolver('Link', 'title',
  511. $builder->callback(function ($parent, $args) {
  512. return isset($parent[0]) ? $parent[0]['title'] : null;
  513. })
  514. );
  515. }
  516. // ___ _
  517. // | \ __ _| |_ ___
  518. // | |) / _` | _/ -_)
  519. // |___/\__,_|\__\___|
  520. protected function addDate(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  521. $registry->addFieldResolver('Date', 'start',
  522. $builder->callback(function ($parent, $args) {
  523. return isset($parent[0]) ? $parent[0]['value'] : null;
  524. })
  525. );
  526. $registry->addFieldResolver('Date', 'end',
  527. $builder->callback(function ($parent, $args) {
  528. return isset($parent[0]) ? $parent[0]['end_value'] : null;
  529. })
  530. );
  531. }
  532. // ___ _ _ __ _ _ _
  533. // | __(_) |___ / _(_)___| |__| |
  534. // | _|| | / -_) _| / -_) / _` |
  535. // |_| |_|_\___|_| |_\___|_\__,_|
  536. protected function addFilefield(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  537. $registry->addFieldResolver('Filefield', 'description',
  538. $builder->callback(function ($parent, $args) {
  539. return $parent['description'];
  540. })
  541. );
  542. $registry->addFieldResolver('Filefield', 'file',
  543. $builder->callback(function ($parent, $args) {
  544. return \Drupal\file\Entity\File::load($parent['target_id']);
  545. })
  546. );
  547. }
  548. // ___ _ _
  549. // | __(_) |___
  550. // | _|| | / -_)
  551. // |_| |_|_\___|
  552. protected function addFile(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  553. $registry->addFieldResolver('File', 'url',
  554. $builder->callback(function ($parent, $args) {
  555. return $parent->url();
  556. })
  557. );
  558. $registry->addFieldResolver('File', 'filesize',
  559. $builder->callback(function ($parent, $args) {
  560. return $parent->getSize();
  561. })
  562. );
  563. $registry->addFieldResolver('File', 'filemime',
  564. $builder->callback(function ($parent, $args) {
  565. return $parent->getMimeType();
  566. })
  567. );
  568. $registry->addFieldResolver('File', 'filename',
  569. $builder->callback(function ($parent, $args) {
  570. return $parent->getFilename();
  571. })
  572. );
  573. $registry->addFieldResolver('File', 'fid',
  574. $builder->callback(function ($parent, $args) {
  575. return $parent->id();
  576. })
  577. );
  578. $registry->addFieldResolver('File', 'uuid',
  579. $builder->callback(function ($parent, $args) {
  580. return $parent->uuid();
  581. })
  582. );
  583. }
  584. // _ _ _
  585. // /_\ __| |__| |_ _ ___ ______
  586. // / _ \/ _` / _` | '_/ -_|_-<_-<
  587. // /_/ \_\__,_\__,_|_| \___/__/__/
  588. protected function addAddress(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  589. // $addr_fields = [
  590. // 'langcode',
  591. // 'country_code',
  592. // 'administrative_area',
  593. // 'locality',
  594. // 'dependent_locality',
  595. // 'postal_code',
  596. // 'sorting_code',
  597. // 'address_line1',
  598. // 'address_line2',
  599. // 'organization',
  600. // 'given_name',
  601. // 'additional_name',
  602. // 'family_name'
  603. // ];
  604. //
  605. // foreach ($addr_fields as $key => $value) {
  606. // $registry->addFieldResolver('Address', $value,
  607. // $builder->callback(function ($parent, $args) {
  608. // return $parent[0][$value];
  609. // })
  610. // );
  611. // }
  612. $registry->addFieldResolver('Address', 'langcode',
  613. $builder->callback(function ($parent, $args) {
  614. return $parent[0]['langcode'];
  615. })
  616. );
  617. $registry->addFieldResolver('Address', 'country_code',
  618. $builder->callback(function ($parent, $args) {
  619. return $parent[0]['country_code'];
  620. })
  621. );
  622. $registry->addFieldResolver('Address', 'administrative_area',
  623. $builder->callback(function ($parent, $args) {
  624. return $parent[0]['administrative_area'];
  625. })
  626. );
  627. $registry->addFieldResolver('Address', 'locality',
  628. $builder->callback(function ($parent, $args) {
  629. return $parent[0]['locality'];
  630. })
  631. );
  632. $registry->addFieldResolver('Address', 'dependent_locality',
  633. $builder->callback(function ($parent, $args) {
  634. return $parent[0]['dependent_locality'];
  635. })
  636. );
  637. $registry->addFieldResolver('Address', 'postal_code',
  638. $builder->callback(function ($parent, $args) {
  639. return $parent[0]['postal_code'];
  640. })
  641. );
  642. $registry->addFieldResolver('Address', 'sorting_code',
  643. $builder->callback(function ($parent, $args) {
  644. return $parent[0]['sorting_code'];
  645. })
  646. );
  647. $registry->addFieldResolver('Address', 'address_line1',
  648. $builder->callback(function ($parent, $args) {
  649. return $parent[0]['address_line1'];
  650. })
  651. );
  652. $registry->addFieldResolver('Address', 'address_line2',
  653. $builder->callback(function ($parent, $args) {
  654. return $parent[0]['address_line2'];
  655. })
  656. );
  657. $registry->addFieldResolver('Address', 'organization',
  658. $builder->callback(function ($parent, $args) {
  659. return $parent[0]['organization'];
  660. })
  661. );
  662. $registry->addFieldResolver('Address', 'given_name',
  663. $builder->callback(function ($parent, $args) {
  664. return $parent[0]['given_name'];
  665. })
  666. );
  667. $registry->addFieldResolver('Address', 'additional_name',
  668. $builder->callback(function ($parent, $args) {
  669. return $parent[0]['additional_name'];
  670. })
  671. );
  672. $registry->addFieldResolver('Address', 'family_name',
  673. $builder->callback(function ($parent, $args) {
  674. return $parent[0]['family_name'];
  675. })
  676. );
  677. }
  678. // ___
  679. // / __|___ _ __ _ __ __ _ _ _ _ _
  680. // | (__/ _ \ ' \| '_ \/ _` | ' \ || |
  681. // \___\___/_|_|_| .__/\__,_|_||_\_, |
  682. // |_| |__/
  683. protected function addCompany(ResolverRegistryInterface $registry, ResolverBuilder $builder) {
  684. $registry->addFieldResolver('Query', 'company',
  685. $builder->produce('entity_load')
  686. ->map('type', $builder->fromValue('taxonomy_term'))
  687. ->map('bundles', $builder->fromValue(['company']))
  688. ->map('id', $builder->fromArgument('id'))
  689. );
  690. $registry->addFieldResolver('Company', 'id',
  691. $builder->produce('entity_id')
  692. ->map('entity', $builder->fromParent())
  693. );
  694. $registry->addFieldResolver('Company', 'uuid',
  695. $builder->produce('entity_uuid')
  696. ->map('entity', $builder->fromParent())
  697. );
  698. $registry->addFieldResolver('Company', 'name',
  699. $builder->produce('entity_label')
  700. ->map('entity', $builder->fromParent())
  701. );
  702. $registry->addFieldResolver('Company', 'description',
  703. $builder->callback(function($parent, $args){
  704. return $parent->getDescription();
  705. })
  706. );
  707. // TODO: property_path helper
  708. // $props = [
  709. // [
  710. // "res" => "attachments",
  711. // "type" => "entity:taxonomy_term",
  712. // "path" => "field_attachments",
  713. // ]
  714. // ]
  715. // foreach ($props as $key => $value) {
  716. // $registry->addFieldResolver('Company', $value['res'],
  717. // $builder->produce('property_path')
  718. // ->map('type', $builder->fromValue('entity:taxonomy_term'))
  719. // ->map('value', $builder->fromParent())
  720. // ->map('path', $builder->fromValue('field_attachments'))
  721. // );
  722. // }
  723. $registry->addFieldResolver('Company', 'attachments',
  724. $builder->produce('property_path')
  725. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  726. ->map('value', $builder->fromParent())
  727. ->map('path', $builder->fromValue('field_attachments'))
  728. );
  729. $registry->addFieldResolver('Company', 'memo',
  730. $builder->produce('property_path')
  731. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  732. ->map('value', $builder->fromParent())
  733. ->map('path', $builder->fromValue('field_memo.value'))
  734. );
  735. $registry->addFieldResolver('Company', 'note',
  736. $builder->produce('property_path')
  737. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  738. ->map('value', $builder->fromParent())
  739. ->map('path', $builder->fromValue('field_note.value'))
  740. );
  741. $registry->addFieldResolver('Company', 'website',
  742. $builder->produce('property_path')
  743. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  744. ->map('value', $builder->fromParent())
  745. ->map('path', $builder->fromValue('field_website'))
  746. );
  747. $registry->addFieldResolver('Company', 'departement',
  748. $builder->produce('property_path')
  749. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  750. ->map('value', $builder->fromParent())
  751. ->map('path', $builder->fromValue('field_departement.value'))
  752. );
  753. $registry->addFieldResolver('Company', 'email',
  754. $builder->produce('property_path')
  755. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  756. ->map('value', $builder->fromParent())
  757. ->map('path', $builder->fromValue('field_public_email.value'))
  758. );
  759. $registry->addFieldResolver('Company', 'address',
  760. $builder->produce('property_path')
  761. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  762. ->map('value', $builder->fromParent())
  763. ->map('path', $builder->fromValue('field_public_address'))
  764. );
  765. $registry->addFieldResolver('Company', 'phone',
  766. $builder->produce('property_path')
  767. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  768. ->map('value', $builder->fromParent())
  769. ->map('path', $builder->fromValue('field_public_phone.value'))
  770. );
  771. $registry->addFieldResolver('Company', 'infos',
  772. $builder->produce('property_path')
  773. ->map('type', $builder->fromValue('entity:taxonomy_term'))
  774. ->map('value', $builder->fromParent())
  775. ->map('path', $builder->fromValue('field_infos_from_company.value'))
  776. );
  777. }
  778. /**
  779. * Resolves the response type.
  780. *
  781. * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
  782. * Response object.
  783. *
  784. * @return string
  785. * Response type.
  786. *
  787. * @throws \Exception
  788. * Invalid response type.
  789. */
  790. public static function resolveResponse(ResponseInterface $response): string {
  791. // Resolve content response.
  792. if ($response instanceof MateriauResponse) {
  793. return 'MateriauResponse';
  794. }
  795. throw new \Exception('Invalid response type.');
  796. }
  797. }