diff --git a/modulo4/servicos-backend/.gitignore b/modulo4/servicos-backend/.gitignore new file mode 100644 index 0000000..0a19ff0 --- /dev/null +++ b/modulo4/servicos-backend/.gitignore @@ -0,0 +1,4 @@ +node_modules +build +.env +package-lock.json \ No newline at end of file diff --git a/modulo4/servicos-backend/package.json b/modulo4/servicos-backend/package.json new file mode 100644 index 0000000..e404bed --- /dev/null +++ b/modulo4/servicos-backend/package.json @@ -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" + } +} diff --git a/modulo4/servicos-backend/requests.rest b/modulo4/servicos-backend/requests.rest new file mode 100644 index 0000000..f1a9b72 --- /dev/null +++ b/modulo4/servicos-backend/requests.rest @@ -0,0 +1,8 @@ +POST https://servicos-backend-pablo.herokuapp.com/user +Content-Type: application/json + +{ + "cep": "21030001", + "numero": "9020", + "complemento": "CIAGA" +} \ No newline at end of file diff --git a/modulo4/servicos-backend/src/app.ts b/modulo4/servicos-backend/src/app.ts new file mode 100644 index 0000000..9dc3edf --- /dev/null +++ b/modulo4/servicos-backend/src/app.ts @@ -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; \ No newline at end of file diff --git a/modulo4/servicos-backend/src/data/connection.ts b/modulo4/servicos-backend/src/data/connection.ts new file mode 100644 index 0000000..eec9370 --- /dev/null +++ b/modulo4/servicos-backend/src/data/connection.ts @@ -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 + } +}); \ No newline at end of file diff --git a/modulo4/servicos-backend/src/data/insertAddressDB.ts b/modulo4/servicos-backend/src/data/insertAddressDB.ts new file mode 100644 index 0000000..b0842f7 --- /dev/null +++ b/modulo4/servicos-backend/src/data/insertAddressDB.ts @@ -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 => { + 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 + }); +} \ No newline at end of file diff --git a/modulo4/servicos-backend/src/endpoints/insertAddress.ts b/modulo4/servicos-backend/src/endpoints/insertAddress.ts new file mode 100644 index 0000000..fb5e819 --- /dev/null +++ b/modulo4/servicos-backend/src/endpoints/insertAddress.ts @@ -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; + } + } +} \ No newline at end of file diff --git a/modulo4/servicos-backend/src/index.ts b/modulo4/servicos-backend/src/index.ts new file mode 100644 index 0000000..432af92 --- /dev/null +++ b/modulo4/servicos-backend/src/index.ts @@ -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.`); + } +}); \ No newline at end of file diff --git a/modulo4/servicos-backend/src/services/getAdressInfo.ts b/modulo4/servicos-backend/src/services/getAdressInfo.ts new file mode 100644 index 0000000..783e549 --- /dev/null +++ b/modulo4/servicos-backend/src/services/getAdressInfo.ts @@ -0,0 +1,21 @@ +import axios from 'axios'; +import { Address } from '../types/types'; + +export const getAddressInfo = async (cep: string): Promise
=> { + 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; + + } +} \ No newline at end of file diff --git a/modulo4/servicos-backend/src/types/types.ts b/modulo4/servicos-backend/src/types/types.ts new file mode 100644 index 0000000..0b5a53a --- /dev/null +++ b/modulo4/servicos-backend/src/types/types.ts @@ -0,0 +1,6 @@ +export type Address = { + logradouro: string, + bairro: string, + cidade: string, + estado: string +} \ No newline at end of file diff --git a/modulo4/servicos-backend/tsconfig.json b/modulo4/servicos-backend/tsconfig.json new file mode 100644 index 0000000..5f06550 --- /dev/null +++ b/modulo4/servicos-backend/tsconfig.json @@ -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 + } +} \ No newline at end of file