From 88ab8c933424c964f4dfa03a40aa94e7bed20190 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Tue, 23 Sep 2025 10:32:25 +0200 Subject: [PATCH] feat: complete Phase 5 of service refactoring - Marked tasks in `TODO.md` as completed for moving TFS and Jira services to the `integrations` directory and correcting imports across the codebase. - Updated imports in various action files, API routes, and components to reflect the new structure. - Removed obsolete `jira-advanced-filters.ts`, `jira-analytics.ts`, `jira-analytics-cache.ts`, `jira-anomaly-detection.ts`, `jira-scheduler.ts`, `jira.ts`, and `tfs.ts` files to streamline the codebase. - Added new tasks in `TODO.md` for future cleaning and organization of service imports. --- TODO.md | 24 ++++++++++--------- src/actions/jira-analytics.ts | 2 +- src/actions/jira-anomalies.ts | 4 ++-- src/actions/jira-filters.ts | 4 ++-- src/actions/jira-sprint-details.ts | 2 +- src/actions/tfs.ts | 2 +- src/app/api/jira/sync/route.ts | 4 ++-- src/app/api/jira/validate-project/route.ts | 2 +- src/app/api/tfs/delete-all/route.ts | 2 +- src/app/api/tfs/sync/route.ts | 2 +- src/app/api/tfs/test/route.ts | 2 +- src/clients/jira-client.ts | 2 +- src/components/forms/task/TaskTfsInfo.tsx | 2 +- src/components/jira/AnomalyDetectionPanel.tsx | 2 +- src/components/jira/FilterBar.tsx | 2 +- src/components/jira/JiraSync.tsx | 2 +- .../jira/anomaly/AnomalyConfigModal.tsx | 2 +- src/components/jira/anomaly/AnomalyItem.tsx | 2 +- src/components/jira/anomaly/AnomalyList.tsx | 2 +- .../jira/anomaly/AnomalySummary.tsx | 2 +- src/components/kanban/TaskCard.tsx | 2 +- .../IntegrationsSettingsPageClient.tsx | 2 +- src/components/settings/TfsConfigForm.tsx | 2 +- src/hooks/useJiraFilters.ts | 2 +- src/lib/types.ts | 2 +- src/services/core/user-preferences.ts | 2 +- .../jira/advanced-filters.ts} | 0 .../jira/analytics-cache.ts} | 0 .../jira/analytics.ts} | 2 +- .../jira/anomaly-detection.ts} | 0 src/services/{ => integrations/jira}/jira.ts | 2 +- .../jira/scheduler.ts} | 2 +- src/services/{ => integrations}/tfs.ts | 4 ++-- 33 files changed, 46 insertions(+), 44 deletions(-) rename src/services/{jira-advanced-filters.ts => integrations/jira/advanced-filters.ts} (100%) rename src/services/{jira-analytics-cache.ts => integrations/jira/analytics-cache.ts} (100%) rename src/services/{jira-analytics.ts => integrations/jira/analytics.ts} (99%) rename src/services/{jira-anomaly-detection.ts => integrations/jira/anomaly-detection.ts} (100%) rename src/services/{ => integrations/jira}/jira.ts (99%) rename src/services/{jira-scheduler.ts => integrations/jira/scheduler.ts} (98%) rename src/services/{ => integrations}/tfs.ts (99%) diff --git a/TODO.md b/TODO.md index 1426d5f..ebe2621 100644 --- a/TODO.md +++ b/TODO.md @@ -137,17 +137,19 @@ src/services/ - [x] Corriger 6 imports externes (pages, API routes, actions) - [x] Corriger imports relatifs vers ../core/database -### Phase 5: Intégrations (déjà partiellement fait) -- [ ] **Déplacer `tfs.ts`** → `integrations/tfs.ts` - - [ ] Corriger imports dans actions/tfs, API routes TFS, components TFS -- [ ] **Déplacer services Jira** → `integrations/jira/` - - [ ] `jira.ts` → `integrations/jira/jira.ts` - - [ ] `jira-scheduler.ts` → `integrations/jira/scheduler.ts` - - [ ] `jira-analytics.ts` → `integrations/jira/analytics.ts` - - [ ] `jira-analytics-cache.ts` → `integrations/jira/analytics-cache.ts` - - [ ] `jira-advanced-filters.ts` → `integrations/jira/advanced-filters.ts` - - [ ] `jira-anomaly-detection.ts` → `integrations/jira/anomaly-detection.ts` - - [ ] Corriger tous les imports Jira dans actions, API routes, hooks +### Phase 5: Intégrations ✅ +- [x] **Déplacer `tfs.ts`** → `integrations/tfs.ts` + - [x] Corriger 10 imports externes (actions, API routes, components, types) + - [x] Corriger imports relatifs vers ../core/ +- [x] **Déplacer services Jira** → `integrations/jira/` + - [x] `jira.ts` → `integrations/jira/jira.ts` + - [x] `jira-scheduler.ts` → `integrations/jira/scheduler.ts` + - [x] `jira-analytics.ts` → `integrations/jira/analytics.ts` + - [x] `jira-analytics-cache.ts` → `integrations/jira/analytics-cache.ts` + - [x] `jira-advanced-filters.ts` → `integrations/jira/advanced-filters.ts` + - [x] `jira-anomaly-detection.ts` → `integrations/jira/anomaly-detection.ts` + - [x] Corriger 18 imports externes (actions, API routes, hooks, components) + - [x] Corriger imports relatifs entre services Jira ## phase 6: cleaning - [ ] Les imports des services dans les services : pourquoi ne pas utiliser @/services/... ? diff --git a/src/actions/jira-analytics.ts b/src/actions/jira-analytics.ts index 2d405f5..c88b7dc 100644 --- a/src/actions/jira-analytics.ts +++ b/src/actions/jira-analytics.ts @@ -1,6 +1,6 @@ 'use server'; -import { JiraAnalyticsService } from '@/services/jira-analytics'; +import { JiraAnalyticsService } from '@/services/integrations/jira/analytics'; import { userPreferencesService } from '@/services/core/user-preferences'; import { JiraAnalytics } from '@/lib/types'; diff --git a/src/actions/jira-anomalies.ts b/src/actions/jira-anomalies.ts index 2f3e056..13f23d2 100644 --- a/src/actions/jira-anomalies.ts +++ b/src/actions/jira-anomalies.ts @@ -1,7 +1,7 @@ 'use server'; -import { jiraAnomalyDetection, JiraAnomaly, AnomalyDetectionConfig } from '@/services/jira-anomaly-detection'; -import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics'; +import { jiraAnomalyDetection, JiraAnomaly, AnomalyDetectionConfig } from '@/services/integrations/jira/anomaly-detection'; +import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/integrations/jira/analytics'; import { userPreferencesService } from '@/services/core/user-preferences'; export interface AnomalyDetectionResult { diff --git a/src/actions/jira-filters.ts b/src/actions/jira-filters.ts index 14df915..3840e42 100644 --- a/src/actions/jira-filters.ts +++ b/src/actions/jira-filters.ts @@ -1,7 +1,7 @@ 'use server'; -import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics'; -import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters'; +import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/integrations/jira/analytics'; +import { JiraAdvancedFiltersService } from '@/services/integrations/jira/advanced-filters'; import { userPreferencesService } from '@/services/core/user-preferences'; import { AvailableFilters, JiraAnalyticsFilters, JiraAnalytics } from '@/lib/types'; diff --git a/src/actions/jira-sprint-details.ts b/src/actions/jira-sprint-details.ts index 1871bd1..aa595f6 100644 --- a/src/actions/jira-sprint-details.ts +++ b/src/actions/jira-sprint-details.ts @@ -1,6 +1,6 @@ 'use server'; -import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics'; +import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/integrations/jira/analytics'; import { userPreferencesService } from '@/services/core/user-preferences'; import { SprintDetails } from '@/components/jira/SprintDetailModal'; import { JiraTask, AssigneeDistribution, StatusDistribution, SprintVelocity } from '@/lib/types'; diff --git a/src/actions/tfs.ts b/src/actions/tfs.ts index 3ead50f..e1e3677 100644 --- a/src/actions/tfs.ts +++ b/src/actions/tfs.ts @@ -2,7 +2,7 @@ import { userPreferencesService } from '@/services/core/user-preferences'; import { revalidatePath } from 'next/cache'; -import { tfsService, TfsConfig } from '@/services/tfs'; +import { tfsService, TfsConfig } from '@/services/integrations/tfs'; /** * Sauvegarde la configuration TFS diff --git a/src/app/api/jira/sync/route.ts b/src/app/api/jira/sync/route.ts index 23dee01..272673b 100644 --- a/src/app/api/jira/sync/route.ts +++ b/src/app/api/jira/sync/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server'; -import { createJiraService, JiraService } from '@/services/jira'; +import { createJiraService, JiraService } from '@/services/integrations/jira/jira'; import { userPreferencesService } from '@/services/core/user-preferences'; -import { jiraScheduler } from '@/services/jira-scheduler'; +import { jiraScheduler } from '@/services/integrations/jira/scheduler'; /** * Route POST /api/jira/sync diff --git a/src/app/api/jira/validate-project/route.ts b/src/app/api/jira/validate-project/route.ts index 0c1092a..93171c8 100644 --- a/src/app/api/jira/validate-project/route.ts +++ b/src/app/api/jira/validate-project/route.ts @@ -1,5 +1,5 @@ import { NextRequest, NextResponse } from 'next/server'; -import { createJiraService } from '@/services/jira'; +import { createJiraService } from '@/services/integrations/jira/jira'; import { userPreferencesService } from '@/services/core/user-preferences'; /** diff --git a/src/app/api/tfs/delete-all/route.ts b/src/app/api/tfs/delete-all/route.ts index d786b9f..a329098 100644 --- a/src/app/api/tfs/delete-all/route.ts +++ b/src/app/api/tfs/delete-all/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tfsService } from '@/services/tfs'; +import { tfsService } from '@/services/integrations/tfs'; /** * Supprime toutes les tâches TFS de la base de données locale diff --git a/src/app/api/tfs/sync/route.ts b/src/app/api/tfs/sync/route.ts index e22092b..265a1e9 100644 --- a/src/app/api/tfs/sync/route.ts +++ b/src/app/api/tfs/sync/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tfsService } from '@/services/tfs'; +import { tfsService } from '@/services/integrations/tfs'; /** * Route POST /api/tfs/sync diff --git a/src/app/api/tfs/test/route.ts b/src/app/api/tfs/test/route.ts index 4b9adc8..ea3ee4c 100644 --- a/src/app/api/tfs/test/route.ts +++ b/src/app/api/tfs/test/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tfsService } from '@/services/tfs'; +import { tfsService } from '@/services/integrations/tfs'; /** * Route GET /api/tfs/test diff --git a/src/clients/jira-client.ts b/src/clients/jira-client.ts index f5fdc4e..5c062a3 100644 --- a/src/clients/jira-client.ts +++ b/src/clients/jira-client.ts @@ -3,7 +3,7 @@ */ import { HttpClient } from './base/http-client'; -import { JiraSyncResult } from '@/services/jira'; +import { JiraSyncResult } from '@/services/integrations/jira/jira'; export interface JiraConnectionStatus { connected: boolean; diff --git a/src/components/forms/task/TaskTfsInfo.tsx b/src/components/forms/task/TaskTfsInfo.tsx index 898113f..e8fe431 100644 --- a/src/components/forms/task/TaskTfsInfo.tsx +++ b/src/components/forms/task/TaskTfsInfo.tsx @@ -2,7 +2,7 @@ import { Badge } from '@/components/ui/Badge'; import { Task } from '@/lib/types'; -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; import { useUserPreferences } from '@/contexts/UserPreferencesContext'; interface TaskTfsInfoProps { diff --git a/src/components/jira/AnomalyDetectionPanel.tsx b/src/components/jira/AnomalyDetectionPanel.tsx index c82ade2..14b1df3 100644 --- a/src/components/jira/AnomalyDetectionPanel.tsx +++ b/src/components/jira/AnomalyDetectionPanel.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react'; import { detectJiraAnomalies, updateAnomalyDetectionConfig, getAnomalyDetectionConfig } from '@/actions/jira-anomalies'; -import { JiraAnomaly, AnomalyDetectionConfig } from '@/services/jira-anomaly-detection'; +import { JiraAnomaly, AnomalyDetectionConfig } from '@/services/integrations/jira/anomaly-detection'; import { Button } from '@/components/ui/Button'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { AnomalySummary } from './anomaly/AnomalySummary'; diff --git a/src/components/jira/FilterBar.tsx b/src/components/jira/FilterBar.tsx index bb1968b..05e8a98 100644 --- a/src/components/jira/FilterBar.tsx +++ b/src/components/jira/FilterBar.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; import { JiraAnalyticsFilters, AvailableFilters } from '@/lib/types'; -import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters'; +import { JiraAdvancedFiltersService } from '@/services/integrations/jira/advanced-filters'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { Modal } from '@/components/ui/Modal'; diff --git a/src/components/jira/JiraSync.tsx b/src/components/jira/JiraSync.tsx index 77d53ff..895d198 100644 --- a/src/components/jira/JiraSync.tsx +++ b/src/components/jira/JiraSync.tsx @@ -7,7 +7,7 @@ import { Badge } from '@/components/ui/Badge'; import { getToday } from '@/lib/date-utils'; import { Modal } from '@/components/ui/Modal'; import { jiraClient } from '@/clients/jira-client'; -import { JiraSyncResult, JiraSyncAction } from '@/services/jira'; +import { JiraSyncResult, JiraSyncAction } from '@/services/integrations/jira/jira'; interface JiraSyncProps { onSyncComplete?: () => void; diff --git a/src/components/jira/anomaly/AnomalyConfigModal.tsx b/src/components/jira/anomaly/AnomalyConfigModal.tsx index 95e495b..2faa9fc 100644 --- a/src/components/jira/anomaly/AnomalyConfigModal.tsx +++ b/src/components/jira/anomaly/AnomalyConfigModal.tsx @@ -2,7 +2,7 @@ import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; -import { AnomalyDetectionConfig } from '@/services/jira-anomaly-detection'; +import { AnomalyDetectionConfig } from '@/services/integrations/jira/anomaly-detection'; interface AnomalyConfigModalProps { isOpen: boolean; diff --git a/src/components/jira/anomaly/AnomalyItem.tsx b/src/components/jira/anomaly/AnomalyItem.tsx index d3529e2..dc21e3a 100644 --- a/src/components/jira/anomaly/AnomalyItem.tsx +++ b/src/components/jira/anomaly/AnomalyItem.tsx @@ -1,7 +1,7 @@ 'use client'; import { Badge } from '@/components/ui/Badge'; -import { JiraAnomaly } from '@/services/jira-anomaly-detection'; +import { JiraAnomaly } from '@/services/integrations/jira/anomaly-detection'; interface AnomalyItemProps { anomaly: JiraAnomaly; diff --git a/src/components/jira/anomaly/AnomalyList.tsx b/src/components/jira/anomaly/AnomalyList.tsx index 7aef771..b225210 100644 --- a/src/components/jira/anomaly/AnomalyList.tsx +++ b/src/components/jira/anomaly/AnomalyList.tsx @@ -1,6 +1,6 @@ 'use client'; -import { JiraAnomaly } from '@/services/jira-anomaly-detection'; +import { JiraAnomaly } from '@/services/integrations/jira/anomaly-detection'; import { AnomalyItem } from './AnomalyItem'; interface AnomalyListProps { diff --git a/src/components/jira/anomaly/AnomalySummary.tsx b/src/components/jira/anomaly/AnomalySummary.tsx index 25c0c29..192299f 100644 --- a/src/components/jira/anomaly/AnomalySummary.tsx +++ b/src/components/jira/anomaly/AnomalySummary.tsx @@ -1,7 +1,7 @@ 'use client'; import { Badge } from '@/components/ui/Badge'; -import { JiraAnomaly } from '@/services/jira-anomaly-detection'; +import { JiraAnomaly } from '@/services/integrations/jira/anomaly-detection'; interface AnomalySummaryProps { anomalies: JiraAnomaly[]; diff --git a/src/components/kanban/TaskCard.tsx b/src/components/kanban/TaskCard.tsx index 2456b54..7d173b5 100644 --- a/src/components/kanban/TaskCard.tsx +++ b/src/components/kanban/TaskCard.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useRef, useTransition } from 'react'; import { Task } from '@/lib/types'; -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; import { formatDistanceToNow } from 'date-fns'; import { fr } from 'date-fns/locale'; import { Card } from '@/components/ui/Card'; diff --git a/src/components/settings/IntegrationsSettingsPageClient.tsx b/src/components/settings/IntegrationsSettingsPageClient.tsx index ac2930a..021e62c 100644 --- a/src/components/settings/IntegrationsSettingsPageClient.tsx +++ b/src/components/settings/IntegrationsSettingsPageClient.tsx @@ -1,7 +1,7 @@ 'use client'; import { JiraConfig } from '@/lib/types'; -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; import { Header } from '@/components/ui/Header'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { JiraConfigForm } from '@/components/settings/JiraConfigForm'; diff --git a/src/components/settings/TfsConfigForm.tsx b/src/components/settings/TfsConfigForm.tsx index 8d2e61d..87ef1f1 100644 --- a/src/components/settings/TfsConfigForm.tsx +++ b/src/components/settings/TfsConfigForm.tsx @@ -1,7 +1,7 @@ 'use client'; import { useState, useEffect, useTransition } from 'react'; -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; import { getTfsConfig, saveTfsConfig, deleteAllTfsTasks } from '@/actions/tfs'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; diff --git a/src/hooks/useJiraFilters.ts b/src/hooks/useJiraFilters.ts index ae9abb3..3be019c 100644 --- a/src/hooks/useJiraFilters.ts +++ b/src/hooks/useJiraFilters.ts @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react'; import { getAvailableJiraFilters, getFilteredJiraAnalytics } from '@/actions/jira-filters'; import { AvailableFilters, JiraAnalyticsFilters, JiraAnalytics } from '@/lib/types'; -import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters'; +import { JiraAdvancedFiltersService } from '@/services/integrations/jira/advanced-filters'; export function useJiraFilters() { const [availableFilters, setAvailableFilters] = useState({ diff --git a/src/lib/types.ts b/src/lib/types.ts index 2381d66..4f12a95 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,4 +1,4 @@ -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; // Types de base pour les tâches // Note: TaskStatus et TaskPriority sont maintenant gérés par la configuration centralisée dans lib/status-config.ts diff --git a/src/services/core/user-preferences.ts b/src/services/core/user-preferences.ts index b7f1eed..15753aa 100644 --- a/src/services/core/user-preferences.ts +++ b/src/services/core/user-preferences.ts @@ -6,7 +6,7 @@ import { UserPreferences, JiraConfig, } from '@/lib/types'; -import { TfsConfig } from '@/services/tfs'; +import { TfsConfig } from '@/services/integrations/tfs'; import { prisma } from './database'; import { getConfig } from '@/lib/config'; diff --git a/src/services/jira-advanced-filters.ts b/src/services/integrations/jira/advanced-filters.ts similarity index 100% rename from src/services/jira-advanced-filters.ts rename to src/services/integrations/jira/advanced-filters.ts diff --git a/src/services/jira-analytics-cache.ts b/src/services/integrations/jira/analytics-cache.ts similarity index 100% rename from src/services/jira-analytics-cache.ts rename to src/services/integrations/jira/analytics-cache.ts diff --git a/src/services/jira-analytics.ts b/src/services/integrations/jira/analytics.ts similarity index 99% rename from src/services/jira-analytics.ts rename to src/services/integrations/jira/analytics.ts index 3992947..5618d37 100644 --- a/src/services/jira-analytics.ts +++ b/src/services/integrations/jira/analytics.ts @@ -4,7 +4,7 @@ */ import { JiraService } from './jira'; -import { jiraAnalyticsCache } from './jira-analytics-cache'; +import { jiraAnalyticsCache } from './analytics-cache'; import { getToday, parseDate, subtractDays } from '@/lib/date-utils'; import { JiraAnalytics, diff --git a/src/services/jira-anomaly-detection.ts b/src/services/integrations/jira/anomaly-detection.ts similarity index 100% rename from src/services/jira-anomaly-detection.ts rename to src/services/integrations/jira/anomaly-detection.ts diff --git a/src/services/jira.ts b/src/services/integrations/jira/jira.ts similarity index 99% rename from src/services/jira.ts rename to src/services/integrations/jira/jira.ts index 7246375..f9d02a8 100644 --- a/src/services/jira.ts +++ b/src/services/integrations/jira/jira.ts @@ -4,7 +4,7 @@ */ import { JiraTask } from '@/lib/types'; -import { prisma } from './core/database'; +import { prisma } from '../../core/database'; import { parseDate, formatDateForDisplay } from '@/lib/date-utils'; export interface JiraConfig { diff --git a/src/services/jira-scheduler.ts b/src/services/integrations/jira/scheduler.ts similarity index 98% rename from src/services/jira-scheduler.ts rename to src/services/integrations/jira/scheduler.ts index 767c5ee..0aff2a1 100644 --- a/src/services/jira-scheduler.ts +++ b/src/services/integrations/jira/scheduler.ts @@ -1,4 +1,4 @@ -import { userPreferencesService } from './core/user-preferences'; +import { userPreferencesService } from '../../core/user-preferences'; import { JiraService } from './jira'; import { addMinutes, getToday } from '@/lib/date-utils'; diff --git a/src/services/tfs.ts b/src/services/integrations/tfs.ts similarity index 99% rename from src/services/tfs.ts rename to src/services/integrations/tfs.ts index 3afe7ef..21775c9 100644 --- a/src/services/tfs.ts +++ b/src/services/integrations/tfs.ts @@ -5,9 +5,9 @@ */ import { TfsPullRequest } from '@/lib/types'; -import { prisma } from './core/database'; +import { prisma } from '../core/database'; import { parseDate, formatDateForDisplay } from '@/lib/date-utils'; -import { userPreferencesService } from './core/user-preferences'; +import { userPreferencesService } from '../core/user-preferences'; export interface TfsConfig { enabled: boolean;