44 lines
No EOL
2 KiB
TypeScript
44 lines
No EOL
2 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import { HttpClient } from '@angular/common/http';
|
|
import { Observable } from 'rxjs';
|
|
import { NewsResponse } from '@interface/news'; // Assure-toi que le chemin est correct
|
|
import { tap } from 'rxjs/operators';
|
|
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class NewsService {
|
|
private apiKey: string = 'e9bb2770d3374edea421bcadbecdca5c';
|
|
private apiUrl: string = `https://newsapi.org/v2/everything?q=covid&language=fr&apiKey=${this.apiKey}`;
|
|
private storageKey: string = 'newsData'; // Clé utilisée pour le localStorage
|
|
private lastUpdateKey: string = 'lastUpdate'; // Clé pour stocker la date de la dernière mise à jour
|
|
private cacheDuration: number = 60 * 60 * 1000; // Durée en millisecondes (par exemple, 1 heure)
|
|
|
|
constructor(private http: HttpClient) {}
|
|
|
|
// Méthode pour récupérer les articles de l'API ou du localStorage
|
|
getNews(): Observable<NewsResponse> {
|
|
const storedData = localStorage.getItem(this.storageKey);
|
|
const lastUpdate = localStorage.getItem(this.lastUpdateKey);
|
|
|
|
// Vérifie si les données existent et si elles sont encore valides
|
|
const currentTime = new Date().getTime();
|
|
|
|
if (storedData && lastUpdate && (currentTime - Number(lastUpdate)) < this.cacheDuration) {
|
|
// Si les données sont présentes et récentes (moins de 1 heure par exemple), on les retourne
|
|
return new Observable(observer => {
|
|
observer.next(JSON.parse(storedData)); // On envoie les données stockées
|
|
observer.complete();
|
|
});
|
|
} else {
|
|
// Sinon, on effectue la requête à l'API
|
|
return this.http.get<NewsResponse>(this.apiUrl).pipe(
|
|
tap(response => {
|
|
// On stocke la réponse dans le localStorage et la date de mise à jour
|
|
localStorage.setItem(this.storageKey, JSON.stringify(response));
|
|
localStorage.setItem(this.lastUpdateKey, currentTime.toString()); // On enregistre l'heure de la mise à jour
|
|
})
|
|
);
|
|
}
|
|
}
|
|
} |