import ApiRequestService from "./apiRequestService"; import {AssociativeArray, FORMAT} from "./data"; import {Model, useRepo} from "pinia-orm"; import UrlBuilder from "~/services/utils/urlBuilder"; import ModelNormalizer from "~/services/data/serializer/normalizer/modelNormalizer"; import HydraDenormalizer from "~/services/data/serializer/denormalizer/hydraDenormalizer"; import ApiModel from "~/models/ApiModel"; /** * Entity manager: make operations on the models defined with the Pinia-Orm library * * @see https://pinia-orm.codedredd.de/ */ class EntityManager { private apiRequestService: ApiRequestService; public constructor(apiRequestService: ApiRequestService) { this.apiRequestService = apiRequestService } public getRepository(model: typeof Model) { return useRepo(model) } /** * Fetch one entity by its id, save it to the store and returns it * @param model * @param id */ public async fetch(model: typeof ApiModel, id: number) { const url = UrlBuilder.concat('api', model.entity, String(id)) const response = await this.apiRequestService.get(url) // deserialize the response const entity = await HydraDenormalizer.denormalize(response) // Save data into the store const repository = this.getRepository(model) repository.save(entity) return entity } public findBy(model: typeof ApiModel, query: AssociativeArray) { } public fetchAll(model: typeof ApiModel) { } public async persist(model: typeof ApiModel, entity: ApiModel) { const data = ModelNormalizer.normalize(entity) let url = UrlBuilder.concat('api', model.entity) let response = null if (entity.isNew) { response = await this.apiRequestService.post(url, data) } else { url = UrlBuilder.concat(url, String(entity.id)) response = await this.apiRequestService.put(url, data) } const fetchedEntity = await HydraDenormalizer.denormalize(response) // Save data into the store const repository = this.getRepository(model) repository.save(fetchedEntity) return fetchedEntity } public delete() { } public new(model: typeof ApiModel) { const entity = new model() entity.isNew = true // Save data into the store const repository = this.getRepository(model) repository.save(entity) return entity } public reset() { } } export default EntityManager