34
loading...
This website collects cookies to deliver better user experience
{
"id": 1,
"name": "Kelly",
"telephone": "118888888",
"address": "Rua dos Bobos n 1",
"_id": "607d805caa972341ebd3e568"
}
_id
não é uma boa pratica pois pode expor detalhes internos que não queremos compartilhar com o mundo externo.const Contact = {
id: 0,
name: "",
telephone: "",
address: ""
}
module.exports = Object.create(Contact)
id
que poderia ser usado por um banco de dados contudo não agrega valor ao domínio Contato , a primeira coisa seria excluí-lo. A segunda coisa que podemos usar para nos ajudar a manipular os dados do nosso domínio é ter uma forma de criarmos o objeto, uma função criadora que receba os dados de um contato e devolva uma instância pronta. Há algumas formas de fazer porém aqui iremos usar um construtor , uma função que toda classe já possui no JavaScript e já é responsável por criar o objeto.class Contact {
constructor(name, telephone, address){
this.name = name
this.telephone = telephone
this.address = address
}
}
module.exports = Contact
id
do domínio e alteramos o objeto Contato para que ele seja uma classe, com um construtor e três variáveis que são informadas no momento da criação.const Contact = require('../model')
class Service{
constructor(repository){
this.repository = repository
}
create(body){
const contact = new Contact(body.name, body.telephone, body.address)
this.repository.insert(contact)
}
async getById(name){
const contact = await this.repository.selectById(name)
return new Contact(contact.name, contact.telephone, contact.address)
}
async getAll(){
const contactList = await this.repository.selectAll()
const result = contactList.map((contact) => {
return new Contact(contact.name, contact.telephone, contact.address)
})
return result
}
async put(name, body){
const contact = await this.repository.update(name, new Contact(body.name, body.telephone, body.address))
const result = contact.value
return new Contact(result.name, result.telephone, result.address)
}
async patch(name, body){
return this.repository.patch(name, body);
}
remove(name){
this.repository.remove(name)
}
}
module.exports = Service
curl --location --request POST 'http://localhost:3000/api' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Kelly",
"telephone": "1199999999",
"address": "Rua dos Bobos n 2"
}' | json_pp
{
"name": "Kelly",
"telephone": "1199999999",
"address": "Rua dos Bobos n 2"
}
id
, apesar de internamente existir e ser importante para o banco de dados para o nosso domínio e para a nossa resposta ao usuário que fez essa chamada não é.npm install --save celebrate
index.js
:const { Joi } = require('celebrate')
const bodySchema = Joi.object().keys({
name: Joi.string().min(3).required(),
telephone: Joi.string().required(),
address: Joi.string().required()
})
const pathSchema = { name: Joi.string().min(3).required() }
module.exports = {
bodySchema,
pathSchema
}
name
deve ter pelo menos 3 caracteres.name
, ele é obrigatório e deve ter pelo menos 3 caracteres.const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const router = require('./router')
//Declaração do middleware de erros do Celebrate
const { errors } = require('celebrate')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use((req, resp, next) => {
resp.set('Access-Control-Allow-Origin', '*')
next()
})
app.use('/api', router)
//Inclusão do middleware
app.use(errors())
const server = app.listen(3000, () => console.log('A API está funcionando!'))
module.exports = server
const { celebrate, Segments } = require('celebrate')
const validation = require('../validation')
router.post('/', celebrate({[Segments.BODY]: validation.bodySchema }), async (req, res) => {
const contact = req.body
service.create(contact)
res.status(201).json(contact)
})
router.get('/:name', celebrate({[Segments.PARAMS]: validation.pathSchema }), async (req, res) => {
const id = req.name_from_param
const result = await service.getById(id)
if(result !== undefined){
res.status(200).json(result)
return
}
res.sendStatus(204)
})
curl --location --request POST 'http://localhost:3000/api' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Kelly",
"address": "Rua dos Bobos n 2"
}' | json_pp
{
"statusCode": 400,
"error": "Bad Request",
"message": "celebrate request validation failed",
"validation": {
"body": {
"source": "body",
"keys": [
"telephone"
],
"message": "\"telephone\" is required"
}
}
}
curl --location --request GET 'http://localhost:3000/api/k'
{
"statusCode": 400,
"error": "Bad Request",
"message": "celebrate request validation failed",
"validation": {
"params": {
"source": "params",
"keys": [
"name"
],
"message": "\"name\" length must be at least 3 characters long"
}
}
}