sse.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import {defineStore} from "pinia";
  2. import {Ref, ref} from "@vue/reactivity";
  3. import {useEntityManager} from "~/composables/data/useEntityManager";
  4. import {MercureEntityUpdate} from "~/types/interfaces";
  5. export const useSseStore = defineStore('sse', () => {
  6. const connected: Ref<boolean> = ref(false)
  7. const events: Ref<Array<MercureEntityUpdate>> = ref([])
  8. const addEvent = async (event: MercureEntityUpdate) => {
  9. const {em} = useEntityManager()
  10. // TODO: voir à refactorer le "get model from iri"
  11. const matches = event.iri.match(/^\/api\/(\w+)\/.*/)
  12. if (!matches || !matches[1]) {
  13. throw new Error('cannot parse the IRI')
  14. }
  15. const entityName = matches[1]
  16. const model = em.getModelFor(entityName)
  17. switch (event.operation) {
  18. case "update":
  19. case "create":
  20. await em.persist(model, JSON.parse(event.data))
  21. break
  22. case "delete":
  23. break
  24. default:
  25. throw new Error('SSE: unknown operation type')
  26. }
  27. }
  28. return {
  29. connected,
  30. events,
  31. addEvent
  32. }
  33. })