-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
683d4c7
commit e102f03
Showing
13 changed files
with
1,866 additions
and
18,446 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,128 +1,2 @@ | ||
# Calculador de Horas <br> | ||
Projeto criado com a intenção de facilitar o cálculo entre horas, possibilitando cálculos entre datas diferentes, obtendo informações resumidas para aplicação e gestão.<br><br> | ||
|
||
# Cliente Web - Diferença entre Horas <br> | ||
Com o objetivo de ser uma ferramenta simples e de fácil aprendizagem, o cliente web possibilita para o usuário as seguintes facilidades:<br><br> | ||
|
||
• Resultados com informações objetivas para fácil utilização;<br> | ||
• Possibilidade de cálculo entre dois horários distintos, sendo possível selecionar datas diferentes, simulando o cálculo entre dias diferentes.<br><br><br> | ||
|
||
|
||
Foi utilizado para desenvolvimento do cliente web as seguintes tecnologias: <br><br> | ||
|
||
• HTML; <br> | ||
• CSS; <br> | ||
• Javascript; <br> | ||
• JQuery; <br> | ||
• Moment; <br><br><br> | ||
|
||
Abaixo exemplo de utilização do cliente: <br><br> | ||
|
||
![examplo gif](https://github.com/gabrielgfw/api-hour-calculator/blob/master/examplo.gif?raw=true) | ||
<br> | ||
|
||
# API <br> | ||
|
||
Desenvolvida em Node, a API utiliza alguns frameworks para seu funcionamento: <br><br> | ||
• Express; <br> | ||
• Moment; <br> | ||
• MongoDB (para futuras atualizações); <br> | ||
• Mongoose (para futuras atualizações); <br> | ||
• Nunjucks (para futuras atualizações); <br> | ||
<br> | ||
|
||
# Consumindo a API <br> | ||
|
||
Informações para a chamada da API: | ||
|
||
``` | ||
Servidor: "http://localhost:8080" | ||
End-Point: "/api/calc/" | ||
Método: POST | ||
``` | ||
|
||
|
||
<br> | ||
Payload Exemplo: | ||
|
||
``` | ||
{ | ||
startHour: "YYYY-MM-DD HH:mm:ss", | ||
finalHour: "YYYY-MM-DD HH:mm:ss" | ||
} | ||
``` | ||
|
||
|
||
<br> | ||
Retorno: | ||
|
||
``` | ||
{ | ||
input: | ||
{ | ||
startHour: "DD/MM/YYYY - HH:mm:ss", | ||
finalHour: "DD/MM/YYYY - HH:mm:ss" | ||
}, | ||
result: | ||
{ | ||
diffHours: resultHours, | ||
diffMinutes: resultMinutes | ||
}, | ||
rawResult: | ||
{ | ||
diffInHours: resultCalcInHours, | ||
diffInMinutes: resultCalcInMinutes, | ||
diffInSeconds: resultCalcInSeconds, | ||
diffInMillisec: resultCalcInMs | ||
} | ||
} | ||
``` | ||
<br> | ||
|
||
# Experimente <br> | ||
|
||
Instalações prévias necessárias: <br><br> | ||
• Node.js (compilador JS): <br> | ||
<a href="https://nodejs.org/en/download/"># Node Website</a> <br><br> | ||
• MongoDB Community (Banco de dados - Futuras Features): <br> | ||
<a href="https://www.mongodb.com/"># MongoDB Website</a> <br><br> | ||
|
||
<br> | ||
Clone o projeto localmente: <br> | ||
|
||
``` | ||
git clone https://github.com/gabrielgfw/api-hour-calculator | ||
``` | ||
|
||
<br> | ||
Instalando dependências: <br> | ||
|
||
``` | ||
npm install | ||
``` | ||
<br> | ||
Inicializando a API: <br> | ||
|
||
``` | ||
npm start | ||
``` | ||
<br> | ||
Acessando Web Client (em desenvolvimento): <br> | ||
<a href="http://localhost:8080/"># Local Host</a> <br> | ||
<br> | ||
|
||
# Futuras implementações <br> | ||
|
||
• Avaliar estabilidade da aplicação web;<br> | ||
• Disponibilizar a API de forma pública;<br> | ||
• Disponibilizar Cliente Web de forma pública;<br> | ||
• Sistema de Contas; <br> | ||
• Cada conta possuir seu histórico de resultados;<br> | ||
• Possibilitar a criação de grupo de resultados; <br> | ||
|
||
|
||
|
||
|
||
<br><br> | ||
Versão simplificada para web (sem servidor node). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
const express = require('express'); | ||
const mongoose = require('mongoose'); | ||
const nunjucks = require('nunjucks'); | ||
const moment = require('moment'); | ||
const path = require('path'); | ||
|
||
const app = express(); | ||
|
||
// Allowing express to work with JSON files. | ||
app.use(express.json()); | ||
|
||
// Nunjucks config. | ||
nunjucks.configure({ | ||
express: app | ||
}); | ||
|
||
// Connection with mongodb database. | ||
mongoose.connect('mongodb://localhost/gabriel', { | ||
useNewUrlParser: true, | ||
useUnifiedTopology: true | ||
|
||
}).then(() => { | ||
createLog("normal", "Sucesso - Conexão com banco de dados."); | ||
|
||
}).catch((err) => { | ||
createLog("aditional", "Falha - Conexão com banco de dados.", err.toString()); | ||
}); | ||
|
||
// Calculating. | ||
app.post("/api/calc/", (req, res) => { | ||
const startHour = req.body.startHour; | ||
const finalHour = req.body.finalHour; | ||
|
||
createLog("normal", ">>> Nova Requisição Iniciada <<<"); | ||
createLog("aditional", "Data Inicial:", moment(startHour).format("YYYY-MM-DD HH:mm:ss")); | ||
createLog("aditional", "Data Final:", moment(finalHour).format("YYYY-MM-DD HH:mm:ss")) | ||
|
||
calculateAndCreateResponse(startHour, finalHour).then((result) => { | ||
createLog("normal", "Sucesso - Requisição finalizada.") | ||
res.json(result); | ||
|
||
}).catch((error) => { | ||
createLog("aditional", "Falha - Erro na Requsição.", error.name + ": " + error.message); | ||
res.json(error); | ||
}); | ||
}); | ||
|
||
function createLog(type, message, extra) { | ||
if (type === "normal") { | ||
return console.log(hourNow() + message); | ||
} | ||
if (type === "aditional") { | ||
return console.log(hourNow() + message + " - " + extra); | ||
} | ||
} | ||
|
||
|
||
function hourNow() { | ||
return moment().format("DD/MM/YYYY - HH:mm:ss") + " --> "; | ||
} | ||
|
||
|
||
function calculateAndCreateResponse(startHour, finalHour) { | ||
|
||
return new Promise((resolve, reject) => { | ||
const resultCalcInMs = moment(finalHour, "YYYY-MM-DD HH:mm:ss").diff(startHour, "YYYY-MM-DD HH:mm:ss"); | ||
const resultCalcInHours = resultCalcInMs / 3600000 | ||
const resultCalcInMinutes = resultCalcInHours * 60; | ||
const resultCalcInSeconds = resultCalcInHours * 3600; | ||
const resultHours = parseInt(resultCalcInHours); | ||
const resultMinutes = ((parseFloat(resultCalcInHours)) - resultHours) * 60; | ||
|
||
const resultObject = { | ||
startHour: startHour, | ||
finalHour: finalHour, | ||
resultCalcInMs: resultCalcInMs, | ||
resultCalcInHours: resultCalcInHours, | ||
resultCalcInMinutes: resultCalcInMinutes, | ||
resultCalcInSeconds: resultCalcInSeconds, | ||
resultHours: resultHours, | ||
resultMinutes: resultMinutes | ||
} | ||
|
||
if (!isValidDate(startHour, finalHour) || !isValidResult(resultCalcInMs)) { | ||
createLog("aditional", "Error - Falha na realização do Cálculo das horas", message); | ||
reject({ | ||
error: true, | ||
message: "Error: Invalid inputs for calculating." | ||
}); | ||
} else { | ||
createLog("normal", "Sucesso - Cálculo das horas."); | ||
resolve( | ||
createResponse(resultObject) | ||
); | ||
} | ||
}); | ||
} | ||
|
||
function isValidDate(start, final) { | ||
const minDate = moment("1900-01-01", "YYYY-MM-DD"); | ||
const maxDate = moment("3000-12-31", "YYYY-MM-DD"); | ||
const startDate = moment(start, "YYYY-MM-DD HH:mm:ss"); | ||
const finalDate = moment(final, "YYYY-MM-DD HH:mm:ss"); | ||
|
||
if (!(moment(startDate).isValid())) { | ||
createLog("normal", "Falhou - Validação - Data Inicial.") | ||
return false; | ||
} | ||
if (!(moment(finalDate).isValid())) { | ||
createLog("normal", "Falhou - Validação - Data Final"); | ||
return false; | ||
} | ||
if (startDate > maxDate || startDate < minDate) { | ||
createLog("normal", "Falhou - Validação - Data Inicial."); | ||
return false; | ||
} | ||
if (finalDate > maxDate || finalDate < minDate) { | ||
return false | ||
} | ||
return true; | ||
} | ||
|
||
function isValidResult(result) { | ||
if (isNaN(result) || result < 0) { | ||
return false; | ||
} else { | ||
return true; | ||
} | ||
} | ||
|
||
function createResponse(resultObj) { | ||
const diffMinutes = resultObj.resultMinutes.toFixed(0); | ||
const result = { | ||
input: | ||
{ | ||
startHour: moment(resultObj.startHour).format("DD/MM/YYYY - HH:mm:ss"), | ||
finalHour: moment(resultObj.finalHour).format("DD/MM/YYYY - HH:mm:ss") | ||
}, | ||
result: | ||
{ | ||
diffHours: resultObj.resultHours.toString(), | ||
diffMinutes: diffMinutes.toString() | ||
}, | ||
rawResult: | ||
{ | ||
diffInHours: resultObj.resultCalcInHours.toString(), | ||
diffInMinutes: resultObj.resultCalcInMinutes.toString(), | ||
diffInSeconds: resultObj.resultCalcInSeconds.toString(), | ||
diffInMillisec: resultObj.resultCalcInMs.toString() | ||
} | ||
} | ||
return result; | ||
} | ||
|
||
app.get("/src/scripts", (req, res) => { | ||
res.sendFile(path.join(__dirname, "./scripts/hourcalculator.js")); | ||
}); | ||
|
||
app.get("/src/style", (req, res) => { | ||
res.sendFile(path.join(__dirname, "./style/main.css")); | ||
}); | ||
|
||
app.use((req, res) => { | ||
res.render(path.join(__dirname, './index.html')); | ||
}); | ||
// Server port. | ||
app.listen(9999, () => { | ||
createLog("normal", "Servidor inicializado na porta 9999."); | ||
}); |
Binary file not shown.
Oops, something went wrong.