query.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { Query as VuexQuery } from '@vuex-orm/core'
  2. import { Collection, Item } from '@vuex-orm/core/dist/src/data/Data'
  3. import { $objectProperties } from '~/services/utils/objectProperties'
  4. import { AnyJson } from '~/types/interfaces'
  5. /**
  6. * Classe Wrapper pour assurer les opérations les plus communes des Query de VuexORM
  7. */
  8. class Query {
  9. /**
  10. * Récupération de l'Item souhaité
  11. *
  12. * @param {VuexQuery} query
  13. * @param {number|string} id
  14. * @return {Item} l'Item
  15. */
  16. public getItem (query: VuexQuery, id: number|string): Item {
  17. const item = query.find(id)
  18. if (!item || typeof item === 'undefined') { throw new Error('item not found') }
  19. return item
  20. }
  21. /**
  22. * Récupération du premier item
  23. *
  24. * @param {VuexQuery} query
  25. * @return {Item} l'Item
  26. */
  27. public getFirstItem (query: VuexQuery): Item {
  28. const item = query.first()
  29. if (!item || typeof item === 'undefined') { throw new Error('item not found') }
  30. return item
  31. }
  32. /**
  33. * Récupération la collection de la Query
  34. *
  35. * @param {VuexQuery} query
  36. * @return {Collection} Array d'Item
  37. */
  38. public getCollection (query: VuexQuery): Collection {
  39. return query.get()
  40. }
  41. /**
  42. * Récupération de l'Item souhaité puis transformation en JSON aplati
  43. *
  44. * @param {VuexQuery} query
  45. * @param {number|string} id
  46. * @return {AnyJson} réponse
  47. */
  48. public getFlattenEntry (query: VuexQuery, id: number|string): AnyJson {
  49. return $objectProperties.cloneAndFlatten(this.getItem(query, id) as AnyJson)
  50. }
  51. /**
  52. * Récupération la collection de la Query puis transformation en JSON aplati
  53. *
  54. * @param {VuexQuery} query
  55. * @return {Array<AnyJson>} réponse
  56. */
  57. public getFlattenEntries (query: VuexQuery): Array<AnyJson> {
  58. const entries = this.getCollection(query)
  59. return entries.map((entry: AnyJson) => {
  60. return $objectProperties.cloneAndFlatten(entry)
  61. })
  62. }
  63. }
  64. export const queryHelper = new Query()