Aller au contenu principal

Workers Integration - Exemple d'utilisation

Ce document montre comment intégrer les nouveaux workers dans le code existant.

Exemple : Export asynchrone

Backend : Nouvel endpoint /export/async

Un nouvel endpoint a été ajouté pour les exports asynchrones utilisant le nouveau worker :

GET /api/export/async?entity=sessions&format=csv&fields=id,title,status

Réponse :

{
"exportJobId": "uuid-export-job",
"jobRunId": "uuid-job-run",
"message": "Export job queued successfully",
"status": "QUEUED",
"pollUrl": "/api/job-runs/uuid-job-run"
}

Frontend : Utilisation avec hooks

import { useState } from "react";
import { useJobRunStatus } from "@/client/job-runs/useJobRuns";
import { JobRunProgress } from "@/components/job-runs/JobRunProgress";
import { api } from "@/client/api";

function AsyncExportButton() {
const [jobRunId, setJobRunId] = useState<string | null>(null);
const { isCompleted, jobRun } = useJobRunStatus(jobRunId);

const handleExport = async () => {
try {
// Appeler le nouvel endpoint async
const response = await api.get("/export/async", {
entity: "sessions",
format: "csv",
fields: "id,title,status",
});

// Démarrer le polling
setJobRunId(response.jobRunId);
} catch (error) {
console.error("Failed to start export:", error);
}
};

const handleDownload = () => {
if (jobRun?.result?.fileObjectId) {
// Télécharger le fichier depuis R2
window.open(`/api/file-objects/${jobRun.result.fileObjectId}/download`);
}
};

return (
<div>
{!jobRunId && (
<button onClick={handleExport}>Export Sessions (Async)</button>
)}

{jobRunId && !isCompleted && (
<JobRunProgress jobRunId={jobRunId} />
)}

{isCompleted && (
<button onClick={handleDownload}>Download Export</button>
)}
</div>
);
}

Migration progressive

L'ancien endpoint /export reste disponible pour les exports synchrones rapides. Le nouvel endpoint /export/async est recommandé pour :

  • Exports volumineux (> 1000 lignes)
  • Exports complexes (ALL entity, PDF avec beaucoup de données)
  • Meilleure UX : pas de timeout, feedback en temps réel

Comparaison

Aspect/export (sync)/export/async (worker)
Timeout30s maxPas de timeout
FeedbackAucunPolling automatique
PerformanceBloque la requêteTraitement en arrière-plan
UXAttente passiveProgress bar + status
Recommandé pourPetits exportsExports volumineux

Prochaines intégrations

D'autres endpoints peuvent être migrés vers les workers :

  1. AI Tasks : Utiliser ai:run pour les tâches IA lourdes
  2. Document Processing : Utiliser doc:ingest et doc:ocr pour les PDFs