Comment filtrer les données selon l’utilisateur connecté dans une liste d’enregistrements ?

Problème

Notre cas métier est le suivant :

  1. un utilisateur travaille pour un établissement ;
  2. une demande est créée par l’utilisateur pour son établissement de rattachement, la demande est alors associée à cet établissement ;
  3. un utilisateur connecté n’accède qu’aux demandes de son propre établissement.

Nous avons donc modifié le modèle de données de l’entité user afin d’y rajouter un champ relationnel vers l’entité Etablissement. Nous souhaitons modifier le comportement natif de la liste des demandes afin qu’elle ne restitue que les demandes associées à l’établissement de l’utilisateur connecté.

Exemple de script d’instruction correspondant au cas métier :

add project Test
add application Filtrage

select module home
add entity Etablissement
add field Nom
set field Nom required

add entity Demande
add field Référence
set field Référence required
add field Etablissement related to Etablissement using Nom

select module administration
select entity user
add field Etablissement related to Etablissement using Nom

Mise en œuvre

  1. Enrichissement de l’objet user passé en session lors de la connexion de l’utilisateur à l’application :
    • Fichier utils/auth_strategy.js
models.E_user.findOne({
where: {f_login: login_user},
include: [{
model: models.E_group,
as: 'r_group'
}, {
model: models.E_role,
as: 'r_role'
}, {
model: models.E_etablissement,
as: 'r_etablissement'
}]
})

2.  Modification de la route entity/datalist pour y rajouter le filtrage :

    • Utilisation des options speInclude et speWhere de la fonction filterDataTable. Dans l’exemple ci-dessous le speInclude reste vide tandis que l’on ajoute le filtrage des demandes avec la clause where :
filterDataTable("E_demande", req.body, [],{fk_id_etablissement_etablissement: req.session.passport.user.fk_id_etablissement_etablissement})