Files
towercontrol/src/actions/jira-filters.ts
Julien Froidefond 30aaca4877 feat: enhance user preferences management with userId integration
- Added `userId` field to `UserPreferences` model in Prisma schema for user-specific preferences.
- Implemented migration to populate existing preferences with the first user.
- Updated user preferences service methods to handle user-specific data retrieval and updates.
- Modified API routes and components to ensure user authentication and fetch preferences based on the authenticated user.
- Enhanced session management in various components to load user preferences accordingly.
2025-09-30 22:15:44 +02:00

126 lines
3.9 KiB
TypeScript

'use server';
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';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
export interface FiltersResult {
success: boolean;
data?: AvailableFilters;
error?: string;
}
export interface FilteredAnalyticsResult {
success: boolean;
data?: JiraAnalytics;
error?: string;
}
/**
* Récupère les filtres disponibles depuis les données Jira
*/
export async function getAvailableJiraFilters(): Promise<FiltersResult> {
try {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
// Récupérer la config Jira
const jiraConfig = await userPreferencesService.getJiraConfig(session.user.id);
if (!jiraConfig?.baseUrl || !jiraConfig?.email || !jiraConfig?.apiToken || !jiraConfig?.projectKey) {
return {
success: false,
error: 'Configuration Jira incomplète'
};
}
// Récupérer toutes les issues du projet pour extraire les filtres
if (!jiraConfig.baseUrl || !jiraConfig.projectKey) {
return { success: false, error: 'Configuration Jira incomplète' };
}
const analyticsService = new JiraAnalyticsService(jiraConfig as JiraAnalyticsConfig);
// Récupérer la liste des issues pour extraire les filtres
const allIssues = await analyticsService.getAllProjectIssues();
// Extraire les filtres disponibles
const availableFilters = JiraAdvancedFiltersService.extractAvailableFilters(allIssues);
return {
success: true,
data: availableFilters
};
} catch (error) {
console.error('❌ Erreur lors de la récupération des filtres:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Applique des filtres aux analytics et retourne les données filtrées
*/
export async function getFilteredJiraAnalytics(filters: Partial<JiraAnalyticsFilters>): Promise<FilteredAnalyticsResult> {
try {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
// Récupérer la config Jira
const jiraConfig = await userPreferencesService.getJiraConfig(session.user.id);
if (!jiraConfig?.baseUrl || !jiraConfig?.email || !jiraConfig?.apiToken || !jiraConfig?.projectKey) {
return {
success: false,
error: 'Configuration Jira incomplète'
};
}
// Récupérer les analytics originales
if (!jiraConfig.baseUrl || !jiraConfig.projectKey) {
return { success: false, error: 'Configuration Jira incomplète' };
}
const analyticsService = new JiraAnalyticsService(jiraConfig as JiraAnalyticsConfig);
const originalAnalytics = await analyticsService.getProjectAnalytics();
// Si aucun filtre actif, retourner les données originales
if (!JiraAdvancedFiltersService.hasActiveFilters(filters)) {
return {
success: true,
data: originalAnalytics
};
}
// Récupérer toutes les issues pour appliquer les filtres
const allIssues = await analyticsService.getAllProjectIssues();
// Appliquer les filtres
const filteredAnalytics = JiraAdvancedFiltersService.applyFiltersToAnalytics(
originalAnalytics,
filters,
allIssues
);
return {
success: true,
data: filteredAnalytics
};
} catch (error) {
console.error('❌ Erreur lors du filtrage des analytics:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}