Files
paperclip-wallet/modules/database.js
Taegus 35c1eb5472 + transaction details with explorer redirection
+ sorting and floating header for wallets and address book
+ detect geth crash and notify the user
2019-03-05 18:54:29 +01:00

162 lines
3.6 KiB
JavaScript

const {app, dialog, ipcMain} = require("electron");
const storage = require("electron-storage");
const datastore = require("nedb");
const moment = require("moment");
const path = require("path");
const fs = require("fs");
const os = require("os");
const dbPath = path.join(app.getPath("userData"), "storage.db");
const db = new datastore({filename: dbPath});
db.loadDatabase(function (err) {
// Now commands will be executed
});
// index the block field
db.ensureIndex({
fieldName: "block"
}, function (err) {
// If there was an error, err is not null
});
// index the txhash field
db.ensureIndex({
fieldName: "txhash",
unique: true
}, function (err) {
// If there was an error, err is not null
});
ipcMain.on("storeTransaction", (event, arg) => {
db.update({
txhash: arg.txhash
}, arg, {
upsert: true
}, function (err, numReplaced, upsert) {
// do nothing for now
});
});
ipcMain.on("getTransactions", (event, arg) => {
db.find({}).exec(function (err, docs) {
ResultData = [];
// sort the data
docs.sort((a, b) => {
if (!b.block && a.block) {
return 1;
} else if (b.block && !a.block) {
return -1;
} else if (!b.block && !a.block) {
return (moment(b.timestamp, "YYYY-MM-DD HH:mm:ss").toDate() - moment(a.timestamp, "YYYY-MM-DD HH:mm:ss").toDate());
} else {
return b.block - a.block;
}
});
for (i = 0; i < Math.min(docs.length, 500); i++) {
ResultData.push([
docs[i].block,
docs[i].timestamp,
docs[i].txhash,
docs[i].fromaddr,
docs[i].toaddr,
docs[i].value
]);
}
// return the transactions data
event.returnValue = ResultData;
});
});
ipcMain.on("getJSONFile", (event, arg) => {
storage.get(arg, (err, data) => {
if (err) {
event.returnValue = null;
} else {
event.returnValue = data;
}
});
});
ipcMain.on("setJSONFile", (event, arg) => {
storage.set(arg.file, arg.data, err => {
if (err) {
event.returnValue = {
success: false,
error: err
};
} else {
event.returnValue = {
success: true,
error: null
};
}
});
});
ipcMain.on("deleteTransactions", (event, arg) => {
fs.unlink(dbPath, err => {
if (err) {
event.returnValue = {
success: false,
error: err
};
} else {
event.returnValue = {
success: true,
error: null
};
}
});
});
ipcMain.on("deleteWalletData", (event, arg) => {
fs.unlink(path.join(app.getPath("userData"), "wallets.json"), err => {
if (err) {
event.returnValue = {
success: false,
error: err
};
} else {
event.returnValue = {
success: true,
error: null
};
}
});
});
ipcMain.on("deleteBlockchainData", (event, arg) => {
var deleteFolderRecursive = function (path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach(function (file, index) {
var curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) {
// recurse
deleteFolderRecursive(curPath);
} else {
// delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
function getBlockchainDataLocation() {
switch (os.type()) {
case "Darwin":
return path.join(os.homedir(), "Library", "Ether1", "geth");
break;
default:
return path.join(process.env.APPDATA, "Ether1", "geth");
}
}
// delete folder in a synchronous recursive maner
deleteFolderRecursive(getBlockchainDataLocation());
event.returnValue = true;
});