Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: fix visu / suppression de doublons pour un organisme #3272

Merged
merged 10 commits into from
Oct 13, 2023

Conversation

sbenfares
Copy link
Contributor

@sbenfares sbenfares commented Oct 5, 2023

Bugs remontés par @ClemLan : l'écran n'était accessible que pour les admins.

Modifications faites testables via impostures :

  • Ajout de l'écran doublons pour un organisme
  • Modification de l'API pour remonter directement le détail des doublons dans la route duplicates, plus besoin d'un appel API spécifique à un détail d'effectif
  • Modification de la route de delete pour permettre à un organisme de supprimer ses effectifs avec un controle sur l'organisme id.

@sbenfares sbenfares force-pushed the feature/fix-droits-ecran-doublons branch from e78dab5 to 6dcda44 Compare October 5, 2023 13:50
@sbenfares sbenfares changed the title wip: fix doublons feat: fix visu / suppression de doublons pour un organisme Oct 5, 2023
@sbenfares sbenfares marked this pull request as ready for review October 5, 2023 15:04
Copy link
Contributor

@totakoko totakoko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il me reste juste à valider en local et je valide demain !

{organisme && <EffectifsDoublonsPage isMine={true} />}
</Container>
</Box>
</Page>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Y'a un composant SimplePage qui simplifie un peu les choses et pour harmoniser avec le reste des pages, il faut le titre en bleu cf 👇

    <SimplePage title={title}>
      <Container maxW="xl" p="8">
        <Heading as="h1" color="#465F9D" fontSize="beta" fontWeight="700" mb="4w">
          Titre de page en bleu
        </Heading>
        ...
      </Container>
    </SimplePage>

Comme ça le SimplePage laisse la possibilité au contenu de choisir la largeur souhaitée avec le container (par exemple sur la page d'accueil, j'avais besoin d'avoir la largeur complète). Et pas besoin du Box intermédiaire. 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

@@ -57,7 +62,7 @@ const EffectifDoublonDeleteAlertDialog = ({
<Button
colorScheme="red"
onClick={async () => {
await _delete(`/api/v1/effectif/${effectifId}`);
await _delete(`/api/v1/organismes/${organisme?._id}/duplicate/${duplicateDetail?.id}`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vu qu'on a l'id de l'effectif et que ce n'est pas relatif 1, 2, 3, 4. pourquoi ajouter organisme id en paramètre ?
Dans tous les cas, pour les permissions, on devrait récupérer l'effectif, et vérifier que l'organisme_id est accessible selon notre profil. (j'ai pas encore vu la partie backend)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, désormais la route est différente plus besoin de l'organisme_id en param.

requireOrganismePermission("manageEffectifs"),
async (req, res, next) => {
res.locals.duplicateId = new ObjectId((req.params as any).effectifId);
console.log("res.locals.duplicateId :>> ", res.locals.duplicateId);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Faudra supprimer tous les console.log de debug 🧹

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


if (!isEffectifLinkedToOrganisme) return res.status(401).json({ error: "Accès non autorisé" });
next();
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu voudrais pas mettre tout ce code dans le handler plutôt ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

)?.organisme_id.equals(res.locals.organismeId);
console.log("isEffectifLinkedToOrganisme:>> ", isEffectifLinkedToOrganisme);

if (!isEffectifLinkedToOrganisme) return res.status(401).json({ error: "Accès non autorisé" });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

throw Boom.forbidden("Permissions invalides") pour avoir un 403 qui correspond à un accès interdit selon les permissions.
401 correspond plutôt à une erreur d'authentification.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


const isEffectifLinkedToOrganisme = (
await effectifsDb().findOne({ _id: res.locals.duplicateId })
)?.organisme_id.equals(res.locals.organismeId);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A voir, mais y'a moyen qu'un organisme parent doivent / puisse gérer les effectifs des organismes formateurs. (il me semble que c'était l'idée jusque-là)

cf https://www.notion.so/Permissions-afd9dc14606042e8b76b23aa57f516a8

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et en relisant le code, en fait on vérifie juste que l'effectif correspond à l'organisme passé en paramètre. Du coup c'est pas super secure... 🙃
Je recommande de supprimer l'organisme des paramètres car on peut de toute façon retrouver l'organisme_id afin de vérifier les droits.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, ajout d'une fonction spécifique dans les permissions

Copy link
Contributor

@totakoko totakoko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 J'ai pu tester et ça fonctionne. Il y a juste quelques points qu'on peut améliorer je pense : sécu route suppression + afficher les nom et prénoms originaux.

{`Détail de l'apprenant ${toPascalCase(effectifDetail?.apprenant?.prenom)} ${toPascalCase(
effectifDetail?.apprenant?.nom
{`Détail de l'apprenant ${toPascalCase(duplicateDetail?.apprenant?.prenom)} ${toPascalCase(
duplicateDetail?.apprenant?.nom
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

Le toPascaleCase semble un peu pourri car il supprime les tirets entre autres, du coup le nom affiché est pas génial. On peut pas juste afficher les valeurs telles quelles ? (dans la dialog de détail + dans la liste)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 pour prendre le nom tel quel dans l'affichage (même si on transforme pour comparer)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


const isEffectifLinkedToOrganisme = (
await effectifsDb().findOne({ _id: res.locals.duplicateId })
)?.organisme_id.equals(res.locals.organismeId);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et en relisant le code, en fait on vérifie juste que l'effectif correspond à l'organisme passé en paramètre. Du coup c'est pas super secure... 🙃
Je recommande de supprimer l'organisme des paramètres car on peut de toute façon retrouver l'organisme_id afin de vérifier les droits.

Copy link
Contributor

@rap2hpoutre rap2hpoutre left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok pour moi après la prise en compte des commentaires de la review de @totakoko

@sbenfares sbenfares force-pushed the feature/fix-droits-ecran-doublons branch from 805c174 to 3c78f8b Compare October 9, 2023 08:33
server/src/http/server.ts Fixed Show fixed Hide fixed
Copy link
Contributor

@rap2hpoutre rap2hpoutre left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On peut merge quand vous voulez quand c'est prêt

@sbenfares sbenfares force-pushed the feature/fix-droits-ecran-doublons branch from 3c78f8b to a1c476a Compare October 12, 2023 13:04
server/src/http/server.ts Fixed Show fixed Hide fixed
@sbenfares sbenfares force-pushed the feature/fix-droits-ecran-doublons branch from 8808a81 to ac2af8c Compare October 12, 2023 15:32
@sbenfares
Copy link
Contributor Author

Qqs updates et ajout d'un système de vérification des permissions pour permettre :

  • Admin
  • OF Concerné
  • OF responsables

server/src/http/server.ts Fixed Show fixed Hide fixed
Copy link
Contributor

@totakoko totakoko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 J'ai fait quelques derniers commentaires ! 😄

throw new Error("organisme de l'organisation non trouvé");
}

const organismesResponsablesIdsOfOrganisme = findOrganismeFormateursIds(userOrganisme);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... organismesResponsables... = findOrganismesFormateurs .... 🤔 😁

En relisant, je pense que tu voudrais utiliser findOrganismesAccessiblesByOrganisationOF pour retourner un tableau contenant l'organisme Id + ceux de ces formateurs.

En fait ça revient à faire comme la fonction canManageOrganismeEffectifs.


return (
organismeIdForEffectif.equals(userOrganisme._id) ||
organismesResponsablesIdsOfOrganisme.includes(organismeIdForEffectif)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cf commentaire précédent (plus haut), donc potentiellement obsolète.

Attention ici le includes ne va pas fonctionner car organismeIdForEffectif n'est pas un type primitif mais un ObjectId.

* @param effectifId
* @returns
*/
export const canDeleteEffectifDuplicate = async (ctx: AuthContext, effectifId: ObjectId) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actuellement effectifId n'est pas un ObjectId mais un string !

Tu pourrais le définir en ObjectId directement côté handler, et supprimer le new ObjectId(effectifId) ici.

</Head>
<Box w="100%" pt={[4, 6]} px={[1, 1, 2, 4]} mb={16}>
<Container maxW="xl" px={0}>
{organisme && <EffectifsDoublonsPage isMine={true} />}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On peut utiliser SimplePage ici aussi ! 🙃

@sbenfares
Copy link
Contributor Author

sbenfares commented Oct 13, 2023

Update ici 👉🏼 d0b3e16

Et ici 👉🏼 c5e0f5a

Comment on lines +375 to +379
returnResult(async (req) => {
const effectifId = new ObjectId(req.params.id);
if (!(await canDeleteEffectif(req.user, effectifId))) throw Boom.forbidden("Permissions invalides");
await effectifsDb().deleteOne({ _id: effectifId });
})

Check failure

Code scanning / CodeQL

Missing rate limiting

This route handler performs [a database access](1), but is not rate-limited.
@sbenfares sbenfares force-pushed the feature/fix-droits-ecran-doublons branch from c5e0f5a to e4bdef5 Compare October 13, 2023 10:03
@sbenfares
Copy link
Contributor Author

Ajout d'un test sur la route : e4bdef5 @totakoko

@github-actions
Copy link

🚀 Prévisualisation

https://3272.tdb-preview.apprentissage.beta.gouv.fr/

@sbenfares sbenfares merged commit 9abaf6e into master Oct 13, 2023
@sbenfares sbenfares deleted the feature/fix-droits-ecran-doublons branch October 13, 2023 12:17
@github-actions
Copy link

🎉 This PR is included in version 3.64.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants