From 7c139e4ce0cf6d7686aede8365852eb190d06640 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 17 Sep 2025 15:55:40 +0200 Subject: [PATCH] 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. --- services/jira.ts | 70 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/services/jira.ts b/services/jira.ts index 9f45725..783b895 100644 --- a/services/jira.ts +++ b/services/jira.ts @@ -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): Promise { + 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é */