From 04ab3446df9e4319ef7f5904a0c4a08dc4c08963 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Nakazone Batista Date: Fri, 29 Dec 2023 01:50:04 -0300 Subject: [PATCH] Implements LocalStorage to Limit GithubAPI Calls --- .../shared/github-service/github.service.ts | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/app/shared/github-service/github.service.ts b/src/app/shared/github-service/github.service.ts index 568cffa..90ba7d7 100644 --- a/src/app/shared/github-service/github.service.ts +++ b/src/app/shared/github-service/github.service.ts @@ -4,7 +4,7 @@ import {HttpClient} from "@angular/common/http"; import { map, mergeMap, Observable, - pipe, switchMap, take + pipe, switchMap, take, tap } from 'rxjs'; import { environment } from 'src/environments/environment'; @@ -28,6 +28,57 @@ export class GithubService { } getProjects(): Observable { + 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 { + const projects = localStorage.getItem('github-projects') || '[]'; + return new Observable((observer) => { + JSON.parse(projects).forEach((project: Project) => { + observer.next(project); + }); + }); + } + + private getProjectsFromGithub(): Observable { return this.http.get(this.apiReposString()).pipe( map((projects: any) => { return projects.map((project: any) => { @@ -54,7 +105,8 @@ export class GithubService { }); }); }); - }) + }), + tap((project: Project) => this.saveProjectsToLocalStorage(project)) ) }