query.ts 2.1 KB

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