Session étendue :
- Ajout session.user.organizationId (typedef + auth callbacks JWT
& session). Permet à canManageCarbet de check membership sans
refetch DB.
src/lib/carbet-access.ts :
- MANAGER_ROLES inclut désormais CE_MANAGER → /espace-hote ET /espace-ce
sont gardés par requireOwnerSession (CE_MANAGER passe, OWNER passe,
ADMIN passe).
- canManageCarbet(session, carbetOwnerId, linkedOrgIds=[]) :
- ADMIN → toujours vrai
- OWNER + session.user.id === carbetOwnerId → vrai
- CE_MANAGER + session.user.organizationId ∈ linkedOrgIds → vrai
- sinon faux.
- Callers historiques (qui ne passent pas linkedOrgIds) restent sûrs :
CE_MANAGER ne peut rien gérer par défaut.
createCarbet étendu : si role=CE_MANAGER + organizationId présent,
crée OrganizationCarbetMembership dans la même transaction. Redirige
ensuite vers /espace-ce/carbets/[id] au lieu de /espace-hote/.
Sweep des callers canManageCarbet (8 sites) : chargent désormais
`Carbet.organizations` + passent linkedOrgIds. Includes :
- updateCarbet, setCarbetStatus, deleteCarbet, reorderMedia, deleteMedia
dans espace-hote/carbets/actions.ts
- espace-hote/carbets/[carbetId]/page.tsx
- API POST /api/carbets/[carbetId]/media
Pages /espace-ce/carbets/* :
- page.tsx : liste les carbets co-gérés via OrganizationCarbetMembership,
forms Publier/Dépublier/Supprimer pointent vers les actions
existantes de /espace-hote (réutilisation totale)
- nouveau/page.tsx : requireApprovedOrg (redirect dashboard si pending),
CarbetForm + createCarbet (même action que /espace-hote — détecte
CE_MANAGER et crée membership)
- [carbetId]/page.tsx : vérif que le carbet est lié à l'org du user
+ MediaUploader + CarbetForm (updateCarbet partagé)
Dashboard /espace-ce/page.tsx : ActionCard « Mes carbets » devient
active (le lien marche même en pending — l'org peut préparer des
brouillons, c'est juste la publication qui est bloquée).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>