-
Notifications
You must be signed in to change notification settings - Fork 4
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
Conversation
e78dab5
to
6dcda44
Compare
There was a problem hiding this 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 !
ui/pages/effectifs/doublons.tsx
Outdated
{organisme && <EffectifsDoublonsPage isMine={true} />} | ||
</Container> | ||
</Box> | ||
</Page> |
There was a problem hiding this comment.
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. 🙂
There was a problem hiding this comment.
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}`); |
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
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.
server/src/http/server.ts
Outdated
requireOrganismePermission("manageEffectifs"), | ||
async (req, res, next) => { | ||
res.locals.duplicateId = new ObjectId((req.params as any).effectifId); | ||
console.log("res.locals.duplicateId :>> ", res.locals.duplicateId); |
There was a problem hiding this comment.
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 🧹
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
server/src/http/server.ts
Outdated
|
||
if (!isEffectifLinkedToOrganisme) return res.status(401).json({ error: "Accès non autorisé" }); | ||
next(); | ||
}, |
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
server/src/http/server.ts
Outdated
)?.organisme_id.equals(res.locals.organismeId); | ||
console.log("isEffectifLinkedToOrganisme:>> ", isEffectifLinkedToOrganisme); | ||
|
||
if (!isEffectifLinkedToOrganisme) return res.status(401).json({ error: "Accès non autorisé" }); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
server/src/http/server.ts
Outdated
|
||
const isEffectifLinkedToOrganisme = ( | ||
await effectifsDb().findOne({ _id: res.locals.duplicateId }) | ||
)?.organisme_id.equals(res.locals.organismeId); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
server/src/http/server.ts
Outdated
|
||
const isEffectifLinkedToOrganisme = ( | ||
await effectifsDb().findOne({ _id: res.locals.duplicateId }) | ||
)?.organisme_id.equals(res.locals.organismeId); |
There was a problem hiding this comment.
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.
There was a problem hiding this 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
805c174
to
3c78f8b
Compare
There was a problem hiding this 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
3c78f8b
to
a1c476a
Compare
8808a81
to
ac2af8c
Compare
Qqs updates et ajout d'un système de vérification des permissions pour permettre :
|
There was a problem hiding this 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); |
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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) => { |
There was a problem hiding this comment.
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.
ui/pages/effectifs/doublons.tsx
Outdated
</Head> | ||
<Box w="100%" pt={[4, 6]} px={[1, 1, 2, 4]} mb={16}> | ||
<Container maxW="xl" px={0}> | ||
{organisme && <EffectifsDoublonsPage isMine={true} />} |
There was a problem hiding this comment.
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 ! 🙃
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
c5e0f5a
to
e4bdef5
Compare
🚀 Prévisualisation |
🎉 This PR is included in version 3.64.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Bugs remontés par @ClemLan : l'écran n'était accessible que pour les admins.
Modifications faites testables via impostures :