From 53ff769188d6df1fc6a5b9a09268de5c867a95cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Andr=C3=A9?= Date: Tue, 19 Nov 2019 22:42:43 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'un=20syst=C3=A8me=20de=20cache=20des?= =?UTF-8?q?=20requ=C3=AAtes=20HTTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Back/skydiveLogs-api/Data/JumpsDb-log.db | Bin 188416 -> 409600 bytes .../skydivelogs-app/src/app/app.component.ts | 17 +++-- Front/skydivelogs-app/src/app/app.module.ts | 64 ++++++++++-------- .../list-of-aircrafts.component.ts | 37 +++++----- .../app/list-of-dzs/list-of-dzs.component.ts | 48 +++++++------ .../list-of-jump-types.component.ts | 37 +++++----- .../list-of-jumps/list-of-jumps.component.ts | 37 ++++++---- .../src/app/new-jump/new-jump.component.ts | 57 ++++++++-------- .../src/app/summary/summary.component.ts | 23 ++++--- .../services/caching-interceptor.service.ts | 39 +++++++++++ .../{dateService.ts => date.service.ts} | 0 .../src/services/request-cache.service.ts | 35 ++++++++++ ...ceApiGet.ts => service-api-get.service.ts} | 0 ...ApiPost.ts => service-api-post.service.ts} | 27 ++++---- ...serviceComm.ts => service-comm.service.ts} | 0 15 files changed, 257 insertions(+), 164 deletions(-) create mode 100644 Front/skydivelogs-app/src/services/caching-interceptor.service.ts rename Front/skydivelogs-app/src/services/{dateService.ts => date.service.ts} (100%) create mode 100644 Front/skydivelogs-app/src/services/request-cache.service.ts rename Front/skydivelogs-app/src/services/{serviceApiGet.ts => service-api-get.service.ts} (100%) rename Front/skydivelogs-app/src/services/{serviceApiPost.ts => service-api-post.service.ts} (75%) rename Front/skydivelogs-app/src/services/{serviceComm.ts => service-comm.service.ts} (100%) diff --git a/Back/skydiveLogs-api/Data/JumpsDb-log.db b/Back/skydiveLogs-api/Data/JumpsDb-log.db index 754edc0381b172b8b786c1ab175683d23a1d9186..f08cd2d111c8f1db529dc9a1ab6eb21488f62c07 100644 GIT binary patch literal 409600 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 diff --git a/Front/skydivelogs-app/src/app/app.component.ts b/Front/skydivelogs-app/src/app/app.component.ts index f250fde..a22cb1a 100644 --- a/Front/skydivelogs-app/src/app/app.component.ts +++ b/Front/skydivelogs-app/src/app/app.component.ts @@ -1,20 +1,19 @@ -import { Component, OnInit } from '@angular/core'; -import { ServiceComm } from '../services/serviceComm'; +import { Component, OnInit } from "@angular/core"; +import { ServiceComm } from "../services/service-comm.service"; @Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] + selector: "app-root", + templateUrl: "./app.component.html", + styleUrls: ["./app.component.css"] }) export class AppComponent implements OnInit { - title = 'app'; + title = "app"; showMenu = false; - constructor(private serviceComm: ServiceComm) { - } + constructor(private serviceComm: ServiceComm) {} ngOnInit() { - this.serviceComm.componentTitle.subscribe(title => this.title = title); + this.serviceComm.componentTitle.subscribe(title => (this.title = title)); } toggleMenu() { diff --git a/Front/skydivelogs-app/src/app/app.module.ts b/Front/skydivelogs-app/src/app/app.module.ts index 9d88c6c..ecef785 100644 --- a/Front/skydivelogs-app/src/app/app.module.ts +++ b/Front/skydivelogs-app/src/app/app.module.ts @@ -1,23 +1,23 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { HttpClientModule } from '@angular/common/http'; +import { BrowserModule } from "@angular/platform-browser"; +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http"; -import { AppComponent } from './app.component'; +import { AppComponent } from "./app.component"; -import { SummaryComponent } from './summary/summary.component'; -import { ListOfJumpsComponent } from './list-of-jumps/list-of-jumps.component'; -import { ListOfDzsComponent } from './list-of-dzs/list-of-dzs.component'; -import { NewJumpComponent } from './new-jump/new-jump.component'; -import { ListOfAircraftsComponent } from './list-of-aircrafts/list-of-aircrafts.component'; -import { ListOfJumpTypesComponent } from './list-of-jump-types/list-of-jump-types.component'; +import { SummaryComponent } from "./summary/summary.component"; +import { ListOfJumpsComponent } from "./list-of-jumps/list-of-jumps.component"; +import { ListOfDzsComponent } from "./list-of-dzs/list-of-dzs.component"; +import { NewJumpComponent } from "./new-jump/new-jump.component"; +import { ListOfAircraftsComponent } from "./list-of-aircrafts/list-of-aircrafts.component"; +import { ListOfJumpTypesComponent } from "./list-of-jump-types/list-of-jump-types.component"; -import { DateService } from '../services/dateService'; -import { ServiceApiGet } from '../services/serviceApiGet'; -import { ServiceApiPost } from '../services/serviceApiPost'; -import { ServiceComm } from '../services/serviceComm'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { FormsModule } from '@angular/forms'; +import { DateService } from "../services/date.service"; +import { ServiceApiGet } from "../services/service-api-get.service"; +import { ServiceApiPost } from "../services/service-api-post.service"; +import { ServiceComm } from "../services/service-comm.service"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { FormsModule } from "@angular/forms"; import { MatPaginatorModule, MatTableModule, @@ -30,20 +30,19 @@ import { MatInputModule, MatButtonModule, MatIconModule -} from '@angular/material'; - - +} from "@angular/material"; +import { RequestCache } from "../services/request-cache.service"; +import { CachingInterceptor } from "../services/caching-interceptor.service"; const appRoutes: Routes = [ - { path: 'summary', component: SummaryComponent }, - { path: 'jumpsList', component: ListOfJumpsComponent }, - { path: 'dz', component: ListOfDzsComponent }, - { path: 'newjump', component: NewJumpComponent }, - { path: 'aircraftList', component: ListOfAircraftsComponent }, - { path: 'jumpTypeList', component: ListOfJumpTypesComponent } + { path: "summary", component: SummaryComponent }, + { path: "jumpsList", component: ListOfJumpsComponent }, + { path: "dz", component: ListOfDzsComponent }, + { path: "newjump", component: NewJumpComponent }, + { path: "aircraftList", component: ListOfAircraftsComponent }, + { path: "jumpTypeList", component: ListOfJumpTypesComponent } ]; - @NgModule({ declarations: [ AppComponent, @@ -75,7 +74,14 @@ const appRoutes: Routes = [ MatIconModule ], exports: [HttpClientModule], - providers: [ServiceApiPost, ServiceApiGet, ServiceComm, DateService], + providers: [ + ServiceApiPost, + ServiceApiGet, + ServiceComm, + DateService, + RequestCache, + { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, multi: true } + ], bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule {} diff --git a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts index 974a09f..7282521 100644 --- a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts @@ -1,34 +1,35 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { MatPaginator } from "@angular/material/paginator"; +import { MatTableDataSource } from "@angular/material/table"; -import { AircraftResp } from '../../models/aircraft'; -import { ServiceApiGet } from '../../services/serviceApiGet'; -import { ServiceComm } from '../../services/serviceComm'; +import { AircraftResp } from "../../models/aircraft"; +import { ServiceApiGet } from "../../services/service-api-get.service"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-list-of-aircrafts', - templateUrl: './list-of-aircrafts.component.html', - styleUrls: ['./list-of-aircrafts.component.css'] + selector: "app-list-of-aircrafts", + templateUrl: "./list-of-aircrafts.component.html", + styleUrls: ["./list-of-aircrafts.component.css"] }) export class ListOfAircraftsComponent implements OnInit { - public displayedColumns: Array = ['id', 'name']; + public displayedColumns: Array = ["id", "name"]; public dataSourceTable; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; - constructor(private serviceApi: ServiceApiGet, private serviceComm: ServiceComm) { - } + constructor( + private serviceApi: ServiceApiGet, + private serviceComm: ServiceComm + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('List of aircrafts'); + this.serviceComm.updatedComponentTitle("List of aircrafts"); this.getListOfAircrafts(); } getListOfAircrafts() { - this.serviceApi.getListOfAircrafts() - .subscribe(data => { - this.dataSourceTable = new MatTableDataSource(data); - this.dataSourceTable.paginator = this.paginator; - }); + this.serviceApi.getListOfAircrafts().subscribe(data => { + this.dataSourceTable = new MatTableDataSource(data); + this.dataSourceTable.paginator = this.paginator; + }); } } diff --git a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts index e459b60..fbbcf95 100644 --- a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts @@ -1,37 +1,43 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { MatPaginator } from "@angular/material/paginator"; +import { MatTableDataSource } from "@angular/material/table"; -import { DropZoneResp } from '../../models/dropzone'; -import { ServiceApiGet } from '../../services/serviceApiGet'; -import { ServiceComm } from '../../services/serviceComm'; +import { DropZoneResp } from "../../models/dropzone"; +import { ServiceApiGet } from "../../services/service-api-get.service"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-list-of-dzs', - templateUrl: './list-of-dzs.component.html', - styleUrls: ['./list-of-dzs.component.css'] + selector: "app-list-of-dzs", + templateUrl: "./list-of-dzs.component.html", + styleUrls: ["./list-of-dzs.component.css"] }) - - export class ListOfDzsComponent implements OnInit { - public displayedColumns: Array = ['id', 'name', 'latitude', 'longitude', 'address', 'email', 'type']; + public displayedColumns: Array = [ + "id", + "name", + "latitude", + "longitude", + "address", + "email", + "type" + ]; public dataSourceTable; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; - constructor(private serviceApi: ServiceApiGet, - private serviceComm: ServiceComm) { - } + constructor( + private serviceApi: ServiceApiGet, + private serviceComm: ServiceComm + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('List of DZs'); + this.serviceComm.updatedComponentTitle("List of DZs"); this.getListOfDropZones(); } getListOfDropZones() { - this.serviceApi.getListOfDropZones() - .subscribe(data => { - this.dataSourceTable = new MatTableDataSource(data); - this.dataSourceTable.paginator = this.paginator; - }); + this.serviceApi.getListOfDropZones().subscribe(data => { + this.dataSourceTable = new MatTableDataSource(data); + this.dataSourceTable.paginator = this.paginator; + }); } } diff --git a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts index dd9dea9..1ba9493 100644 --- a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts @@ -1,34 +1,35 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { MatPaginator } from "@angular/material/paginator"; +import { MatTableDataSource } from "@angular/material/table"; -import { JumpTypeResp } from '../../models/jumpType'; -import { ServiceApiGet } from '../../services/serviceApiGet'; -import { ServiceComm } from '../../services/serviceComm'; +import { JumpTypeResp } from "../../models/jumpType"; +import { ServiceApiGet } from "../../services/service-api-get.service"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-list-of-jump-types', - templateUrl: './list-of-jump-types.component.html', - styleUrls: ['./list-of-jump-types.component.css'] + selector: "app-list-of-jump-types", + templateUrl: "./list-of-jump-types.component.html", + styleUrls: ["./list-of-jump-types.component.css"] }) export class ListOfJumpTypesComponent implements OnInit { - public displayedColumns: Array = ['id', 'name']; + public displayedColumns: Array = ["id", "name"]; public dataSourceTable; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; - constructor(private serviceApi: ServiceApiGet, private serviceComm: ServiceComm) { - } + constructor( + private serviceApi: ServiceApiGet, + private serviceComm: ServiceComm + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('List of jump types'); + this.serviceComm.updatedComponentTitle("List of jump types"); this.getListOfJumpTypes(); } getListOfJumpTypes() { - this.serviceApi.getListOfJumpTypes() - .subscribe(data => { - this.dataSourceTable = new MatTableDataSource(data); - this.dataSourceTable.paginator = this.paginator; - }); + this.serviceApi.getListOfJumpTypes().subscribe(data => { + this.dataSourceTable = new MatTableDataSource(data); + this.dataSourceTable.paginator = this.paginator; + }); } } diff --git a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts index 7e74c21..ce22e4f 100644 --- a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts @@ -1,29 +1,36 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatTableDataSource } from '@angular/material/table'; - -import { Observable } from 'rxjs'; -import { JumpResp } from '../../models/jump'; -import { ServiceApiGet } from '../../services/serviceApiGet'; -import { ServiceComm } from '../../services/serviceComm'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { MatPaginator } from "@angular/material/paginator"; +import { MatTableDataSource } from "@angular/material/table"; +import { Observable } from "rxjs"; +import { JumpResp } from "../../models/jump"; +import { ServiceApiGet } from "../../services/service-api-get.service"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-list-of-jumps', - templateUrl: './list-of-jumps.component.html', - styleUrls: ['./list-of-jumps.component.css'] + selector: "app-list-of-jumps", + templateUrl: "./list-of-jumps.component.html", + styleUrls: ["./list-of-jumps.component.css"] }) export class ListOfJumpsComponent implements OnInit { public listOfJumps: Observable>; - public displayedColumns: Array = ['id', 'jumpDate', 'jumpTypeId', 'aircraftId', 'dropZoneId',]; + public displayedColumns: Array = [ + "id", + "jumpDate", + "jumpTypeId", + "aircraftId", + "dropZoneId" + ]; public dataSourceTable; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; - constructor(private serviceApi: ServiceApiGet, private serviceComm: ServiceComm) { - } + constructor( + private serviceApi: ServiceApiGet, + private serviceComm: ServiceComm + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('List of jumps'); + this.serviceComm.updatedComponentTitle("List of jumps"); this.getListOfJumps(); } diff --git a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts index e788f29..9e78f81 100644 --- a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts +++ b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts @@ -1,17 +1,16 @@ -import { Component, OnInit } from '@angular/core'; -import { ServiceComm } from '../../services/serviceComm'; -import { ServiceApiGet } from '../../services/serviceApiGet'; -import { ServiceApiPost } from '../../services/serviceApiPost'; -import { JumpTypeResp } from '../../models/jumpType'; -import { AircraftResp } from '../../models/aircraft'; -import { DropZoneResp } from '../../models/dropzone'; -import { DateService } from '../../services/dateService'; - +import { Component, OnInit } from "@angular/core"; +import { ServiceComm } from "../../services/service-comm.service"; +import { ServiceApiGet } from "../../services/service-api-get.service"; +import { ServiceApiPost } from "../../services/service-api-post.service"; +import { JumpTypeResp } from "../../models/jumpType"; +import { AircraftResp } from "../../models/aircraft"; +import { DropZoneResp } from "../../models/dropzone"; +import { DateService } from "../../services/date.service"; @Component({ - selector: 'app-new-jump', - templateUrl: './new-jump.component.html', - styleUrls: ['./new-jump.component.css'] + selector: "app-new-jump", + templateUrl: "./new-jump.component.html", + styleUrls: ["./new-jump.component.css"] }) export class NewJumpComponent implements OnInit { beginDate: Date; @@ -28,14 +27,15 @@ export class NewJumpComponent implements OnInit { listOfAircraft: Array; listOfDropZone: Array; - constructor(private serviceComm: ServiceComm, + constructor( + private serviceComm: ServiceComm, private serviceApiGet: ServiceApiGet, private serviceApiPost: ServiceApiPost, - private dateService: DateService) { - } + private dateService: DateService + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('Add a new jump'); + this.serviceComm.updatedComponentTitle("Add a new jump"); this.endDate = new Date(); @@ -64,26 +64,23 @@ export class NewJumpComponent implements OnInit { } private getListOfJumpTypes() { - this.serviceApiGet.getListOfJumpTypes() - .subscribe(data => { - this.listOfJumpType = data; - this.getListOfAircrafts(); - this.getListOfDropZones(); - }); + this.serviceApiGet.getListOfJumpTypes().subscribe(data => { + this.listOfJumpType = data; + this.getListOfAircrafts(); + this.getListOfDropZones(); + }); } private getListOfAircrafts() { - this.serviceApiGet.getListOfAircrafts() - .subscribe(data => { - this.listOfAircraft = data; - }); + this.serviceApiGet.getListOfAircrafts().subscribe(data => { + this.listOfAircraft = data; + }); } private getListOfDropZones() { - this.serviceApiGet.getListOfDropZones() - .subscribe(data => { - this.listOfDropZone = data; - }); + this.serviceApiGet.getListOfDropZones().subscribe(data => { + this.listOfDropZone = data; + }); } // private getListOfGears() { diff --git a/Front/skydivelogs-app/src/app/summary/summary.component.ts b/Front/skydivelogs-app/src/app/summary/summary.component.ts index 763ce52..dccd797 100644 --- a/Front/skydivelogs-app/src/app/summary/summary.component.ts +++ b/Front/skydivelogs-app/src/app/summary/summary.component.ts @@ -1,25 +1,26 @@ -import { Component, OnInit } from '@angular/core'; -import { ServiceComm } from '../../services/serviceComm'; -import { ServiceApiGet } from '../../services/serviceApiGet'; +import { Component, OnInit } from "@angular/core"; +import { ServiceComm } from "../../services/service-comm.service"; +import { ServiceApiGet } from "../../services/service-api-get.service"; @Component({ - selector: 'app-summary', - templateUrl: './summary.component.html', - styleUrls: ['./summary.component.css'] + selector: "app-summary", + templateUrl: "./summary.component.html", + styleUrls: ["./summary.component.css"] }) export class SummaryComponent implements OnInit { - public displayedColumns: Array = ['label', 'nb']; + public displayedColumns: Array = ["label", "nb"]; public dsNbJumpByDz; public dsNbJumpByAircraft; public dsNbJumpByRig; public dsNbJumpByType; public dsNbJumpByYear; - constructor(private serviceApi: ServiceApiGet, - private serviceComm: ServiceComm) { } + constructor( + private serviceApi: ServiceApiGet, + private serviceComm: ServiceComm + ) {} ngOnInit() { - this.serviceComm.updatedComponentTitle('Summary'); + this.serviceComm.updatedComponentTitle("Summary"); } - } diff --git a/Front/skydivelogs-app/src/services/caching-interceptor.service.ts b/Front/skydivelogs-app/src/services/caching-interceptor.service.ts new file mode 100644 index 0000000..9c622c1 --- /dev/null +++ b/Front/skydivelogs-app/src/services/caching-interceptor.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from "@angular/core"; +import { + HttpEvent, + HttpRequest, + HttpResponse, + HttpInterceptor, + HttpHandler +} from "@angular/common/http"; + +import { Observable } from "rxjs/Observable"; +import { startWith, tap } from "rxjs/operators"; +import "rxjs/add/observable/of"; + +import { RequestCache } from "./request-cache.service"; + +@Injectable() +export class CachingInterceptor implements HttpInterceptor { + constructor(private cache: RequestCache) {} + + intercept(req: HttpRequest, next: HttpHandler) { + const cachedResponse = this.cache.get(req); + return cachedResponse + ? Observable.of(cachedResponse) + : this.sendRequest(req, next); + } + + sendRequest( + req: HttpRequest, + next: HttpHandler + ): Observable> { + return next.handle(req).pipe( + tap(event => { + if (event instanceof HttpResponse) { + this.cache.put(req, event); + } + }) + ); + } +} diff --git a/Front/skydivelogs-app/src/services/dateService.ts b/Front/skydivelogs-app/src/services/date.service.ts similarity index 100% rename from Front/skydivelogs-app/src/services/dateService.ts rename to Front/skydivelogs-app/src/services/date.service.ts diff --git a/Front/skydivelogs-app/src/services/request-cache.service.ts b/Front/skydivelogs-app/src/services/request-cache.service.ts new file mode 100644 index 0000000..d334ff6 --- /dev/null +++ b/Front/skydivelogs-app/src/services/request-cache.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from "@angular/core"; +import { HttpRequest, HttpResponse } from "@angular/common/http"; + +const maxAge = 30000; +@Injectable() +export class RequestCache { + cache = new Map(); + + get(req: HttpRequest): HttpResponse | undefined { + const url = req.urlWithParams + "-" + req.method; + const cached = this.cache.get(url); + + if (!cached) { + return undefined; + } + + return cached.response; + } + + put(req: HttpRequest, response: HttpResponse): void { + //const url = req.url; + const url = req.urlWithParams + "-" + req.method; + const entry = { url, response, lastRead: Date.now() }; + this.cache.set(url, entry); + + console.log(this.cache); + + const expired = Date.now() - maxAge; + this.cache.forEach(expiredEntry => { + if (expiredEntry.lastRead < expired) { + this.cache.delete(expiredEntry.url); + } + }); + } +} diff --git a/Front/skydivelogs-app/src/services/serviceApiGet.ts b/Front/skydivelogs-app/src/services/service-api-get.service.ts similarity index 100% rename from Front/skydivelogs-app/src/services/serviceApiGet.ts rename to Front/skydivelogs-app/src/services/service-api-get.service.ts diff --git a/Front/skydivelogs-app/src/services/serviceApiPost.ts b/Front/skydivelogs-app/src/services/service-api-post.service.ts similarity index 75% rename from Front/skydivelogs-app/src/services/serviceApiPost.ts rename to Front/skydivelogs-app/src/services/service-api-post.service.ts index 1917623..ebdfdb3 100644 --- a/Front/skydivelogs-app/src/services/serviceApiPost.ts +++ b/Front/skydivelogs-app/src/services/service-api-post.service.ts @@ -1,18 +1,17 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from "@angular/core"; +import { HttpClient, HttpHeaders } from "@angular/common/http"; -import { JumpReq } from '../models/jump'; -import { environment } from '../environments/environment'; -import { DateService } from './dateService'; +import { JumpReq } from "../models/jump"; +import { environment } from "../environments/environment"; +import { DateService } from "./date.service"; @Injectable() export class ServiceApiPost { private readonly headers = new HttpHeaders({ - 'Access-Control-Allow-Origin': environment.urlApi + "Access-Control-Allow-Origin": environment.urlApi }); - constructor(private http: HttpClient, - private dateService: DateService) { } + constructor(private http: HttpClient, private dateService: DateService) {} public AddListOfJump( selectedJumpType: number, @@ -26,7 +25,8 @@ export class ServiceApiPost { defaultDeployAltitude: number, countOfJumps: number ) { - const diffInDays = this.dateService.DiffBetweenDates(beginDate, endDate) + 1; + const diffInDays = + this.dateService.DiffBetweenDates(beginDate, endDate) + 1; const countOfJumpsPerDay = Math.trunc(countOfJumps / diffInDays); for (let i = 1; beginDate.getTime() < endDate.getTime(); i++) { @@ -79,15 +79,16 @@ export class ServiceApiPost { exitAltitude: defaultExitAltitude, deployAltitude: defaultDeployAltitude, gearId: selectedRig, - notes: '', + notes: "", id: 0, jumpDate: jumpDate }; // console.log(bodyNewjump.jumpDate); - this.http.post(`${environment.urlApi}/api/Jump`, - bodyNewjump, - { headers: this.headers }) + this.http + .post(`${environment.urlApi}/api/Jump`, bodyNewjump, { + headers: this.headers + }) .subscribe(data => console.log(data)); } } diff --git a/Front/skydivelogs-app/src/services/serviceComm.ts b/Front/skydivelogs-app/src/services/service-comm.service.ts similarity index 100% rename from Front/skydivelogs-app/src/services/serviceComm.ts rename to Front/skydivelogs-app/src/services/service-comm.service.ts