├── .gitignore ├── infraestrutura ├── conexao.js └── tabelas.js ├── config └── customExpress.js ├── index.js ├── package.json ├── controllers └── atendimentos.js └── models └── atendimentos.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /infraestrutura/conexao.js: -------------------------------------------------------------------------------- 1 | const mysql = require('mysql') 2 | 3 | const conexao = mysql.createConnection({ 4 | host: 'localhost', 5 | port: 3307, 6 | user: 'root', 7 | password: 'admin', 8 | database: 'agenda-petshop' 9 | }) 10 | 11 | module.exports = conexao -------------------------------------------------------------------------------- /config/customExpress.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const consign = require('consign') 3 | const bodyParser = require('body-parser') 4 | 5 | module.exports = () => { 6 | const app = express() 7 | 8 | app.use(bodyParser.json()) 9 | app.use(bodyParser.urlencoded({ extended: true })) 10 | 11 | consign() 12 | .include('controllers') 13 | .into(app) 14 | 15 | return app 16 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const customExpress = require('./config/customExpress') 2 | const conexao = require('./infraestrutura/conexao') 3 | const Tabelas = require('./infraestrutura/tabelas') 4 | 5 | conexao.connect(erro => { 6 | if(erro) { 7 | console.log(erro) 8 | } else { 9 | console.log('conectado com sucesso') 10 | 11 | Tabelas.init(conexao) 12 | 13 | const app = customExpress() 14 | 15 | app.listen(3000, () => console.log('Servidor rodando na porta 3000')) 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /infraestrutura/tabelas.js: -------------------------------------------------------------------------------- 1 | class Tabelas { 2 | init(conexao) { 3 | this.conexao = conexao 4 | 5 | this.criarAtendimentos() 6 | } 7 | 8 | criarAtendimentos() { 9 | const sql = 'CREATE TABLE IF NOT EXISTS Atendimentos (id int NOT NULL AUTO_INCREMENT, cliente varchar(50) NOT NULL, pet varchar(20), servico varchar(20) NOT NULL, data datetime NOT NULL, dataCriacao datetime NOT NULL, status varchar(20) NOT NULL, observacoes text, PRIMARY KEY(id))' 10 | 11 | this.conexao.query(sql, erro => { 12 | if(erro) { 13 | console.log(erro) 14 | } else { 15 | console.log('Tabela Atendimentos criada com sucesso') 16 | } 17 | }) 18 | } 19 | } 20 | 21 | module.exports = new Tabelas -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "projeto-nodejs-rest", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/juunegreiros/nodejs-api-rest.git" 13 | }, 14 | "author": "juliana negreiros", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/juunegreiros/nodejs-api-rest/issues" 18 | }, 19 | "homepage": "https://github.com/juunegreiros/nodejs-api-rest#readme", 20 | "dependencies": { 21 | "consign": "^0.1.6", 22 | "express": "^4.17.1", 23 | "moment": "^2.24.0", 24 | "mysql": "^2.17.1" 25 | }, 26 | "devDependencies": { 27 | "nodemon": "^1.19.2" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /controllers/atendimentos.js: -------------------------------------------------------------------------------- 1 | const Atendimento = require('../models/atendimentos') 2 | 3 | module.exports = app => { 4 | app.get('/atendimentos', (req, res) => { 5 | Atendimento.lista(res) 6 | }) 7 | 8 | app.get('/atendimentos/:id', (req, res) => { 9 | const id = parseInt(req.params.id) 10 | 11 | Atendimento.buscaPorId(id, res) 12 | }) 13 | 14 | app.post('/atendimentos', (req, res) => { 15 | const atendimento = req.body 16 | 17 | Atendimento.adiciona(atendimento, res) 18 | }) 19 | 20 | app.patch('/atendimentos/:id', (req, res) => { 21 | const id = parseInt(req.params.id) 22 | const valores = req.body 23 | 24 | Atendimento.altera(id, valores, res) 25 | }) 26 | 27 | app.delete('/atendimentos/:id', (req, res) => { 28 | const id = parseInt(req.params.id) 29 | 30 | Atendimento.deleta(id, res) 31 | }) 32 | } -------------------------------------------------------------------------------- /models/atendimentos.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment') 2 | const conexao = require('../infraestrutura/conexao') 3 | 4 | class Atendimento { 5 | adiciona(atendimento, res) { 6 | const dataCriacao = moment().format('YYYY-MM-DD HH:MM:SS') 7 | const data = moment(atendimento.data, 'DD/MM/YYYY').format('YYYY-MM-DD HH:MM:SS') 8 | 9 | const dataEhValida = moment(data).isSameOrAfter(dataCriacao) 10 | const clienteEhValido = atendimento.cliente.length >= 5 11 | 12 | const validacoes = [ 13 | { 14 | nome: 'data', 15 | valido: dataEhValida, 16 | mensagem: 'Data deve ser maior ou igual a data atual' 17 | }, 18 | { 19 | nome: 'cliente', 20 | valido: clienteEhValido, 21 | mensagem: 'Cliente deve ter pelo menos cinco caracteres' 22 | } 23 | ] 24 | 25 | const erros = validacoes.filter(campo => !campo.valido) 26 | const existemErros = erros.length 27 | 28 | if(existemErros) { 29 | res.status(400).json(erros) 30 | } else { 31 | const atendimentoDatado = {...atendimento, dataCriacao, data} 32 | 33 | const sql = 'INSERT INTO Atendimentos SET ?' 34 | 35 | conexao.query(sql, atendimentoDatado, (erro, resultados) => { 36 | if(erro) { 37 | res.status(400).json(erro) 38 | } else { 39 | res.status(201).json(atendimento) 40 | } 41 | }) 42 | } 43 | 44 | } 45 | 46 | lista(res) { 47 | const sql = 'SELECT * FROM Atendimentos' 48 | 49 | conexao.query(sql, (erro, resultados) => { 50 | if(erro) { 51 | res.status(400).json(erro) 52 | } else { 53 | res.status(200).json(resultados) 54 | } 55 | }) 56 | } 57 | 58 | buscaPorId(id, res) { 59 | const sql = `SELECT * FROM Atendimentos WHERE id=${id}` 60 | 61 | conexao.query(sql, (erro, resultados) => { 62 | const atendimento = resultados[0] 63 | if(erro) { 64 | res.status(400).json(erro) 65 | } else { 66 | res.status(200).json(atendimento) 67 | } 68 | }) 69 | } 70 | 71 | altera(id, valores, res) { 72 | if(valores.data) { 73 | valores.data = moment(valores.data, 'DD/MM/YYYY').format('YYYY-MM-DD HH:MM:SS') 74 | } 75 | const sql = 'UPDATE Atendimentos SET ? WHERE id=?' 76 | 77 | conexao.query(sql, [valores, id], (erro, resultados) => { 78 | if(erro) { 79 | res.status(400).json(erro) 80 | } else { 81 | res.status(200).json({...valores, id}) 82 | } 83 | }) 84 | } 85 | 86 | deleta(id, res) { 87 | const sql = 'DELETE FROM Atendimentos WHERE id=?' 88 | 89 | conexao.query(sql, id, (erro, resultados) => { 90 | if(erro) { 91 | res.status(400).json(erro) 92 | } else { 93 | res.status(200).json({id}) 94 | } 95 | }) 96 | } 97 | } 98 | 99 | module.exports = new Atendimento --------------------------------------------------------------------------------