feat(rental): Sprint F — photos & vidéos items rental #80
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/rental-sprint-f"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Sprint F — Photos & vidéos items rental
Comble le gap mentionné dans la doc Sprint A : les items rental n'avaient qu'un
imageUrlsimple, là où les carbets ont un modèleMediariche avec ordering, cover, suppression, variantes responsives.Schéma
RentalItemMedia(parallèle deMedia) : s3Key, s3Url, sortOrder, type (PHOTO|VIDEO), cascade sur RentalItem20260603100000_rental_item_media— appliquée à la DB prod via container éphémèreEndpoints upload (dédiés, pas d'overload du flow carbet)
POST /api/uploads/rental-presign— authcanManageRentalProvider(admin OR provider manager), s3Key préfixérental-items/<itemId>/POST /api/uploads/rental-finalize— crée laRentalItemMedia, hydrateRentalItem.imageUrlavec la première PHOTO (rétro-compat listings), génère les variantes responsives en best-effortDELETE /api/rental-media/[id]+POST /api/rental-media/reorder— reorder met à jourimageUrlpour suivre le cover (sortOrder 0)MediaUploader générique
Refactor avec prop
scope: {kind, id}:{kind: "carbet", carbetId}— comportement inchangé (rétro-compatcarbetIdprop deprecated){kind: "rental-item", itemId}— utilise les nouveaux endpointsAucune régression côté carbet : les call-sites existants restent intacts.
UI branchée
/admin/rental-items/[id]— section « Photos & vidéos » au-dessus du form/espace-prestataire/items/[itemId]— idem côté prestataire/materiel/[itemId]— nouveau<ItemGallery />(thumbs cliquables + support vidéo), fallback sur ancienimageUrlsi pas de média dédié (compat seed)Test plan
gear-rentalsur/admin/plugins/admin/rental-items/[id]: upload 2 photos via drag&drop, réordonner, supprimerRentalItem.imageUrlest mis à jour vers le cover (DB)/materiel/[itemId]affiche la galerie avec thumbs/espace-prestataire/items/[itemId]rental-items/X/Y.jpg-320.jpg,-800.jpg,-1600.jpg🤖 Generated with Claude Code
Nouveau modèle `RentalItemMedia` parallèle de `Media` (carbet) : - s3Key / s3Url / sortOrder / type (PHOTO|VIDEO), cascade sur RentalItem - Migration `20260603100000_rental_item_media` appliquée Endpoints upload dédiés (mêmes conventions que carbet) : - POST /api/uploads/rental-presign + POST /api/uploads/rental-finalize → auth par canManageRentalProvider (admin OR provider manager) → s3Key préfixé `rental-items/<itemId>/` → finalize hydrate `RentalItem.imageUrl` avec la première PHOTO → générateur de variantes (320/800/1600 via sharp) en best-effort - DELETE /api/rental-media/[id] + POST /api/rental-media/reorder → reorder rafraîchit imageUrl (cover = sortOrder 0) `MediaUploader` rendu générique : - Nouveau prop `scope: {kind: "carbet" | "rental-item", id}` ; conserve rétro-compat `carbetId` (deprecated) - Endpoints + payload key (`carbetId` ↔ `itemId`) calculés via `endpointsFor()`. Aucun changement de comportement côté carbet. UI branchée : - /admin/rental-items/[id] : section « Photos & vidéos » au-dessus du form, alimentée par `item.media` chargé par `getRentalItemForAdmin` - /espace-prestataire/items/[itemId] : idem, charge via `getHostItem` - /materiel/[itemId] : nouveau `<ItemGallery />` (thumbs cliquables + support vidéo). Fallback : ancien `item.imageUrl` si pas de média dédié (compat seed). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>