model.ts 2.1 KB

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