Merge remote-tracking branch 'origin/develop'
This commit is contained in:
commit
a5019e083c
|
@ -39,11 +39,11 @@ import {AlertModalModule} from './openaireLibrary/utils/modal/alertModal.module'
|
|||
exports: [AppComponent],
|
||||
providers: [
|
||||
{provide: APP_ID, useValue: 'explore'},
|
||||
{
|
||||
provide: HTTP_INTERCEPTORS,
|
||||
useClass: CacheInterceptorService,
|
||||
multi: true
|
||||
},
|
||||
// {
|
||||
// provide: HTTP_INTERCEPTORS,
|
||||
// useClass: CacheInterceptorService,
|
||||
// multi: true
|
||||
// },
|
||||
{
|
||||
provide: HTTP_INTERCEPTORS,
|
||||
useClass: HttpInterceptorService,
|
||||
|
|
|
@ -67,7 +67,7 @@ export class ContactComponent implements OnInit {
|
|||
this.updateTitle(this.pageTitle);
|
||||
this.updateDescription(this.description);
|
||||
this.reset();
|
||||
this.getPageContents();
|
||||
// this.getPageContents();
|
||||
this.sending = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ import {NumberUtils} from '../openaireLibrary/utils/number-utils.class';
|
|||
import {LayoutService} from '../openaireLibrary/dashboard/sharedComponents/sidebar/layout.service';
|
||||
import {FormBuilder, FormControl} from '@angular/forms';
|
||||
import {debounceTime, distinctUntilChanged} from 'rxjs/operators';
|
||||
import {GroupedRequestsService} from "../openaireLibrary/services/groupedRequests.service";
|
||||
|
||||
@Component({
|
||||
selector: 'funders',
|
||||
|
@ -85,7 +86,8 @@ export class FundersComponent implements OnInit {
|
|||
private stakeholderService: StakeholderService,
|
||||
private layoutService: LayoutService,
|
||||
private cdr: ChangeDetectorRef,
|
||||
private fb: FormBuilder,) {
|
||||
private fb: FormBuilder,
|
||||
private groupedRequestsService: GroupedRequestsService) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
@ -142,100 +144,155 @@ export class FundersComponent implements OnInit {
|
|||
}
|
||||
|
||||
private getFunders() {
|
||||
let refineParams = '&fq=resultbestaccessright%20exact%20%22Open%20Access%22';
|
||||
this.subscriptions.push(
|
||||
zip(
|
||||
this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties),
|
||||
this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties, refineParams),
|
||||
this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('funder', 'project', this.properties),
|
||||
this.stakeholderService.getStakeholders(this.properties.monitorServiceAPIURL, 'funder')
|
||||
).subscribe((data: any[]) => {
|
||||
// storing all needed data to a map
|
||||
// 1st call
|
||||
let queriedFunders1 = data[0][1][0].values;
|
||||
queriedFunders1.forEach(queriedFunder => {
|
||||
this.fundersMap.set(queriedFunder.id, {
|
||||
"id": queriedFunder.id,
|
||||
"name": queriedFunder.name,
|
||||
"alias": '',
|
||||
"researchProducts": +queriedFunder.number,
|
||||
"openAccessResearchProducts": 0,
|
||||
"openAccessPercentage": 0,
|
||||
"projects": 0,
|
||||
"monitorDashboard": '',
|
||||
"monitorDashboardStatus": '',
|
||||
"logoUrl": ''
|
||||
});
|
||||
});
|
||||
this.subscriptions.push(this.groupedRequestsService.funders().subscribe(data => {
|
||||
let funders = data["funders"];
|
||||
funders.forEach(queriedFunder => {
|
||||
let id = queriedFunder.id;
|
||||
let funder = {
|
||||
"id": id,
|
||||
"name": this.removePartAfterCharacters(queriedFunder.name, "||"),
|
||||
"alias": '',
|
||||
"researchProducts": +queriedFunder.results,
|
||||
"openAccessResearchProducts": +queriedFunder.openResults,
|
||||
"openAccessPercentage": 0,
|
||||
"projects": +queriedFunder.projects,
|
||||
"monitorDashboard": '',
|
||||
"monitorDashboardStatus": '',
|
||||
"logoUrl": ''
|
||||
};
|
||||
|
||||
// 2nd call
|
||||
let queriedFunders2 = data[1][1][0].values;
|
||||
queriedFunders2.forEach(queriedFunder => {
|
||||
if(this.fundersMap.has(queriedFunder.id)) {
|
||||
this.fundersMap.get(queriedFunder.id).openAccessResearchProducts = +queriedFunder.number;
|
||||
}
|
||||
});
|
||||
if((!funder.researchProducts || funder.researchProducts == 0) && (!funder.projects || funder.projects == 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 3rd call
|
||||
let queriedFunders3 = data[2][1][0].values;
|
||||
queriedFunders3.forEach(queriedFunder => {
|
||||
if(+queriedFunder.number > 1) {
|
||||
if (this.fundersMap.has(queriedFunder.id)) {
|
||||
this.fundersMap.get(queriedFunder.id).projects = +queriedFunder.number;
|
||||
} else {
|
||||
this.fundersMap.set(queriedFunder.id, {
|
||||
"id": queriedFunder.id,
|
||||
"name": queriedFunder.name,
|
||||
"alias": '',
|
||||
"researchProducts": 0,
|
||||
"openAccessResearchProducts": 0,
|
||||
"openAccessPercentage": 0,
|
||||
"projects": +queriedFunder.number,
|
||||
"monitorDashboard": '',
|
||||
"monitorDashboardStatus": '',
|
||||
"logoUrl": ''
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
if(queriedFunder.stakeholder) {
|
||||
let stakeholder = queriedFunder.stakeholder;
|
||||
funder.alias = stakeholder.alias;
|
||||
funder.monitorDashboard = stakeholder.alias;
|
||||
funder.monitorDashboardStatus = stakeholder.visibility;
|
||||
funder.logoUrl = (stakeholder.isUpload ? properties.utilsService + "/download/" : "")+ (stakeholder.logoUrl);
|
||||
}
|
||||
|
||||
// 4th call
|
||||
let queriedFunders4 = data[3];
|
||||
queriedFunders4.forEach(queriedFunder => {
|
||||
let id = queriedFunder.index_id + '||' + queriedFunder.index_name + '||' + queriedFunder.index_shortName;
|
||||
if(this.fundersMap.has(id) && (
|
||||
!this.fundersMap.get(id).monitorDashboardStatus
|
||||
||
|
||||
(this.fundersMap.get(id).monitorDashboardStatus == "RESTRICTED" && queriedFunder.visibility == "PUBLIC")
|
||||
||
|
||||
(this.fundersMap.get(id).monitorDashboardStatus == "PRIVATE" && (queriedFunder.visibility == "RESTRICTED" || queriedFunder.visibility == "PUBLIC")))) {
|
||||
this.fundersMap.get(id).alias = queriedFunder.alias;
|
||||
this.fundersMap.get(id).monitorDashboard = queriedFunder.alias;
|
||||
this.fundersMap.get(id).monitorDashboardStatus = queriedFunder.visibility;
|
||||
this.fundersMap.get(id).logoUrl = (queriedFunder.isUpload ? properties.utilsService + "/download/" : "")+ (queriedFunder.logoUrl);
|
||||
}
|
||||
});
|
||||
this.fundersMap.forEach((value) => {
|
||||
if(value.openAccessResearchProducts > 0) {
|
||||
value.openAccessPercentage = Math.round((value.openAccessResearchProducts / value.researchProducts) * 100);
|
||||
}
|
||||
if(!value.logoUrl && this.staticLogos.has(value.id)) {
|
||||
let split = value.id.split("||");
|
||||
let shortname = (split && split.length==3) ? value.id.split("||")[2] : value.id;
|
||||
value.logoUrl = "assets/explore-assets/funders/logos/"+shortname+".png";
|
||||
}
|
||||
});
|
||||
// convert funders map into an array
|
||||
this.funders = Array.from(this.fundersMap.values());
|
||||
// calculate total numbers for intro content
|
||||
this.calculateNumbers();
|
||||
// sort funders
|
||||
this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
|
||||
// initialize displayedFunders
|
||||
this.displayedFunders = this.funders;
|
||||
this.showLoading = false;
|
||||
})
|
||||
);
|
||||
if(funder.openAccessResearchProducts && funder.researchProducts) {
|
||||
funder.openAccessPercentage = Math.round((funder.openAccessResearchProducts / funder.researchProducts) * 100);
|
||||
}
|
||||
|
||||
if(!funder.logoUrl && this.staticLogos.has(funder.id)) {
|
||||
let split = funder.id.split("||");
|
||||
let shortname = (split && split.length==3) ? funder.id.split("||")[2] : funder.id;
|
||||
funder.logoUrl = "assets/explore-assets/funders/logos/"+shortname+".png";
|
||||
}
|
||||
|
||||
this.fundersMap.set(queriedFunder.id, funder);
|
||||
});
|
||||
// convert funders map into an array
|
||||
this.funders = Array.from(this.fundersMap.values());
|
||||
// calculate total numbers for intro content
|
||||
this.fundersNumber = data.count;
|
||||
this.researchProductsNumber = data.results;
|
||||
this.projectsNumber = data.projects;
|
||||
// sort funders
|
||||
this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
|
||||
// initialize displayedFunders
|
||||
this.displayedFunders = this.funders;
|
||||
this.showLoading = false;
|
||||
}))
|
||||
|
||||
// let refineParams = '&fq=resultbestaccessright%20exact%20%22Open%20Access%22';
|
||||
// this.subscriptions.push(
|
||||
// zip(
|
||||
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties),
|
||||
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties, refineParams),
|
||||
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('funder', 'project', this.properties),
|
||||
// this.stakeholderService.getStakeholders(this.properties.monitorServiceAPIURL, 'funder')
|
||||
// ).subscribe((data: any[]) => {
|
||||
// // storing all needed data to a map
|
||||
// // 1st call
|
||||
// let queriedFunders1 = data[0][1][0].values;
|
||||
// queriedFunders1.forEach(queriedFunder => {
|
||||
// this.fundersMap.set(queriedFunder.id, {
|
||||
// "id": queriedFunder.id,
|
||||
// "name": queriedFunder.name,
|
||||
// "alias": '',
|
||||
// "researchProducts": +queriedFunder.number,
|
||||
// "openAccessResearchProducts": 0,
|
||||
// "openAccessPercentage": 0,
|
||||
// "projects": 0,
|
||||
// "monitorDashboard": '',
|
||||
// "monitorDashboardStatus": '',
|
||||
// "logoUrl": ''
|
||||
// });
|
||||
// });
|
||||
//
|
||||
// // 2nd call
|
||||
// let queriedFunders2 = data[1][1][0].values;
|
||||
// queriedFunders2.forEach(queriedFunder => {
|
||||
// if(this.fundersMap.has(queriedFunder.id)) {
|
||||
// this.fundersMap.get(queriedFunder.id).openAccessResearchProducts = +queriedFunder.number;
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// // 3rd call
|
||||
// let queriedFunders3 = data[2][1][0].values;
|
||||
// queriedFunders3.forEach(queriedFunder => {
|
||||
// if(+queriedFunder.number > 1) {
|
||||
// if (this.fundersMap.has(queriedFunder.id)) {
|
||||
// this.fundersMap.get(queriedFunder.id).projects = +queriedFunder.number;
|
||||
// } else {
|
||||
// this.fundersMap.set(queriedFunder.id, {
|
||||
// "id": queriedFunder.id,
|
||||
// "name": queriedFunder.name,
|
||||
// "alias": '',
|
||||
// "researchProducts": 0,
|
||||
// "openAccessResearchProducts": 0,
|
||||
// "openAccessPercentage": 0,
|
||||
// "projects": +queriedFunder.number,
|
||||
// "monitorDashboard": '',
|
||||
// "monitorDashboardStatus": '',
|
||||
// "logoUrl": ''
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// // 4th call
|
||||
// let queriedFunders4 = data[3];
|
||||
// queriedFunders4.forEach(queriedFunder => {
|
||||
// let id = queriedFunder.index_id + '||' + queriedFunder.index_name + '||' + queriedFunder.index_shortName;
|
||||
// if(this.fundersMap.has(id) && (
|
||||
// !this.fundersMap.get(id).monitorDashboardStatus
|
||||
// ||
|
||||
// (this.fundersMap.get(id).monitorDashboardStatus == "RESTRICTED" && queriedFunder.visibility == "PUBLIC")
|
||||
// ||
|
||||
// (this.fundersMap.get(id).monitorDashboardStatus == "PRIVATE" && (queriedFunder.visibility == "RESTRICTED" || queriedFunder.visibility == "PUBLIC")))) {
|
||||
// this.fundersMap.get(id).alias = queriedFunder.alias;
|
||||
// this.fundersMap.get(id).monitorDashboard = queriedFunder.alias;
|
||||
// this.fundersMap.get(id).monitorDashboardStatus = queriedFunder.visibility;
|
||||
// this.fundersMap.get(id).logoUrl = (queriedFunder.isUpload ? properties.utilsService + "/download/" : "")+ (queriedFunder.logoUrl);
|
||||
// }
|
||||
// });
|
||||
// this.fundersMap.forEach((value) => {
|
||||
// if(value.openAccessResearchProducts > 0) {
|
||||
// value.openAccessPercentage = Math.round((value.openAccessResearchProducts / value.researchProducts) * 100);
|
||||
// }
|
||||
// if(!value.logoUrl && this.staticLogos.has(value.id)) {
|
||||
// let split = value.id.split("||");
|
||||
// let shortname = (split && split.length==3) ? value.id.split("||")[2] : value.id;
|
||||
// value.logoUrl = "assets/explore-assets/funders/logos/"+shortname+".png";
|
||||
// }
|
||||
// });
|
||||
// // convert funders map into an array
|
||||
// this.funders = Array.from(this.fundersMap.values());
|
||||
// // calculate total numbers for intro content
|
||||
// this.calculateNumbers();
|
||||
// // sort funders
|
||||
// this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
|
||||
// // initialize displayedFunders
|
||||
// this.displayedFunders = this.funders;
|
||||
// console.log(this.funders);
|
||||
// this.showLoading = false;
|
||||
// })
|
||||
// );
|
||||
}
|
||||
|
||||
private calculateSum(array, property) {
|
||||
|
@ -305,4 +362,12 @@ export class FundersComponent implements OnInit {
|
|||
this.currentPage = $event.value;
|
||||
HelperFunctions.scrollToId('target');
|
||||
}
|
||||
|
||||
private removePartAfterCharacters(field, characters):string {
|
||||
if(field && field.indexOf(characters) !=-1){
|
||||
return field.split(characters)[0];
|
||||
|
||||
}
|
||||
return field;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ import {closed_access} from '../openaireLibrary/utils/icons/icons';
|
|||
import {InputModule} from '../openaireLibrary/sharedComponents/input/input.module';
|
||||
import {PagingModule} from '../openaireLibrary/utils/paging.module';
|
||||
import {SearchInputModule} from '../openaireLibrary/sharedComponents/search-input/search-input.module';
|
||||
import {GroupedRequestsServiceModule} from "../openaireLibrary/services/groupedRequestsService.module";
|
||||
|
||||
|
||||
@NgModule({
|
||||
|
@ -27,7 +28,7 @@ import {SearchInputModule} from '../openaireLibrary/sharedComponents/search-inpu
|
|||
FundersRoutingModule, CommonModule, RouterModule, AlertModalModule,
|
||||
Schema2jsonldModule, SEOServiceModule, BreadcrumbsModule, LoadingModule,
|
||||
RefineFieldResultsServiceModule, LogoUrlPipeModule, IconsModule, InputModule,
|
||||
PagingModule, SearchInputModule
|
||||
PagingModule, SearchInputModule, GroupedRequestsServiceModule
|
||||
],
|
||||
declarations: [
|
||||
FundersComponent
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text uk-margin-small-bottom"
|
||||
routerLinkActive="router-link-active" routerLink="/sdgs">
|
||||
<span class="uk-flex uk-flex-middle">
|
||||
<img src="assets/common-assets/sdg/sdg-dot-img.svg" alt="SDGs logo" loading="lazy">
|
||||
<img src="assets/common-assets/sdg/sdg-dot-img.svg" alt="SDGs logo" loading="lazy" width="17px" height="17px">
|
||||
<span class="uk-margin-small-left">Sustainable Development Goals (SDG<span
|
||||
class="uk-text-lowercase">s</span>)</span>
|
||||
</span>
|
||||
|
@ -55,7 +55,7 @@
|
|||
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
|
||||
routerLinkActive="router-link-active" routerLink="/fields-of-science">
|
||||
<span class="uk-flex uk-flex-middle">
|
||||
<img src="assets/common-assets/fos/fos-icon.svg" alt="FOS logo" loading="lazy">
|
||||
<img src="assets/common-assets/fos/fos-icon.svg" alt="FOS logo" loading="lazy" width="17px" height="8px">
|
||||
<span class="uk-margin-small-left">Fields of Science (FoS)</span>
|
||||
</span>
|
||||
</a>
|
||||
|
@ -64,8 +64,8 @@
|
|||
</div>
|
||||
<div class="uk-visible@m uk-width-expand" uk-scrollspy-class>
|
||||
<div class="uk-position-relative">
|
||||
<img src="assets/explore-assets/home/explore.jpg" uk-parallax="y: 500">
|
||||
<img class="uk-position-bottom-left" src="assets/explore-assets/home/mask.svg">
|
||||
<img src="assets/explore-assets/home/explore.jpg" alt="researchers" uk-parallax="y: 500" loading="lazy">
|
||||
<img class="uk-position-bottom-left" src="assets/explore-assets/home/mask.svg" alt="search" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -156,16 +156,16 @@
|
|||
alt="ipad" loading="lazy">
|
||||
</slider-item>
|
||||
<slider-item type="slide" [start]="0">
|
||||
<img src="assets/explore-assets/home/1.png" alt="ipad" loading="lazy">
|
||||
<img src="assets/explore-assets/home/1.png" alt="Deposit search" loading="lazy">
|
||||
</slider-item>
|
||||
<slider-item type="slide" [start]="0.5">
|
||||
<img src="assets/explore-assets/home/2.png" alt="ipad" loading="lazy">
|
||||
<img src="assets/explore-assets/home/2.png" alt="Deposit in OpenAIRE or Zenodo" loading="lazy">
|
||||
</slider-item>
|
||||
<slider-item type="slide" [start]="1">
|
||||
<img src="assets/explore-assets/home/3.png" alt="ipad" loading="lazy">
|
||||
<img src="assets/explore-assets/home/3.png" alt="Search links" loading="lazy">
|
||||
</slider-item>
|
||||
<slider-item type="slide" [start]="1.5">
|
||||
<img src="assets/explore-assets/home/4.png" alt="ipad" loading="lazy">
|
||||
<img src="assets/explore-assets/home/4.png" alt="link" loading="lazy">
|
||||
</slider-item>
|
||||
</slider-column>
|
||||
<slider-column type="nav" class="slider-nav">
|
||||
|
@ -238,7 +238,7 @@
|
|||
</div>
|
||||
<div></div>
|
||||
<img class="uk-visible@m uk-height-1-1 uk-position-top-right"
|
||||
src="assets/common-assets/common/graph-nodes.svg" alt="ipad" loading="lazy">
|
||||
src="assets/common-assets/common/graph-nodes.svg" alt="Graph nodes" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
port = 4000
|
||||
utilsService = https://beta.explore.openaire.eu/utils-service
|
||||
environment = beta
|
||||
preloadRequests =https://beta.services.openaire.eu/openaire/info/,https://beta.services.openaire.eu/openaire/contexts/,https://beta.services.openaire.eu/usagestats/allmetrics,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:provenanceActions.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:subject_classification_typologies.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:relation_relClass.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:publication_resource.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:dataCite_resource.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:languages.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:access_modes.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:datasource_typologies.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:datasourceCompatibilityLevel.json,https://beta.services.openaire.eu/provision/mvc/vocabularies/dnet:countries.json
|
||||
|
|
|
@ -2,23 +2,19 @@
|
|||
const axios = require('axios');
|
||||
let express = require('express');
|
||||
let app = express();
|
||||
let mcache = require('memory-cache');
|
||||
const { LRUCache } = require('lru-cache');
|
||||
const request = require('superagent');
|
||||
const prom = require('prom-client');
|
||||
const URL = require('url');
|
||||
var PropertiesReader = require('properties-reader');
|
||||
var properties = PropertiesReader('./properties.file');
|
||||
const expireShort = 60 * 60 * 1000 // 1 hour //2 * 60 * 1000; //2mins
|
||||
const expireLong = 24 * 60 * 60 * 1000; //24 hours
|
||||
const cacheMaxSize = 500;
|
||||
const longCachingRequests = ["/communityFull", "/full", "/pagehelpcontent",
|
||||
"/provision/mvc/vocabularies/", "/pages?page_route=",
|
||||
"/allmetrics", "/countryusagestats/", "/openaire/info",
|
||||
"/api/communities/", "/openaire/contexts/",
|
||||
"/utils-service/explore/home", "/utils-service/explore/search", "/utils-service/explore/funders"];
|
||||
const PropertiesReader = require('properties-reader');
|
||||
const properties = PropertiesReader('./properties.file');
|
||||
const environment = properties.get("environment");
|
||||
const preloadRequests = properties.get("preloadRequests").split(',');;
|
||||
|
||||
const cacheMaxSize = 300;
|
||||
let cors = require('cors');
|
||||
app.use(cors());
|
||||
|
||||
const lruCache = new LRUCache({ max: cacheMaxSize });
|
||||
const register = new prom.Registry();
|
||||
prom.collectDefaultMetrics({register: register});
|
||||
|
||||
|
@ -46,39 +42,40 @@ const histogram = new prom.Histogram({
|
|||
let cache = () => {
|
||||
return (req, res, next) => {
|
||||
if (req.query.url) {
|
||||
if (mcache.memsize() > cacheMaxSize) {
|
||||
console.log("Max cache size reached!" + cacheMaxSize);
|
||||
clearCache();
|
||||
}
|
||||
let key = '__express__' + req.query.url;
|
||||
let longCache = checkForLongCachedRequests(req.query.url);
|
||||
let cachedBody = mcache.get(key);
|
||||
const url = new URL.parse(req.query.url);
|
||||
const target = url.host + '/' + url.pathname.split('/')[1];
|
||||
const scheme = url.protocol.replace(':', '');
|
||||
if (cachedBody) {
|
||||
if (lruCache.has(key)) {
|
||||
// console.log( key, "hit")
|
||||
const end = histogram.startTimer({scheme: scheme, target: target, cache: 'hit'});
|
||||
res.send(JSON.parse(cachedBody));
|
||||
res.send(JSON.parse(lruCache.get(key)));
|
||||
responses.inc({scheme: scheme, target: target, code: res.statusCode});
|
||||
end();
|
||||
} else {
|
||||
const end = histogram.startTimer({scheme: scheme, target: target, cache: 'miss'});
|
||||
res.sendResponse = res.send;
|
||||
res.send = (body) => {
|
||||
let alreadyCached = !!mcache.get(key);
|
||||
entries.set(mcache.memsize());
|
||||
if (!alreadyCached) {
|
||||
responses.inc({scheme: scheme, target: target, code: res.statusCode});
|
||||
end();
|
||||
}
|
||||
if (res.statusCode === 200) {
|
||||
// console.log("Expire in " +(longCache?expireLong:expireShort) + " " +req.query.url);
|
||||
mcache.put(key, body, longCache ? expireLong : expireShort, () => {
|
||||
entries.set(mcache.memsize());
|
||||
});
|
||||
}
|
||||
res.sendResponse(body);
|
||||
};
|
||||
// console.log( key, "miss")
|
||||
const end = histogram.startTimer({scheme: scheme, target: target, cache: 'miss'});
|
||||
res.sendResponse = res.send;
|
||||
res.send = (body) => {
|
||||
if(isAllowedToBeCached(scheme, target)) {
|
||||
let alreadyCached = lruCache.has(key);
|
||||
entries.set(lruCache.size);
|
||||
if (!alreadyCached) {
|
||||
responses.inc({scheme: scheme, target: target, code: res.statusCode});
|
||||
end();
|
||||
}
|
||||
if (res.statusCode === 200) {
|
||||
lruCache.set(key, body);
|
||||
entries.set(lruCache.size);
|
||||
}
|
||||
res.sendResponse(body);
|
||||
}else{
|
||||
res.statusCode = 405;
|
||||
res.sendResponse(JSON.stringify( {code: 405, message: "Method not Allowed"}));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
next();
|
||||
}
|
||||
} else {
|
||||
|
@ -86,19 +83,26 @@ let cache = () => {
|
|||
}
|
||||
};
|
||||
};
|
||||
|
||||
function isAllowedToBeCached(scheme, target){
|
||||
if(environment != "development"){
|
||||
return scheme.indexOf("https://")!=-1 && ( target.indexOf(".openaire.eu/") !=-1 || target.indexOf(".zenodo.org/api/") !=-1 || target.indexOf("lab.idiap.ch/enermaps" != -1))
|
||||
} else if(environment == "development"){
|
||||
return target.indexOf(".openaire.eu/") !=-1 || target.indexOf(".di.uoa.gr") !=-1 || target.indexOf("dev-openaire.d4science.org") !=-1 || target.indexOf("lab.idiap.ch/enermaps") != -1
|
||||
}
|
||||
return true;
|
||||
}
|
||||
app.get('/clear', (req, res) => {
|
||||
let c = mcache.size();
|
||||
let c = lruCache.size;
|
||||
const url = req.query.url;
|
||||
let message = "";
|
||||
if (url) {
|
||||
let key = '__express__' + req.query.url;
|
||||
mcache.del(key);
|
||||
lruCache.delete(key);
|
||||
message = "Delete entry with key " + url;
|
||||
entries.set(mcache.size());
|
||||
entries.set(lruCache.size);
|
||||
} else {
|
||||
clearCache();
|
||||
message = "Delete " + c + " entries. Now there are: " + mcache.size()
|
||||
message = "Delete " + c + " entries. Now there are: " + lruCache.size
|
||||
}
|
||||
res.header("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length");
|
||||
res.header("Access-Control-Allow-Methods", "GET, OPTIONS");
|
||||
|
@ -119,7 +123,6 @@ app.get('/get', cache(), cors(), (req, res) => {
|
|||
res.status(404).send(getResponse(404, "Not Found ")) //not found
|
||||
} else {
|
||||
request.get(url, function (err, response) {
|
||||
// res.header("Access-Control-Allow-Origin", "http://localhost:3000");
|
||||
res.header("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length");
|
||||
res.header("Access-Control-Allow-Methods", "GET, OPTIONS");
|
||||
res.header("Access-Control-Allow-Methods", "GET, OPTIONS");
|
||||
|
@ -155,31 +158,29 @@ function getResponse(code, message) {
|
|||
|
||||
function clearCache() {
|
||||
console.log("cache is cleared!");
|
||||
mcache.clear();
|
||||
entries.set(mcache.size());
|
||||
lruCache.clear();
|
||||
entries.set(lruCache.size);
|
||||
initCache();
|
||||
}
|
||||
|
||||
async function initCache() {
|
||||
try {
|
||||
const requests = await axios.get(properties.get('utilsService') + '/grouped-requests');
|
||||
const additionalDataPromises = requests.data.map((url) => axios.get('http://localhost:'+properties.get('port') + '/get?url=' + properties.get('utilsService') + url));
|
||||
const additionalDataResponses = await Promise.all(additionalDataPromises);
|
||||
console.log("Cache initialized!")
|
||||
const requests = await axios.get(properties.get('utilsService') + '/grouped-requests');
|
||||
const additionalDataPromises = requests.data.map((url) => axios.get('http://localhost:'+properties.get('port') + '/get?url=' + properties.get('utilsService') + url));
|
||||
const additionalDataResponses = await Promise.all(additionalDataPromises);
|
||||
console.log("Cache initialized group queries!")
|
||||
} catch (error) {
|
||||
console.error('Error fetching data: Cache initialize failed', error.message);
|
||||
console.error('Error fetching data: Cache initialize failed', error);
|
||||
}
|
||||
try{
|
||||
const additionalDataPromisesPreloadRequests = preloadRequests.map((url) => axios.get('http://localhost:'+properties.get('port') + '/get?url=' + url));
|
||||
const additionalDataResponsesPreloadRequests = await Promise.all(additionalDataPromisesPreloadRequests);
|
||||
console.log("Cache initialized preload requests!")
|
||||
} catch (error) {
|
||||
console.error('Error fetching data: Cache initialize failed', error);
|
||||
}
|
||||
}
|
||||
|
||||
function checkForLongCachedRequests(url) {
|
||||
let long = false;
|
||||
longCachingRequests.forEach(partUrl => {
|
||||
if (url.indexOf(partUrl) !== -1) {
|
||||
long = true;
|
||||
}
|
||||
});
|
||||
return long;
|
||||
}
|
||||
|
||||
function resetAtMidnight() {
|
||||
console.log("Run Reset timer");
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"axios": "^1.6.7",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.18.2",
|
||||
"memory-cache": "^0.2.0",
|
||||
"lru-cache": "^10.2.0",
|
||||
"prom-client": "^11.3.0",
|
||||
"properties-reader": "^2.2.0",
|
||||
"superagent": "^5.0.5"
|
||||
|
|
|
@ -1,2 +1,5 @@
|
|||
port = 4000
|
||||
utilsService = https://explore.openaire.eu/utils-service
|
||||
environment = production
|
||||
preloadRequests =https://services.openaire.eu/openaire/info/,https://services.openaire.eu/openaire/contexts/,https://services.openaire.eu/usagestats/allmetrics,https://services.openaire.eu/provision/mvc/vocabularies/dnet:provenanceActions.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:subject_classification_typologies.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:relation_relClass.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:publication_resource.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:dataCite_resource.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:languages.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:access_modes.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:datasource_typologies.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:datasourceCompatibilityLevel.json,https://services.openaire.eu/provision/mvc/vocabularies/dnet:countries.json
|
||||
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
port = 3200
|
||||
utilsService= http://scoobydoo.di.uoa.gr:8000
|
||||
environment = development
|
||||
preloadRequests =https://dev-openaire.d4science.org/openaire/info/,https://dev-openaire.d4science.org/openaire/contexts/,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:provenanceActions.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:subject_classification_typologies.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:publication_resource.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:dataCite_resource.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:languages.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:access_modes.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:datasource_typologies.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:datasourceCompatibilityLevel.json,https://dev-openaire.d4science.org/provision/mvc/vocabularies/dnet:countries.json
|
||||
|
|
Loading…
Reference in New Issue