소스 검색

services/environnement/composables

Vincent 3 년 전
부모
커밋
22905393cf

+ 28 - 0
.env.local

@@ -0,0 +1,28 @@
+## LOCAL ENVIRONMENT FILE
+ENV=dev
+DEBUG=1
+
+## API Base Url
+NUXT_BASE_URL=http://nginx_new
+NUXT_PUBLIC_BASE_URL=https://local.ap2i.opentalent.fr
+
+# Legacy API Base Url
+NUXT_BASE_URL_LEGACY=http://nginx
+NUXT_PUBLIC_BASE_URL_LEGACY=https://local.api.opentalent.fr
+
+# Legacy Admin Base Url
+NUXT_BASE_URL_ADMIN_LEGACY=https://local.admin.opentalent.fr/#
+NUXT_PUBLIC_BASE_URL_ADMIN_LEGACY=https://local.admin.opentalent.fr/#
+
+# Typo3 Base Url
+NUXT_BASE_URL_TYPO3=https://local.sub.opentalent.fr/###subDomain###
+NUXT_PUBLIC_BASE_URL_TYPO3=https://local.sub.opentalent.fr/###subDomain###
+
+# Mercure push events
+NUXT_BASE_URL_MERCURE=https://local.mercure.opentalent.fr/.well-known/mercure
+NUXT_PUBLIC_BASE_URL_MERCURE=https://local.mercure.opentalent.fr/.well-known/mercure
+
+
+MERCURE_SUBSCRIBER_JWT_KEY=NQEupdREijrfYvCmF2mnvZQFL9zLKDH9RCYter6tUWzjemPqzicffhc2fSf0yEmM
+
+

+ 19 - 0
.env.preprod

@@ -0,0 +1,19 @@
+## PREPROD ENVIRONMENT FILE
+ENV=preprod
+DEBUG=1
+
+## API Base Url
+NUXT_BASE_URL=https://ap2i.preprod.opentalent.fr
+NUXT_PUBLIC_BASE_URL=https://ap2i.preprod.opentalent.fr
+
+# Legacy API Base Url
+NUXT_BASE_URL_LEGACY=https://api.preprod.opentalent.fr
+NUXT_PUBLIC_BASE_URL_LEGACY=https://api.preprod.opentalent.fr
+
+# Legacy Admin Base Url
+NUXT_BASE_URL_ADMIN_LEGACY=https://admin.preprod.opentalent.fr/#
+NUXT_PUBLIC_BASE_URL_ADMIN_LEGACY=https://admin.preprod.opentalent.fr/#
+
+# Typo3 Base Url
+NUXT_BASE_URL_TYPO3=https://preprod.opentalent.fr/###subDomain###
+NUXT_PUBLIC_BASE_URL_TYPO3=https://preprod.opentalent.fr/###subDomain###

+ 20 - 0
.env.prod

@@ -0,0 +1,20 @@
+## PROD ENVIRONMENT FILE
+# /!\ -- USE ONLY IN PRODUCTION --
+ENV=production
+DEBUG=0
+
+## API Base Url
+NUXT_BASE_URL=https://ap2i.opentalent.fr
+NUXT_PUBLIC_BASE_URL=https://ap2i.opentalent.fr
+
+# Legacy API Base Url
+NUXT_BASE_URL_LEGACY=https://api.opentalent.fr
+NUXT_PUBLIC_BASE_URL_LEGACY=https://api.opentalent.fr
+
+# Legacy Admin Base Url
+NUXT_BASE_URL_ADMIN_LEGACY=https://admin.opentalent.fr/#
+NUXT_PUBLIC_BASE_URL_ADMIN_LEGACY=https://admin.opentalent.fr/#
+
+# Typo3 Base Url
+NUXT_BASE_URL_TYPO3=https://###subDomain###.opentalent.fr
+NUXT_PUBLIC_BASE_URL_TYPO3=https://###subDomain###.opentalent.fr

+ 7 - 0
composables/data/useDataDeleter.ts

@@ -0,0 +1,7 @@
+import DataDeleter from "~/services/data/dataDeleter";
+
+export const useDataDeleter = () => {
+    // const dataDeleter = new DataDeleter()
+    // dataDeleter.initCtx(useNuxtApp())
+    return new DataDeleter()
+}

+ 7 - 0
composables/data/useDataPersister.ts

@@ -0,0 +1,7 @@
+import DataPersister from "~/services/data/dataPersister";
+
+export const useDataPersister = () => {
+    // const dataPersister = new DataPersister()
+    // dataPersister.initCtx(useNuxtApp())
+    return new DataPersister()
+}

+ 7 - 0
composables/data/useDataProvider.ts

@@ -0,0 +1,7 @@
+import DataProvider from "~/services/data/dataProvider";
+
+export const useDataProvider = () => {
+    // const dataProvider = new DataProvider()
+    // dataProvider.initCtx(useNuxtApp())
+    return new DataProvider()
+}

+ 16 - 0
nuxt.config.ts

@@ -3,6 +3,22 @@ import fs from 'fs';
 
 // https://v3.nuxtjs.org/api/configuration/nuxt.config
 export default defineNuxtConfig({
+    runtimeConfig: {
+        // Private config that is only available on the server
+        baseUrl: '',
+        baseUrlLegacy: '',
+        baseUrlAdminLegacy: '',
+        baseUrlTypo3: '',
+        baseUrlMercure: '',
+        // Config within public will be also exposed to the client
+        public: {
+            baseUrl: '',
+            baseUrlLegacy: '',
+            baseUrlAdminLegacy: '',
+            baseUrlTypo3: '',
+            baseUrlMercure: '',
+        }
+    },
     hooks: {
       'builder:watch': console.log
     },

+ 10 - 0
pages/index.vue

@@ -3,10 +3,20 @@
     <div v-if="$can('create', 'tagg')">
       <a @click="createPost">Add Post</a>
     </div>
+
+<!--  {{store}}-->
 </template>
 
 <script setup lang="ts">
 import {useProfileAccessStore} from "~/store/profile/access";
+import {repositoryHelper} from "~/services/store/repository";
+import {MyProfile} from "~/models/Access/MyProfile";
+import {useDataDeleter} from "~/composables/data/useDataDeleter";
 // const store = useProfileAccessStore()
+
+
+//const myProfile = repositoryHelper.findItemFromModel(MyProfile, 20840)
+
+
 </script>
 

+ 2 - 2
plugins/ability.ts

@@ -2,6 +2,6 @@ import { Ability } from '@casl/ability'
 import { $abilitiesUtils } from '~/services/rights/abilitiesUtils'
 
 export const ability = new Ability()
-export default defineNuxtPlugin(({$pinia}) => {
-    $abilitiesUtils($pinia, ability).setAbilities()
+export default defineNuxtPlugin(() => {
+    $abilitiesUtils(ability).setAbilities()
 })

+ 0 - 21
plugins/dataProvider.ts

@@ -1,21 +0,0 @@
-import DataProvider from "../services/data/dataProvider";
-import {useAsyncData, useFetch} from "nuxt/app";
-
-export default defineNuxtPlugin(async () => {
-
-
-    // const {data} = await useAsyncData('fetch', () =>
-    //     $fetch('https://jsonplaceholder.typicode.com/todos/1')
-    // )
-    //
-    //
-    // console.log(data.value)
-    //
-    // const dataProvider = new DataProvider()
-    //
-    // return {
-    //     provide: {
-    //         dataProvider: dataProvider
-    //     }
-    // }
-})

+ 9 - 10
plugins/init.server.ts

@@ -1,8 +1,10 @@
 import {defineNuxtPlugin} from "nuxt/app";
 import {useProfileAccessStore} from "~/store/profile/access";
+import {QUERY_TYPE} from "~/types/enums";
+import {useDataProvider} from "~/composables/data/useDataProvider";
 
-export default defineNuxtPlugin(async ({$pinia, ssrContext}) => {
-    const profileAccessStore = useProfileAccessStore($pinia)
+export default defineNuxtPlugin(async ({ssrContext}) => {
+    const profileAccessStore = useProfileAccessStore()
 
     const arraysCookies = ssrContext?.req?.headers.cookie?.split('; ').map((a:string) => a.split('='))
     if(arraysCookies) {
@@ -13,14 +15,11 @@ export default defineNuxtPlugin(async ({$pinia, ssrContext}) => {
             id: cookies['AccessId']
         })
 
-        const data = await $fetch('/api/my_profile', {
-            baseURL: 'http://nginx_new',
-            headers: {
-                'x-accessid' : profileAccessStore.id,
-                'Authorization' : 'BEARER ' + profileAccessStore.bearer
-            }
+        const dataProvider = useDataProvider()
+        const myProfile = await dataProvider.invoke({
+            type: QUERY_TYPE.DEFAULT,
+            url: '/api/my_profile'
         })
-
-        profileAccessStore.setProfile(data)
+        profileAccessStore.setProfile(myProfile.data)
     }
 })

+ 71 - 33
services/connection/connection.ts

@@ -1,8 +1,10 @@
-import {NuxtAxiosInstance} from '@nuxtjs/axios'
-import {AxiosRequestConfig, AxiosResponse} from 'axios'
-import {AnyJson, DataPersisterArgs, DataProviderArgs, FileArgs, UrlArgs} from '~/types/interfaces'
+import {AnyJson, DataPersisterArgs, DataProviderArgs, UrlArgs} from '~/types/interfaces'
 import {HTTP_METHOD, QUERY_TYPE} from '~/types/enums'
 import TypesTesting from "~/services/utils/typesTesting";
+import {$fetch, FetchOptions} from "ohmyfetch";
+import {useProfileAccessStore} from "~/store/profile/access";
+import Page from "~//services/store/page";
+import {TYPE_ALERT} from "~//types/enums";
 
 /**
  * @category Services/connection
@@ -11,15 +13,6 @@ import TypesTesting from "~/services/utils/typesTesting";
  * Classe Wrapper du connecteur de requête (Axios dans notre cas)
  */
 class Connection {
-  static connector: NuxtAxiosInstance;
-
-  /**
-   * Initialisation du connecteur (Axios dans notre cas)
-   * @param {NuxtAxiosInstance} connector
-   */
-  static initConnector (connector: NuxtAxiosInstance) {
-    Connection.connector = connector
-  }
 
   /**
    * Main méthode qui appellera les méthodes privées correspondantes (getItem, getCollection, put, post, delete)
@@ -73,13 +66,12 @@ class Connection {
    * @return {Promise<any>}
    */
   public static getItem (url: string, id: number, showProgress: boolean = true, params: AnyJson = {}): Promise<any> {
-    const config: AxiosRequestConfig = {
-      url: `${url}/${id}`,
+    const config: FetchOptions = {
       method: HTTP_METHOD.GET,
       progress: showProgress,
       params: params
     }
-    return Connection.request(config)
+    return Connection.request(`${url}/${id}`, config)
   }
 
   /**
@@ -91,8 +83,7 @@ class Connection {
    * @return {Promise<any>}
    */
   public static getCollection (url: string, type: QUERY_TYPE, progress: boolean = true, params: AnyJson = {}): Promise<any> {
-    let config: AxiosRequestConfig = {
-      url: `${url}`,
+    let config: FetchOptions = {
       method: HTTP_METHOD.GET,
       progress,
       params: params
@@ -100,7 +91,7 @@ class Connection {
     if(type === QUERY_TYPE.IMAGE)
       config = {...config, responseType: 'blob'}
 
-    return Connection.request(config)
+    return Connection.request(`${url}`, config)
   }
 
   /**
@@ -112,14 +103,13 @@ class Connection {
    * @return {Promise<any>}
    */
   public static download (url: string, showProgress: boolean = true, params: AnyJson = {}): Promise<any> {
-    const config: AxiosRequestConfig = {
-      url: `${url}`,
+    const config: FetchOptions = {
       method: HTTP_METHOD.GET,
       progress: showProgress,
       responseType: 'blob',
       params: params
     }
-    return Connection.request(config)
+    return Connection.request(`${url}`, config)
   }
 
   /**
@@ -131,14 +121,13 @@ class Connection {
    * @return {Promise<any>}
    */
   public static post(url: string, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
-    const config: AxiosRequestConfig = {
-      url: `${url}`,
+    const config: FetchOptions = {
       method: HTTP_METHOD.POST,
       data,
       progress,
       params: params
     }
-    return Connection.request(config)
+    return Connection.request(`${url}`, config)
   }
 
   /**
@@ -151,14 +140,13 @@ class Connection {
    * @return {Promise<any>}
    */
   public static put (url: string, id: number, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
-    const config: AxiosRequestConfig = {
-      url: `${url}/${id}`,
+    const config: FetchOptions = {
       method: HTTP_METHOD.PUT,
       data,
       progress,
       params: params
     }
-    return Connection.request(config)
+    return Connection.request(`${url}/${id}`, config)
   }
 
   /**
@@ -170,22 +158,72 @@ class Connection {
    * @return {Promise<any>}
    */
   public static deleteItem (url: string, id: number, progress: boolean = true, params: AnyJson = {}): Promise<any> {
-    const config: AxiosRequestConfig = {
-      url: `${url}/${id}`,
+    const config: FetchOptions = {
       method: HTTP_METHOD.DELETE,
       progress,
       params: params
     }
-    return Connection.request(config)
+    return Connection.request(`${url}/${id}`, config)
   }
 
   /**
    * Exécute la requete
-   * @param {AxiosRequestConfig} config
+   * @param {string} url
+   * @param {FetchOptions} config
    * @return {Promise<any>}
    */
-  public static async request (config: AxiosRequestConfig): Promise<AxiosResponse> {
-    return await Connection.connector.$request(config)
+  public static async request (url: string, config: FetchOptions): Promise<FetchResponse> {
+    Connection.addBaseUrl(config)
+    Connection.addHeader(config)
+    Connection.addOnResponseError(config)
+    return await $fetch(url, config)
+  }
+
+  /**
+   * On ajoute la base URL
+   * @param config
+   */
+  public static addBaseUrl(config){
+    const runtimeConfig = useRuntimeConfig()
+    config['baseURL'] = runtimeConfig.baseUrl ?? runtimeConfig.public.baseUrl
+  }
+
+  /**
+   * On ajoute les headers
+   * @param config
+   */
+  public static addHeader(config){
+    if(!config.params.noXaccessId){
+      const profileAccessStore = useProfileAccessStore()
+      config['headers'] = {
+        'x-accessid' : profileAccessStore.id,
+        'Authorization' : 'BEARER ' + profileAccessStore.bearer
+      }
+
+      if (profileAccessStore.switchId) {
+        config['headers']['x-switch-user'] = profileAccessStore.switchId
+      }
+    }
+  }
+
+  /**
+   * Gestion des erreurs de réponse
+   * @param config
+   */
+  public static async addOnResponseError(config){
+    config['onResponseError'] = (({ request, response, options }) => {
+      // In case of unauthorized, redirect to a specific page
+      if (response.status === 401) {
+        redirect('/login')
+      }
+      if (response.status === 403) {
+        new Page().addAlerts(TYPE_ALERT.ALERT, ['forbidden'])
+      }
+
+      if (response.status === 500) {
+        new Page().addAlerts(TYPE_ALERT.ALERT, [response])
+      }
+    })
   }
 }
 

+ 7 - 7
services/data/baseDataManager.ts

@@ -1,14 +1,15 @@
-import { Context } from '@nuxt/types/app'
+import {NuxtApp} from "#app";
 import {DataManager, DataPersisterArgs, DataProviderArgs, UrlArgs} from '~/types/interfaces'
 import Connection from '~/services/connection/connection'
 import Hookable from '~/services/data/hookable'
 import { HTTP_METHOD, QUERY_TYPE } from '~/types/enums'
 
 /**
+ * @todo : le context (ctx) on devrait pouvoir s'en passer grace aux différent composable... a voir..
  * Base class for data providers, persisters or deleters
  */
 abstract class BaseDataManager extends Hookable implements DataManager {
-  protected ctx!: Context
+  protected ctx!: NuxtApp
   protected defaultArguments: object = {
     type: QUERY_TYPE.MODEL,
     showProgress: true
@@ -16,10 +17,9 @@ abstract class BaseDataManager extends Hookable implements DataManager {
 
   /**
    * Initialise le contexte (la connection en particulier)
-   * @param {Context} ctx
+   * @param {NuxtApp} ctx
    */
-  public initCtx (ctx: Context) {
-    Connection.initConnector(ctx.$axios)
+  public initCtx (ctx: NuxtApp) {
     this.ctx = ctx
   }
 
@@ -52,8 +52,8 @@ abstract class BaseDataManager extends Hookable implements DataManager {
    */
   private static startLoading (args: UrlArgs) {
     if (args.showProgress) {
-      const $nuxt = window.$nuxt
-      $nuxt.$loading.start()
+      // const $nuxt = window.$nuxt
+      // $nuxt.$loading.start()
     }
   }
 

+ 3 - 3
services/data/processor/baseProcessor.ts

@@ -1,11 +1,11 @@
-import { Context } from '@nuxt/types/app'
+import {NuxtApp} from "#app";
 import { AnyJson, DataProviderArgs } from '~/types/interfaces'
 
 class BaseProcessor {
   protected arguments!: DataProviderArgs;
-  protected ctx!: Context;
+  protected ctx!: NuxtApp;
 
-  constructor (ctx: Context, args: DataProviderArgs) {
+  constructor (ctx: NuxtApp, args: DataProviderArgs) {
     this.arguments = args
     this.ctx = ctx
   }

+ 1 - 2
services/data/processor/enumProcessor.ts

@@ -1,4 +1,3 @@
-import * as _ from 'lodash'
 import {ApiResponse, DataProviderArgs, EnumChoice, EnumChoices, Processor} from '~/types/interfaces'
 import BaseProcessor from '~/services/data/processor/baseProcessor'
 import { QUERY_TYPE } from '~/types/enums'
@@ -21,7 +20,7 @@ class EnumProcessor extends BaseProcessor implements Processor {
   async process (payload: ApiResponse): Promise<any> {
     const enums: EnumChoices = []
 
-    _.each(payload.data.items, (item, key) => {
+    useEach(payload.data.items, (item, key) => {
       const entry:EnumChoice = {
         value: key,
         label: this.ctx.app.i18n.t(item) as string

+ 1 - 2
services/data/processor/modelProcessor.ts

@@ -1,4 +1,3 @@
-import * as _ from 'lodash'
 import {ApiResponse, DataProviderArgs, Processor} from '~/types/interfaces'
 import BaseProcessor from '~/services/data/processor/baseProcessor'
 import {METADATA_TYPE, QUERY_TYPE} from '~/types/enums'
@@ -23,7 +22,7 @@ class ModelProcessor extends BaseProcessor implements Processor {
     }
 
     if(payload.metadata.type !== METADATA_TYPE.COLLECTION){
-      payload.data.originalState = _.cloneDeep(payload)
+      payload.data.originalState = useCloneDeep(payload)
     }
     await repositoryHelper.persist(this.arguments.model, payload.data)
 

+ 2 - 5
services/profile/accessProfile.ts

@@ -12,15 +12,12 @@ export class AccessProfile {
   private accessProfile!: accessState
 
   private $ability:Ability = {} as Ability
-  private $pinia!:Pinia
 
   /**
    * Set le store
-   * @param {Pinia} pinia
    */
-  public setPinia (pinia: Pinia) {
-    this.accessProfile = useProfileAccessStore(pinia)
-    this.$pinia = pinia
+  public setPinia () {
+    this.accessProfile = useProfileAccessStore()
   }
 
   /**

+ 7 - 9
services/rights/abilitiesUtils.ts

@@ -14,15 +14,13 @@ import {useProfileOrganizationStore} from "~/store/profile/organization";
  */
 class AbilitiesUtils {
     private readonly $ability: Ability = {} as Ability
-    private readonly $pinia: Pinia = {} as Pinia
     private factory: AnyJson = {}
 
     /**
      * @constructor
      */
-    constructor(pinia: Pinia, ability: Ability) {
+    constructor(ability: Ability) {
         this.$ability = ability
-        this.$pinia = pinia
     }
 
     /**
@@ -40,7 +38,7 @@ class AbilitiesUtils {
     initFactory() {
         this.factory = {
             access: $accessProfile,
-            organization: $organizationProfile(this.$pinia)
+            organization: $organizationProfile()
         }
         this.setAbilitiesAndStore()
     }
@@ -50,15 +48,15 @@ class AbilitiesUtils {
      */
     setAbilitiesAndStore() {
         this.factory.access.setAbility(this.$ability)
-        this.factory.access.setPinia(this.$pinia)
+        this.factory.access.setPinia()
     }
 
     /**
      * Définit les abilities de l'utilisateur à chaque fois qu'on met à jour son profile
      */
     setAbilities() {
-        const accessProfileStore = useProfileAccessStore(this.$pinia)
-        const organizationProfileStore = useProfileOrganizationStore(this.$pinia)
+        const accessProfileStore = useProfileAccessStore()
+        const organizationProfileStore = useProfileOrganizationStore()
 
         // Nécessaire pour que l'update des habilités soit correcte après la phase SSR
         this.$ability.update(accessProfileStore.abilities)
@@ -93,7 +91,7 @@ class AbilitiesUtils {
      * @return {Array<AbilitiesType>}
      */
     getAbilities(): Array<AbilitiesType> {
-        const accessProfileStore = useProfileAccessStore(this.$pinia)
+        const accessProfileStore = useProfileAccessStore()
         const abilitiesByRoles: Array<AbilitiesType> = this.getAbilitiesByRoles(accessProfileStore.roles)
         this.$ability.update(abilitiesByRoles)
         this.initFactory()
@@ -189,4 +187,4 @@ class AbilitiesUtils {
     }
 }
 
-export const $abilitiesUtils = (pinia: Pinia, ability: Ability) => new AbilitiesUtils(pinia, ability)
+export const $abilitiesUtils = (ability: Ability) => new AbilitiesUtils(ability)

+ 2 - 8
services/store/form.ts

@@ -1,14 +1,8 @@
-import {Pinia} from "pinia";
 import {FORM_STATUS} from "~/types/enums";
 // import {Route} from "vue-router";
 import {useFormStore} from "~/store/form";
 
 export default class FormStorage {
-  private $pinia:Pinia
-
-  constructor(pinia:Pinia) {
-    this.$pinia = pinia
-  }
 
   /**
    * Actions devant être gérées si on souhaite quitter une page
@@ -16,7 +10,7 @@ export default class FormStorage {
    */
   // handleActionsAfterLeavePage(to: Route){
   handleActionsAfterLeavePage(to: any){
-    const formStore = useFormStore(this.$pinia)
+    const formStore = useFormStore()
     if (formStore.dirty) {
       formStore.showConfirmToLeave = true
       formStore.goAfterLeave = to
@@ -31,7 +25,7 @@ export default class FormStorage {
    * @param invalidFields
    */
   addViolations(invalidFields: []){
-    const formStore = useFormStore(this.$pinia)
+    const formStore = useFormStore()
     formStore.violations = invalidFields
   }
 }

+ 1 - 8
services/store/page.ts

@@ -1,22 +1,15 @@
-import {Pinia} from "pinia";
 import {TYPE_ALERT} from "~/types/enums";
 import {Alert} from "~/types/interfaces";
 import {usePageStore} from "~/store/page";
 
 export default class Page {
-  private $pinia
-
-  constructor(pinia:Pinia) {
-    this.$pinia = pinia
-  }
-
   /**
    * Ajout des alerts dans le store
    * @param type
    * @param alerts
    */
   addAlerts(type: TYPE_ALERT, alerts: Array<string>){
-    const pageStore = usePageStore(this.$pinia)
+    const pageStore = usePageStore()
     const alert:Alert = {
       type: type,
       messages: alerts

+ 5 - 17
services/store/repository.ts

@@ -1,6 +1,4 @@
-import { Collection, Item, Model, Repository as VuexRepository } from 'pinia-orm'
-import { Pinia } from 'pinia'
-import * as _ from 'lodash'
+import { Collection, Item, Model, Repository as PiniaRepository, useRepo } from 'pinia-orm'
 import { $objectProperties } from '~/services/utils/objectProperties'
 import { AnyJson } from '~/types/interfaces'
 import {OrderByVuexOrm} from "~/types/types";
@@ -9,16 +7,6 @@ import {OrderByVuexOrm} from "~/types/types";
  * Classe Wrapper pour assurer les opérations les plus communes des Repository de VuexORM
  */
 class Repository {
-  private pinia !: Pinia
-
-  /**
-   * Set le store
-   *
-   * @param {Store<any>} store
-   */
-  public setStore (pinia: Pinia) {
-    this.pinia = pinia
-  }
 
   /**
    * Récupération du repository du Model
@@ -26,15 +14,15 @@ class Repository {
    * @param {Model} model
    * @return {VuexRepository<Model>} le repository
    */
-  public getRepository (model: typeof Model): VuexRepository<Model> {
-    return this.pinia.$repo(model)
+  public getRepository (model: typeof Model): PiniaRepository<Model> {
+    return useRepo(model)
   }
 
   public createNewModelInstance (model: typeof Model): Model {
     return this.getRepository(model).make()
   }
 
-  /**
+  /**x
    * Récupération du nom de l'entité du model
    *
    * @param {Model} model
@@ -73,7 +61,7 @@ class Repository {
    * @param {string} field
    */
   public updateStoreFromField (model: typeof Model, entry: AnyJson, value: any, field: string): void {
-    if (!_.has(entry, field)) { throw new Error('field not found') }
+    if (!useHas(entry, field)) { throw new Error('field not found') }
 
     entry[field] = value
     this.persist(model, $objectProperties.cloneAndNest(entry))

+ 3 - 3
store/profile/access.ts

@@ -78,7 +78,7 @@ export const useProfileAccessStore = defineStore('profileAccess', {
       const organizationProfileStore = useProfileOrganizationStore()
       organizationProfileStore.setProfile(profile.organization)
 
-      this.createNewMyProfileVUexOrmInstance(profile)
+      this.createNewMyProfilePiniaOrmInstance(profile)
     },
     refreshProfile(profile: any) {
       this.name = profile.name
@@ -135,8 +135,8 @@ export const useProfileAccessStore = defineStore('profileAccess', {
      * Créer une nouvelle instance MyProfile dans Vuex ORM
      * @param access
      */
-    createNewMyProfileVUexOrmInstance(access: any): void {
-      //repositoryHelper.persist(MyProfile, access)
+    createNewMyProfilePiniaOrmInstance(access: any): void {
+      repositoryHelper.persist(MyProfile, access)
     }
   }
 })

+ 0 - 1
types/interfaces.d.ts

@@ -209,7 +209,6 @@ interface DataDeleterArgs extends UrlArgs {}
 interface EnumChoices extends Array<EnumChoice> {}
 
 interface DataManager {
-  initCtx(ctx: Context): void,
   invoke(args: UrlArgs): Promise<any>,
 }