Nodejs
node : v10.15.3
npm : 6.4.1
API para gerenciar solicitações de cartões de crédito.
Para instalar as dependências utilize as linhas de comando do npm
ou se preferir yarn
.
npm install
Crie o arquivo .env
de acordo com o arquivo .env.example
.
Para esse projeto foi utilizado o banco de dados não relacional mongoDB, caso ainda não o tenho instalado, siga o passo-a-passo aqui
src
├── controller
│ └── order.js
├── index.js
├── models
│ └── Order.js
├── routes.js
├── services
│ └── order.js
├── utils
│ └── order.js
└── validation
└── order.js
O diretório de models
é responsável por modelar e realizar a conexão com o banco de dados.
Aqui criamos o schema
através da biblioteca Mongoose para realizar a conexão e as transações de dados com o mongoDB, e é nesse schema
que se define e valida quais os campos que devem ser salvos, além de, definir o nome da collection
onde os nossos dados ficarão armazenados.
O modelo a ser armazenado deve seguir a seguinte estrutura:
user: {
firstName : <type: String>
lastName : <type: String>
document : <type: Number>
bornDate : <type: Date>
},
contact: {
cellphoneNumber : <type: Number>
},
address: {
country : <type: String>
df : <type: String>
country : <type: String>
postCode : <type: Number>
neighborhood : <type: String>
street : <type: String>
houseNumber : <type: Number>
moreInfo : <type: String>
},
creditCardInfo: {
amount : <type: Number>
approved : <type: Boolean>
creditLimit : <type: Number>
},
createdAt : <type: Date>
O diretório de controllers
é responsável por controlar a comunicação entre as requisições feitas do cliente para com a aplicação.
Todas as requisições recebidas aqui são enviadas para os seus respectivos serviços localizados no diretório de services
.
O diretório de services
é responsável por manipular e persistir os dados de acordo com a regra de negócio pré-estabelecida.
É aqui onde são feitas as seguintes operações:
- Validação de dados utilizando o
schema
criado no diretório devalidations
; - Transformação dos dados de acordo com a regra de negócio pré-estabelecida utilizando funções disponíveis no diretório de
utils
; - Persistência e manipulação dos dados utilizando o
schema
criado no diretório demodels
.
O diretório de validations
contém o schema
criado a partir da biblioteca Joi para validar os dados da requisição antes de iniciar as operações para persistência no banco de dados.
O diretório de utils
é responsável por realizar operações pontuais, como por exemplo:
- Formatação dos dados recebidos para persistir no banco de dados;
- Geração do score de aprovação após a solicitação do cartão de crédito ser feita;
- Verificação do limite de crédito que o cartão terá caso seja aprovado;
- Cálculo do limite de crédito.
O arquivo de routes.js
contém todas as rotas disponíveis na aplicação:
- Os métodos disponíveis são ( GET| POST| DELETE )
GET /order -> Retorna todas as solicitações salvas dentro de data
, no seguinte formato via json
:
{
"message": "All found successfully",
"data": [
{
"user": {
"firstName" : <type: String>,
"lastName" : <type: String>,
"document" : <type: Number>,
"bornDate" : <type: Date>
},
"contact": {
"cellphoneNumber" : <type: Number>
},
"address": {
"country" : <type: String>,
"df" : <type: String>,
"county" : <type: String>,
"postCode" : <type: Number>,
"neighborhood" : <type: String>,
"street" : <type: String>,
"houseNumber" : <type: Number>,
"moreInfo" : <type: String>
},
"creditCardInfo": {
"amount" : <type: Number>,
"approved" : <type: Boolean>,
"creditLimit" : <type: Number>
},
"_id" : <type: ObjectID>,
"createdAt" : <type: Date>,
}
],
"status" : <type: Number>
}
POST /order -> Adiciona uma nova solicitação via application/x-www-form-urlencoded
.
Os parâmetros devem estar no seguinte formato:
{
firstName : <type: String>
lastName : <type: String>
document : <type: Number>
bornDate : <type: Date>
cellphoneNumber : <type: Number>
country : <type: String>
df : <type: String>
country : <type: String>
postCode : <type: Number>
neighborhood : <type: String>
street : <type: String>
houseNumber : <type: Number>
moreInfo : <type: String>
amount : <type: Number>
}
DELETE /order -> Deleta uma solicitação de acordo com o _id : <type : ObjectID()
. O parâmetro deve estar no seguinte formato via json
:
{
"user": {
"firstName" : <type: String>,
"lastName" : <type: String>,
"document" : <type: Number>,
"bornDate" : <type: Date>
},
"contact": {
"cellphoneNumber" : <type: Number>
},
"address": {
"country" : <type: String>,
"df" : <type: String>,
"county" : <type: String>,
"postCode" : <type: Number>,
"neighborhood" : <type: String>,
"street" : <type: String>,
"houseNumber" : <type: Number>,
"moreInfo" : <type: String>
},
"creditCardInfo": {
"amount" : <type: Number>,
"approved" : <type: Boolean>,
"creditLimit" : <type: Number>
},
"_id" : <type: ObjectID>,
"createdAt" : <type: Date>,
}
Após a instalação estar completa e o arquivo .env
estar devidamente preenchido, para rodar o projeto localmente digite o comando:
npm start
O projeto rodará localmente no endereço http://localhost:3000/, mas você pode conferí-lo online no endereço https://gypzchallenge-backend.herokuapp.com/ onde está armazenado em um servidor no Heroku
- @hapi/joi: Objeto com função de
schema
utilizado para validar Objetos Javascript. - @hapi/boom: Amigável objeto para erros HTTP.
- dotenv: Dotenv é um módulo sem dependências que carrega variáveis de ambiente a partir de um arquivo
.env
dentro deprocess.env
. - express: Web server framework.
- cors: CORS é um pacote
node.js
que pode ser utilizado para habilitar conexões para o servidorexpress
. - moment: Validator e manipulador de datas.
- mongoose: MongoDB objeto criado para realizar operações em ambientes assíncronos.