feat: enhance JiraService with task deletion logic

- Added `tasksDeleted` to `JiraSyncResult` to track deleted tasks.
- Implemented `cleanupUnassignedTasks` method to remove Jira tasks no longer assigned to the user, improving data accuracy and synchronization.
- Updated logging for better visibility during task cleanup process.
This commit is contained in:
Julien Froidefond
2025-09-17 15:55:40 +02:00
parent 95ac4617d6
commit 7c139e4ce0

View File

@@ -18,6 +18,7 @@ export interface JiraSyncResult {
tasksCreated: number;
tasksUpdated: number;
tasksSkipped: number;
tasksDeleted: number;
errors: string[];
}
@@ -157,6 +158,7 @@ export class JiraService {
tasksCreated: 0,
tasksUpdated: 0,
tasksSkipped: 0,
tasksDeleted: 0,
errors: []
};
@@ -166,12 +168,15 @@ export class JiraService {
// S'assurer que le tag "From Jira" existe
await this.ensureJiraTagExists();
// Récupérer les tickets Jira
// Récupérer les tickets Jira actuellement assignés
const jiraTasks = await this.getAssignedIssues();
result.tasksFound = jiraTasks.length;
console.log(`📋 ${jiraTasks.length} tickets trouvés dans Jira`);
// Récupérer la liste des IDs Jira actuels pour le nettoyage
const currentJiraIds = new Set(jiraTasks.map(task => task.id));
// Synchroniser chaque ticket
for (const jiraTask of jiraTasks) {
try {
@@ -190,6 +195,9 @@ export class JiraService {
}
}
// Nettoyer les tâches Jira qui ne sont plus assignées à l'utilisateur
result.tasksDeleted = await this.cleanupUnassignedTasks(currentJiraIds);
// Déterminer le succès et enregistrer le log
result.success = result.errors.length === 0;
await this.logSync(result);
@@ -269,7 +277,6 @@ export class JiraService {
(existingTask.dueDate?.getTime() || null) !== (taskData.dueDate?.getTime() || null) ||
existingTask.jiraProject !== taskData.jiraProject ||
existingTask.jiraKey !== taskData.jiraKey ||
// @ts-expect-error - jiraType existe mais n'est pas encore dans les types générés
existingTask.jiraType !== taskData.jiraType ||
existingTask.assignee !== taskData.assignee;
@@ -293,7 +300,6 @@ export class JiraService {
dueDate: taskData.dueDate,
jiraProject: taskData.jiraProject,
jiraKey: taskData.jiraKey,
// @ts-expect-error - jiraType existe mais n'est pas encore dans les types générés
jiraType: taskData.jiraType,
assignee: taskData.assignee,
updatedAt: taskData.updatedAt // Seulement si changements réels
@@ -308,6 +314,64 @@ export class JiraService {
}
}
/**
* Nettoie les tâches Jira qui ne sont plus assignées à l'utilisateur
*/
private async cleanupUnassignedTasks(currentJiraIds: Set<string>): Promise<number> {
try {
console.log('🧹 Début du nettoyage des tâches non assignées...');
// Trouver toutes les tâches Jira existantes dans la base
const existingJiraTasks = await prisma.task.findMany({
where: {
source: 'jira'
},
select: {
id: true,
sourceId: true,
jiraKey: true
}
});
console.log(`📊 ${existingJiraTasks.length} tâches Jira trouvées en base`);
// Identifier les tâches à supprimer (celles qui ne sont plus dans Jira)
const tasksToDelete = existingJiraTasks.filter(task =>
task.sourceId && !currentJiraIds.has(task.sourceId)
);
if (tasksToDelete.length === 0) {
console.log('✅ Aucune tâche à supprimer');
return 0;
}
console.log(`🗑️ ${tasksToDelete.length} tâche(s) à supprimer (plus assignées à l'utilisateur)`);
let deletedCount = 0;
// Supprimer les tâches une par une avec logging
for (const task of tasksToDelete) {
try {
await prisma.task.delete({
where: { id: task.id }
});
console.log(`🗑️ Tâche supprimée: ${task.jiraKey} (non assignée)`);
deletedCount++;
} catch (error) {
console.error(`❌ Erreur suppression tâche ${task.jiraKey}:`, error);
}
}
console.log(`✅ Nettoyage terminé: ${deletedCount} tâche(s) supprimée(s)`);
return deletedCount;
} catch (error) {
console.error('❌ Erreur lors du nettoyage des tâches non assignées:', error);
// Ne pas faire échouer la sync pour un problème de nettoyage
return 0;
}
}
/**
* Assigne le tag "🔗 From Jira" à une tâche si pas déjà assigné
*/