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