Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions modulo4/servicos-backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
build
.env
package-lock.json
33 changes: 33 additions & 0 deletions modulo4/servicos-backend/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"name": "servicos-backend",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "ts-node-dev ./src/index.ts",
"start": "node ./build/index.js",
"postinstall": "tsc",
"test": "echo \"Error: no test specified\" && exit 1"
},
"engines": {
"node": "v16.13.2"
},
"keywords": [],
"author": "Pablo Leão",
"license": "ISC",
"devDependencies": {
"@types/cors": "^2.8.12",
"@types/express": "^4.17.13",
"ts-node-dev": "^2.0.0",
"typescript": "^4.8.2"
},
"dependencies": {
"@types/knex": "^0.16.1",
"axios": "^0.27.2",
"cors": "^2.8.5",
"dotenv": "^16.0.2",
"express": "^4.18.1",
"knex": "^2.2.0",
"mysql": "^2.18.1"
}
}
8 changes: 8 additions & 0 deletions modulo4/servicos-backend/requests.rest
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
POST https://servicos-backend-pablo.herokuapp.com/user
Content-Type: application/json

{
"cep": "21030001",
"numero": "9020",
"complemento": "CIAGA"
}
9 changes: 9 additions & 0 deletions modulo4/servicos-backend/src/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import express, { Express } from 'express';
import cors from 'cors';

const app: Express = express();

app.use(express.json());
app.use(cors());

export default app;
16 changes: 16 additions & 0 deletions modulo4/servicos-backend/src/data/connection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import dotenv from "dotenv";
import knex from "knex";

dotenv.config();

export const connection = knex({
client: "mysql",
connection: {
host: process.env.DB_HOST,
port: 3306,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_SCHEMA,
multipleStatements: true
}
});
18 changes: 18 additions & 0 deletions modulo4/servicos-backend/src/data/insertAddressDB.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Address } from "../types/types";
import { connection } from "./connection";

export const insertAddressDB = async (cep: string, numero: string, complemento: string | undefined, address: Address): Promise<void> => {
const { logradouro, bairro, cidade, estado } = address;
const id_user: string = Date.now().toString();

await connection("exercicios_servicos_address").insert({
id_user,
cep,
logradouro,
numero,
complemento,
bairro,
cidade,
estado
});
}
36 changes: 36 additions & 0 deletions modulo4/servicos-backend/src/endpoints/insertAddress.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { Request, Response } from "express";
import { insertAddressDB } from "../data/insertAddressDB";
import { getAddressInfo } from "../services/getAdressInfo";

export const insertAddress = async (req: Request, res: Response) => {
try {
const { cep, numero, complemento } = req.body;

if(!cep || !numero) {
throw new Error("Verifique os campos cep e numero. Os dados devem estar preenchidos.");
}

const address = await getAddressInfo(cep);

if (!address || address === undefined) {
throw new Error("CEP inválido.");
}

await insertAddressDB(cep, numero, complemento, address);

res.status(200).send("Endereço criado com sucesso!");

} catch (error: any) {
switch(error.message) {
case "Verifique os campos cep e numero. Os dados devem estar preenchidos.":
res.status(422).send({ message: error.message });
break;
case "CEP inválido.":
res.status(404).send({ message: error.message });
break;
default:
res.status(500).send(error.sqlMessage || { message: "Erro inesperado!" });
break;
}
}
}
14 changes: 14 additions & 0 deletions modulo4/servicos-backend/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { AddressInfo } from 'net';
import app from './app';
import { insertAddress } from './endpoints/insertAddress';

app.post("/user", insertAddress);

const server = app.listen(process.env.PORT || 3003, () => {
if (server) {
const address = server.address() as AddressInfo;
console.log(`Server is running in http://localhost:${address.port}`);
} else {
console.error(`Failure upon starting server.`);
}
});
21 changes: 21 additions & 0 deletions modulo4/servicos-backend/src/services/getAdressInfo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import axios from 'axios';
import { Address } from '../types/types';

export const getAddressInfo = async (cep: string): Promise<Address | undefined> => {
try {

const result = await axios.get(`https://viacep.com.br/ws/${cep}/json/`);
const address: Address = {
logradouro: result.data.logradouro,
bairro: result.data.bairro,
cidade: result.data.localidade,
estado: result.data.uf
}
return address;

} catch (error: any) {

return undefined;

}
}
6 changes: 6 additions & 0 deletions modulo4/servicos-backend/src/types/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type Address = {
logradouro: string,
bairro: string,
cidade: string,
estado: string
}
14 changes: 14 additions & 0 deletions modulo4/servicos-backend/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"sourceMap": true,
"outDir": "./build",
"rootDir": "./src",
"removeComments": true,
"strict": true,
"noImplicitAny": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true
}
}