Skip to content

Commit

Permalink
refactor: Isolate responsabilities in services
Browse files Browse the repository at this point in the history
  • Loading branch information
pedrosancao committed Feb 15, 2021
1 parent a233012 commit e99f63e
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 112 deletions.
67 changes: 10 additions & 57 deletions pages/api/shipping/v1/calculate-price.js
Original file line number Diff line number Diff line change
@@ -1,82 +1,35 @@
import microCors from 'micro-cors';
import * as Yup from 'yup';

import SOAPRequestService from '../../../../src/services/soapRequestService';

const bodySchema = Yup.object().shape({
nCdEmpresa: Yup.string(),
sDsSenha: Yup.string(),
nCdServico: Yup.string().required(),
sCepOrigem: Yup.string().required(),
sCepDestino: Yup.string().required(),
nVlPeso: Yup.string().required(),
nCdFormato: Yup.string().required(),
nVlComprimento: Yup.string().required(),
nVlAltura: Yup.string().required(),
nVlLargura: Yup.string().required(),
nVlDiametro: Yup.string().required(),
sCdMaoPropria: Yup.string(),
nVlValorDeclarado: Yup.string(),
sCdAvisoRecebimento: Yup.string(),
});
import {
calculateShipping,
validateShippingData,
} from '../../../../services/shipping';

const cors = microCors();

async function ShippingPrice(request, response) {
if (request.method !== 'POST') {
response.status(405);
response.json({
return response.status(405).json({
error: {
message:
'This method is not allowed for this route, try POST with a valid request body',
more_info: 'httos://brasilapi.com.br',
},
});
return;
}

try {
await bodySchema.validate(request.body, {
abortEarly: false,
stripUnknown: true,
});
await validateShippingData(request.body);
} catch (err) {
delete err.value;
delete err.inner;

response.status(422);
return response.json(err);
return response.status(422).json(err);
}

try {
const soapRequestService = new SOAPRequestService();
const result = await soapRequestService.makeRequest(
'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPreco',
'POST',
{
nCdEmpresa: request.body.nCdEmpresa,
sDsSenha: request.body.sDsSenha,
nCdServico: request.body.nCdServico,
sCepOrigem: request.body.sCepOrigem,
sCepDestino: request.body.sCepDestino,
nVlPeso: request.body.nVlPeso,
nCdFormato: request.body.nCdFormato,
nVlComprimento: request.body.nVlComprimento,
nVlAltura: request.body.nVlAltura,
nVlLargura: request.body.nVlLargura,
nVlDiametro: request.body.nVlDiametro,
sCdMaoPropria: request.body.sCdMaoPropria,
nVlValorDeclarado: request.body.nVlValorDeclarado,
sCdAvisoRecebimento: request.body.sCdAvisoRecebimento,
}
);

response.status(200);
return response.json(result);
const result = await calculateShipping(request.body);
return response.status(200).json(result);
} catch (err) {
response.status(500);

return response.json({
return response.status(500).json({
error: {
message: 'Internal Server Error',
},
Expand Down
51 changes: 51 additions & 0 deletions services/shipping/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import * as Yup from 'yup';
import makeRequest from '../soapRequestService';

export function validateShippingData(data) {
return Yup.object()
.shape({
nCdEmpresa: Yup.string(),
sDsSenha: Yup.string(),
nCdServico: Yup.string().required(),
sCepOrigem: Yup.string().required(),
sCepDestino: Yup.string().required(),
nVlPeso: Yup.string().required(),
nCdFormato: Yup.string().required(),
nVlComprimento: Yup.string().required(),
nVlAltura: Yup.string().required(),
nVlLargura: Yup.string().required(),
nVlDiametro: Yup.string().required(),
sCdMaoPropria: Yup.string(),
nVlValorDeclarado: Yup.string(),
sCdAvisoRecebimento: Yup.string(),
})
.validate(data, {
abortEarly: false,
stripUnknown: true,
});
}

export async function calculateShipping(data) {
const endpoint = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPreco';
const result = await makeRequest(endpoint, 'POST', {
nCdEmpresa: data.nCdEmpresa,
sDsSenha: data.sDsSenha,
nCdServico: data.nCdServico,
sCepOrigem: data.sCepOrigem,
sCepDestino: data.sCepDestino,
nVlPeso: data.nVlPeso,
nCdFormato: data.nCdFormato,
nVlComprimento: data.nVlComprimento,
nVlAltura: data.nVlAltura,
nVlLargura: data.nVlLargura,
nVlDiametro: data.nVlDiametro,
sCdMaoPropria: data.sCdMaoPropria,
nVlValorDeclarado: data.nVlValorDeclarado,
sCdAvisoRecebimento: data.sCdAvisoRecebimento,
});
const shippingData = result.cResultado.Servicos[0].cServico[0];
Object.getOwnPropertyNames(shippingData).forEach((property) => {
[shippingData[property]] = shippingData[property];
});
return shippingData;
}
33 changes: 33 additions & 0 deletions services/soapRequestService/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { Parser } from 'xml2js';
import axios from 'axios';

function mountSearchParams(obj) {
return Object.getOwnPropertyNames(obj)
.map((key) => `${key}=${obj[key]}`)
.join('&');
}

function parseResponse(xml) {
return new Promise((resolve, reject) => {
const xmlParser = new Parser();
xmlParser.parseString(xml, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}

export default async function makeRequest(url, method, obj) {
const data = mountSearchParams(obj);
const options = {
url,
method,
data,
};

const response = await axios(options);
return parseResponse(response.data);
}
55 changes: 0 additions & 55 deletions src/services/soapRequestService.js

This file was deleted.

0 comments on commit e99f63e

Please sign in to comment.