├── .gitignore
├── bancoDeDados.db
├── src
├── database
│ ├── db.js
│ └── creatingDatabase.js
├── routes
│ └── rotas.js
├── public
│ ├── deleteCard.js
│ └── updateCard.js
├── controllers
│ └── tarefas-controller.js
├── DAO
│ └── tarefas-dao.js
└── views
│ └── template_todo_app.js
├── package.json
├── server.js
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/bancoDeDados.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanvalverde/projetoExpress/HEAD/bancoDeDados.db
--------------------------------------------------------------------------------
/src/database/db.js:
--------------------------------------------------------------------------------
1 | const sqlite3 = require('sqlite3').verbose();
2 | const bd = new sqlite3.Database('bancoDeDados.db');
3 |
4 |
5 | //Processamento de sinal
6 | process.on('SIGINT', () =>
7 | bd.close(() => {
8 | console.log('BD encerrado!');
9 | process.exit(0);
10 | })
11 | );
12 |
13 | module.exports = bd;
--------------------------------------------------------------------------------
/src/routes/rotas.js:
--------------------------------------------------------------------------------
1 | const TarefasController = require('../controllers/tarefas-controller.js')
2 |
3 |
4 | module.exports = (app) => {
5 |
6 | app.get('/',TarefasController.geradorTarefas());
7 |
8 | app.post('/',TarefasController.adicionaTarefas());
9 |
10 | app.delete('/:id',TarefasController.removeTarefas());
11 |
12 | app.put('/update/:id',TarefasController.atualizaTarefas());
13 |
14 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "trabalho",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node server.js"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "body-parser": "^1.19.0",
14 | "cors": "^2.8.5",
15 | "express": "^4.17.1",
16 | "method-override": "^3.0.0",
17 | "sqlite3": "^5.0.0"
18 | },
19 | "devDependencies": {
20 | "nodemon": "^2.0.4"
21 | },
22 | "engines": {
23 | "node": "14.x"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/public/deleteCard.js:
--------------------------------------------------------------------------------
1 | let deleteButtons = document.querySelectorAll(".delete");
2 |
3 | deleteButtons.forEach((btn)=>{
4 |
5 | btn.addEventListener('click', (event)=>{
6 | let elementoClicado = event.target;
7 |
8 | if (elementoClicado.classList.contains("delete")){
9 | let tarefasId = elementoClicado.parentNode.childNodes[1].innerText;
10 | fetch(`/${tarefasId}`,
11 | {method: 'DELETE'})
12 | .then(() => {elementoClicado.parentNode.parentNode.remove();})
13 | .catch((err) => console.log(err));
14 | }
15 |
16 | });
17 |
18 | });
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const rotas = require('./src/routes/rotas.js')
3 |
4 | const app = express();
5 | const bodyParser = require('body-parser');
6 | const methodOverride = require('method-override');
7 | const cors = require('cors');
8 | const port = process.env.PORT || 3000;
9 |
10 | app.use(cors())
11 | app.use(bodyParser.urlencoded({
12 | extended: true
13 | }));
14 |
15 | app.use(bodyParser.json());
16 |
17 | app.use(methodOverride(function (req, res) {
18 | if (req.body && typeof req.body === 'object' && '_method' in req.body && req.body.idTarefa != 'null') {
19 | var method = req.body._method
20 | delete req.body._method
21 | return method
22 | }
23 | }))
24 |
25 | app.use('/estatico',express.static(__dirname + '/src/public'));
26 |
27 | rotas(app);
28 |
29 | app.listen(port, () => {
30 | console.log(`Example app listening at http://localhost:${port}`);
31 | })
--------------------------------------------------------------------------------
/src/public/updateCard.js:
--------------------------------------------------------------------------------
1 | let editButtons = document.querySelectorAll(".edit");
2 | let updateButtons = document.querySelectorAll(".save");
3 |
4 | editButtons.forEach((btn)=>{
5 | btn.addEventListener('click', ()=>{
6 | let form = document.querySelector("#formHttp");
7 | let card = btn.parentNode;
8 | let idDatabase = card.childNodes[1].innerText;
9 | let titulo = document.querySelector(`#titulo${idDatabase}`);
10 | let status = document.querySelector(`#status${idDatabase}`);
11 | let descricao = document.querySelector(`#descricao${idDatabase}`);
12 | let botaoEditar = document.querySelector("#adicionarTarefa");
13 |
14 | botaoEditar.innerText = "Editar Tarefa";
15 | form[1].value = idDatabase;
16 | form[2].value = titulo.innerText;
17 | form[3].value = status.innerText;
18 | form[4].value = descricao.innerText;
19 | form.action = `/update/${idDatabase}`;
20 | });
21 | });
--------------------------------------------------------------------------------
/src/database/creatingDatabase.js:
--------------------------------------------------------------------------------
1 | let sqlite3 = require('sqlite3').verbose();
2 | var db = new sqlite3.Database('bancoDeDados.db', (err) => {
3 | if (err) {
4 | console.error(err.message);
5 | }
6 | });
7 |
8 | const tarefasTabela = `CREATE TABLE IF NOT EXISTS Tarefas(
9 | id_tarefas INTEGER PRIMARY KEY AUTOINCREMENT,
10 | titulo TEXT,
11 | descricao TEXT,
12 | status TEXT
13 | )`;
14 |
15 | const inserindoDados = `INSERT INTO Tarefas(titulo, descricao, status)
16 | VALUES ('Malhar', 'Todo dia na academia as 18h', 'To do'),
17 | ('Aula', 'Todo dia às 13:00 é o horário do Resilia', 'Doing'),
18 | ('Almoçar', 'Antes de começar a aula', 'Done')`;
19 |
20 | db.serialize(()=>{
21 |
22 | db.run(tarefasTabela, (err)=>{
23 | if(err){
24 | console.log("Erro na criação da tabela");
25 | process.exit(1);
26 | }
27 | });
28 |
29 | db.run(inserindoDados, (err)=>{
30 | if(err){
31 | console.log("Erro na inserção de dados");
32 | process.exit(1);
33 | }
34 | });
35 |
36 | });
--------------------------------------------------------------------------------
/src/controllers/tarefas-controller.js:
--------------------------------------------------------------------------------
1 | let bd = require('../database/db.js');
2 | const TarefasDao = require('../DAO/tarefas-dao');
3 | const geraView = require('../views/template_todo_app');
4 |
5 | class TarefasController{
6 |
7 | static geradorTarefas(){
8 | return ((req,res)=>{
9 |
10 | const tarefasDao = new TarefasDao(bd);
11 |
12 | tarefasDao.mostra()
13 | .then( (rows)=>{
14 |
15 | if(rows.length>0){
16 |
17 | res.send(geraView(rows));
18 |
19 | };
20 | })
21 | .catch(erro => console.log(erro));
22 | })
23 | }
24 |
25 | static adicionaTarefas(){
26 | return ((req, res)=>{
27 | const tarefasDao = new TarefasDao(bd);
28 |
29 | tarefasDao.adiciona(req.body)
30 | .then(res.redirect('/'))
31 | .catch(erro => console.log(erro));
32 | })
33 | }
34 |
35 | static removeTarefas(){
36 | return ((req, res)=>{
37 | const tarefasDao = new TarefasDao(bd);
38 |
39 | tarefasDao.deleta(req.params.id)
40 | .then((resp)=>res.send(resp))
41 | .catch(erro => console.log(erro));
42 | })
43 | }
44 |
45 | static atualizaTarefas(){
46 | return ((req, res)=>{
47 | const tarefasDao = new TarefasDao(bd);
48 |
49 | tarefasDao.atualiza(req.params.id, req.body)
50 | .then(res.redirect('/'))
51 | .catch(erro => console.log(erro));
52 | })
53 | }
54 | }
55 |
56 | module.exports = TarefasController;
--------------------------------------------------------------------------------
/src/DAO/tarefas-dao.js:
--------------------------------------------------------------------------------
1 | class TarefasDao {
2 |
3 | constructor(db){
4 | this._db = db;
5 | }
6 |
7 | adiciona(tarefa){
8 | return new Promise((resolve, reject) =>{
9 | this._db.run(`INSERT INTO Tarefas (titulo, descricao, status) VALUES (?,?,?)`,
10 | [tarefa.titulo, tarefa.descricao, tarefa.status],
11 | (err)=>{
12 | if(err){
13 | console.log(err);
14 | return reject(`Não foi possível adicionar a tarefa!`);
15 | }
16 |
17 | resolve();
18 | });
19 | });
20 | }
21 |
22 | mostra(){
23 | return new Promise((resolve,reject)=>{
24 | this._db.all(`SELECT * FROM Tarefas;`, (err, rows)=>{
25 |
26 | if (err) return reject('Não foi possível mostrar as tarefas!');
27 |
28 | return resolve(rows);
29 | })
30 | })
31 | }
32 |
33 | deleta(tarefa){
34 | return new Promise((resolve, reject) =>{
35 | this._db.run(`DELETE FROM Tarefas WHERE id_tarefas=?`, [tarefa],
36 | (err)=>{
37 | if(err){
38 | console.log(err);
39 | reject(`Não foi possível remover a tarefa!`);
40 | }
41 |
42 | resolve();
43 | });
44 | });
45 | }
46 |
47 | atualiza(elemento, info){
48 | return new Promise((resolve, reject) =>{
49 | this._db.run(`UPDATE Tarefas SET titulo = ?, status= ?, descricao = ? WHERE id_tarefas=?`,
50 | [info.titulo, info.status, info.descricao, elemento],
51 | (err)=>{
52 | if(err){
53 | console.log(err);
54 | reject(`Não foi possível atualizar a tarefa!`);
55 | }
56 |
57 | resolve();
58 | });
59 | });
60 | }
61 |
62 | }
63 |
64 | module.exports = TarefasDao;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Documentação
2 | Aplicativo que facilita a organização de suas tarefas.
3 |
4 | # Dependências do projeto
5 |
6 | ***Sqlite3:*** Banco de dados utilizado no projeto;
7 | ***Express:*** Framework Web estruturado escrito em javascript que roda sobre ambiente Node.js em tempo de execução ;
8 | ***Body-parser:*** Módulo para conversão do *body* da requisição para vários formatos;
9 | ***Cors:*** Módulo que permite o acesso a recursos restritos na página por outros domínios.
10 |
11 | ## Instalação das dependências
12 |
13 | No terminal do seu editor de texto(ou em algum terminal, com o node.js instalado), para instalar todas as dependências basta digitar *npm install* (serão instaladas as versões das extensões/módulos armazenadas nos arquivos *package.json* e *package-lock.json*)
14 |
15 | # Como funciona
16 |
17 | O site disponibiliza o armazenamento no banco de dados de tarefas fornecidas pelo usuário. Tudo é realizado através de botões presentes na página principal do site. Ao clicar em um dos botões é feita uma busca pela rota da API associada a tal responsabilidade, e realizada a respectiva operação.
18 |
19 | # Rotas
20 |
21 | ***GET:*** Rota para acesso tradicional à API com o objetivo de fazer acesso ao seu conteúdo (https://localhost:3000);
22 | ***POST:*** Utiliza a mesma URI da rota tradicional porém com o verbo HTTP post. É realizada ao clicar no botão de adicionar um novo card de tarefas (https://localhost:3000). As informações preenchidas no card são enviadas através do corpo da requisição;
23 | ***DELETE:*** Rota para deleção de um card previamente criado. É recebido um parâmetro através da URI que identifica o id do elemento(banco) a ser removido (https://localhost:3000/id). Esta operação é realizada ao clicar no botão deletar;
24 | ***PUT:*** Rota para edição de um card previamente criada. É recebido um parâmetro através da URI do site que identifica o elemento a ser modificado e são recebidas as informações à serem modificadas pelo corpo da requisição (https://localhost:3000/update/id);
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/views/template_todo_app.js:
--------------------------------------------------------------------------------
1 | function geraView(dados){
2 |
3 | let cards = "";
4 |
5 | dados.forEach((element, index) => {
6 | cards += `
${element.id_tarefas}
9 |${element.descricao}
12 | 13 | 14 |