Skip to main content

verify_quote_org_access

Function verify_quote_org_access 

Source
pub async fn verify_quote_org_access(
    user: &AuthenticatedUser,
    quote_id: Uuid,
    quote_use_cases: &QuoteUseCases,
    building_use_cases: &BuildingUseCases,
    acp_use_cases: &AcpUseCases,
) -> Result<(), AppError>
Expand description

Vérifie le mandat de l’appelant sur l’ACP dont relève un lot.

Remonte lot → immeuble → ACP → organisation.

GET /units/{id}/etats-dates sert les états datés d’un lot : le document remis au notaire lors d’une vente, qui porte les arriérés du vendeur et l’état du fonds de réserve. C’est une pièce financière nominative. Vérifie le mandat de l’appelant sur l’organisation d’une réservation.

── Ce que cette garde protège ─────────────────────────────────────────────

Une réservation de ressource commune dit qui a réservé la salle, la buanderie ou le parking visiteur, et quand. Ce n’est pas une donnée neutre : elle dit aussi qui n’était pas chez lui à ce moment-là.

Trois routes agissent sur une réservation par son seul identifiant — complete, no-show, confirm — et deux la lisent. Aucune ne reçoit d’immeuble : la chaîne réservation → immeuble → ACP → organisation doit donc être remontée ici.

Elles prenaient _auth: AuthenticatedUser, l’identité soulignée d’un underscore pour dire qu’on ne s’en sert pas (#772).

── Pourquoi elle délègue plutôt que de comparer ──────────────────────────

Comme les huit autres, elle finit par appeler verify_building_org_access, qui remonte à l’ACP. Refaire la comparaison ici dupliquerait la règle de cloisonnement en un endroit de plus — et c’est cette duplication, recopiée à la main dans chaque gestionnaire, que l’issue #772 désigne comme la cause première de la fuite. Vérifie le mandat de l’appelant sur l’organisation d’un devis.

── Ce que cette garde protège ─────────────────────────────────────────────

Un devis dit qui a soumis quel prix pour quels travaux. Le lire hors de son ACP, c’est lire la concurrence — un entrepreneur ayant un compte sur la plateforme y verrait les offres de ses concurrents, montants compris.

Neuf routes agissent sur un devis par son seul identifiant : le lire, le soumettre, l’examiner, le retirer, le noter, le supprimer. Aucune ne reçoit d’immeuble, d’où la remontée devis → immeuble → ACP → organisation.

── Ce qu’elle ne fait PAS ────────────────────────────────────────────────

Elle vérifie le périmètre, pas le droit d’agir. Examiner un devis (review) ou noter un prestataire n’appartient pas à tout membre de l’ACP — ce sont des actes de gestion. Ce garde ne dit donc pas « cet utilisateur peut le faire », il dit « ce devis n’est pas celui d’une autre copropriété ».

Confondre les deux serait le défaut que l’issue #772 décrit : un garde qui vérifie la mauvaise chose est pire qu’un garde absent, puisqu’il fait croire la route protégée.