MaterioSchemaExtension.php 37 KB

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