model.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import BaseNormalizer from '~/services/serializer/normalizer/baseNormalizer'
  2. import {AnyJson, DataPersisterArgs} from '~/types/interfaces'
  3. import { QUERY_TYPE } from '~/types/enums'
  4. import { Item } from 'pinia-orm'
  5. import { repositoryHelper } from '~/services/store/repository'
  6. import {queryHelper} from "~/services/store/query";
  7. import {$objectProperties} from "~/services/utils/objectProperties";
  8. /**
  9. * @category Services/serializer/normalizer
  10. * @class Model
  11. * Classe assurant la normalization d'un Model vers un fichier JSON
  12. */
  13. class Model extends BaseNormalizer {
  14. static support (type: QUERY_TYPE): boolean {
  15. return type === QUERY_TYPE.MODEL
  16. }
  17. /**
  18. * Récupération de l'Item souhaité puis transformation en JSON
  19. * @param {DataPersisterArgs} args
  20. * @return {any} réponse
  21. */
  22. public static normalize (args: DataPersisterArgs): any {
  23. if (!args.model) {
  24. throw new Error('*args* has no model attribute')
  25. }
  26. let item:Item = null
  27. const itemId = args.idTemp ? args.idTemp : args.id
  28. if(args.query){
  29. item = queryHelper.getItem(args.query, itemId)
  30. }else{
  31. item = repositoryHelper.findItemFromModel(args.model, itemId)
  32. }
  33. if (!item || typeof item === 'undefined') {
  34. throw new Error('Item not found')
  35. }
  36. let data = item.$toJson()
  37. if(Model.isPostQuery(args)) data = Model.sanitizeBeforePost(data, args.query ? args.query.getAllRelations() : [])
  38. return useOmit(data, 'originalState')
  39. }
  40. /**
  41. * Return true si on est dans un POST
  42. * @param args
  43. */
  44. public static isPostQuery(args: DataPersisterArgs): boolean{
  45. return args.idTemp
  46. }
  47. /**
  48. * Opération de nettoyage avant un POST
  49. * @param data
  50. * @param relations
  51. */
  52. public static sanitizeBeforePost(data:AnyJson, relations: Array<string>): AnyJson{
  53. if(relations){
  54. data = $objectProperties.cloneAndFlatten(data)
  55. for(const relation of relations){
  56. delete data[`${relation}.id`]
  57. delete data[`${relation}.@id`]
  58. }
  59. data = $objectProperties.cloneAndNest(data)
  60. }
  61. delete data.id
  62. return data
  63. }
  64. }
  65. export default Model