From 7fb2f1c19ec0dfbe7259e3b8a49f220727cc9e61 Mon Sep 17 00:00:00 2001 From: vilarodr Date: Thu, 25 Jan 2024 11:35:18 +0100 Subject: [PATCH] Folder names invalid characters check and code improvements --- assets/images/logos/_org-logo.svg | 1 + assets/images/logos/org-logo.svg | 263 +++++++++++++++++- .../components/data-file-list.ts | 84 +++--- .../components/data-files-input.ts | 140 +++++++--- src/index-renderer/components/user-dataset.ts | 1 + src/main/controllers/upload-controller.ts | 63 +++-- src/main/main.ts | 35 ++- src/main/services/upload-service.ts | 15 +- styles/colors.css | 2 +- styles/footer.css | 2 +- views/index.html | 1 - 11 files changed, 477 insertions(+), 130 deletions(-) create mode 100755 assets/images/logos/_org-logo.svg mode change 100755 => 100644 assets/images/logos/org-logo.svg diff --git a/assets/images/logos/_org-logo.svg b/assets/images/logos/_org-logo.svg new file mode 100755 index 0000000..f4011ec --- /dev/null +++ b/assets/images/logos/_org-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/logos/org-logo.svg b/assets/images/logos/org-logo.svg old mode 100755 new mode 100644 index f4011ec..4c41b65 --- a/assets/images/logos/org-logo.svg +++ b/assets/images/logos/org-logo.svg @@ -1 +1,262 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/index-renderer/components/data-file-list.ts b/src/index-renderer/components/data-file-list.ts index b0630b1..d709328 100755 --- a/src/index-renderer/components/data-file-list.ts +++ b/src/index-renderer/components/data-file-list.ts @@ -1,3 +1,4 @@ +import { JsonData } from './../../model/json-data'; import { ipcRenderer, shell } from 'electron'; import Cmp from './base-component.js'; @@ -9,10 +10,6 @@ export class DataFileList extends Cmp { fileListElement: HTMLUListElement; openDatasetElement: HTMLLinkElement; - modalElement: HTMLElement; - modalButtonElement: HTMLButtonElement; - backdropElement: HTMLElement; - selectedFiles: FileInfo[]; constructor() { @@ -20,13 +17,6 @@ export class DataFileList extends Cmp { this.fileListElement = this.element.querySelector( "#research-files-list" ) as HTMLUListElement; - - this.modalElement = document.getElementById('alertModal') as HTMLElement; - this.modalButtonElement = document.getElementById( - 'modalClose' - ) as HTMLButtonElement; - - this.backdropElement = document.getElementById('backdrop') as HTMLElement; this.selectedFiles = []; @@ -34,23 +24,11 @@ export class DataFileList extends Cmp { } configure(): void { - this.modalButtonElement.addEventListener('click', this.closeModal.bind(this)); - - this.backdropElement.style.display = "none"; - this.backdropElement.style.visibility = "hidden"; - - const regexp = /[:;#<>"\*\?\/\|]/ ; - ipcRenderer.setMaxListeners(0); dataFiles.updateListener((file: FileInfo) => { - if (!regexp.test(file.name)) { - this.selectedFiles.push(file); - this.renderItem(this.selectedFiles[this.selectedFiles.length - 1]); - } else { - dataFiles.removeDataFile(file); - this.openModal(`${file.name} excluded from your selection!
File Name cannot contain any of the following characters:
/ : * ? \" < > | ; #`); - } + this.selectedFiles.push(file); + this.renderItem(this.selectedFiles[this.selectedFiles.length - 1]); }); ipcRenderer.on("DO_FILE_CLEAR", (event: Event, file: FileInfo) => { @@ -58,10 +36,14 @@ export class DataFileList extends Cmp { this.selectedFiles.splice(file.id, 1); const element = document.getElementById(file.id.toString()); element.remove(); - if (!dataFiles.length()) { - (document.getElementById("clear") as HTMLButtonElement).disabled = true; - (document.getElementById("upload") as HTMLButtonElement).disabled = true; - (document.getElementById("cancel") as HTMLButtonElement).disabled = true; + if (dataFiles.length() === 0) { + (document.querySelector( + '#clear' + ) as HTMLButtonElement).disabled = true; + (document.querySelector( + '#upload' + ) as HTMLButtonElement).disabled = true; + ipcRenderer.send('DO_CLEAR_SELECTED'); } }); @@ -71,20 +53,20 @@ export class DataFileList extends Cmp { this.element.querySelector( "ul" - )!.innerHTML = `
-
${result.numFiles2Upload} files to upload, ${(result.numFiles2Upload as number) - (result.numFilesUploaded as number)} fails
-
${result.numFilesUploaded} files uploaded to ${result.destination}
-
- -
`; + )!.innerHTML = this.successReport(result, repository); this.openDatasetElement = document.getElementById( 'open-dataset' ) as HTMLLinkElement; this.openDatasetElement.addEventListener('click', this.openDatasetHandler.bind(this)); + }); - (document.getElementById("cancel") as HTMLButtonElement).disabled = true; - (document.getElementById("files") as HTMLButtonElement).disabled = false; - (document.getElementById("folder") as HTMLButtonElement).disabled = false; + ipcRenderer.on("UPLOAD_FAILED", (event: Event, result: Record, repository: string) => { + this.selectedFiles = []; + dataFiles.clear(); + + this.element.querySelector( + "ul" + )!.innerHTML = this.failReport(result); }); ipcRenderer.on("abort", (event: Event, result: Record) => { @@ -118,19 +100,23 @@ export class DataFileList extends Cmp { shell.openExternal(this.openDatasetElement.href); } - private openModal(message:string) { - this.backdropElement.style.display = "block" - this.backdropElement.style.visibility = "visible" - this.modalElement.style.display = "block" - this.modalElement.classList.add("show"); - this.modalElement.children[0].children[0].children[1].innerHTML = message; + private successReport(result: any, repository: any): string { + + return `
+
Upload report
+
${result.numFiles2Upload} files to upload, ${(result.numFiles2Upload as number) - (result.numFilesUploaded as number)} fails
+
${result.numFilesUploaded} files uploaded to ${result.destination}
+
+ +
`; } - private closeModal() { - this.backdropElement.style.display = "none" - this.backdropElement.style.visibility = "hidden" - this.modalElement.style.display = "none" - this.modalElement.classList.remove("show"); + private failReport(result: any): string { + + return `
+
Upload failed!
+

${result}

+
`; } } \ No newline at end of file diff --git a/src/index-renderer/components/data-files-input.ts b/src/index-renderer/components/data-files-input.ts index d510b1f..4b54959 100755 --- a/src/index-renderer/components/data-files-input.ts +++ b/src/index-renderer/components/data-files-input.ts @@ -12,6 +12,10 @@ export class DataFilesInput extends Cmp { submitButtonElement: HTMLButtonElement; cancelButtonElement: HTMLButtonElement; + modalElement: HTMLElement; + modalButtonElement: HTMLButtonElement; + backdropElement: HTMLElement; + MAXFILES: number; remainingFiles: number; enteredFiles: FileInfo[] @@ -34,11 +38,20 @@ export class DataFilesInput extends Cmp { '#cancel' ) as HTMLButtonElement; + this.modalElement = document.getElementById('alertModal') as HTMLElement; + this.modalButtonElement = document.getElementById( + 'modalClose' + ) as HTMLButtonElement; + + this.backdropElement = document.getElementById('backdrop') as HTMLElement; + this.configure(); } configure():void { this.MAXFILES = 2000; + const regexp = /[:;#<>"\*\?\/\|]/ ; + const regexp2 = /[^A-Za-z0-9_ .\/\-]+/ ; this.element.addEventListener('change', this.changeHandler.bind(this)); this.filesButtonElement.addEventListener('click', this.filesHandler.bind(this)); @@ -47,9 +60,13 @@ export class DataFilesInput extends Cmp { this.submitButtonElement.addEventListener('click', this.submitHandler.bind(this)); this.cancelButtonElement.addEventListener('click', this.cancelHandler.bind(this)); + this.modalButtonElement.addEventListener('click', this.closeModal.bind(this)); + + this.backdropElement.style.display = "none"; + this.backdropElement.style.visibility = "hidden"; + ipcRenderer.on('DO_FILE_SELECT', (event: Event, folder: string, filesCount: number) => { - const dsSelected = document.getElementById("dataset") as HTMLInputElement; - if (dsSelected.value.length > 0 && dsSelected.value[0].length > 0) { + if (this.isDSSelected) { this.filesButtonElement.disabled = false; } else { this.filesButtonElement.disabled = true; @@ -59,26 +76,27 @@ export class DataFilesInput extends Cmp { }) ipcRenderer.on('FILE_SELECT_DONE', (event: Event, enteredFiles: FileInfo[]) => { - const doneElement = document.getElementById('upload-done'); - if (doneElement) { - doneElement.innerHTML = ''; - } + this.clearView(); if (enteredFiles.length) { const files = Array.from(enteredFiles); enteredFiles.forEach((file) => { - dataFiles.addFile(file); + if (!regexp.test(file.name)) { + dataFiles.addFile(file); + } else { + this.openModal(`${file.name} excluded from your selection!
File Name cannot contain any of the following characters:
/ : * ? \" < > | ; #`); + } }); - const dsSelected = document.getElementById("dataset") as HTMLInputElement; - if (dsSelected.value.length > 0 && dsSelected.value[0].length > 0) { - this.submitButtonElement.disabled = false; + if (dataFiles.length()) { + if (this.isDSSelected) { + this.submitButtonElement.disabled = false; + } + this.resetButtonElement.disabled = false; } - this.resetButtonElement.disabled = false; } }) ipcRenderer.on('DO_FOLDER_SELECT', (event: Event, folder: string, filesCount: number) => { - const dsSelected = document.getElementById("dataset") as HTMLInputElement; - if (dsSelected.value.length > 0 && dsSelected.value[0].length > 0) { + if (this.isDSSelected) { this.folderButtonElement.disabled = false; } else { this.folderButtonElement.disabled = true; @@ -87,29 +105,43 @@ export class DataFilesInput extends Cmp { }) ipcRenderer.on('FOLDER_SELECT_DONE', (event: Event, enteredFiles: FileInfo[]) => { - const doneElement = document.getElementById('upload-done'); - if (doneElement) { - doneElement.innerHTML = ''; - } + this.clearView(); if (enteredFiles.length) { + let lastPath = ''; const files = Array.from(enteredFiles); enteredFiles.forEach((file) => { - dataFiles.addFile(file); + if (!regexp2.test(file.relativePath)) { + if (!regexp.test(file.name)) { + dataFiles.addFile(file); + } else { + this.openModal(`${file.name} excluded from your selection!
File Name cannot contain any of the following characters:
/ : * ? \" < > | ; #`); + } + } else { + if (file.relativePath !== lastPath) { + this.openModal(`Directory ${file.relativePath} name cannot contain invalid characters!
Valid characters are:
a-Z 0-9 _ - . \\ / and ' ' (white space).`); + lastPath = file.relativePath; + } + } }); - const dsSelected = document.getElementById("dataset") as HTMLInputElement; - if (dsSelected.value.length > 0 && dsSelected.value[0].length > 0) { - this.submitButtonElement.disabled = false; + if (dataFiles.length()) { + if (this.isDSSelected) { + this.submitButtonElement.disabled = false; + } + this.resetButtonElement.disabled = false; } - this.resetButtonElement.disabled = false; + } else { + alert(`The selected folder is empty, please select a folder that contains files`); } }) ipcRenderer.on('UPLOAD_DONE', (event: Event, result: Record) => { this.remainingFiles = this.remainingFiles - Number(result.numFilesUploaded); + this.actionButtons({cancel: true, files: false, folder: false}); this.nextUpload(); }) ipcRenderer.on('UPLOAD_FAILED', (event: Event, dummy: string) => { + this.actionButtons({cancel: true, files: false, folder: false}); this.nextUpload(); }) @@ -142,11 +174,7 @@ export class DataFilesInput extends Cmp { private submitHandler(event: Event) { event.preventDefault(); if (dataFiles.length()) { - this.filesButtonElement.disabled = true; - this.folderButtonElement.disabled = true; - this.resetButtonElement.disabled = true; - this.submitButtonElement.disabled = true; - this.cancelButtonElement.disabled = false; + this.actionButtons({files: true, folder: true, clear: true, upload: true, cancel: false}); ipcRenderer.send('DO_UPLOAD', dataFiles.getAll()); } } @@ -168,17 +196,16 @@ export class DataFilesInput extends Cmp { for (const file of enteredFiles) { dataFiles.addFile(file); }; - this.submitButtonElement.disabled = false; - this.resetButtonElement.disabled = false; + this.actionButtons({files: true, folder: true, clear: true, upload: true, cancel: false}); + } else { + this.actionButtons({files: false, folder: false, clear: true, upload: true, cancel: true}); } } private resetHandler(event: Event) { event.preventDefault(); dataFiles.clear(); - this.submitButtonElement.disabled = true; - this.resetButtonElement.disabled = true; - + this.actionButtons({files: false, folder: false, clear: true, upload: true, cancel: true}); ipcRenderer.send('DO_CLEAR_SELECTED'); } @@ -186,12 +213,51 @@ export class DataFilesInput extends Cmp { event.preventDefault(); dataFiles.clear(); this.submitButtonElement.innerHTML = ' Upload '; - this.resetButtonElement.disabled = true; - this.submitButtonElement.disabled = true; - this.cancelButtonElement.disabled = true; - this.filesButtonElement.disabled = false; - this.folderButtonElement.disabled = false; + this.actionButtons({files: false, folder: false, clear: true, upload: true, cancel: true}); ipcRenderer.send('DO_ABORT'); } + private clearView() { + const doneElement = document.getElementById('upload-done'); + if (doneElement) { + doneElement.innerHTML = ''; + } + const failedElement = document.getElementById('upload-failed'); + if (failedElement) { + failedElement.innerHTML = ''; + } + } + + private isDSSelected(): boolean { + const dsSelected = document.getElementById("dataset") as HTMLInputElement; + if (dsSelected.value.length > 0 && dsSelected.value[0].length > 0) { + return true; + } else { + return false; + } + } + + private actionButtons(enabled: {files?: boolean, folder?: boolean , clear?: boolean, upload?: boolean, cancel?: boolean}):void { + if (typeof enabled.files !== 'undefined') this.filesButtonElement.disabled = enabled.files; + if (typeof enabled.folder !== 'undefined') this.folderButtonElement.disabled = enabled.folder; + if (typeof enabled.clear !== 'undefined') this.resetButtonElement.disabled = enabled.clear; + if (typeof enabled.upload !== 'undefined') this.submitButtonElement.disabled = enabled.upload; + if (typeof enabled.cancel !== 'undefined') this.cancelButtonElement.disabled = enabled.cancel; + } + + private openModal(message:string) { + this.backdropElement.style.display = "block" + this.backdropElement.style.visibility = "visible" + this.modalElement.style.display = "block" + this.modalElement.classList.add("show"); + this.modalElement.children[0].children[0].children[1].innerHTML = message; + } + + private closeModal() { + this.backdropElement.style.display = "none" + this.backdropElement.style.visibility = "hidden" + this.modalElement.style.display = "none" + this.modalElement.classList.remove("show"); + } + } diff --git a/src/index-renderer/components/user-dataset.ts b/src/index-renderer/components/user-dataset.ts index 1b92872..9faf500 100755 --- a/src/index-renderer/components/user-dataset.ts +++ b/src/index-renderer/components/user-dataset.ts @@ -60,6 +60,7 @@ export class UserDataset extends Cmp { ) { (document.getElementById("upload") as HTMLButtonElement).disabled = true; (document.getElementById("cancel") as HTMLButtonElement).disabled = true; + this.lastSelected = ''; alert('Please, select a Dataset'); return; } else { diff --git a/src/main/controllers/upload-controller.ts b/src/main/controllers/upload-controller.ts index 41c65d3..9394385 100755 --- a/src/main/controllers/upload-controller.ts +++ b/src/main/controllers/upload-controller.ts @@ -23,6 +23,7 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: const numberOfItems = items.length; let itemsFailed = 0; let i = 0; + let events = ""; for (const item of items) { const itemInfo: FileInfo = { @@ -43,8 +44,12 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: let uploadUrlsResponseBody: any = null; try { uploadUrlsResponseBody = await getUploadUrls(persistentId, itemInfo.size); + if (JSON.parse(JSON.stringify(uploadUrlsResponseBody)).status != "OK") { + throw new Error(JSON.parse(JSON.stringify(uploadUrlsResponseBody)).status); + } } catch (err) { - new Notification({ title: itemInfo.name, body: err }); + const title = `Error uploading file ${itemInfo.name} to store.` + new Notification({ title: title, body: err }).show(); event.sender.send('actionFor' + itemInfo.id.toString(), 'fail', 0); itemsFailed++; continue; @@ -66,14 +71,20 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: numFilesUploaded: 0 }; } catch (err) { - throw new Error("Error aborting singlepart uploading to store"); + const title = 'Error aborting singlepart upload to store.'; + throw new Error(title + '\n' + err); } } else { itemInfo.storageUrls.push(uploadUrlsResponseBody.data.url); try { - uploadToStoreResponse = await uploadSinglepartToStore(event, itemInfo) + console.log("itemInfo: " + JSON.stringify(itemInfo)); // Debug + uploadToStoreResponse = await uploadSinglepartToStore(event, itemInfo); + if (JSON.parse(JSON.stringify(uploadToStoreResponse))._responseHead.statusCode != 200) { + throw new Error('HTTP ' + JSON.parse(JSON.stringify(uploadToStoreResponse))._responseHead.statusMessage); + } } catch (err) { - new Notification({ title: itemInfo.name, body: err }); + const title = `Error uploading file ${itemInfo.name} to store.` + new Notification({ title: title, body: err }).show(); event.sender.send('actionFor' + itemInfo.id.toString(), 'fail', 0); itemsFailed++; continue; @@ -88,8 +99,13 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: itemInfo.storageUrls.push(uploadUrlsResponseBody.data.urls[key]); try { uploadToStoreResponse = await uploadMultipartToStore(event, itemInfo); + if (JSON.parse(JSON.stringify(uploadToStoreResponse))._responseHead.statusCode != 200) { + throw new Error('HTTP ' + JSON.parse(JSON.stringify(uploadToStoreResponse))._responseHead.statusMessage); + } } catch (err) { - throw new Error("Error uploading part of file to store"); + const title = `Error uploading part of file ${itemInfo.name} to store.` + new Notification({ title: title, body: err }).show(); + throw new Error(title + '\n' + err); } const responseHeaders = JSON.parse(JSON.stringify(uploadToStoreResponse.headers)); itemInfo.partEtags[Number(key)] = responseHeaders.etag.replace(/^"+|"+$/g, ''); @@ -98,6 +114,9 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: if (abort) { try { const completeMultipartResponse = await abortMultipartUpload(itemInfo, uploadUrlsResponseBody.data.abort); + if (JSON.parse(JSON.stringify(completeMultipartResponse))._responseHead.statusCode != 200) { + throw new Error('HTTP ' + JSON.parse(JSON.stringify(completeMultipartResponse))._responseHead.statusMessage); + } abort = false; return { numFiles2Upload: 0, @@ -105,13 +124,20 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: numFilesUploaded: 0 }; } catch (err) { - throw new Error("Error aborting multipart uploading to store"); + const title = 'Error aborting multipart upload.'; + new Notification({ title: title, body: err }).show(); + throw new Error(title + '\n' + err); } } else { try { - await completeMultipartUpload(itemInfo, uploadUrlsResponseBody.data.complete); + const completeMultipartResponse = await completeMultipartUpload(itemInfo, uploadUrlsResponseBody.data.complete); + if (JSON.parse(JSON.stringify(completeMultipartResponse))._responseHead.statusCode != 200) { + throw new Error('HTTP ' + JSON.parse(JSON.stringify(completeMultipartResponse))._responseHead.statusCode); + } } catch (err) { - throw new Error("Error completing multipart uploading to store"); + const title = 'Error completing multipart upload to store.'; + new Notification({ title: title, body: err }).show(); + throw new Error(title + '\n' + err); } itemInfo.etag = await calcChecksum(itemInfo); } @@ -124,9 +150,12 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: if (uploaded.length % 1000 == 0 || i + 1 == (numberOfItems - itemsFailed)) { try { const addMultipleFilesResponse = await addMultipleFilesToDataset(persistentId, uploaded); - if (addMultipleFilesResponse._eventsCount) throw new Error("Error adding files to dataset"); + if (addMultipleFilesResponse._responseHead.statusCode != 200) { + throw new Error("HTTP " + JSON.stringify(addMultipleFilesResponse._responseHead.statusCode)); + } } catch (err) { - throw new Error("Error adding files to dataset"); + const title = 'Error adding files to dataset.'; + throw new Error(title + '\n' + err); } for (const item of uploaded) { files.push(item); @@ -135,13 +164,13 @@ export const filesTransfer = (event: IpcMainEvent, persistentId: string, items: } i++; } - - resolve({ - // TO-DO: extract relevant info from addMultipleFilesResponse - numFiles2Upload: items.length, - destination: persistentId, - numFilesUploaded: files.length - }); + if (files.length) { + resolve({ + numFiles2Upload: items.length, + destination: persistentId, + numFilesUploaded: files.length + }); + } else throw new Error("No file has been uploaded"); } catch (err) { reject(err); } diff --git a/src/main/main.ts b/src/main/main.ts index 0e463db..0fbb731 100755 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -20,7 +20,7 @@ function createMainWindow() { width: 1600, height: 800, webPreferences: { - // webSecurity: true, + webSecurity: true, nodeIntegration: true, preload: path.join(__dirname, "../index-renderer/preload.js") }, @@ -33,8 +33,8 @@ function createMainWindow() { const indexPath = path.join('file://', __dirname, '../../views/index.html') mainWindow.loadURL(indexPath); - // Open the DevTools. - // mainWindow.webContents.openDevTools(); + // for Debugging + //mainWindow.webContents.openDevTools(); mainWindow.on('close', function () { app.quit(); @@ -48,7 +48,7 @@ function createSettingsWindow() { // resizable: false, title: "Settings", webPreferences: { - // webSecurity: true, + webSecurity: true, nodeIntegration: true, preload: path.join(__dirname, "../settings-renderer/preload.js") }, @@ -61,7 +61,7 @@ function createSettingsWindow() { settingsWindow.show(); - // Open the DevTools. + // for Debugging //settingsWindow.webContents.openDevTools(); } @@ -138,7 +138,7 @@ app.on("ready", () => { }); } } catch (err) { - new Notification({ title: 'Upverse', body: err.message }).show(); + new Notification({ title: 'Upverse Settings', body: err.message }).show(); } }); @@ -173,7 +173,7 @@ ipcMain.on('DO_TEST_CONN', async (event: IpcMainEvent, givenSettings: string[]) }); } else throw new Error('Please, check Settings'); } catch (error) { - new Notification({ title: 'Settings', body: error.message }).show(); + new Notification({ title: 'Upverse Settings', body: error.message }).show(); } }) @@ -192,7 +192,7 @@ ipcMain.on('DO_SAVE_SETTINGS', (event: IpcMainEvent, givenSettings: string[]) => } } else throw new Error('Please, enter values'); } catch (error) { - new Notification({ title: 'Settings', body: error.message }).show(); + new Notification({ title: 'Upverse Settings', body: error.message }).show(); } }) @@ -209,7 +209,7 @@ ipcMain.on('DO_DS_LIST_REFRESH', async (event: IpcMainEvent) => { mainWindow.webContents.send('DO_DS_SELECT', datasetList); }); } catch (error) { - new Notification({ title: 'Upverse', body: error.message }).show(); + new Notification({ title: 'Upverse datasets', body: error.message }).show(); } }) @@ -233,7 +233,7 @@ ipcMain.on('DO_FILE_SELECT', (event: IpcMainEvent) => { if (fileInfoList.length) event.reply('FILE_SELECT_DONE', fileInfoList); }); } catch (error) { - new Notification({ title: 'File Explorer', body: 'Open file explorer failed' }); + new Notification({ title: 'Upverse File Explorer', body: 'Open file explorer failed' }); event.reply('FILE_SELECT_FAILED', ''); } }) @@ -260,32 +260,31 @@ ipcMain.on('DO_FOLDER_SELECT', (event: IpcMainEvent) => { } if (fileInfoList.length) { event.reply('FOLDER_SELECT_DONE', fileInfoList); - } else new Notification({ title: 'File Explorer', body: "Please, select a non empty folder" }).show(); + } else new Notification({ title: 'Upverse File Explorer', body: "Please, select a non empty folder" }).show(); } }); } catch (error) { - new Notification({ title: 'File Explorer', body: error.message }).show(); + new Notification({ title: 'Upverse File Explorer', body: error.message }).show(); event.reply('FOLDER_SELECT_FAILED', ''); } }) -ipcMain.on('DO_UPLOAD', async (event: IpcMainEvent, fileInfoList: FileInfo[]) => { +ipcMain.on('DO_UPLOAD', async (event: IpcMainEvent, fileInfoList: FileInfo[]) => { if (!fileInfoList.length) { - new Notification({ title: 'Upload Failed!', body: 'Nothing selected to Upload' }).show(); + new Notification({ title: 'Upverse Upload Failed!', body: 'Nothing selected to Upload' }).show(); } else if (!process.env.dest_dataset) { - new Notification({ title: 'Upload Failed!', body: 'No destination Dataset selected' }).show(); + new Notification({ title: 'Upverse Upload Failed!', body: 'No destination Dataset selected' }).show(); } else { try { await transferFiles(event, process.env.dest_dataset, fileInfoList).then((result: Record) => { event.reply('UPLOAD_DONE', result, process.env.dv_base_uri); }).catch(error => { - event.reply('UPLOAD_FAILED', error.message); - log.error(error); throw error; }) } catch (error) { - new Notification({ title: 'Upload Failed!', body: error.message }).show(); + new Notification({ title: 'Upverse Upload Failed!', body: error.message }).show(); + event.reply('UPLOAD_FAILED', error.message); } } }); diff --git a/src/main/services/upload-service.ts b/src/main/services/upload-service.ts index a97d3cb..463352c 100755 --- a/src/main/services/upload-service.ts +++ b/src/main/services/upload-service.ts @@ -3,12 +3,13 @@ import { createReadStream } from 'fs'; import { FileInfo } from '../../model/file-info'; import { createHash } from 'crypto'; import { Transfer } from "../interfaces/storage-interface"; +import log from 'electron-log/main'; import { IpcMainEvent, net } from "electron"; export const calcChecksum = (item: FileInfo): Promise => { return new Promise((resolve, reject) => { - const hash = createHash('md5'); + const hash = createHash('sha1'); const stream = createReadStream(item.path); stream.on('error', function (error) { @@ -55,6 +56,7 @@ export const getUploadUrls = (doi: String, size: Number) => { }); request.on('error', (error) => { + log.error("getUploadUrls.request: \n" + error); reject(error); }); @@ -91,6 +93,7 @@ export const uploadSinglepartToStore = (event: IpcMainEvent, item: FileInfo) => }); request.on('error', (error) => { + log.error("uploadSinglepartToStore.request: \n" + error); reject(error); }); @@ -127,9 +130,9 @@ export const uploadSinglepartToStore = (event: IpcMainEvent, item: FileInfo) => request.end(); }); fileStream.on('error', (error) => { + log.error("uploadSinglepartToStore.fileStream: \n" + error); reject(error); }); - }); } @@ -156,6 +159,7 @@ export const addMultipleFilesToDataset = (doi: string, items: FileInfo[]) => { }); request.on('error', (error) => { + log.error("addMultipleFilesToDataset.request: \n" + error); reject(error); }); @@ -175,7 +179,6 @@ export const addMultipleFilesToDataset = (doi: string, items: FileInfo[]) => { '\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--'; request.write(postData); request.end(); - }); } @@ -216,6 +219,7 @@ export const uploadMultipartToStore = (event: IpcMainEvent, item: FileInfo) => { }) request.on('error', (error) => { + log.error("uploadMultipartToStore.request: \n" + error); reject(error); }); @@ -252,9 +256,9 @@ export const uploadMultipartToStore = (event: IpcMainEvent, item: FileInfo) => { request.end(); }); fileStream.on('error', (error) => { + log.error("uploadMultipartToStore.fileStream: " + error); reject(new Error(`file streaming ${item.name} failed`)); }); - }); } @@ -275,6 +279,7 @@ export const completeMultipartUpload = (item: FileInfo, completeUrl: string) => }); request.on('error', (error) => { + log.error("completeMultipartUpload.request: \n" + error); reject(error); }); @@ -282,7 +287,6 @@ export const completeMultipartUpload = (item: FileInfo, completeUrl: string) => var jsonpartEtags = JSON.stringify(Object.assign({}, item.partEtags)); request.write(jsonpartEtags); request.end(); - }); } @@ -303,6 +307,7 @@ export const abortMultipartUpload = (item: FileInfo, abortUrl: string) => { }); request.on('error', (error) => { + log.error("abortMultipartUpload.request: \n" + error); reject(error); }); diff --git a/styles/colors.css b/styles/colors.css index 7e8921a..0b7676d 100755 --- a/styles/colors.css +++ b/styles/colors.css @@ -8,7 +8,7 @@ --green-4: #F6FFF5; --green-5: #01E9CD; - --mpg-blue: #00445F; + --mpg-blue: #235B70; --mpg-secondary-blue: #006699; --mpg-dark-blue: #001f2c; --mpg-black-blue: #000d13; diff --git a/styles/footer.css b/styles/footer.css index d2ca631..3e54e97 100755 --- a/styles/footer.css +++ b/styles/footer.css @@ -17,7 +17,7 @@ } .footer img { - height: 2rem; + height: 4rem; } .footer-tagline { diff --git a/views/index.html b/views/index.html index ecabb47..cf120ed 100755 --- a/views/index.html +++ b/views/index.html @@ -49,7 +49,6 @@
Research Data