Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
311 changes: 163 additions & 148 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/**
* SETE Desktop: index.js
*
*
* Ponto de entrada da aplicação desktop.
* Primeiramente, instanciamos o electron e criamos o processo main e renderer.
* Logo em seguida, realiza-se a instanciação da base de dados.
* Logo em seguida, realiza-se a instanciação da base de dados.
* Cria-se a janela do navegador no processo renderer e instancia-se a parte web.
* Por fim, cria-se os listeners de IPC e o worker para a parte de roteirização.
*/
Expand All @@ -15,7 +15,7 @@ const path = require("path");
const fs = require("fs-extra");

// Desabilita cache do http
app.commandLine.appendSwitch ("disable-http-cache");
app.commandLine.appendSwitch("disable-http-cache");

// Arquivo de configuração (variáveis básicas)
const Store = require("electron-store");
Expand All @@ -25,48 +25,55 @@ var appconfig = new Store();
const figlet = require("figlet");

// Plotando dados do sistema e SETE
console.log(figlet.textSync("SETE"))
console.log("SETE".padEnd(30), app.getVersion())
console.log("SISTEMA OPERACIONAL".padEnd(30), process.platform)
console.log("VERSAO DO SISTEMA OPERACIONAL".padEnd(30), process.getSystemVersion())
console.log("ARQUITETURA CPU".padEnd(30), process.arch)
console.log(figlet.textSync("SETE"));
console.log("SETE".padEnd(30), app.getVersion());
console.log("SISTEMA OPERACIONAL".padEnd(30), process.platform);
console.log(
"VERSAO DO SISTEMA OPERACIONAL".padEnd(30),
process.getSystemVersion()
);
console.log("ARQUITETURA CPU".padEnd(30), process.arch);

////////////////////////////////////////////////////////////////////////////////
// BANCO DE DADOS
////////////////////////////////////////////////////////////////////////////////

// Path do banco de dados (dbPath), banco padrão (rawDBPath)
const dbPath = path.join(app.getPath('userData'), "db", "local.db");
const dbPath = path.join(app.getPath("userData"), "db", "local.db");
const rawDBPath = path.join(__dirname, "db", "local.db");

// Verificando existência da base de dados
if (!fs.existsSync(dbPath)) {
fs.copySync(rawDBPath, dbPath);
console.log("COPIANDO A BASE DE DADOS DE: ", rawDBPath)
console.log("PARA: ", dbPath)
fs.copySync(rawDBPath, dbPath);
console.log("COPIANDO A BASE DE DADOS DE: ", rawDBPath);
console.log("PARA: ", dbPath);
} else {
console.log("BASE SQLITE".padEnd(30), dbPath)
console.log("BASE SQLITE".padEnd(30), dbPath);
}

// Verificação se existe o template para criar a base de dados roteirizável
const malhaTemplatePath = path.join(app.getPath('userData'), "db", "osm_road_template");
const malhaTemplatePath = path.join(
app.getPath("userData"),
"db",
"osm_road_template"
);
const rawMalhaTemplatePath = path.join(__dirname, "db", "osm_road_template");

if (!fs.existsSync(malhaTemplatePath)) {
fs.copySync(rawMalhaTemplatePath, malhaTemplatePath);
console.log("COPIANDO O TEMPLATE DE MALHA DE: ", rawMalhaTemplatePath)
console.log("PARA: ", malhaTemplatePath)
fs.copySync(rawMalhaTemplatePath, malhaTemplatePath);
console.log("COPIANDO O TEMPLATE DE MALHA DE: ", rawMalhaTemplatePath);
console.log("PARA: ", malhaTemplatePath);
} else {
console.log("TEMPLATE OSM".padEnd(30), malhaTemplatePath)
console.log("TEMPLATE OSM".padEnd(30), malhaTemplatePath);
}

// Instanciação das bases de dados
const sqliteDB = require("knex")({
client: "sqlite3",
connection: {
filename: dbPath
},
useNullAsDefault: true
client: "sqlite3",
connection: {
filename: dbPath,
},
useNullAsDefault: true,
});
const spatialite = require("spatialite");
const spatialiteDB = new spatialite.Database(dbPath);
Expand All @@ -79,76 +86,78 @@ const spatialiteDB = new spatialite.Database(dbPath);
let appWindow;

const createEntryWindow = () => {
// Cria a janela do navegador
appWindow = new BrowserWindow({
"width": 1250,
"height": 450,
"minWidth": 1250,
"minHeight": 450,
"backgroundThrottling": false,
"show": false,
webPreferences: {
nodeIntegration: true,
nodeIntegrationInWorker: true,
enableRemoteModule: true
}
});

// Desabilita e esconde menu
// appWindow.setMenu(null);
appWindow.setMenuBarVisibility(false);

// Agora carrega a página de login do SETE
// Vamos verificar se estamos usando proxy
let usingProxy = appconfig.get("PROXY_USE");

if (!usingProxy) {
// Cria a janela do navegador
appWindow = new BrowserWindow({
width: 1250,
height: 450,
minWidth: 1250,
minHeight: 450,
backgroundThrottling: false,
show: false,
webPreferences: {
nodeIntegration: true,
nodeIntegrationInWorker: true,
enableRemoteModule: true,
},
});

// Desabilita e esconde menu
// appWindow.setMenu(null);
appWindow.setMenuBarVisibility(false);

// Agora carrega a página de login do SETE
// Vamos verificar se estamos usando proxy
let usingProxy = appconfig.get("PROXY_USE");

if (!usingProxy) {
appWindow.loadURL(`file://${__dirname}/renderer/login-view.html`);
} else {
let proxyType = appconfig.get("PROXY_TYPE");
let proxyAddress = appconfig.get("PROXY_ADDRESS");
let proxyPort = appconfig.get("PROXY_PORT");
let proxyString = `${proxyType}://${proxyAddress}:${proxyPort},direct://`;
console.log("PROXY STRING", proxyString);

appWindow.webContents.session
.setProxy({ proxyRules: proxyString })
.then(() => {
appWindow.loadURL(`file://${__dirname}/renderer/login-view.html`);
} else {
let proxyType = appconfig.get("PROXY_TYPE");
let proxyAddress = appconfig.get("PROXY_ADDRESS");
let proxyPort = appconfig.get("PROXY_PORT");
let proxyString = `${proxyType}://${proxyAddress}:${proxyPort},direct://`
console.log("PROXY STRING", proxyString)

appWindow.webContents.session.setProxy({ proxyRules: proxyString }).then(() => {
appWindow.loadURL(`file://${__dirname}/renderer/login-view.html`);
});
}
});
}

// Abre DevTools.
// appWindow.webContents.openDevTools();
// Abre DevTools.
// appWindow.webContents.openDevTools();

// Desabilita navegação externa
appWindow.webContents.on("will-navigate", (e, url) => {
console.log("WILL-NAVIGATE", url);
// Desabilita navegação externa
appWindow.webContents.on("will-navigate", (e, url) => {
console.log("WILL-NAVIGATE", url);

if (url.includes("censobasico.inep.gov")) {
shell.openExternal(url);
e.preventDefault();
} else if (!(url.includes("file:"))) {
e.preventDefault();
}
});

// Bloqueia tentativa de abrir nova janela, redireciona para navegador do sistema
appWindow.webContents.on('new-window', function (e, url) {
console.log('NEW-WINDOW', url)
e.preventDefault();
shell.openExternal(url);
});

// Mostra o navegador quando o mesmo terminar de renderizar a página inicial
appWindow.on("ready-to-show", () => {
appWindow.maximize();
appWindow.show();
});

// Tratamento quando o usuário fecha a janela do navegador
appWindow.on('closed', () => {
// Dereferencia a variável que armazena o navegador
appWindow = null;
});
if (url.includes("censobasico.inep.gov")) {
shell.openExternal(url);
e.preventDefault();
} else if (!url.includes("file:")) {
e.preventDefault();
}
});

// Bloqueia tentativa de abrir nova janela, redireciona para navegador do sistema
appWindow.webContents.on("new-window", function (e, url) {
console.log("NEW-WINDOW", url);
e.preventDefault();
shell.openExternal(url);
});

// Mostra o navegador quando o mesmo terminar de renderizar a página inicial
appWindow.on("ready-to-show", () => {
appWindow.maximize();
appWindow.show();
});

// Tratamento quando o usuário fecha a janela do navegador
appWindow.on("closed", () => {
// Dereferencia a variável que armazena o navegador
appWindow = null;
});
};

////////////////////////////////////////////////////////////////////////////////
Expand All @@ -173,42 +182,42 @@ const Proxy = require("./main/proxy/proxy.js");
app.disableHardwareAcceleration();

// Evento chamado quando precisamos logar utilizando o proxy
app.on('login', (event, webContents, details, authInfo, callback) => {
event.preventDefault()
console.log(authInfo)

let proxyTemAutenticacao = appconfig.get("PROXY_HASAUTENTICATION");
if (proxyTemAutenticacao) {
let proxyUser = appconfig.get("PROXY_USER");
let proxyPassword = appconfig.get("PROXY_PASSWORD");
callback(proxyUser, proxyPassword);
}
})
app.on("login", (event, webContents, details, authInfo, callback) => {
event.preventDefault();
console.log(authInfo);

let proxyTemAutenticacao = appconfig.get("PROXY_HASAUTENTICATION");
if (proxyTemAutenticacao) {
let proxyUser = appconfig.get("PROXY_USER");
let proxyPassword = appconfig.get("PROXY_PASSWORD");
callback(proxyUser, proxyPassword);
}
});

// Evento que será chamado quando o electron terminou de carregar
// Neste caso, redirecionamos para a função de criação do processo renderer
app.on('ready', createEntryWindow);
app.on("ready", createEntryWindow);

// Evento quando todas as janelas tiverem terminadas
app.on('window-all-closed', () => {
// No mac é comum a app ficar na dock até que o usuário explicitamente feche ela
if (process.platform !== 'darwin') {
app.quit();
}
app.on("window-all-closed", () => {
// No mac é comum a app ficar na dock até que o usuário explicitamente feche ela
if (process.platform !== "darwin") {
app.quit();
}
});

// Evento gerado quando app vai terminar
app.on("will-quit", () => {
routeOptimizer.quit();
})
// Evento gerado quando app vai terminar
app.on("will-quit", () => {
routeOptimizer.quit();
});

// Evento chamado quando clicamos no ícone do app
app.on('activate', () => {
// No mac é comum recriar o aplicativo quando o ícone está na dock
if (appWindow === null) {
routeOptimizer = new RouteOptimization(app, dbPath);
createEntryWindow();
}
app.on("activate", () => {
// No mac é comum recriar o aplicativo quando o ícone está na dock
if (appWindow === null) {
routeOptimizer = new RouteOptimization(app, dbPath);
createEntryWindow();
}
});

////////////////////////////////////////////////////////////////////////////////
Expand All @@ -220,49 +229,55 @@ let routeOptimizer = new RouteOptimization(app, dbPath);

// Evento para gerar rotas
ipcMain.on("start:route-generation", (event, routingArgs) => {
let cachedODMatrix = appconfig.get("OD", {
nodes: {}, dist: {}, cost: {}
});

cachedODMatrix = {
nodes: {}, dist: {}, cost: {}
}

type_Capacity = typeof routingArgs.maxCapacity;
if (type_Capacity !== 'object') {
routingArgs.maxCapacity = [Number(routingArgs.maxCapacity)];
}
routingArgs.maxCapacity.sort((a,b)=> b-a);
let minNumVehicles = Math.max(routingArgs.numVehicles, Math.floor(routingArgs.stops.length / routingArgs.maxCapacity[0]));
routingArgs.numVehicles = minNumVehicles;
routeOptimizer.optimize(cachedODMatrix, routingArgs);
})
let cachedODMatrix = appconfig.get("OD", {
nodes: {},
dist: {},
cost: {},
});

cachedODMatrix = {
nodes: {},
dist: {},
cost: {},
};

if (typeof routingArgs.maxCapacity !== "object") {
routingArgs.maxCapacity = [Number(routingArgs.maxCapacity)];
}
routingArgs.maxCapacity.sort((a, b) => b - a);
routingArgs.numVehicles = Math.max(
routingArgs.numVehicles,
Math.floor(routingArgs.stops.length / routingArgs.maxCapacity[0])
);
routeOptimizer.optimize(cachedODMatrix, routingArgs);
});

// Evento chamado pelo nosso worker quando ele terminar de gerar a rota
app.on("done:route-generation", (res) => {
// Set new cache
let newODCache = res[0];
appconfig.set("OD", newODCache);
// Set new cache
let newODCache = res[0];
appconfig.set("OD", newODCache);

// Send generated routes
let optRoutes = res.slice(1);
appWindow.webContents.send("end:route-generation", optRoutes);
})
// Send generated routes
let optRoutes = res.slice(1);
appWindow.webContents.send("end:route-generation", optRoutes);
});

// Evento chamado pelo nosso worker quando ele encontra um erro ao gerar a rota
app.on("error:route-generation", (err) => {
appWindow.webContents.send("error:route-generation", err);
})
appWindow.webContents.send("error:route-generation", err);
});

// Evento para atualizar malha
ipcMain.on("start:malha-update", (event, newOSMFile) => {
let malha = new MalhaUpdate(newOSMFile, dbPath);
malha.update()
let malha = new MalhaUpdate(newOSMFile, dbPath);
malha
.update()
.then((updateData) => {
appconfig.delete("OD");
appWindow.webContents.send("end:malha-update", true);
appconfig.delete("OD");
appWindow.webContents.send("end:malha-update", true);
})
.catch((err) => {
appWindow.webContents.send("end:malha-update", false);
})
appWindow.webContents.send("end:malha-update", false);
});
});
Loading