feat: enhance Jira analytics with caching and force refresh

- Updated `getJiraAnalytics` to accept a `forceRefresh` parameter for optional cache bypass.
- Modified `getProjectAnalytics` to check the cache and return cached data unless forced to refresh.
- Adjusted `loadAnalytics` in `useJiraAnalytics` to trigger a forced refresh on manual updates.
- Improved UI in `JiraDashboardPageClient` to indicate when data is served from cache.
This commit is contained in:
Julien Froidefond
2025-09-18 22:28:34 +02:00
parent 5d73a6c279
commit 4c03ae946f
6 changed files with 309 additions and 26 deletions

View File

@@ -4,14 +4,15 @@
*/
import { JiraService } from './jira';
import {
JiraAnalytics,
import { jiraAnalyticsCache } from './jira-analytics-cache';
import {
JiraAnalytics,
JiraTask,
AssigneeDistribution,
SprintVelocity,
CycleTimeByType,
StatusDistribution,
AssigneeWorkload
AssigneeDistribution,
SprintVelocity,
CycleTimeByType,
StatusDistribution,
AssigneeWorkload
} from '@/lib/types';
export interface JiraAnalyticsConfig {
@@ -24,18 +25,28 @@ export interface JiraAnalyticsConfig {
export class JiraAnalyticsService {
private jiraService: JiraService;
private projectKey: string;
private config: JiraAnalyticsConfig;
constructor(config: JiraAnalyticsConfig) {
this.jiraService = new JiraService(config);
this.projectKey = config.projectKey;
this.config = config;
}
/**
* Récupère toutes les analytics du projet
* Récupère toutes les analytics du projet avec cache
*/
async getProjectAnalytics(): Promise<JiraAnalytics> {
async getProjectAnalytics(forceRefresh = false): Promise<JiraAnalytics> {
try {
console.log(`📊 Début de l'analyse du projet ${this.projectKey}...`);
// Vérifier le cache d'abord (sauf si forceRefresh)
if (!forceRefresh) {
const cachedAnalytics = jiraAnalyticsCache.get(this.config);
if (cachedAnalytics) {
return cachedAnalytics;
}
}
console.log(`🔄 Calcul des analytics Jira pour projet ${this.projectKey} ${forceRefresh ? '(actualisation forcée)' : '(cache manquant)'}`);
// Récupérer les informations du projet
const projectInfo = await this.getProjectInfo();
@@ -57,7 +68,7 @@ export class JiraAnalyticsService {
this.calculateWorkInProgress(allIssues)
]);
return {
const analytics: JiraAnalytics = {
project: {
key: this.projectKey,
name: projectInfo.name,
@@ -69,12 +80,24 @@ export class JiraAnalyticsService {
workInProgress
};
// Mettre en cache le résultat
jiraAnalyticsCache.set(this.config, analytics);
return analytics;
} catch (error) {
console.error('Erreur lors du calcul des analytics:', error);
throw error;
}
}
/**
* Invalide le cache pour ce projet
*/
invalidateCache(): void {
jiraAnalyticsCache.invalidate(this.config);
}
/**
* Récupère les informations de base du projet
*/