├── .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 += `
7 |
8 | 9 |
${element.titulo}
10 |
${element.status}
11 |

${element.descricao}

12 | 13 | 14 |
15 |
` 16 | }); 17 | 18 | 19 | 20 | 21 | return ` 22 | 23 | 24 | 25 | 26 | TODO App 27 | 28 | 29 | 30 | 31 | 34 |
35 |
36 |
37 | 38 | 39 |
40 | 41 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 | 50 |
51 | 52 |
53 |
54 |
55 |
56 | 57 | ${cards} 58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | ` 66 | } 67 | 68 | module.exports = geraView; --------------------------------------------------------------------------------