feat: migrate to S3 storage with automatic download and timestamped filenames

- Replace local file storage with S3-compatible object storage

- Add automatic PDF download after generation

- Include timestamps in filenames to ensure uniqueness

- Remove unused static volume from Kubernetes deployment

- Update ConfigMap to remove unused variables and add S3 configuration

- Configure S3 credentials via Kubernetes secrets for both dev and prod environments

- Add boto3 dependency for S3 integration
This commit is contained in:
2025-09-03 22:41:16 +02:00
parent a67db405f7
commit 75548dab2b
10 changed files with 164 additions and 67 deletions
+24 -18
View File
@@ -176,31 +176,37 @@
})
});
const result = await response.json();
const resultContainer = document.getElementById('resultContainer');
const resultMessage = document.getElementById('resultMessage');
const downloadLinkContainer = document.getElementById('downloadLinkContainer');
const downloadLink = document.getElementById('downloadLink');
if (result.error) {
resultMessage.innerHTML = `<div class="alert alert-danger">${result.error}</div>`;
downloadLinkContainer.classList.add('d-none');
} else {
// Check if it's a redirect response (for automatic download)
if (response.redirected) {
// Automatically trigger download
window.location.href = response.url;
// Show success message
const resultContainer = document.getElementById('resultContainer');
const resultMessage = document.getElementById('resultMessage');
resultMessage.innerHTML = `
<div class="alert alert-success">
<h6>${result.message}</h6>
<h6>PDF généré avec succès!</h6>
<p>Le téléchargement devrait commencer automatiquement.</p>
<ul class="mb-0">
<li>Tables de ${result.min_table} à ${result.max_table}</li>
<li>${result.num_exercises} exercices générés</li>
<li>Tables de ${minTable} à ${maxTable}</li>
<li>${numExercises} exercices générés</li>
</ul>
</div>
`;
downloadLink.href = `/download/${result.pdf_filename}`;
downloadLinkContainer.classList.remove('d-none');
resultContainer.classList.remove('d-none');
} else {
// Handle JSON response (error case)
const result = await response.json();
const resultContainer = document.getElementById('resultContainer');
const resultMessage = document.getElementById('resultMessage');
if (result.error) {
resultMessage.innerHTML = `<div class="alert alert-danger">${result.error}</div>`;
}
resultContainer.classList.remove('d-none');
}
resultContainer.classList.remove('d-none');
} catch (error) {
const resultContainer = document.getElementById('resultContainer');
const resultMessage = document.getElementById('resultMessage');