Skip to content

Commit

Permalink
Era pra ser uma PR do Scaffolding, mas acabei corrigindo o roteador t…
Browse files Browse the repository at this point in the history
…ambém. (#33)

* Refatoração de processo de registro de rotas.
* Gerando rotas separadas entre rotas com id e sem id.
  • Loading branch information
leonelsanchesdasilva authored Jan 15, 2024
1 parent 74159a1 commit 1200939
Show file tree
Hide file tree
Showing 7 changed files with 346 additions and 441 deletions.
6 changes: 4 additions & 2 deletions index-gerar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,10 @@ const pontoDeEntradaGerar = async (argumentos: string[]) => {
const nomeBaseModelo = declaracaoModelo.simbolo.lexema.toLocaleLowerCase('pt');
const nomeModeloPlural = pluralizar(nomeBaseModelo).toLocaleLowerCase('pt');

const caminhoControlador = geradorRotas.criarNovasRotas(declaracaoModelo);
console.info(`Controlador ${caminhoControlador}`);
const caminhosRotas: string[] = geradorRotas.criarNovasRotas(declaracaoModelo);
for (const caminhoRota of caminhosRotas) {
console.info(`Rota ${caminhoRota}`);
}

// Visões
criarDiretorioSeNaoExiste('visoes', nomeModeloPlural);
Expand Down
227 changes: 2 additions & 225 deletions infraestrutura/roteador/index.ts
Original file line number Diff line number Diff line change
@@ -1,225 +1,2 @@
import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser';
import cors from 'cors';
import express, { NextFunction, Request, Response } from 'express';
import helmet from 'helmet';
import jwt from 'jwt-simple';
import morgan from 'morgan';

import { VariavelInterface } from '@designliquido/delegua/fontes/interfaces';

import users from '../../usuarios';
import autenticacao from '../utilidades/autenticacao';

import { devolverVariavelAmbiente } from '../utilidades/variaveis-ambiente';

export class Roteador {
aplicacao: express.Express;
porta: number;

morgan = false;
helmet = false;
expressJson = false;
cookieParser = false;
bodyParser = false;

cors = false;
passport = false;

constructor() {
this.aplicacao = express();
this.porta = Number(process.env.PORTA) || Number(process.env.PORT) || 3000;
}

configurarArquivosEstaticos(diretorio: string = 'publico'): void {
this.aplicacao.use(express.static(diretorio, { redirect: true }));
}

ativarMiddleware(nomePropriedade: string, informacoesVariavel: VariavelInterface) {
switch (nomePropriedade) {
case 'cors':
this.ativarDesativarCors(informacoesVariavel.valor);
break;
case 'cookieParser':
this.ativarDesativarCookieParser(informacoesVariavel.valor);
break;
case 'bodyParser':
this.ativarDesativarBodyParser(informacoesVariavel.valor);
break;
case 'json':
this.ativarDesativarExpressJson(informacoesVariavel.valor);
break;
case 'passport':
this.ativarDesativarPassport(informacoesVariavel.valor);
break;
case 'morgan':
this.ativarDesativarMorgan(informacoesVariavel.valor);
break;
case 'helmet':
this.ativarDesativarHelmet(informacoesVariavel.valor);
break;
case 'diretorioEstatico':
this.configurarArquivosEstaticos(informacoesVariavel.valor);
break;
default:
console.log(`Método ${nomePropriedade} não reconhecido.`);
break;
}
}

iniciarMiddlewares() {
if (this.morgan) {
this.aplicacao.use(morgan('dev'));
}

if (this.helmet) {
this.aplicacao.use(helmet());
}

if (this.bodyParser) {
this.aplicacao.use(bodyParser.json());
}

if (this.expressJson) {
this.aplicacao.use(express.json());
}

if (this.cookieParser) {
this.aplicacao.use(cookieParser());
}

if (this.cors) {
this.aplicacao.use(cors());
}

if (this.passport) {
this.aplicacao.use(autenticacao().initialize());
}
}

ativarDesativarCors(valor: boolean): void {
this.cors = valor;
}

ativarDesativarPassport(valor: boolean): void {
this.passport = valor;
}

ativarDesativarCookieParser(valor: boolean): void {
this.cookieParser = valor;
}

ativarDesativarExpressJson(valor: boolean): void {
this.expressJson = valor;
}

ativarDesativarBodyParser(valor: boolean): void {
this.bodyParser = valor;
}

ativarDesativarHelmet(valor: boolean): void {
this.helmet = valor;
}

ativarDesativarMorgan(valor: boolean): void {
this.morgan = valor;
}

rotaGet(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.get(caminho, execucao);
}

rotaPost(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.post(caminho, execucao);
}

rotaPut(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.put(caminho, execucao);
}

rotaPatch(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.patch(caminho, execucao);
}

rotaDelete(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.delete(caminho, execucao);
}

rotaOptions(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.options(caminho, execucao);
}

rotaCopy(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.copy(caminho, execucao);
}

rotaHead(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.head(caminho, execucao);
}

rotaLock(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.lock(caminho, execucao);
}

rotaUnlock(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.unlock(caminho, execucao);
}

rotaPurge(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.purge(caminho, execucao);
}

rotaPropfind(caminho: string, execucao: (req: Request, res: Response) => void) {
this.aplicacao.propfind(caminho, execucao);
}

adicionandoRotaToken() {
this.aplicacao.post('/token', (req: Request, res: Response) => {
if (req.body.email && req.body.senha) {
const { email, senha } = req.body;
const usuario = users.find((u) => {
return u.email === email && u.senha === senha;
});
if (usuario) {
const payload = {
id: usuario.id
};
const token = jwt.encode(payload, devolverVariavelAmbiente('chaveSecreta') as string);
users.find((u) => u.id === usuario.id).token = token;
return res.json({ token });
} else {
res.sendStatus(401);
}
} else {
res.sendStatus(401);
}
});
}

validarToken(req: Request, res: Response, next: NextFunction) {
const token = req.headers['authorization'];
if (token) {
try {
const decoded = jwt.decode(token, devolverVariavelAmbiente('chaveSecreta') as string);
if (decoded) {
next();
} else {
res.sendStatus(401);
}
} catch (error) {
res.sendStatus(401);
}
} else {
res.sendStatus(401);
}
}

iniciar() {
if (this.passport === true) {
this.adicionandoRotaToken();
}
this.aplicacao.listen(this.porta, () => {
console.log(`Aplicação iniciada na porta ${this.porta}`);
});
}
}
export * from './metodo-roteador';
export * from './roteador';
14 changes: 14 additions & 0 deletions infraestrutura/roteador/metodo-roteador.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export const MetodoRoteador = {
Get: 'Get',
Post: 'Post',
Put: 'Put',
Delete: 'Delete',
Patch: 'Patch',
Options: 'Options',
Copy: 'Copy',
Head: 'Head',
Lock: 'Lock',
Unlock: 'Unlock',
Purge: 'Purge',
Propfind: 'Propfind'
};
Loading

0 comments on commit 1200939

Please sign in to comment.