repository.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { Collection, Item, Model, Repository as PiniaRepository, useRepo } 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 Repository de VuexORM
  7. */
  8. class Repository {
  9. /**
  10. * Récupération du repository du Model
  11. *
  12. * @param {Model} model
  13. * @return {VuexRepository<Model>} le repository
  14. */
  15. public getRepository (model: typeof Model): PiniaRepository<Model> {
  16. return useRepo(model)
  17. }
  18. public createNewModelInstance (model: typeof Model): Model {
  19. return this.getRepository(model).make()
  20. }
  21. /**x
  22. * Récupération du nom de l'entité du model
  23. *
  24. * @param {Model} model
  25. * @return {string} l'entité
  26. */
  27. public getEntity (model: typeof Model): string {
  28. return this.getRepository(model).getModel().$entity()
  29. }
  30. /**
  31. * Créer une entry dans le repository
  32. *
  33. * @param {Model} model
  34. * @param {AnyJson} entry
  35. */
  36. public make (model: typeof Model, entry?: AnyJson): Model {
  37. return this.getRepository(model).make(entry)
  38. }
  39. /**
  40. * Persist l'entry dans le repository
  41. *
  42. * @param {Model} model
  43. * @param {AnyJson} entry
  44. */
  45. public persist (model: typeof Model, entry: AnyJson): Model {
  46. return this.getRepository(model).save(entry)
  47. }
  48. /**
  49. * Effectue une mise à jour du store après la modification d'un champ de l'entry
  50. *
  51. * @param {Model} model
  52. * @param {AnyJson} entry
  53. * @param {any} value
  54. * @param {string} field
  55. */
  56. public updateStoreFromField (model: typeof Model, entry: AnyJson, value: any, field: string): void {
  57. if (!useHas(entry, field)) { throw new Error('field not found') }
  58. entry[field] = value
  59. this.persist(model, $objectProperties.cloneAndNest(entry))
  60. }
  61. /**
  62. * Récupération de l'Item du Model souhaité
  63. *
  64. * @param {Model} model
  65. * @param {number|string} id
  66. * @return {Item} l'Item
  67. */
  68. public findItemFromModel (model: typeof Model, id: number|string): Item {
  69. const repository = this.getRepository(model)
  70. const item = repository.find(id)
  71. if (!item || typeof item === 'undefined') { throw new Error('Item not found') }
  72. return item
  73. }
  74. /**
  75. * Récupération de la Collection du Model souhaité
  76. *
  77. * @param {Model} model
  78. * @param {OrderByVuexOrm} orderBy
  79. * @return {Collection} la collection
  80. */
  81. public findCollectionFromModel (model: typeof Model, orderBy?: OrderByVuexOrm): Collection {
  82. const repository = this.getRepository(model)
  83. if(orderBy){
  84. for(const orderKey in orderBy){
  85. repository.orderBy(orderKey, orderBy[orderKey])
  86. }
  87. }
  88. return repository.all()
  89. }
  90. /**
  91. * Supprime l'Item du repository
  92. *
  93. * @param {Model} model
  94. * @param {number} id
  95. */
  96. public deleteItem (model: typeof Model, id: number|string) {
  97. const repository = this.getRepository(model)
  98. repository.destroy(id)
  99. }
  100. /**
  101. * Supprime tous les Items du repository
  102. *
  103. * @param {Model} model
  104. */
  105. public cleanRepository (model: typeof Model) {
  106. const repository = this.getRepository(model)
  107. repository.flush()
  108. }
  109. }
  110. export const repositoryHelper = new Repository()