Browse Source

rewrite stores with composition api

Olivier Massot 3 years ago
parent
commit
32b87b9948
6 changed files with 204 additions and 91 deletions
  1. 71 0
      models/models.ts
  2. 10 0
      services/data/entityManager.ts
  3. 1 3
      services/rights/abilitiesUtils.ts
  4. 69 48
      store/form.ts
  5. 22 18
      store/page.ts
  6. 31 22
      store/sse.ts

+ 71 - 0
models/models.ts

@@ -0,0 +1,71 @@
+import {Access} from "~/models/Access/Access";
+import {AdminAccess} from "~/models/Access/AdminAccess";
+import {MyProfile} from "~/models/Access/MyProfile";
+import {PersonalizedList} from "~/models/Access/PersonalizedList";
+import {ResidenceArea} from "~/models/Billing/ResidenceArea";
+import {AddressPostal} from "~/models/Core/AddressPostal";
+import {BankAccount} from "~/models/Core/BankAccount";
+import {ContactPoint} from "~/models/Core/ContactPoint";
+import {Country} from "~/models/Core/Country";
+import {File} from "~/models/Core/File";
+import {Notification} from "~/models/Core/Notification";
+import {NotificationUsers} from "~/models/Core/NotificationUsers";
+import {NotificationMessage} from "~/models/Core/NotificationMessage";
+import {Tagg} from "~/models/Core/Tagg";
+import {EducationTiming} from "~/models/Education/EducationTiming";
+import {Cycle} from "~/models/Education/Cycle";
+import {LicenceCmfOrganizationER} from "~/models/Export/LicenceCmfOrganizationER";
+import {Network} from "~/models/Network/Network";
+import {NetworkOrganization} from "~/models/Network/NetworkOrganization";
+import {Organization} from "~/models/Organization/Organization";
+import {OrganizationAddressPostal} from "~/models/Organization/OrganizationAddressPostal";
+import {OrganizationArticle} from "~/models/Organization/OrganizationArticle";
+import {OrganizationLicence} from "~/models/Organization/OrganizationLicence";
+import {OrganizationNetwork} from "~/models/Organization/OrganizationNetwork";
+import {OrganizationProfile} from "~/models/Organization/OrganizationProfile";
+import {Parameters} from "~/models/Organization/Parameters";
+import {TypeOfPractice} from "~/models/Organization/TypeOfPractice";
+import {Person} from "~/models/Person/Person";
+import {Subdomain} from "~/models/Organization/Subdomain";
+import ApiResource from "~/models/ApiResource";
+
+
+const classes = [
+    Access,
+    AdminAccess,
+    MyProfile,
+    PersonalizedList,
+    ResidenceArea,
+    AddressPostal,
+    BankAccount,
+    ContactPoint,
+    Country,
+    File,
+    Notification,
+    NotificationMessage,
+    NotificationUsers,
+    Tagg,
+    Cycle,
+    EducationTiming,
+    LicenceCmfOrganizationER,
+    Network,
+    NetworkOrganization,
+    Organization,
+    OrganizationAddressPostal,
+    OrganizationArticle,
+    OrganizationLicence,
+    OrganizationNetwork,
+    OrganizationProfile,
+    Parameters,
+    Subdomain,
+    TypeOfPractice,
+    Person
+]
+
+const models: Record<string, typeof ApiResource> = {}
+
+classes.forEach((model) => {
+    models[model.entity] = model
+})
+
+export default models

+ 10 - 0
services/data/entityManager.ts

@@ -10,6 +10,7 @@ import {MyProfile} from "~/models/Access/MyProfile";
 import { v4 as uuid4 } from 'uuid';
 import {AssociativeArray, Collection} from "~/types/data.d";
 import {useCloneDeep} from "#imports";
+import models from "~/models/models";
 
 /**
  * Entity manager: make operations on the models defined with the Pinia-Orm library
@@ -41,6 +42,15 @@ class EntityManager {
         return new model(entity)
     }
 
+    /**
+     * Return the model class with the given entity name
+     *
+     * @param entityName
+     */
+    public getModelFor(entityName: string): typeof ApiResource{
+        return models[entityName]
+    }
+
     /**
      * Create a new instance of the given model
      *

+ 1 - 3
services/rights/abilitiesUtils.ts

@@ -1,12 +1,10 @@
-import {$accessProfile} from '~/services/profile/accessProfile'
-import {$organizationProfile} from '~/services/profile/organizationProfile'
 import {$roleUtils} from '~/services/rights/roleUtils'
 import {AbilitiesType} from '~/types/interfaces'
 import {useAccessProfileStore} from "~/store/profile/access";
 import {useOrganizationProfileStore} from "~/store/profile/organization";
 import YamlDenormalizer from "~/services/data/serializer/denormalizer/yamlDenormalizer";
 import {MongoAbility} from "@casl/ability/dist/types/Ability";
-import {AnyJson} from "~/types/enum/data";
+import {AnyJson} from "~/types/data";
 
 /**
  * Classe permettant de mener des opérations sur les habilités

+ 69 - 48
store/form.ts

@@ -1,53 +1,74 @@
-import {formState} from '~/types/interfaces'
 import {FORM_FUNCTION} from "~/types/enum/enums";
 import {defineStore} from "pinia";
-import {AnyJson} from "~/types/enum/data";
-
-export const useFormStore = defineStore('form', {
-  state: (): formState => {
-    return {
-      formFunction: FORM_FUNCTION.EDIT,
-      violations: {},
-      readonly: false,
-      dirty: false,
-      showConfirmToLeave: false,
-      goAfterLeave: null
-    }
-  },
-  actions: {
-    setViolations (violations: Array<string>) {
-      this.violations = violations
-    },
-    addViolations(invalidFields: AnyJson){
-      this.violations = invalidFields
-    },
-    setReadOnly (readonly: boolean) {
-      this.readonly = readonly
-    },
-    setFormFunction (formFunction: FORM_FUNCTION) {
-      this.formFunction = formFunction
-    },
-    setDirty (dirty: boolean) {
-      this.dirty = dirty
-    },
-    setShowConfirmToLeave (showConfirmToLeave: boolean) {
-      this.showConfirmToLeave = showConfirmToLeave
-    },
-    setGoAfterLeave (goAfterLeave: string) {
-      this.goAfterLeave = goAfterLeave
-    },
-    /**
-     * Actions devant être gérées si on souhaite quitter une page
-     * @param to
-     */
-    handleActionsAfterLeavePage(to: any){
-      if (this.dirty) {
-        this.showConfirmToLeave = true
-        this.goAfterLeave = to
-      } else {
-        this.formFunction = FORM_FUNCTION.EDIT
-        this.violations = []
-      }
+import {Ref, ref} from "@vue/reactivity";
+import {AnyJson} from "~/types/data";
+
+export const useFormStore = defineStore('form', () => {
+  const formFunction = ref(FORM_FUNCTION.EDIT)
+  const violations = ref({})
+  const readonly = ref(false)
+  const dirty = ref(false)
+  const showConfirmToLeave = ref(false)
+  const goAfterLeave: Ref<string | null> = ref(null)
+
+  const setViolations = (newViolations: Array<string>) => {
+    violations.value = newViolations
+  }
+
+  const addViolation = (invalidFields: AnyJson) => {
+    // TODO: revoir
+    violations.value = invalidFields
+  }
+
+  const setReadOnly = (value: boolean) => {
+    readonly.value = value
+  }
+
+  const setFormFunction = (newFormFunction: FORM_FUNCTION) => {
+    formFunction.value = newFormFunction
+  }
+
+  const setDirty = (value: boolean) => {
+    dirty.value = value
+  }
+
+  const setShowConfirmToLeave = (value: boolean) => {
+    showConfirmToLeave.value = value
+  }
+
+  const setGoAfterLeave = (value: string) => {
+    goAfterLeave.value = value
+  }
+
+  /**
+   * Actions devant être gérées si on souhaite quitter une page
+   *
+   * @param to
+   */
+  const handleActionsAfterLeavingPage = (to: any) => {
+    if (dirty) {
+      showConfirmToLeave.value = true
+      goAfterLeave.value = to
+    } else {
+      formFunction.value = FORM_FUNCTION.EDIT
+      violations.value = []
     }
   }
+
+  return [
+    formFunction,
+    violations,
+    readonly,
+    dirty,
+    showConfirmToLeave,
+    goAfterLeave,
+    setViolations,
+    addViolation,
+    setReadOnly,
+    setFormFunction,
+    setDirty,
+    setShowConfirmToLeave,
+    setGoAfterLeave,
+    handleActionsAfterLeavingPage
+  ]
 })

+ 22 - 18
store/page.ts

@@ -1,31 +1,35 @@
-import {Alert, pageState} from '~/types/interfaces'
+import {Alert} from '~/types/interfaces'
 import {defineStore} from "pinia";
 import {TYPE_ALERT} from "~/types/enum/enums";
+import {Ref, ref} from "@vue/reactivity";
 
-export const usePageStore = defineStore('page', {
-  state: (): pageState => {
-    return {
-      alerts: [],
-      menusOpened: {}
-    }
-  },
-  actions: {
-    removeSlowlyAlert () {
+export const usePageStore = defineStore('page', () => {
+    const alerts: Ref<Array<Alert>> = ref([])
+    const menusOpened = ref({})
+
+    const removeSlowlyAlert = () => {
       setTimeout(() => {
-        this.alerts.shift()
+        alerts.value.shift()
       }, 300)
-    },
+    }
+
     /**
      * Ajout des alerts dans le store
      * @param type
-     * @param alerts
+     * @param messages
      */
-    addAlerts(type: TYPE_ALERT, alerts: Array<string>){
-      const alert:Alert = {
+    const addAlert = (type: TYPE_ALERT, messages: Array<string>) => {
+      const alert: Alert = {
         type: type,
-        messages: alerts
+        messages: messages
       }
-      this.alerts.push(alert)
+      alerts.value.push(alert)
     }
-  }
+
+    return [
+        alerts,
+        menusOpened,
+        removeSlowlyAlert,
+        addAlert
+    ]
 })

+ 31 - 22
store/sse.ts

@@ -1,32 +1,41 @@
 import {MercureEntityUpdate, sseState} from "~/types/interfaces";
-import {repositoryHelper} from "~/services/store/repository";
-import ModelsUtils from "~/services/utils/modelsUtils";
 import {defineStore} from "pinia";
+import {ref} from "@vue/reactivity";
+import {useEntityManager} from "~/composables/data/useEntityManager";
 
-export const useSseStore = defineStore('sse', {
-  state: (): sseState => {
-    return {
-      connected: false,
-      events: []
+export const useSseStore = defineStore('sse', () => {
+  const connected = ref(false)
+  const events = ref([])
+
+  const addEvent = (state: sseState, event: MercureEntityUpdate) => {
+    const { em } = useEntityManager()
+
+    // TODO: voir à refactorer le "get model from iri"
+    const matches = event.iri.match(/^\/api\/(\w+)\/.*/)
+    if (!matches || !matches[1]) {
+      throw new Error('cannot parse the IRI')
     }
-  },
-  actions: {
-    addEvent(state: sseState, event: MercureEntityUpdate) {
+    const entityName = matches[1]
 
-      const model = ModelsUtils.getModelFromIri(event.iri)
+    const model = em.getModelFor(entityName)
 
-      switch (event.operation) {
-        case "update":
-        case "create":
-          repositoryHelper.persist(model, JSON.parse(event.data))
-          break
+    switch (event.operation) {
+      case "update":
+      case "create":
+        em.persist(model, JSON.parse(event.data))
+        break
 
-        case "delete":
-          break
+      case "delete":
+        break
 
-        default:
-          throw new Error('SSE: unknown operation type')
-      }
+      default:
+        throw new Error('SSE: unknown operation type')
     }
   }
-})
+
+  return [
+      connected,
+      events,
+      addEvent
+  ]
+})