MaterioSchemaExtension.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  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. /**
  10. * @SchemaExtension(
  11. * id = "materio_extension",
  12. * name = "Materio extension",
  13. * description = "Materio extension.",
  14. * schema = "materio"
  15. * )
  16. */
  17. class MaterioSchemaExtension extends SdlSchemaExtensionPluginBase {
  18. /**
  19. * {@inheritdoc}
  20. */
  21. public function registerResolvers(ResolverRegistryInterface $registry) {
  22. $builder = new ResolverBuilder();
  23. // __ __ _ _
  24. // | \/ |__ _| |_ ___ _ _(_)__ _ _ _
  25. // | |\/| / _` | _/ -_) '_| / _` | || |
  26. // |_| |_\__,_|\__\___|_| |_\__,_|\_,_|
  27. $registry->addFieldResolver('Query', 'materiau',
  28. $builder->produce('entity_load')
  29. ->map('type', $builder->fromValue('node'))
  30. ->map('bundles', $builder->fromValue(['materiau']))
  31. ->map('id', $builder->fromArgument('id'))
  32. );
  33. $registry->addFieldResolver('Materiau', 'id',
  34. $builder->produce('entity_id')
  35. ->map('entity', $builder->fromParent())
  36. );
  37. $registry->addFieldResolver('Materiau', 'uuid',
  38. $builder->produce('entity_uuid')
  39. ->map('entity', $builder->fromParent())
  40. );
  41. $registry->addFieldResolver('Materiau', 'title',
  42. $builder->compose(
  43. $builder->produce('entity_label')
  44. ->map('entity', $builder->fromParent())
  45. ));
  46. $registry->addFieldResolver('Materiau', 'body',
  47. $builder->produce('property_path')
  48. ->map('type', $builder->fromValue('entity:node'))
  49. ->map('value', $builder->fromParent())
  50. ->map('path', $builder->fromValue('body.value'))
  51. );
  52. $registry->addFieldResolver('Materiau', 'short_description',
  53. $builder->produce('property_path')
  54. ->map('type', $builder->fromValue('entity:node'))
  55. ->map('value', $builder->fromParent())
  56. ->map('path', $builder->fromValue('field_short_description.value'))
  57. );
  58. $registry->addFieldResolver('Materiau', 'author',
  59. $builder->compose(
  60. $builder->produce('entity_owner')
  61. ->map('entity', $builder->fromParent()),
  62. $builder->produce('entity_label')
  63. ->map('entity', $builder->fromParent())
  64. ));
  65. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  66. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  67. $registry->addFieldResolver('Materiau', 'linked_materials',
  68. $builder->compose(
  69. $builder->produce('entity_reference')
  70. ->map('entity', $builder->fromParent())
  71. ->map('field', $builder->fromValue('field_linked_materials'))
  72. ));
  73. $registry->addFieldResolver('Materiau', 'linked_articles',
  74. $builder->compose(
  75. $builder->produce('entity_reference')
  76. ->map('entity', $builder->fromParent())
  77. ->map('field', $builder->fromValue('field_linked_articles'))
  78. ));
  79. $registry->addFieldResolver('Materiau', 'memo',
  80. $builder->produce('property_path')
  81. ->map('type', $builder->fromValue('entity:node'))
  82. ->map('value', $builder->fromParent())
  83. ->map('path', $builder->fromValue('field_memo.value'))
  84. );
  85. $registry->addFieldResolver('Materiau', 'images',
  86. $builder->produce('entity_reference')
  87. ->map('entity', $builder->fromParent())
  88. ->map('field', $builder->fromValue('field_materiau_images'))
  89. );
  90. $registry->addFieldResolver('Materiau', 'attachments',
  91. $builder->produce('property_path')
  92. ->map('type', $builder->fromValue('entity:node'))
  93. ->map('value', $builder->fromParent())
  94. ->map('path', $builder->fromValue('field_attachments'))
  95. // $builder->produce('entity_reference')
  96. // ->map('entity', $builder->fromParent())
  97. // ->map('field', $builder->fromValue('field_attachments'))
  98. );
  99. $registry->addFieldResolver('Materiau', 'videos',
  100. $builder->produce('property_path')
  101. ->map('type', $builder->fromValue('entity:node'))
  102. ->map('value', $builder->fromParent())
  103. ->map('path', $builder->fromValue('field_video'))
  104. );
  105. $registry->addFieldResolver('Materiau', 'tags',
  106. $builder->produce('entity_reference')
  107. ->map('entity', $builder->fromParent())
  108. ->map('field', $builder->fromValue('field_tags'))
  109. );
  110. $registry->addFieldResolver('Materiau', 'thesaurus',
  111. $builder->produce('entity_reference')
  112. ->map('entity', $builder->fromParent())
  113. ->map('field', $builder->fromValue('field_thesaurus'))
  114. );
  115. // field_distributor
  116. // field_famille
  117. // field_index
  118. // field_manufacturer
  119. // field_reference
  120. // field_samples
  121. // _ _ _ _
  122. // /_\ _ _| |_(_)__| |___
  123. // / _ \| '_| _| / _| / -_)
  124. // /_/ \_\_| \__|_\__|_\___|
  125. $registry->addFieldResolver('Query', 'article',
  126. $builder->produce('entity_load')
  127. ->map('type', $builder->fromValue('node'))
  128. ->map('bundles', $builder->fromValue(['article']))
  129. ->map('id', $builder->fromArgument('id'))
  130. );
  131. $registry->addFieldResolver('Article', 'id',
  132. $builder->produce('entity_id')
  133. ->map('entity', $builder->fromParent())
  134. );
  135. $registry->addFieldResolver('Article', 'uuid',
  136. $builder->produce('entity_uuid')
  137. ->map('entity', $builder->fromParent())
  138. );
  139. $registry->addFieldResolver('Article', 'title',
  140. $builder->compose(
  141. $builder->produce('entity_label')
  142. ->map('entity', $builder->fromParent())
  143. ));
  144. $registry->addFieldResolver('Article', 'author',
  145. $builder->compose(
  146. $builder->produce('entity_owner')
  147. ->map('entity', $builder->fromParent()),
  148. $builder->produce('entity_label')
  149. ->map('entity', $builder->fromParent())
  150. ));
  151. $registry->addFieldResolver('Article', 'body',
  152. $builder->produce('property_path')
  153. ->map('type', $builder->fromValue('entity:node'))
  154. ->map('value', $builder->fromParent())
  155. ->map('path', $builder->fromValue('body.value'))
  156. );
  157. $registry->addFieldResolver('Article', 'memo',
  158. $builder->produce('property_path')
  159. ->map('type', $builder->fromValue('entity:node'))
  160. ->map('value', $builder->fromParent())
  161. ->map('path', $builder->fromValue('field_memo.value'))
  162. );
  163. // https://github.com/drupal-graphql/graphql/blob/8.x-4.x/doc/SUMMARY.md
  164. // https://blog.chrismitchellonline.com/posts/custom_graphql_data/
  165. $registry->addFieldResolver('Article', 'linked_materials',
  166. $builder->produce('entity_reference')
  167. ->map('entity', $builder->fromParent())
  168. ->map('field', $builder->fromValue('field_linked_materials'))
  169. );
  170. $registry->addFieldResolver('Article', 'images',
  171. $builder->produce('entity_reference')
  172. ->map('entity', $builder->fromParent())
  173. ->map('field', $builder->fromValue('field_visuel'))
  174. );
  175. $registry->addFieldResolver('Article', 'videos',
  176. $builder->produce('property_path')
  177. ->map('type', $builder->fromValue('entity:node'))
  178. ->map('value', $builder->fromParent())
  179. ->map('path', $builder->fromValue('field_video'))
  180. );
  181. $registry->addFieldResolver('Article', 'tags',
  182. $builder->produce('entity_reference')
  183. ->map('entity', $builder->fromParent())
  184. ->map('field', $builder->fromValue('field_tags'))
  185. );
  186. $registry->addFieldResolver('Article', 'thesaurus',
  187. $builder->produce('entity_reference')
  188. ->map('entity', $builder->fromParent())
  189. ->map('field', $builder->fromValue('field_thesaurus'))
  190. );
  191. $registry->addFieldResolver('Article', 'showroom',
  192. $builder->compose(
  193. $builder->produce('entity_reference')
  194. ->map('entity', $builder->fromParent())
  195. ->map('field', $builder->fromValue('field_showroom')),
  196. $builder->callback(function ($items) {
  197. return $items[0];
  198. })
  199. ));
  200. $registry->addFieldResolver('Article', 'source',
  201. $builder->produce('property_path')
  202. ->map('type', $builder->fromValue('entity:node'))
  203. ->map('value', $builder->fromParent())
  204. ->map('path', $builder->fromValue('field_source'))
  205. );
  206. $registry->addFieldResolver('Article', 'date',
  207. $builder->produce('property_path')
  208. ->map('type', $builder->fromValue('entity:node'))
  209. ->map('value', $builder->fromParent())
  210. ->map('path', $builder->fromValue('field_date'))
  211. );
  212. // ___ _ _
  213. // | __(_) |___
  214. // | _|| | / -_)
  215. // |_| |_|_\___|
  216. $registry->addFieldResolver('Filefield', 'description',
  217. $builder->callback(function ($parent, $args) {
  218. return $parent['description'];
  219. })
  220. );
  221. $registry->addFieldResolver('Filefield', 'file',
  222. // $builder->produce('entity_reference')
  223. // ->map('entity', $builder->fromParent())
  224. // ->map('field', $builder->fromValue('field_showroom'))
  225. $builder->callback(function ($parent, $args) {
  226. return \Drupal\file\Entity\File::load($parent['target_id']);
  227. })
  228. );
  229. $registry->addFieldResolver('File', 'url',
  230. $builder->callback(function ($parent, $args) {
  231. return $parent->url();
  232. })
  233. );
  234. $registry->addFieldResolver('File', 'filesize',
  235. $builder->callback(function ($parent, $args) {
  236. return $parent->getSize();
  237. })
  238. );
  239. $registry->addFieldResolver('File', 'filemime',
  240. $builder->callback(function ($parent, $args) {
  241. return $parent->getMimeType();
  242. })
  243. );
  244. $registry->addFieldResolver('File', 'filename',
  245. $builder->callback(function ($parent, $args) {
  246. return $parent->getFilename();
  247. })
  248. );
  249. $registry->addFieldResolver('File', 'fid',
  250. $builder->callback(function ($parent, $args) {
  251. return $parent->id();
  252. })
  253. );
  254. $registry->addFieldResolver('File', 'uuid',
  255. $builder->callback(function ($parent, $args) {
  256. return $parent->uuid();
  257. })
  258. );
  259. // ___ _
  260. // | \ __ _| |_ ___
  261. // | |) / _` | _/ -_)
  262. // |___/\__,_|\__\___|
  263. $registry->addFieldResolver('Date', 'start',
  264. $builder->callback(function ($parent, $args) {
  265. return $parent[0]['value'];
  266. })
  267. );
  268. $registry->addFieldResolver('Date', 'end',
  269. $builder->callback(function ($parent, $args) {
  270. return $parent[0]['end_value'];
  271. })
  272. );
  273. // _ _ _
  274. // | | (_)_ _ | |__
  275. // | |__| | ' \| / /
  276. // |____|_|_||_|_\_\
  277. $registry->addFieldResolver('Link', 'url',
  278. $builder->callback(function ($parent, $args) {
  279. return $parent[0]['uri'];
  280. })
  281. );
  282. $registry->addFieldResolver('Link', 'title',
  283. $builder->callback(function ($parent, $args) {
  284. return $parent[0]['title'];
  285. })
  286. );
  287. // ___ _
  288. // / __| |_ _____ __ ___ _ ___ ___ _ __
  289. // \__ \ ' \/ _ \ V V / '_/ _ \/ _ \ ' \
  290. // |___/_||_\___/\_/\_/|_| \___/\___/_|_|_|
  291. $registry->addFieldResolver('Query', 'showroom',
  292. $builder->produce('entity_load')
  293. ->map('type', $builder->fromValue('taxonomy_term'))
  294. ->map('bundles', $builder->fromValue(['showroom']))
  295. ->map('id', $builder->fromArgument('id'))
  296. );
  297. $registry->addFieldResolver('Showroom', 'id',
  298. $builder->produce('entity_id')
  299. ->map('entity', $builder->fromParent())
  300. );
  301. $registry->addFieldResolver('Showroom', 'uuid',
  302. $builder->produce('entity_uuid')
  303. ->map('entity', $builder->fromParent())
  304. );
  305. $registry->addFieldResolver('Showroom', 'name',
  306. $builder->produce('entity_label')
  307. ->map('entity', $builder->fromParent())
  308. );
  309. // _____
  310. // |_ _|_ _ __ _
  311. // | |/ _` / _` |
  312. // |_|\__,_\__, |
  313. // |___/
  314. $registry->addFieldResolver('Query', 'tag',
  315. $builder->produce('entity_load')
  316. ->map('type', $builder->fromValue('taxonomy_term'))
  317. ->map('bundles', $builder->fromValue(['tags']))
  318. ->map('id', $builder->fromArgument('id'))
  319. );
  320. $registry->addFieldResolver('Tag', 'id',
  321. $builder->produce('entity_id')
  322. ->map('entity', $builder->fromParent())
  323. );
  324. $registry->addFieldResolver('Tag', 'uuid',
  325. $builder->produce('entity_uuid')
  326. ->map('entity', $builder->fromParent())
  327. );
  328. $registry->addFieldResolver('Tag', 'name',
  329. $builder->produce('entity_label')
  330. ->map('entity', $builder->fromParent())
  331. );
  332. // _____ _
  333. // |_ _| |_ ___ ___ __ _ _ _ _ _ _ _ ___
  334. // | | | ' \/ -_|_-</ _` | || | '_| || (_-<
  335. // |_| |_||_\___/__/\__,_|\_,_|_| \_,_/__/
  336. $registry->addFieldResolver('Query', 'thesaurus',
  337. $builder->produce('entity_load')
  338. ->map('type', $builder->fromValue('taxonomy_term'))
  339. ->map('bundles', $builder->fromValue(['thesaurus']))
  340. ->map('id', $builder->fromArgument('id'))
  341. );
  342. $registry->addFieldResolver('Thesaurus', 'id',
  343. $builder->produce('entity_id')
  344. ->map('entity', $builder->fromParent())
  345. );
  346. $registry->addFieldResolver('Thesaurus', 'uuid',
  347. $builder->produce('entity_uuid')
  348. ->map('entity', $builder->fromParent())
  349. );
  350. $registry->addFieldResolver('Thesaurus', 'name',
  351. $builder->produce('entity_label')
  352. ->map('entity', $builder->fromParent())
  353. );
  354. // __ ___ _ _ _ _
  355. // \ \ / (_)__| |___ ___| | (_)_ _ | |__
  356. // \ V /| / _` / -_) _ \ |__| | ' \| / /
  357. // \_/ |_\__,_\___\___/____|_|_||_|_\_\
  358. $registry->addFieldResolver('VideoLink', 'url',
  359. $builder->produce('property_path')
  360. ->map('type', $builder->fromValue('field_item:video_embed_field'))
  361. ->map('value', $builder->fromParent())
  362. ->map('path', $builder->fromValue('value'))
  363. );
  364. // ___
  365. // |_ _|_ __ __ _ __ _ ___
  366. // | || ' \/ _` / _` / -_)
  367. // |___|_|_|_\__,_\__, \___|
  368. // |___/
  369. $registry->addFieldResolver('Image', 'id',
  370. $builder->produce('entity_id')
  371. ->map('entity', $builder->fromParent())
  372. );
  373. $registry->addFieldResolver('Image', 'url',
  374. $builder->produce('image_url')
  375. ->map('entity', $builder->fromParent())
  376. );
  377. $registry->addFieldResolver('Image', 'alt',
  378. $builder->produce('property_path')
  379. ->map('type', $builder->fromValue('entity:node'))
  380. ->map('value', $builder->fromParent())
  381. ->map('path', $builder->fromValue('field_image.alt'))
  382. );
  383. $registry->addFieldResolver('Image', 'style_minicard',
  384. $builder->produce('image_derivative')
  385. ->map('entity', $builder->fromParent())
  386. ->map('style', $builder->fromValue('card_medium_half'))
  387. );
  388. $registry->addFieldResolver('Image', 'style_cardmedium',
  389. $builder->produce('image_derivative')
  390. ->map('entity', $builder->fromParent())
  391. ->map('style', $builder->fromValue('card_medium'))
  392. );
  393. $registry->addFieldResolver('Image', 'style_cardfull',
  394. $builder->produce('image_derivative')
  395. ->map('entity', $builder->fromParent())
  396. ->map('style', $builder->fromValue('card_full'))
  397. );
  398. $registry->addFieldResolver('Image', 'style_articlecardmedium',
  399. $builder->produce('image_derivative')
  400. ->map('entity', $builder->fromParent())
  401. ->map('style', $builder->fromValue('article_card_medium'))
  402. );
  403. // Response type resolver.
  404. $registry->addTypeResolver('Response', [
  405. __CLASS__,
  406. 'resolveResponse',
  407. ]);
  408. }
  409. /**
  410. * Resolves the response type.
  411. *
  412. * @param \Drupal\graphql\GraphQL\Response\ResponseInterface $response
  413. * Response object.
  414. *
  415. * @return string
  416. * Response type.
  417. *
  418. * @throws \Exception
  419. * Invalid response type.
  420. */
  421. public static function resolveResponse(ResponseInterface $response): string {
  422. // Resolve content response.
  423. if ($response instanceof MateriauResponse) {
  424. return 'MateriauResponse';
  425. }
  426. throw new \Exception('Invalid response type.');
  427. }
  428. }