├── .gitignore ├── db_todo.db ├── src ├── public │ ├── remove_task.js │ └── update_task.js ├── config │ ├── db_close_todoapp.js │ └── db_create_todoapp.js ├── paths │ └── path_tasks.js ├── server.js ├── controller │ └── task_controller.js ├── DAO │ └── tasks_DAO.js └── views │ └── template_todoapp.js ├── package.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules 3 | 4 | -------------------------------------------------------------------------------- /db_todo.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paula-gomes/To_do_App/HEAD/db_todo.db -------------------------------------------------------------------------------- /src/public/remove_task.js: -------------------------------------------------------------------------------- 1 | 2 | function deleteTask(event) { 3 | 4 | const idFetch = `${event.target.parentNode.dataset.idTasks}`; 5 | fetch(`http://localhost:3000/${idFetch}`, { method: "DELETE" }) 6 | .then(() => { event.target.parentNode.remove() }) 7 | .catch(err => console.log(err)); 8 | } 9 | 10 | -------------------------------------------------------------------------------- /src/config/db_close_todoapp.js: -------------------------------------------------------------------------------- 1 | const sqlite = require('sqlite3').verbose(); 2 | const db = new sqlite.Database('db_todo.db'); 3 | 4 | process.on('SIGINT', () => { 5 | 6 | db.close(() => { 7 | 8 | console.log('bd closed'); 9 | process.exit(0); 10 | }) 11 | }); 12 | 13 | module.exports = db; 14 | -------------------------------------------------------------------------------- /src/paths/path_tasks.js: -------------------------------------------------------------------------------- 1 | const { reset } = require('nodemon'); 2 | const taskShow = require('../controller/task_controller'); 3 | const db = require ('../config/db_close_todoapp'); 4 | const taskController = require('../controller/task_controller'); 5 | 6 | module.exports = (app) => { 7 | 8 | app.get('/', taskController.showTask()); 9 | 10 | app.delete('/:id', taskController.removeTask()); 11 | 12 | app.post('/tasks', taskController.addTask()); 13 | 14 | app.put('/tasks/:id',taskController.updateTask()); 15 | 16 | }; -------------------------------------------------------------------------------- /src/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const pathTasks = require('../src/paths/path_tasks'); 3 | const bodyParser = require('body-parser'); 4 | const methodOverRide = require('method-override'); 5 | const app = express(); 6 | const port = process.env.PORT || 3000; 7 | 8 | app.use('/static', express.static('src/public')); 9 | app.use(bodyParser.urlencoded({ extended: true })); 10 | app.use(methodOverRide(function (req, res) { 11 | if (req.body && typeof req.body === 'object' && '_method' in req.body && req.body.idTask != "null") { 12 | var method = req.body._method 13 | delete req.body._method 14 | return method 15 | } 16 | })); 17 | 18 | pathTasks(app); 19 | 20 | 21 | app.listen(port, () => console.log('server initialiazed')); 22 | module.exports = app; -------------------------------------------------------------------------------- /src/public/update_task.js: -------------------------------------------------------------------------------- 1 | let buttonEdit = document.querySelectorAll(".editTask"); 2 | 3 | 4 | function updateTask(event) { 5 | event.preventDefault(); 6 | buttonEdit.forEach((btn) => { 7 | 8 | btn.addEventListener('click', () => { 9 | 10 | const form = document.querySelector('#formTask'); 11 | let card = btn.parentNode; 12 | let idTask = `${event.target.parentNode.dataset.idTasks}`; 13 | let titleTask = card.childNodes[0].nextSibling.innerText; 14 | let descTask = card.childNodes[2].nextSibling.innerText; 15 | let statusTask = card.childNodes[4].nextSibling.innerText; 16 | 17 | form[1].value = idTask; 18 | form[2].value = titleTask; 19 | form[3].value = descTask; 20 | form[4].value = statusTask; 21 | form.action = `/tasks/${idTask}`; 22 | }) 23 | }) 24 | }; 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "to_do_app", 3 | "version": "1.0.0", 4 | "description": "Creation of a todo app using nodejs", 5 | "main": "server.js", 6 | "dependencies": { 7 | "body-parser": "^1.19.0", 8 | "cors": "^2.8.5", 9 | "express": "^4.17.1", 10 | "method-override": "^3.0.0", 11 | "sqlite3": "^5.0.0" 12 | }, 13 | "devDependencies": { 14 | "nodemon": "^2.0.4" 15 | }, 16 | "scripts": { 17 | "test": "echo \"Error: no test specified\" && exit 1", 18 | "start": "nodemon ./src/server.js" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/paula-gomes/To_do_App.git" 23 | }, 24 | "author": "", 25 | "license": "ISC", 26 | "bugs": { 27 | "url": "https://github.com/paula-gomes/To_do_App/issues" 28 | }, 29 | "homepage": "https://github.com/paula-gomes/To_do_App#readme", 30 | "engines": { 31 | "node": "10.x" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # To Do App 2 | Creation of a todo app using nodejs and Data Access Object Pattern (DAO pattern) 3 | 4 | ## Installing / Getting started 5 | 6 | ```shell 7 | $ git clone https://github.com/paula-gomes/To_do_App.git 8 | 9 | npm i express --save 10 | npm i nodemon --save-dev 11 | npm i sqlite3@latest 12 | npm start 13 | ``` 14 | By doing that you will clone the repository and install its dependencies 15 | 16 | # Features 17 | 18 | --CRUD operations-- 19 | 20 | * Add tasks (Create) 21 | 22 | * Display tasks (Read) 23 | 24 | * Edit tasks (Update) 25 | 26 | * Delete tasks (Delete) 27 | 28 | 29 | # Get it tested 30 | 31 | After setting up all dependecies, access on your local network : 32 | 33 | http://localhost:3000/ 34 | 35 | ### Suggested Tool 36 | 37 | * Insomnia Rest : provides a great comunication with ToDo app 38 | ##### Link - https://insomnia.rest/download/ 39 | 40 | 41 | 42 | # Project Status 43 | 44 | Still being developed and accepting contributions -------------------------------------------------------------------------------- /src/config/db_create_todoapp.js: -------------------------------------------------------------------------------- 1 | const sqlite = require('sqlite3').verbose(); 2 | const db = new sqlite.Database('db_todo.db'); 3 | 4 | const TASK_SCHEMA = ` 5 | CREATE TABLE IF NOT EXISTS tasks ( 6 | id_tasks INTEGER PRIMARY KEY AUTOINCREMENT, 7 | title_task VARCHAR(100), 8 | details_task TEXT, 9 | id_status VARCHAR(50) 10 | ) 11 | `; 12 | 13 | const ADD_TASKS = ` 14 | INSERT or IGNORE into tasks ( 15 | title_task, 16 | details_task, 17 | id_status 18 | ) 19 | VALUES 20 | ('Academia','Trocar de série Segunda-feira as 9:30','To do'), 21 | ('Reuniao com Luiza','programa de coaching Resilia toda segunda às 19:30','Every week') 22 | `; 23 | 24 | db.serialize(() => { 25 | 26 | db.run(TASK_SCHEMA, (err) => { 27 | if (err) { 28 | console.log("Could not create table tasks"); 29 | process.exit(1); 30 | } 31 | }); 32 | 33 | db.run(ADD_TASKS, (err) => { 34 | if (err) { 35 | console.log(err); 36 | process.exit(1); 37 | } 38 | }); 39 | 40 | }); 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/controller/task_controller.js: -------------------------------------------------------------------------------- 1 | const taskDao = require('../DAO/tasks_DAO'); 2 | const db = require('../config/db_close_todoapp'); 3 | const viewToDo = require('../views/template_todoapp'); 4 | 5 | class TaskController { 6 | 7 | static showTask() { 8 | 9 | return ((req, res) => { 10 | const taskDaoInstance = new taskDao(db); 11 | taskDaoInstance.viewTasks().then((row) => { 12 | if (row.length > 0) { 13 | res.send(viewToDo(row)) 14 | } 15 | else res.send(viewToDo()); 16 | }) 17 | .catch((err) => console.log(err)); 18 | }); 19 | 20 | } 21 | 22 | static removeTask() { 23 | 24 | return ((req, res) => { 25 | const taskDaoInstance = new taskDao(db); 26 | taskDaoInstance.removeTasks(req.params.id) 27 | .then(() => res.status(200).send("deleted")) 28 | .catch(err => console.log(err)); 29 | }); 30 | } 31 | 32 | static addTask() { 33 | 34 | return ((req, res) => { 35 | const taskDaoInstance = new taskDao(db); 36 | taskDaoInstance.addTasks(req.body.titleTask, req.body.descTask, req.body.statusTask) 37 | .then(()=>res.redirect('/')) 38 | .catch((err) => {console.log(err);}); 39 | }); 40 | }; 41 | 42 | static updateTask(){ 43 | 44 | return ((req,res)=>{ 45 | 46 | const taskDaoInstance = new taskDao(db); 47 | taskDaoInstance.updateTasks(req.body.titleTask, req.body.descTask, req.body.statusTask,req.params.id) 48 | .then(()=>res.redirect('/')) 49 | .catch((err) => { console.log (err);}); 50 | }); 51 | }; 52 | } 53 | 54 | module.exports = TaskController; -------------------------------------------------------------------------------- /src/DAO/tasks_DAO.js: -------------------------------------------------------------------------------- 1 | class TaskDao { 2 | 3 | constructor(db) { 4 | this._db = db; 5 | } 6 | 7 | viewTasks() { 8 | 9 | return new Promise((resolve, reject) => { 10 | this._db.all( 11 | `SELECT * FROM tasks`, 12 | (err, rows) => { 13 | if (err) return reject('Not able to show tasks'); 14 | 15 | return resolve(rows); 16 | } 17 | ) 18 | }); 19 | } 20 | 21 | removeTasks(id) { 22 | 23 | return new Promise((resolve, reject) => { 24 | this._db.run( 25 | `DELETE FROM tasks WHERE id_tasks = ? `, 26 | [id], 27 | (err) => { 28 | if (err) { 29 | console.log(err); 30 | return reject('Not able to delete task'); 31 | } 32 | return resolve(); 33 | } 34 | ); 35 | }); 36 | 37 | }; 38 | 39 | addTasks(title,desc,status){ 40 | 41 | return new Promise ((resolve, reject) => { 42 | this._db.run( 43 | `INSERT INTO tasks(title_task,details_task,id_status) VALUES (?, ?, ?)`, 44 | [title,desc,status], 45 | (err) => { 46 | if (err) { 47 | console.log(err) 48 | return reject('Not able to add task') 49 | } 50 | return resolve (); 51 | } 52 | ); 53 | }); 54 | }; 55 | 56 | updateTasks(title,desc,status,id){ 57 | 58 | return new Promise ((resolve,reject)=>{ 59 | this._db.run( 60 | `UPDATE tasks SET title_task=?, details_task=?, id_status =? WHERE id_tasks =?`, 61 | [title,desc,status,id], 62 | (err) => { 63 | if (err) { 64 | console.log(err) 65 | return reject('Not able to update task') 66 | } 67 | return resolve (); 68 | } 69 | 70 | ); 71 | }); 72 | }; 73 | } 74 | 75 | module.exports = TaskDao; -------------------------------------------------------------------------------- /src/views/template_todoapp.js: -------------------------------------------------------------------------------- 1 | function taskFunction(tasks) { 2 | 3 | let cardsTasks = ''; 4 | 5 | tasks.forEach(task => { 6 | 7 | cardsTasks += 8 | `
${task.details_task}
12 |${task.id_status}
13 | 14 | 15 |