Skip to content

Commit

Permalink
aula 9
Browse files Browse the repository at this point in the history
  • Loading branch information
leasampaio committed Apr 16, 2021
1 parent a5e2ccc commit ca0b289
Show file tree
Hide file tree
Showing 24 changed files with 1,629 additions and 121 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules
config
config
.env
19 changes: 19 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "Run Nodemon",
"runtimeExecutable": "nodemon",
"restart": true,
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/api/agendamentos/Agendamento.js"
}
]
}
111 changes: 86 additions & 25 deletions api/Serializar.js
Original file line number Diff line number Diff line change
@@ -1,49 +1,110 @@
const FormatoInvalido = require('./erros/Formatoinvalido');
const FormatoInvalido = require('./errors/FormatoInvalido');
const jsonxml = require('jsontoxml')

class Serializar {
json (dados){
json(dados) {
return JSON.stringify(dados)
}
transformar(dados){
if(this.contentType !== 'application/json'){
throw new FormatoInvalido(this.contentType);

};

xml(dados){
if(Array.isArray(dados)){
dados = dados.map((item)=>{
return{
[this.tag]: item
}
})
this.tag=this.tagList;
}
return this.json(this.filtrar(dados));
return jsonxml({
[this.tag]:dados
})
}
filtrarCampos (dados){

transformar(dados) {
dados = this.filtrar(dados)
if(this.contentType ==='application/json'){

return this.json(
dados
)
}

if(this.contentType ==='application/xml'){

return this.xml(
dados
)
}

throw new FormatoInvalido(this.contentType)


};

filtrarCampos(dados) {
const camposFiltrados = {};
this.camposPermitidos.forEach(campo => {
if(dados.hasOwnProperty(campo)){
camposFiltrados[campo]= dados[campo];
this.camposPermitidos.forEach((campo) => {
if(dados.hasOwnProperty(campo)) {
camposFiltrados[campo] = dados[campo];
}

});

return camposFiltrados;
}
filtrar(dados){
let dadosFiltrados = this.filtrarCampos(dados);
};

if(Array.isArray(dados)){
dadosFiltrados = dados.map((dados)=>{
return this.filtrarCampos(dados);
filtrar(dados) {
let dadosFiltrados = this.filtrarCampos(dados);

})
if(Array.isArray(dados)) {
dadosFiltrados = dados.map((dado) => {
return this.filtrarCampos(dado);
});
}

return dadosFiltrados;
}
}

class SerializarAgendamento extends Serializar{
constructor(contentType, camposPersonalizados){
class SerializarAgendamento extends Serializar {
constructor(contentType, camposPersonalizados) {
super()
this.contentType = contentType;
this.camposPermitidos = ['id', 'nome_cliente', 'data_agendamento'].concat(camposPersonalizados || [])
this.camposPermitidos = [
'id', 'nome_cliente', 'data_agendamento'
].concat(camposPersonalizados || []);
this.tag = 'Agendamento'
this.tag = 'Agendamentos';
}
}

class SerializarErro extends Serializar {
constructor(contentType, camposPersonalizados) {
super();
this.contentType = contentType;
this.camposPermitidos = [
'id', 'mensagem'
].concat(camposPersonalizados || []);
this.tag = 'Error';
this.tagList = 'Erros'
}
}
module.exports ={
class SerializarUsuario extends Serializar{
constructor(contentType, camposPersonalizados){
super();
this.contentType = contentType;
this.camposPermitidos =[
'id', 'email', 'senha'
].concat (camposPersonalizados|| []);
this.tag = 'Usuario';
this.tagList = 'Usuarios'
}
}


module.exports = {
Serializar: Serializar,
SerializarAgendamento: SerializarAgendamento,
FormatosValidos : ['application/json']
SerializarError: SerializarErro,
SerializarUsuario,
FormatosValidos: ['application/json', 'application/xml']
}
47 changes: 34 additions & 13 deletions api/agendamentos/Agendamento.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@

const TabelaAgendamento = require('./TabelaAgendamento')
const CampoInvalido = require('../errors/CampoInvalido');
const TabelaAgendamento = require('./TabelaAgendamento');
const DadosNaoInformados = require('../errors/DadosNaoInformados');
const NaoEncontrado = require('../errors/NaoEncontrado');

class Agendamento {
constructor({id, nome_cliente, nome_servico, status, data_agendamento,
Expand All @@ -14,6 +16,7 @@ class Agendamento {
}

async criar(){
this.validar()
const result = await TabelaAgendamento.adicionar({
nome_cliente: this.nome_cliente,
nome_servico: this.nome_servico,
Expand All @@ -27,31 +30,49 @@ class Agendamento {

async buscar() {
const result = await TabelaAgendamento.buscarPorPK(this.id);
if(!result){
throw new NaoEncontrado('Agendamento');
}
this.nome_servico = result.nome_servico;
this.nome_cliente = result.nome_cliente;
this.status = result.status;
this.data_agendamento = result.data_agendamento;
this.data_criação = result.data_criacao;
this.data_atualizacao = result.data_atualizacao;
}

async remover() {
await TabelaAgendamento.remover(this.id)
}
async atualizar(){
await TabelaAgendamento.buscarPorPK(this.id)
const camposAtualizaveis = ['nome_cliente','nome_servico','status','data_agendamento']

async atualizar() {
this.validar()
await TabelaAgendamento.buscarPorPK(this.id);
const camposAtualizaveis = ['nome_cliente', 'nome_servico', 'status', 'data_agendamento']
const dadosAtualizar = {}
camposAtualizaveis.forEach((campo)=>{
const valor = this [campo];
if(typeof valor === 'string' && valor.length>0){
dadosAtualizar[campo]= valor;

camposAtualizaveis.forEach((campo) => {
const valor = this[campo];
if(typeof valor === 'string' && valor.length > 0) {
dadosAtualizar[campo] = valor
}
})
await TabelaAgendamento.atualizar(this.id, dadosAtualizar )

});

if(Object.keys(dadosAtualizar).length === 0) {
throw new DadosNaoInformados()
}

await TabelaAgendamento.atualizar(this.id, dadosAtualizar);
}

validar() {
const camposObrigatorios = ['nome_cliente', 'nome_servico', 'status', 'data_agendamento']

camposObrigatorios.forEach((campo) => {
const valor = this[campo];
if(typeof valor !== 'string' || valor.length === 0) {
throw new CampoInvalido(campo)
}
});
}
}
module.exports = Agendamento;
49 changes: 42 additions & 7 deletions api/config/configExpress.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,58 @@
const express = require('express');
const router = require('../routes/agendamentos');
const FormatoInvalido = require ('../erros/Formatoinvalido');
const routersAgendamento = require('../routes/agendamentos');
const routersUsuarios = require('../routes/usuarios')
const routersLogin = require('../routes/login')
const FormatoInvalido = require('../errors/FormatoInvalido');
const FormatosValidos = require('../Serializar').FormatosValidos;
const NaoEncontrado = require('../errors/NaoEncontrado');
const CampoInvalido = require('../errors/CampoInvalido');
const SerializarError = require('../Serializar').SerializarError;
const DadosNaoInformados = require('../errors/DadosNaoInformados');
const passport = require('../usuarios/autenticacao');

module.exports =()=>{
module.exports = () => {
const app = express()
app.use((req, resp, next) =>{

app.use((req, resp, next) => {
let formatoSolicitado = req.header('Accept');
if(formatoSolicitado === '*/*'){
formatoSolicitado = 'application/json'
}
if(FormatosValidos.indexOf(formatoSolicitado) === -1){
if(FormatosValidos.indexOf(formatoSolicitado) === -1) {
resp.status(406);
return resp.send();
}

resp.setHeader('Content-Type', formatoSolicitado);
next();
})
});
app.use(express.json())
app.use('/api', router)
app.use('/api', routersAgendamento)
app.use('/api', routersUsuarios)
app.use('/api', routersLogin)

app.use((error, req, resp, next) => {
let status = 500;
if(error instanceof CampoInvalido || error instanceof DadosNaoInformados) {
status = 400
}
if(error instanceof NaoEncontrado) {
status = 404
}
if(error instanceof FormatoInvalido) {
status = 406
}
serializarError = new SerializarError(
resp.getHeader('Content-Type')
)

resp.status(status).send(
serializarError.transformar({
id: error.idError,
mensagem: error.message
})
);
})

return app
}
12 changes: 10 additions & 2 deletions api/db/criarTabela.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
const ModeloTabelaAgendamento = require('../agendamentos/modelTabelaAgendamento');
const ModeloTabelaUsuario = require('../usuarios/modelTabelaUsuarios')

ModeloTabelaAgendamento.sync()
.then(()=> {
console.log('Tabela criada com sucesso')
})
.catch(() => {
console.log('Erro, tabela não criada')
.catch((error) => {
console.log('Erro, tabela não criada',error)
});
ModeloTabelaUsuario.sync()
.then(()=> {
console.log('Tabela criada com sucesso')
})
.catch((error) => {
console.log('Erro, tabela não criada', error)
});
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class DadosNaoInformados extends Error {
super('Dados não informados');
this.name ='DadosNaoInformados';
this.idError = 3;
this.mensagem = 'Dados não informados';

}
}
Expand Down
File renamed without changes.
9 changes: 9 additions & 0 deletions api/errors/LoginInvalido.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class LoginInvalido extends Error{
constructor(){
super('email ou senha inválidos!')
this.name = 'LoginInvalido'
this.idError = 7;
}
}

module.exports= LoginInvalido;
4 changes: 2 additions & 2 deletions api/erros/NaoEncontrado.js → api/errors/NaoEncontrado.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
class NaoEncontrado extends Error{
constructor(agendamento){
super('O agendamento não foi encontrado!');
constructor(classe){
super(`O ${classe} não foi encontrado!`);
this.name = 'NaoEncontrado';
this.id = 4;

Expand Down
1 change: 1 addition & 0 deletions api/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require('dotenv').config();
const configExpress = require('./config/configExpress');
const config = require('config');

Expand Down
Loading

0 comments on commit ca0b289

Please sign in to comment.