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;
|
tasksCreated: number;
|
||||||
tasksUpdated: number;
|
tasksUpdated: number;
|
||||||
tasksSkipped: number;
|
tasksSkipped: number;
|
||||||
|
tasksDeleted: number;
|
||||||
errors: string[];
|
errors: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,6 +158,7 @@ export class JiraService {
|
|||||||
tasksCreated: 0,
|
tasksCreated: 0,
|
||||||
tasksUpdated: 0,
|
tasksUpdated: 0,
|
||||||
tasksSkipped: 0,
|
tasksSkipped: 0,
|
||||||
|
tasksDeleted: 0,
|
||||||
errors: []
|
errors: []
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -166,12 +168,15 @@ export class JiraService {
|
|||||||
// S'assurer que le tag "From Jira" existe
|
// S'assurer que le tag "From Jira" existe
|
||||||
await this.ensureJiraTagExists();
|
await this.ensureJiraTagExists();
|
||||||
|
|
||||||
// Récupérer les tickets Jira
|
// Récupérer les tickets Jira actuellement assignés
|
||||||
const jiraTasks = await this.getAssignedIssues();
|
const jiraTasks = await this.getAssignedIssues();
|
||||||
result.tasksFound = jiraTasks.length;
|
result.tasksFound = jiraTasks.length;
|
||||||
|
|
||||||
console.log(`📋 ${jiraTasks.length} tickets trouvés dans Jira`);
|
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
|
// Synchroniser chaque ticket
|
||||||
for (const jiraTask of jiraTasks) {
|
for (const jiraTask of jiraTasks) {
|
||||||
try {
|
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
|
// Déterminer le succès et enregistrer le log
|
||||||
result.success = result.errors.length === 0;
|
result.success = result.errors.length === 0;
|
||||||
await this.logSync(result);
|
await this.logSync(result);
|
||||||
@@ -269,7 +277,6 @@ export class JiraService {
|
|||||||
(existingTask.dueDate?.getTime() || null) !== (taskData.dueDate?.getTime() || null) ||
|
(existingTask.dueDate?.getTime() || null) !== (taskData.dueDate?.getTime() || null) ||
|
||||||
existingTask.jiraProject !== taskData.jiraProject ||
|
existingTask.jiraProject !== taskData.jiraProject ||
|
||||||
existingTask.jiraKey !== taskData.jiraKey ||
|
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.jiraType !== taskData.jiraType ||
|
||||||
existingTask.assignee !== taskData.assignee;
|
existingTask.assignee !== taskData.assignee;
|
||||||
|
|
||||||
@@ -293,7 +300,6 @@ export class JiraService {
|
|||||||
dueDate: taskData.dueDate,
|
dueDate: taskData.dueDate,
|
||||||
jiraProject: taskData.jiraProject,
|
jiraProject: taskData.jiraProject,
|
||||||
jiraKey: taskData.jiraKey,
|
jiraKey: taskData.jiraKey,
|
||||||
// @ts-expect-error - jiraType existe mais n'est pas encore dans les types générés
|
|
||||||
jiraType: taskData.jiraType,
|
jiraType: taskData.jiraType,
|
||||||
assignee: taskData.assignee,
|
assignee: taskData.assignee,
|
||||||
updatedAt: taskData.updatedAt // Seulement si changements réels
|
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é
|
* Assigne le tag "🔗 From Jira" à une tâche si pas déjà assigné
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user