Implements LocalStorage to Limit GithubAPI Calls

This commit is contained in:
2023-12-29 01:50:04 -03:00
parent c1b8b651e0
commit 04ab3446df

View File

@@ -4,7 +4,7 @@ import {HttpClient} from "@angular/common/http";
import { import {
map, mergeMap, map, mergeMap,
Observable, Observable,
pipe, switchMap, take pipe, switchMap, take, tap
} from 'rxjs'; } from 'rxjs';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
@@ -28,6 +28,57 @@ export class GithubService {
} }
getProjects(): Observable<Project> { getProjects(): Observable<Project> {
if (this.isLocalStorageValid()) {
console.log('Fetching projects from local storage')
return this.getProjectsFromLocalStorage();
}
console.log('Fetching projects from Github API')
return this.getProjectsFromGithub()
}
private isLocalStorageValid(): boolean {
const projects = localStorage.getItem('github-projects');
let status = !!projects
if (!status) {
return false;
}
const timestamp = localStorage.getItem('github-projects-timestamp');
if (timestamp) {
const diff = new Date().getTime() - parseInt(timestamp);
status = diff < 86400000;
} else {
status = false;
}
return status;
}
private saveProjectsToLocalStorage(project: Project) {
const p = localStorage.getItem('github-projects');
if (p) {
const projects = JSON.parse(p);
projects.push(project);
localStorage.setItem('github-projects', JSON.stringify(projects));
} else {
localStorage.setItem('github-projects', JSON.stringify([project]));
}
localStorage.setItem('github-projects-timestamp', new Date().getTime().toString());
}
private getProjectsFromLocalStorage(): Observable<Project> {
const projects = localStorage.getItem('github-projects') || '[]';
return new Observable<Project>((observer) => {
JSON.parse(projects).forEach((project: Project) => {
observer.next(project);
});
});
}
private getProjectsFromGithub(): Observable<Project> {
return this.http.get(this.apiReposString()).pipe( return this.http.get(this.apiReposString()).pipe(
map((projects: any) => { map((projects: any) => {
return projects.map((project: any) => { return projects.map((project: any) => {
@@ -54,7 +105,8 @@ export class GithubService {
}); });
}); });
}); });
}) }),
tap((project: Project) => this.saveProjectsToLocalStorage(project))
) )
} }