import {Component, Input} from '@angular/core'; import {Subscriber} from "rxjs"; import {HttpClient, HttpHeaders} from "@angular/common/http"; import {Validators} from "@angular/forms"; import {Location} from '@angular/common'; import {StringUtils} from "../openaireLibrary/utils/string-utils.class"; import {COOKIE} from "../openaireLibrary/login/utils/helper.class"; import {Router} from "@angular/router"; declare var UIkit; @Component({ selector: 'egi-transfer-data', template: ` ` }) export class EGIDataTransferComponent { subscriptions = []; accessToken = null; @Input() dois; loginURL = "http://rudie.di.uoa.gr:8580/openid_connect_login" sourceUrls = [] selectedSourceUrl = null; destinationPath = ""; destinationOptions = [{label: "EGI storage", value: { url: "https://egi.storage.eu", id: "egi" } }]; selectedDestination = null; downloadElements = null; @Input() isOpen = false; APIURL = "https://virtserver.swaggerhub.com/thebe14/eosc-future-data-transfer/1.0.0"; status: "loading" | "success" | "errorParser" | "errorUser" | "errorTransfer" | "init" = "init"; message; validators = [Validators.required, StringUtils.urlValidator()]; constructor(private http: HttpClient, private location: Location, private _router: Router) { } ngOnInit() { if(this.isOpen){ this.open(); } } ngOnDestroy() { this.subscriptions.forEach(subscription => { if (subscription instanceof Subscriber) { subscription.unsubscribe(); } }); } open(){ this.accessToken = COOKIE.getCookie("EGIAccessToken"); for(let doi of this.dois){ if(doi.indexOf("zenodo.")!=-1){ this.sourceUrls.push("https://doi.org/" + doi); } } this.selectedSourceUrl = this.sourceUrls[0]; this.selectedDestination = this.destinationOptions[0].value; this.parse(); this.isOpen = true; } close(){ this.isOpen = false; // this.downloadElements = []; this.destinationPath = ""; this.selectedDestination = this.destinationOptions[0].value; this.selectedSourceUrl = this.sourceUrls[0]; this.message = null; this.status = "init"; if(this._router.url.indexOf("&egiTransfer")){ this.location.go(this._router.url.split("&egiTransfer")[0]); } } checkin(){ window.location.href = this.loginURL+"?redirect="+ encodeURIComponent(window.location.href + "&egiTransfer=t"); } parse(){ this.subscriptions.push(this.http.get(this.APIURL + "/parser/zenodo?source=" + this.selectedSourceUrl ).subscribe( res => { console.log(res) this.downloadElements = []; for( let element of res['elements']){ //TODO remove element.downloadUrl = "https://zenodo.org/record/6354460/files/preprocessed_data/weights/atlas_EUCP_ICTP_CMIP6_REA_tas_weights.nc?download=1"; //TODO can we use element.name instead? element.filename = this.parseFilename(element.downloadUrl); console.log(element.filename) this.downloadElements.push(element) } console.log(this.downloadElements) // this.transfer(); }, error => { this.status = "errorParser"; this.message = "Couldn't get download URLs from zenodo"; UIkit.notification("Couldn't get download URLs from zenodo", { status: 'error', timeout: 6000, pos: 'bottom-right' }); } )); } transfer() { console.log(this.selectedDestination) this.status = "loading"; let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken}); this.subscriptions.push(this.http.get(this.APIURL + "/user/info", {headers: headers}).subscribe( res => { console.log(res) let body = { "files": [], "params": { "priority": 0, "overwrite": true, "retry": 3 } }; console.log(this.selectedDestination) for (let element of this.downloadElements) { let file = { "sources": [ { "url": element['downloadUrl'] } ], "destinations": [ { "url": this.selectedDestination.url + this.destinationPath + element.filename } ], "filesize": element['size'] }; //TODO priority? checksum? body.files.push(file); } let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken}); this.subscriptions.push(this.http.post(this.APIURL + "/transfer" ,body, {headers: headers}).subscribe( res => { console.log(res) UIkit.notification('Data transfer has began! ', { status: 'success', timeout: 6000, pos: 'bottom-right' }); this.status = "success" this.message = `
Data transfer has began!
Transfering ` + this.downloadElements.length + ` files to EGI Storage:
` }, error => { this.status = "errorTransfer"; this.message = "Couldn't transfer files"; UIkit.notification("Couldn't transfer files", { status: 'error', timeout: 6000, pos: 'bottom-right' }); } )); }, error => { this.status = "errorUser"; this.message = "User can't be authenticated!"; UIkit.notification("User can't be authenticated!", { status: 'error', timeout: 6000, pos: 'bottom-right' }); } )); } private parseFilename(url){ let filename = url.split("/")[url.split("/").length - 1]; return filename.split("?")[0]; } }