entityManager.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import ApiRequestService from "./apiRequestService";
  2. import {AssociativeArray, FORMAT} from "./data";
  3. import {Model, useRepo} from "pinia-orm";
  4. import UrlBuilder from "~/services/utils/urlBuilder";
  5. import ModelNormalizer from "~/services/data/serializer/normalizer/modelNormalizer";
  6. import HydraDenormalizer from "~/services/data/serializer/denormalizer/hydraDenormalizer";
  7. import ApiModel from "~/models/ApiModel";
  8. /**
  9. * Entity manager: make operations on the models defined with the Pinia-Orm library
  10. *
  11. * @see https://pinia-orm.codedredd.de/
  12. */
  13. class EntityManager {
  14. private apiRequestService: ApiRequestService;
  15. public constructor(apiRequestService: ApiRequestService) {
  16. this.apiRequestService = apiRequestService
  17. }
  18. public getRepository(model: typeof Model) {
  19. return useRepo(model)
  20. }
  21. /**
  22. * Fetch one entity by its id, save it to the store and returns it
  23. * @param model
  24. * @param id
  25. */
  26. public async fetch(model: typeof ApiModel, id: number) {
  27. const url = UrlBuilder.concat('api', model.entity, String(id))
  28. const response = await this.apiRequestService.get(url)
  29. // deserialize the response
  30. const entity = await HydraDenormalizer.denormalize(response)
  31. // Save data into the store
  32. const repository = this.getRepository(model)
  33. repository.save(entity)
  34. return entity
  35. }
  36. public findBy(model: typeof ApiModel, query: AssociativeArray) {
  37. }
  38. public fetchAll(model: typeof ApiModel) {
  39. }
  40. public async persist(model: typeof ApiModel, entity: ApiModel) {
  41. const data = ModelNormalizer.normalize(entity)
  42. let url = UrlBuilder.concat('api', model.entity)
  43. let response = null
  44. if (entity.isNew) {
  45. response = await this.apiRequestService.post(url, data)
  46. } else {
  47. url = UrlBuilder.concat(url, String(entity.id))
  48. response = await this.apiRequestService.put(url, data)
  49. }
  50. const fetchedEntity = await HydraDenormalizer.denormalize(response)
  51. // Save data into the store
  52. const repository = this.getRepository(model)
  53. repository.save(fetchedEntity)
  54. return fetchedEntity
  55. }
  56. public delete() {
  57. }
  58. public new(model: typeof ApiModel) {
  59. const entity = new model()
  60. entity.isNew = true
  61. // Save data into the store
  62. const repository = this.getRepository(model)
  63. repository.save(entity)
  64. return entity
  65. }
  66. public reset() {
  67. }
  68. }
  69. export default EntityManager