query.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { Query as PiniaQuery, Collection, Item } from 'pinia-orm'
  2. import { $objectProperties } from '~/services/utils/objectProperties'
  3. import { AnyJson } from '~/types/interfaces'
  4. import {OrderByVuexOrm} from "~/types/types";
  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: PiniaQuery, 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: PiniaQuery): 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: PiniaQuery, orderBy?: OrderByVuexOrm): Collection {
  39. if(orderBy){
  40. for(const orderKey in orderBy){
  41. query.orderBy(orderKey, orderBy[orderKey])
  42. }
  43. }
  44. return query.get()
  45. }
  46. /**
  47. * Récupération de l'Item souhaité puis transformation en JSON aplati
  48. *
  49. * @param {VuexQuery} query
  50. * @param {number|string} id
  51. * @return {AnyJson} réponse
  52. */
  53. public getFlattenEntry (query: PiniaQuery, id: number|string): AnyJson {
  54. return $objectProperties.cloneAndFlatten(this.getItem(query, id) as AnyJson)
  55. }
  56. /**
  57. * Récupération la collection de la Query puis transformation en JSON aplati
  58. *
  59. * @param {VuexQuery} query
  60. * @return {Array<AnyJson>} réponse
  61. */
  62. public getFlattenEntries (query: PiniaQuery): Array<AnyJson> {
  63. const entries = this.getCollection(query)
  64. return entries.map((entry: AnyJson) => {
  65. return $objectProperties.cloneAndFlatten(entry)
  66. })
  67. }
  68. }
  69. export const queryHelper = new Query()