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:
@@ -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é
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user