diff --git a/dist/app.js b/dist/app.js index 2eed300f..ddcad0c9 100644 --- a/dist/app.js +++ b/dist/app.js @@ -38,6 +38,7 @@ const fileUpload = require('express-fileupload'); const routes_1 = require('./routes/routes'); const dotenv_1 = require('dotenv'); const AuthDAO_1 = require('./models/DAO/AuthDAO'); +const ApiResponse_1 = require('./models/ApiResponse'); dotenv_1.config({ path: __dirname + '/../.env' }); const app = express(); app.use( @@ -63,13 +64,14 @@ app.use( ], exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', - methods: 'GET,POST', + methods: 'GET, POST', preflightContinue: false, }) ); app.all('*', (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { const token = req.headers.token; + const apiResponse = new ApiResponse_1.ApiResponse(); if (token) { const authDAO = new AuthDAO_1.AuthDAO(token); authDAO @@ -80,14 +82,24 @@ app.all('*', (req, res, next) => if (auth.hasPermissionFor(req.url, req.method)) { next(); } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); + apiResponse.responseText = 'Usuário sem permissão para realizar a ação!'; + apiResponse.statusCode = 403; } }) .catch((err) => { - res.status(403).send('Usuário Inválido'); + apiResponse.responseText = 'Usuário Inválido!'; + apiResponse.statusCode = 401; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); } else { - res.status(403).send('Token não informado!'); + apiResponse.responseText = 'Token não informado!'; + apiResponse.statusCode = 401; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); } }) ); diff --git a/dist/models/ApiResponse.js b/dist/models/ApiResponse.js new file mode 100644 index 00000000..f45ef558 --- /dev/null +++ b/dist/models/ApiResponse.js @@ -0,0 +1,32 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +exports.ApiResponse = void 0; +class ApiResponse { + constructor(statusCode = 200, responseText = '', errorMessage = '') { + this._statusCode = statusCode; + this._responseText = responseText; + this._errorMessage = errorMessage; + } + set statusCode(statusCode) { + this._statusCode = statusCode; + } + set responseText(responseText) { + this._responseText = responseText; + } + set errorMessage(errorMessage) { + this._errorMessage = errorMessage; + } + get statusCode() { + return this._statusCode; + } + get responseText() { + return this._responseText; + } + get jsonResponse() { + return { + responseText: this._responseText, + errorMessage: this._errorMessage, + }; + } +} +exports.ApiResponse = ApiResponse; diff --git a/dist/models/DAO/AuthDAO.js b/dist/models/DAO/AuthDAO.js index 425a8198..693efdf5 100644 --- a/dist/models/DAO/AuthDAO.js +++ b/dist/models/DAO/AuthDAO.js @@ -19,7 +19,9 @@ class AuthDAO { const jsonAuth = data.data(); return new Auth_1.Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw err; + }); } addAuth(auth) { return this._objectStore diff --git a/dist/models/DAO/ConfigDAO.js b/dist/models/DAO/ConfigDAO.js index 3149b3b9..7f8d7866 100644 --- a/dist/models/DAO/ConfigDAO.js +++ b/dist/models/DAO/ConfigDAO.js @@ -13,6 +13,9 @@ class ConfigDAO { return this._objectStore .getAllDocumentsFrom(this._configCollection) .then((documents) => { + if (documents.length === 0) { + throw new Error('A empresa não possui nenhuma configuração!'); + } let lastDocument; documents.forEach((doc, index) => { if (index === 0) lastDocument = doc; @@ -20,7 +23,9 @@ class ConfigDAO { }); return new Config_1.Config(lastDocument); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw new Error(err.message); + }); } addConfig(config) { return new Promise((resolve, reject) => { @@ -37,7 +42,7 @@ class ConfigDAO { this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { - reject('Configuração inválida'); + throw new Error('Configuração inválida!'); } }) .catch((err) => reject(err)); diff --git a/dist/routes/build.js b/dist/routes/build.js index 6bb33e3e..eb137953 100644 --- a/dist/routes/build.js +++ b/dist/routes/build.js @@ -5,6 +5,7 @@ const FileDAO_1 = require('../models/DAO/FileDAO'); const DateUtils_1 = require('../utils/DateUtils'); const CsvUtils_1 = require('../utils/CsvUtils'); const Builder_1 = require('../controllers/Builder'); +const ApiResponse_1 = require('../models/ApiResponse'); const converter = require('json-2-csv'); const build = (app) => { app.post('/build/:media', (req, res) => { @@ -12,15 +13,17 @@ const build = (app) => { const company = req.company; const agency = req.agency; const campaign = req.headers.campaign; - if (!req.files.data) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + const apiResponse = new ApiResponse_1.ApiResponse(); + if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const fileContent = req.files.data.data; const filePath = agency @@ -31,20 +34,18 @@ const build = (app) => { configDAO .getLastConfig() .then((config) => { - if (config) { - companyConfig = config; + companyConfig = config; + if (companyConfig) { if (!companyConfig.toJson()[media]) { - res.status(400).send({ - message: `Mídia ${media} não configurada!`, - }); - return; + apiResponse.statusCode = 400; + throw new Error(`Mídia ${media} não foi configurada!`); } const fileDAO = new FileDAO_1.FileDAO(); fileDAO.file = fileContent; return fileDAO.save(filePath); } else { - res.status(400).send('Nenhuma configuração encontrada!'); - return; + apiResponse.statusCode = 500; + throw new Error('Nenhuma configuração encontrada!'); } }) .then(() => { @@ -63,7 +64,9 @@ const build = (app) => { csv += '\nConfiguracao inserida em;' + configTimestamp; res.setHeader('Content-disposition', 'attachment; filename=data.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - res.status(200).send(csv); + apiResponse.responseText = csv; + apiResponse.statusCode = 200; + res.status(apiResponse.statusCode).send(apiResponse.responseText); }, { delimiter: { @@ -73,7 +76,16 @@ const build = (app) => { ); }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + if (apiResponse.statusCode === 200) { + apiResponse.statusCode = 500; + } + apiResponse.responseText = 'Falha ao salvar o arquivo!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/dist/routes/config.js b/dist/routes/config.js index 8c66f5b1..ef9f564a 100644 --- a/dist/routes/config.js +++ b/dist/routes/config.js @@ -2,12 +2,16 @@ Object.defineProperty(exports, '__esModule', { value: true }); const ConfigDAO_1 = require('../models/DAO/ConfigDAO'); const Config_1 = require('../models/Config'); +const ApiResponse_1 = require('../models/ApiResponse'); const config = (app) => { app.post('/config', (req, res) => { const company = req.company; const configString = req.body.config; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!configString) { - res.status(400).send('Configuração não foi informada!'); + apiResponse.responseText = 'Configuração não foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const config = new Config_1.Config(JSON.parse(configString)); @@ -15,26 +19,35 @@ const config = (app) => { configDAO .addConfig(config) .then((data) => { - res.status(200).send('Configuração criada com sucesso!'); + apiResponse.responseText = 'Configuração criada com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao criar a configuração!'); + apiResponse.responseText = 'Erro ao criar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/config', (req, res) => { const company = req.company; const configDAO = new ConfigDAO_1.ConfigDAO(company); + const apiResponse = new ApiResponse_1.ApiResponse(); configDAO .getLastConfig() .then((config) => { - if (config) { - res.status(200).send(config.toString()); - } else { - res.status(200).send('{}'); - } + apiResponse.responseText = config.toString(); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Erro ao recuperar configuração!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/dist/routes/csv.js b/dist/routes/csv.js index d5994fac..df467356 100644 --- a/dist/routes/csv.js +++ b/dist/routes/csv.js @@ -2,17 +2,25 @@ Object.defineProperty(exports, '__esModule', { value: true }); const FileDAO_1 = require('../models/DAO/FileDAO'); const DateUtils_1 = require('../utils/DateUtils'); +const ApiResponse_1 = require('../models/ApiResponse'); const csv = (app) => { app.post('/csv', (req, res) => { const campaign = req.headers.campaign; - const content = req.files.data.data; const agency = req.agency; const company = req.company; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; + } else if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } + const content = req.files.data.data; const filePath = agency ? `${company}/${agency}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv` : `${company}/${campaign}/${DateUtils_1.DateUtils.generateDateString()}.csv`; @@ -21,10 +29,16 @@ const csv = (app) => { fileDAO .save(filePath) .then(() => { - res.status(200).send('Arquivo salvo com sucesso!'); + apiResponse.responseText = 'Arquivo salvo com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + apiResponse.responseText = 'Falha ao salvar arquivo!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/csv', (req, res) => { @@ -32,15 +46,17 @@ const csv = (app) => { const agency = req.agency; const campaign = req.headers.campaign; const company = req.company; + const apiResponse = new ApiResponse_1.ApiResponse(); if (!fileName) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + apiResponse.responseText = 'Nenhum arquivo foi informado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const filePath = agency ? `${company}/${agency}/${campaign}/${fileName}.csv` @@ -48,11 +64,23 @@ const csv = (app) => { const fileDAO = new FileDAO_1.FileDAO(); fileDAO .getFromStore(filePath) - .then((data) => { - res.status(200).send(data.toString()); + .then((file) => { + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + apiResponse.statusCode = 200; + apiResponse.responseText = file.toString(); }) .catch((err) => { - res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); + apiResponse.statusCode = 500; + apiResponse.responseText = `Falha ao restaurar o arquivo ${fileName}!`; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); app.get('/csv/list', (req, res) => { @@ -61,16 +89,23 @@ const csv = (app) => { const campaign = req.headers.campaign; const fileDAO = new FileDAO_1.FileDAO(); let filePath = `${company}/`; + const apiResponse = new ApiResponse_1.ApiResponse(); if (agency) filePath += `${agency}/`; if (campaign) filePath += `${campaign}/`; fileDAO .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); - res.status(200).send(files); + apiResponse.responseText = files.join(','); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send(`Falha ao restaurar os arquivos!`); + apiResponse.errorMessage = err.message; + apiResponse.responseText = `Falha ao restaurar os arquivos!`; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/dist/routes/register.js b/dist/routes/register.js index 7de3acad..9b48adde 100644 --- a/dist/routes/register.js +++ b/dist/routes/register.js @@ -3,11 +3,11 @@ Object.defineProperty(exports, '__esModule', { value: true }); const express_validator_1 = require('express-validator'); const Auth_1 = require('../models/Auth'); const AuthDAO_1 = require('../models/DAO/AuthDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const register = (app) => { app.post( '/register', express_validator_1.header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), - express_validator_1.header('company').exists().withMessage('Parâmetro company é obrigatório.'), express_validator_1 .header('email') .exists() @@ -16,6 +16,7 @@ const register = (app) => { .withMessage('Email inválido.'), (req, res) => { const validationErrors = express_validator_1.validationResult(req).array(); + const apiResponse = new ApiResponse_1.ApiResponse(); if (!req.headers.agency) { validationErrors.push({ param: 'email', @@ -25,13 +26,15 @@ const register = (app) => { }); } if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); + const message = validationErrors.map((err) => err.msg).join(' '); + apiResponse.responseText = message; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const newUserAuth = new Auth_1.Auth( req.headers.permission, - req.headers.company, + req.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email ); @@ -40,10 +43,18 @@ const register = (app) => { authDAO .addAuth(newUserAuth) .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + const message = `Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`; + apiResponse.responseText = message; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); + const message = 'Falha ao criar permissão!'; + apiResponse.responseText = message; + apiResponse.errorMessage = err.message; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); } ); diff --git a/dist/routes/template.js b/dist/routes/template.js index 1d3b9f0e..380bf104 100644 --- a/dist/routes/template.js +++ b/dist/routes/template.js @@ -1,23 +1,31 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const ConfigDAO_1 = require('../models/DAO/ConfigDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const template = (app) => { app.get('/template', (req, res) => { const company = req.company; - const configDAO = new ConfigDAO_1.ConfigDAO(company); + const configDAO = new ConfigDAO_1.ConfigDAO('company'); + const apiResponse = new ApiResponse_1.ApiResponse(); configDAO .getLastConfig() .then((config) => { res.setHeader('Content-disposition', 'attachment; filename=template.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - if (config) { - res.status(200).send(config.toCsvTemplate()); - } else { - res.status(200).send('{}'); - } + apiResponse.statusCode = 200; + apiResponse.responseText = config.toCsvTemplate(); }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.responseText = 'Erro ao recuperar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/dist/routes/user.js b/dist/routes/user.js index 717512c9..a9f25da3 100644 --- a/dist/routes/user.js +++ b/dist/routes/user.js @@ -1,19 +1,23 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const AuthDAO_1 = require('../models/DAO/AuthDAO'); +const ApiResponse_1 = require('../models/ApiResponse'); const user = (app) => { app.get('/user', (req, res) => { + const apiResponse = new ApiResponse_1.ApiResponse(); new AuthDAO_1.AuthDAO(req.headers.token) .getAuth() - .then((data) => { - if (data) { - res.status(200).send(JSON.stringify(data.toJson())); - } else { - res.status(200).send(JSON.stringify('{}')); - } + .then((auth) => { + apiResponse.responseText = JSON.stringify(auth.toJson()); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao recuperar o usuário!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Falha ao recuperar o usuário!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/app.ts b/src/ts/app.ts index b137041d..b629a3c6 100644 --- a/src/ts/app.ts +++ b/src/ts/app.ts @@ -6,6 +6,7 @@ import routes from './routes/routes'; import { config } from 'dotenv'; import { Auth } from './models/Auth'; import { AuthDAO } from './models/DAO/AuthDAO'; +import { ApiResponse } from './models/ApiResponse'; config({ path: __dirname + '/../.env' }); @@ -36,13 +37,16 @@ app.use( ], exposedHeaders: ['token', 'agency', 'company', 'campaign', 'file', 'data', 'config', 'permission', 'email'], origin: '*', - methods: 'GET,POST', + methods: 'GET, POST', preflightContinue: false, }) ); app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, next: any) => { const token = req.headers.token; + + const apiResponse = new ApiResponse(); + if (token) { const authDAO = new AuthDAO(token); authDAO @@ -53,14 +57,24 @@ app.all('*', async (req: { [key: string]: any }, res: { [key: string]: any }, ne if (auth.hasPermissionFor(req.url, req.method)) { next(); } else { - res.status(403).send('Usuário sem permissão para realizar a ação!'); + apiResponse.responseText = 'Usuário sem permissão para realizar a ação!'; + apiResponse.statusCode = 403; } }) .catch((err) => { - res.status(403).send('Usuário Inválido'); + apiResponse.responseText = 'Usuário Inválido!'; + apiResponse.statusCode = 401; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); } else { - res.status(403).send('Token não informado!'); + apiResponse.responseText = 'Token não informado!'; + apiResponse.statusCode = 401; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); } }); diff --git a/src/ts/models/ApiResponse.ts b/src/ts/models/ApiResponse.ts new file mode 100644 index 00000000..5568a195 --- /dev/null +++ b/src/ts/models/ApiResponse.ts @@ -0,0 +1,38 @@ +export class ApiResponse { + private _statusCode: number; + private _responseText: string; + private _errorMessage: string; + + constructor(statusCode = 200, responseText = '', errorMessage = '') { + this._statusCode = statusCode; + this._responseText = responseText; + this._errorMessage = errorMessage; + } + + set errorMessage(errorMessage: string) { + this._errorMessage = errorMessage; + } + + get statusCode(): number { + return this._statusCode; + } + + set statusCode(statusCode: number) { + this._statusCode = statusCode; + } + + get responseText(): string { + return this._responseText; + } + + set responseText(responseText: string) { + this._responseText = responseText; + } + + get jsonResponse(): { [key: string]: string } { + return { + responseText: this._responseText, + errorMessage: this._errorMessage, + }; + } +} diff --git a/src/ts/models/DAO/AuthDAO.ts b/src/ts/models/DAO/AuthDAO.ts index c252278f..9185b215 100644 --- a/src/ts/models/DAO/AuthDAO.ts +++ b/src/ts/models/DAO/AuthDAO.ts @@ -25,7 +25,9 @@ export class AuthDAO { const jsonAuth = data.data(); return new Auth(jsonAuth.permission, jsonAuth.company, jsonAuth.agency, jsonAuth.email); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw err; + }); } public addAuth(auth: Auth): Promise { diff --git a/src/ts/models/DAO/ConfigDAO.ts b/src/ts/models/DAO/ConfigDAO.ts index 898c92ee..bfb7a128 100644 --- a/src/ts/models/DAO/ConfigDAO.ts +++ b/src/ts/models/DAO/ConfigDAO.ts @@ -20,6 +20,9 @@ export class ConfigDAO { return this._objectStore .getAllDocumentsFrom(this._configCollection) .then((documents) => { + if (documents.length === 0) { + throw new Error('A empresa não possui nenhuma configuração!'); + } let lastDocument: DocumentData; documents.forEach((doc, index) => { if (index === 0) lastDocument = doc; @@ -27,7 +30,9 @@ export class ConfigDAO { }); return new Config(lastDocument); }) - .catch((err) => console.log(err)); + .catch((err) => { + throw new Error(err.message); + }); } /** @@ -49,7 +54,7 @@ export class ConfigDAO { this._objectStore.addDocumentIn(this._configCollection, config.toJson(), `config_${config.version}`) ); } else { - reject('Configuração inválida'); + throw new Error('Configuração inválida!'); } }) .catch((err: { [key: string]: any }) => reject(err)); diff --git a/src/ts/routes/build.ts b/src/ts/routes/build.ts index d06e2faf..849e2436 100644 --- a/src/ts/routes/build.ts +++ b/src/ts/routes/build.ts @@ -4,6 +4,7 @@ import { Config } from '../models/Config'; import { DateUtils } from '../utils/DateUtils'; import { CsvUtils } from '../utils/CsvUtils'; import { Builder } from '../controllers/Builder'; +import { ApiResponse } from '../models/ApiResponse'; import * as converter from 'json-2-csv'; const build = (app: { [key: string]: any }): void => { @@ -12,15 +13,19 @@ const build = (app: { [key: string]: any }): void => { const company = req.company; const agency = req.agency; const campaign = req.headers.campaign; - if (!req.files.data) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + + const apiResponse = new ApiResponse(); + + if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const fileContent = req.files.data.data; @@ -33,21 +38,19 @@ const build = (app: { [key: string]: any }): void => { const configDAO = new ConfigDAO(company); configDAO .getLastConfig() - .then((config) => { - if (config) { - companyConfig = config; + .then((config: Config) => { + companyConfig = config; + if (companyConfig) { if (!companyConfig.toJson()[media]) { - res.status(400).send({ - message: `Mídia ${media} não configurada!`, - }); - return; + apiResponse.statusCode = 400; + throw new Error(`Mídia ${media} não foi configurada!`); } const fileDAO = new FileDAO(); fileDAO.file = fileContent; return fileDAO.save(filePath); } else { - res.status(400).send('Nenhuma configuração encontrada!'); - return; + apiResponse.statusCode = 500; + throw new Error('Nenhuma configuração encontrada!'); } }) .then(() => { @@ -66,7 +69,9 @@ const build = (app: { [key: string]: any }): void => { csv += '\nConfiguracao inserida em;' + configTimestamp; res.setHeader('Content-disposition', 'attachment; filename=data.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - res.status(200).send(csv); + apiResponse.responseText = csv; + apiResponse.statusCode = 200; + res.status(apiResponse.statusCode).send(apiResponse.responseText); }, { delimiter: { @@ -76,7 +81,16 @@ const build = (app: { [key: string]: any }): void => { ); }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + if (apiResponse.statusCode === 200) { + apiResponse.statusCode = 500; + } + apiResponse.responseText = 'Falha ao salvar o arquivo!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode !== 200) { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/src/ts/routes/config.ts b/src/ts/routes/config.ts index 4c831e02..ca0ac5d6 100644 --- a/src/ts/routes/config.ts +++ b/src/ts/routes/config.ts @@ -1,40 +1,59 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; import { Config } from '../models/Config'; +import { ApiResponse } from '../models/ApiResponse'; const config = (app: { [key: string]: any }): void => { app.post('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; const configString = req.body.config; + + const apiResponse = new ApiResponse(); + if (!configString) { - res.status(400).send('Configuração não foi informada!'); + apiResponse.responseText = 'Configuração não foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } + const config = new Config(JSON.parse(configString)); const configDAO = new ConfigDAO(company); + configDAO .addConfig(config) .then((data) => { - res.status(200).send('Configuração criada com sucesso!'); + apiResponse.responseText = 'Configuração criada com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao criar a configuração!'); + apiResponse.responseText = 'Erro ao criar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); app.get('/config', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; const configDAO = new ConfigDAO(company); + + const apiResponse = new ApiResponse(); + configDAO .getLastConfig() - .then((config) => { - if (config) { - res.status(200).send(config.toString()); - } else { - res.status(200).send('{}'); - } + .then((config: Config) => { + apiResponse.responseText = config.toString(); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Erro ao recuperar configuração!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/routes/csv.ts b/src/ts/routes/csv.ts index 307ef35a..5d10da87 100644 --- a/src/ts/routes/csv.ts +++ b/src/ts/routes/csv.ts @@ -1,19 +1,29 @@ import { FileDAO } from '../models/DAO/FileDAO'; import { DateUtils } from '../utils/DateUtils'; +import { ApiResponse } from '../models/ApiResponse'; const csv = (app: { [key: string]: any }): void => { app.post('/csv', (req: { [key: string]: any }, res: { [key: string]: any }) => { const campaign = req.headers.campaign; - const content = req.files.data.data; const agency = req.agency; const company = req.company; + const apiResponse = new ApiResponse(); + if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; + } else if (!req.files || !req.files.data) { + apiResponse.responseText = 'Nenhum arquivo foi enviado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } + const content = req.files.data.data; + const filePath = agency ? `${company}/${agency}/${campaign}/${DateUtils.generateDateString()}.csv` : `${company}/${campaign}/${DateUtils.generateDateString()}.csv`; @@ -23,10 +33,16 @@ const csv = (app: { [key: string]: any }): void => { fileDAO .save(filePath) .then(() => { - res.status(200).send('Arquivo salvo com sucesso!'); + apiResponse.responseText = 'Arquivo salvo com sucesso!'; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao salvar arquivo!'); + apiResponse.responseText = 'Falha ao salvar arquivo!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); @@ -36,15 +52,18 @@ const csv = (app: { [key: string]: any }): void => { const campaign = req.headers.campaign; const company = req.company; + const apiResponse = new ApiResponse(); + if (!fileName) { - res.status(400).send({ - message: 'Nenhum arquivo foi enviado!', - }); + apiResponse.responseText = 'Nenhum arquivo foi informado!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } else if (!campaign) { - res.status(400).send({ - message: 'Nenhuma campanha foi informada!', - }); + apiResponse.responseText = 'Nenhuma campanha foi informada!'; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + return; } const filePath = agency @@ -54,12 +73,24 @@ const csv = (app: { [key: string]: any }): void => { const fileDAO = new FileDAO(); fileDAO .getFromStore(filePath) - .then((data) => { + .then((file) => { // const dataFormated = data[0].toString("utf8"); - res.status(200).send(data.toString()); + res.setHeader('Content-disposition', 'attachment; filename=template.csv'); + res.set('Content-Type', 'text/csv; charset=utf-8'); + apiResponse.statusCode = 200; + apiResponse.responseText = file.toString(); }) .catch((err) => { - res.status(500).send(`Falha ao restaurar o arquivo ${fileName}!`); + apiResponse.statusCode = 500; + apiResponse.responseText = `Falha ao restaurar o arquivo ${fileName}!`; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); @@ -71,6 +102,8 @@ const csv = (app: { [key: string]: any }): void => { let filePath = `${company}/`; + const apiResponse = new ApiResponse(); + if (agency) filePath += `${agency}/`; if (campaign) filePath += `${campaign}/`; @@ -78,10 +111,16 @@ const csv = (app: { [key: string]: any }): void => { .getAllFilesFromStore(filePath) .then((data) => { const files = data[0].filter((file) => /\.csv$/.test(file.name)).map((file) => file.name); - res.status(200).send(files); + apiResponse.responseText = files.join(','); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send(`Falha ao restaurar os arquivos!`); + apiResponse.errorMessage = err.message; + apiResponse.responseText = `Falha ao restaurar os arquivos!`; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); }; diff --git a/src/ts/routes/register.ts b/src/ts/routes/register.ts index 7163a49d..64c1849b 100644 --- a/src/ts/routes/register.ts +++ b/src/ts/routes/register.ts @@ -1,15 +1,18 @@ import { header, validationResult } from 'express-validator'; import { Auth } from '../models/Auth'; import { AuthDAO } from '../models/DAO/AuthDAO'; +import { ApiResponse } from '../models/ApiResponse'; const register = (app: { [key: string]: any }): void => { app.post( '/register', header('permission').exists().withMessage('Parâmetro permission é obrigatório.'), - header('company').exists().withMessage('Parâmetro company é obrigatório.'), header('email').exists().withMessage('Parâmetro email é obrigatório.').isEmail().withMessage('Email inválido.'), (req: { [key: string]: any }, res: { [key: string]: any }) => { const validationErrors = validationResult(req).array(); + + const apiResponse = new ApiResponse(); + if (!req.headers.agency) { validationErrors.push({ param: 'email', @@ -19,14 +22,16 @@ const register = (app: { [key: string]: any }): void => { }); } if (validationErrors.length > 0) { - const msg = validationErrors.map((err) => err.msg).join(' '); - res.status(400).json({ message: msg }); + const message = validationErrors.map((err) => err.msg).join(' '); + apiResponse.responseText = message; + apiResponse.statusCode = 400; + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); return; } const newUserAuth = new Auth( req.headers.permission, - req.headers.company, + req.company, req.headers.permission === 'user' ? req.headers.agency : '', req.headers.email ); @@ -36,10 +41,18 @@ const register = (app: { [key: string]: any }): void => { authDAO .addAuth(newUserAuth) .then((token) => { - res.status(200).send(`Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`); + const message = `Permissão adicionada para o email ${newUserAuth.email}, senha: ${token}`; + apiResponse.responseText = message; + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao criar permissão!'); + const message = 'Falha ao criar permissão!'; + apiResponse.responseText = message; + apiResponse.errorMessage = err.message; + apiResponse.statusCode = 500; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); } ); diff --git a/src/ts/routes/template.ts b/src/ts/routes/template.ts index c593f4ed..417fb6b1 100644 --- a/src/ts/routes/template.ts +++ b/src/ts/routes/template.ts @@ -1,22 +1,33 @@ import { ConfigDAO } from '../models/DAO/ConfigDAO'; +import { ApiResponse } from '../models/ApiResponse'; +import { Config } from '../models/Config'; const template = (app: { [key: string]: any }): void => { app.get('/template', (req: { [key: string]: any }, res: { [key: string]: any }) => { const company = req.company; - const configDAO = new ConfigDAO(company); + const configDAO = new ConfigDAO('company'); + + const apiResponse = new ApiResponse(); + configDAO .getLastConfig() - .then((config) => { + .then((config: Config) => { res.setHeader('Content-disposition', 'attachment; filename=template.csv'); res.set('Content-Type', 'text/csv; charset=utf-8'); - if (config) { - res.status(200).send(config.toCsvTemplate()); - } else { - res.status(200).send('{}'); - } + apiResponse.statusCode = 200; + apiResponse.responseText = config.toCsvTemplate(); }) .catch((err) => { - res.status(500).send('Erro ao recuperar configuração!'); + apiResponse.responseText = 'Erro ao recuperar a configuração!'; + apiResponse.statusCode = 500; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + if (apiResponse.statusCode === 200) { + res.status(apiResponse.statusCode).send(apiResponse.responseText); + } else { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); + } }); }); }; diff --git a/src/ts/routes/user.ts b/src/ts/routes/user.ts index 5c07520d..9c96a4a4 100644 --- a/src/ts/routes/user.ts +++ b/src/ts/routes/user.ts @@ -1,18 +1,24 @@ import { AuthDAO } from '../models/DAO/AuthDAO'; +import { ApiResponse } from '../models/ApiResponse'; +import { Auth } from '../models/Auth'; const user = (app: { [key: string]: any }): void => { app.get('/user', (req: { [key: string]: any }, res: { [key: string]: any }) => { + const apiResponse = new ApiResponse(); + new AuthDAO(req.headers.token) .getAuth() - .then((data) => { - if (data) { - res.status(200).send(JSON.stringify(data.toJson())); - } else { - res.status(200).send(JSON.stringify('{}')); - } + .then((auth: Auth) => { + apiResponse.responseText = JSON.stringify(auth.toJson()); + apiResponse.statusCode = 200; }) .catch((err) => { - res.status(500).send('Falha ao recuperar o usuário!'); + apiResponse.statusCode = 500; + apiResponse.responseText = 'Falha ao recuperar o usuário!'; + apiResponse.errorMessage = err.message; + }) + .finally(() => { + res.status(apiResponse.statusCode).send(apiResponse.jsonResponse); }); }); };