Skip to content

✨ feat(FolderZipArchiver): téléchargement d'un dossier entier en zip#274

Merged
ronan-develop merged 5 commits into
mainfrom
feat/#240-folder-download
Jul 20, 2026
Merged

✨ feat(FolderZipArchiver): téléchargement d'un dossier entier en zip#274
ronan-develop merged 5 commits into
mainfrom
feat/#240-folder-download

Conversation

@ronan-develop

Copy link
Copy Markdown
Owner

Résumé

  • Nouvelle route GET /folders/{id}/download : génère et streame un zip récursif du dossier (sous-dossiers + fichiers), même modèle de sécurité que FileDownloadController (owner ou partage actif via ResourceAccessChecker)
  • FolderZipArchiver : parcourt Folder::getChildren()/getFiles() pour construire l'arborescence dans le zip ; fichier physique manquant sur disque → ignoré silencieusement
  • Bouton de téléchargement ajouté sur FolderCard
  • ext-zip déclarée dans composer.json

Au passage (contexte découvert en investiguant #240, sans lien direct avec le zip) :

  • bin/deploy-all.sh injecte désormais MAILER_DSN_PRESET automatiquement à l'--init (avant : chaque nouvelle instance repartait sur MAILER_DSN=null://null, aucun email d'invitation/reset ne partait)
  • .github/avancement.md mis à jour (suivi du travail mergé récemment : PDF viewer, worker média, EXIF, partage async, mailer_dsn)

Closes #240

Test plan

  • Suite PHPUnit complète : 795 tests verts (hors TailwindBuildTest, préexistant, environnement local sans build CSS)
  • Testé manuellement en local : connexion demo@homecloud.local, téléchargement du dossier "Documents" et "Uploads" depuis /explorer → zip valide contenant les bons fichiers
  • Tests dédiés : tests/Web/FolderDownloadWebTest.php (auth, ownership, partage, 404, headers) + tests/Integration/FolderZipArchiverIntegrationTest.php (structure du zip, dossier vide, fichier manquant sur disque)

…--init

Chaque instance créée via bin/deploy-all.sh --init repartait sur
MAILER_DSN=null://null (défaut de .env) : aucun email d'invitation ni de
réinitialisation de mot de passe ne partait. MAILER_DSN_PRESET était déjà
prévu dans .secrets mais jamais lu ni injecté, contrairement à
DB_PASSWORD_PRESET qui suit le même pattern.
Nécessaire pour ZipArchive (FolderZipArchiver, #240) — déjà présente sur
l'environnement mais pas déclarée, comme ext-gd/ext-exif avant elle.
…dossier

Parcourt Folder::getChildren()/getFiles() (relation Doctrine déjà en place)
plutôt que la CTE SQL findDescendantIds() : la hiérarchie nécessaire au
chemin relatif dans le zip est directement portée par les entités.
Fichier physique manquant sur disque -> ignoré silencieusement plutôt que
de faire échouer tout le zip.

Part de #240.
GET /folders/{id}/download — même modèle de sécurité que FileDownloadController
(ResourceAccessChecker::canRead, owner ou partage actif). Réutilise
FolderZipArchiver pour générer l'archive, streamée via BinaryFileResponse
avec suppression du fichier temporaire après envoi.

Closes #240.
Lien vers app_folder_download à côté de Renommer/Déplacer/Partager/Supprimer.

Part de #240.
@ronan-develop ronan-develop added feature Nouvelle fonctionnalité api Modifications ou ajouts concernant l’API (routes, contrôleurs, ressources…). frontend CSS, Twig, Stimulus, JS labels Jul 20, 2026
@ronan-develop
ronan-develop merged commit cf1de46 into main Jul 20, 2026
3 checks passed
@ronan-develop
ronan-develop deleted the feat/#240-folder-download branch July 20, 2026 08:40
ronan-develop added a commit that referenced this pull request Jul 20, 2026
…manuel) (#300)

- cicd.md affirmait un déploiement automatique via webhook après CI verte —
  faux : le webhook public/deploy.php est cassé (401 depuis plusieurs jours)
  et de toute façon plus utilisé, le déploiement réel est manuel via
  bin/deploy-all.sh. DEPLOY_WORKFLOW.md/DEPLOY_SECRETS.md annotés "non
  implémenté" plutôt que réécrits (référence technique valide si #288 reprend).
- avancement.md rattrapé : #274 à #299 (zip dossier, drag-drop, viewer PDF,
  scan PDF actif + fix Content-Type décalé, page changelog auto-alimentée +
  pagination + PrTitleCleaner, centralisation factories, 7e instance
  baptiste, découvertes déploiement — webhook cassé, SshWhitelist, piège IP
  dynamique/VPN entreprise).
- deploiement.md : piège IP dynamique/VPN + API SshWhitelist documentés.
- technique.md : Factory/ ajouté à la structure src/, section Déploiement
  corrigée (même faux "automatique").
- features.md : limite EXIF RAW obsolète corrigée (lu depuis #269, sauf
  CR3), viewer PDF/zip dossier/changelog ajoutés.
- README.md : nombre de tests obsolète (738 → 832, 17 → 25 suites Jest).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api Modifications ou ajouts concernant l’API (routes, contrôleurs, ressources…). feature Nouvelle fonctionnalité frontend CSS, Twig, Stimulus, JS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Le téléchargement d'un dossier entier ne fonctionne pas

1 participant