Skip to content

Commit

Permalink
add simplified version
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrielgfw committed Apr 24, 2023
1 parent 683d4c7 commit e102f03
Show file tree
Hide file tree
Showing 13 changed files with 1,866 additions and 18,446 deletions.
128 changes: 1 addition & 127 deletions README.md
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).
169 changes: 169 additions & 0 deletions app.js
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 removed examplo.gif
Binary file not shown.
Loading

0 comments on commit e102f03

Please sign in to comment.