Essa aplicação trata-se de uma pequena API para o gerenciamento de agendamentos de uma barbearia fictícia chamada GoBarber. Essa aplicação faz parte do curso GoStack - Bootcamp da Rocketseat.
O front-end web da aplicação pode ser encontrado nesse link.
Indica-se o uso de containers para o gerenciamento dos bancos de dados utilizados pela API. Para a execução dos próximos comandos é necessário que o docker tenha sido instalado previamente.
docker run --name gobarber-postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres
Usando linha de comando ou uma interface crie um banco no container criado. O nome do banco criado será usado posteriormente nas variáveis de ambiente.
docker run --name gobarber-mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=username -e MONGO_INITDB_ROOT_PASSWORD=password -d mongo
docker run --name gobarber-redis -p 6379:6379 -d -t redis:alpine
OBS: O mailtrap foi utilizado para realizar os testes de envio de e-mail, dessa forma, caso deseje utilizar outra ferramenta será necessário realizar as configurações indicadas pela ferramenta. Caso prefira permanecer com os testes no mailtrap basta criar uma conta em https://mailtrap.io/ e informar as credenciais de acesso no arquivo .env
Após clonar o projeto entre na pasta gobarber-api gerada. Renomei o arquivo .env.example para .env e informe os valores das variáveis de ambiente.
Para rodar localmente o projeto informe os seguintes valores:
APP_URL=localhost
APP_PORT=3333
As variáveis abaixo serão utilizadas para criptografar/descriptografar senhas e definir o tempo de validade do token gerado ao iniciar uma sessão. O valor de expiração pode estar em segundos ou em dias. Ex: EXPIRED_IN=2d.
SECRET=
EXPIRED_IN=
No banco postgres o valor do USERNAME por padrão é postgres
DB_USERNAME=postgres
Crie uma conta no Sentry para acompanhar os logs de erros da aplicação. Informe a url DSN do projeto criado no Sentry na variável SENTRY_DSN.
*Caso deseje desativar esse recurso as linhas de import do Sentry e sentryConfig, em app.js, devem ser comentadas.
SENTRY_DSN=
yarn
yarn sequelize db:migrate
yarn start
Gerenciamento de usuários da aplicação
localhost:3333/users
Content-Type application/json
{
"name":"Nome do Usuário",
"email":"usuario@email.com",
"password": "123456",
"provider": true
}
POST /users HTTP/1.1
Host: localhost:3333
Content-Type: application/json
{
"name":"Nome do Usuário",
"email":"usuario@email.com",
"password": "123456",
"provider": true
}
{
"id": 4,
"name": "Nome do Usuário",
"email": "usuario@email.com",
"provider": true
}
localhost:3333/users
Content-Type application/json
Authorization Bearer {{token}}
{
"email":"usuario@email.com",
"avatar_id": 2
}
PUT /users HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
{
"email":"usuario@email.com",
"avatar_id": 2
}
{
"id": 4,
"name": "Nome do Usuário",
"email": "usuario@email.com",
"avatar": {
"url": "http://localhost:3333/files/3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg",
"id": 2,
"path": "3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg"
}
}
Criar sessões
localhost:3333/sessions
Content-Type application/json
{
"email":"usuario@email.com",
"password": "123456"
}
POST /sessions HTTP/1.1
Host: localhost:3333
Content-Type: application/json
{
"email":"usuario@email.com",
"password": "123456"
}
{
"user": {
"id": 4,
"name": "Nome do Usuário",
"email": "usuario@email.com",
"provider": true,
"avatar": {
"url": "http://localhost:3333/files/3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg",
"id": 2,
"path": "3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg"
}
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwiaWF0IjoxNTg3NjA3MDU4LCJleHAiOjE1ODc2OTM0NTh9.RbblC2Vuy_OEjIOB-MlriuN6FKiQNuuxxZ43-2XFbL4"
}
Obter lista dos provedores de serviço cadastrados
localhost:3333/providers
Content-Type application/json
Authorization Bearer {{token}}
GET /providers HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
[
{
"id": 1,
"name": "Joziélio Santiago",
"email": "jozieliosantiago@gmail.com",
"avatar_id": 1,
"avatar": {
"url": "http://localhost:3333/files/fd06bd0ff7596646604c169d1e8383b01c6277e3.jpg",
"name": "eu.jpg",
"path": "fd06bd0ff7596646604c169d1e8383b01c6277e3.jpg"
}
},
{
"id": 4,
"name": "Nome do Usuário",
"email": "usuario@email.com",
"avatar_id": 2,
"avatar": {
"url": "http://localhost:3333/files/3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg",
"name": "photo.jpg",
"path": "3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg"
}
},
{
"id": 3,
"name": "Fulano",
"email": "exemplo@email.com",
"avatar_id": null,
"avatar": null
}
]
Enviar arquivos de imagem
localhost:3333/files
Content-Type multipart/form-data
Authorization Bearer {{token}}
file
POST /files HTTP/1.1
Host: localhost:3333
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer {{token}}
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: image/jpeg
(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW
{
"url": "http://localhost:3333/files/3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg",
"id": 2,
"name": "photo.jpg",
"path": "3b3e62d9eb4ed51e8546607de20cdeaa2bda73c9.jpg",
"updatedAt": "2020-04-23T01:48:37.454Z",
"createdAt": "2020-04-23T01:48:37.454Z"
}
Agendamento/Cancelamento de horário
localhost:3333/appointments
Content-Type application/json
Authorization Bearer {{token}}
{
"provider_id": 3,
"date": "2020-04-30T09:00:00-03:00"
}
POST /appointments HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
{
"provider_id": 3,
"date": "2020-04-30T09:00:00-03:00"
}
{
"past": false,
"cancelable": true,
"id": 2,
"user_id": 4,
"provider_id": 3,
"date": "2020-04-30T12:00:00.000Z",
"updatedAt": "2020-04-23T02:03:17.841Z",
"createdAt": "2020-04-23T02:03:17.841Z",
"canceled_at": null
}
Variáveis obrigatórias
- appointment_id
localhost:3333/appointments/:appointment_id
Content-Type application/json
Authorization Bearer {{token}}
appointment_id 2
DELETE /appointments/2 HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
{
"past": false,
"cancelable": true,
"id": 2,
"date": "2020-04-30T12:00:00.000Z",
"canceled_at": "2020-04-23T02:06:56.776Z",
"createdAt": "2020-04-23T02:03:17.841Z",
"updatedAt": "2020-04-23T02:06:56.776Z",
"user_id": 4,
"provider_id": 3,
"provider": {
"name": "Fulano",
"email": "exemplo@email.com"
},
"user": {
"name": "Nome do Usuário"
}
}
Parâmetros opcionais
- page (default: 1)
localhost:3333/appointments?page=1
Content-Type application/json
Authorization Bearer {{token}}
page 1
GET /appointments?page=1 HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
[
{
"past": false,
"cancelable": true,
"id": 6,
"date": "2020-04-24T12:00:00.000Z",
"provider": {
"id": 3,
"name": "Fulano",
"avatar": null
}
},
{
"past": false,
"cancelable": true,
"id": 5,
"date": "2020-04-30T13:00:00.000Z",
"provider": {
"id": 1,
"name": "Joziélio Santiago",
"avatar": {
"url": "http://localhost:3333/files/fd06bd0ff7596646604c169d1e8383b01c6277e3.jpg",
"id": 1,
"path": "fd06bd0ff7596646604c169d1e8383b01c6277e3.jpg"
}
}
}
]
Obter lista de horários agendados do provedor
Parâmetros obrigatórios
- date
localhost:3333/schedule?date=2020-04-30T00:00:00-03:00
Content-Type application/json
Authorization Bearer {{token}}
date 2020-04-30T00:00:00-03:00
GET /schedule?date=2020-04-30T00:00:00-03:00 HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
[
{
"past": false,
"cancelable": true,
"id": 4,
"date": "2020-04-30T13:00:00.000Z",
"canceled_at": null,
"createdAt": "2020-04-23T02:10:16.027Z",
"updatedAt": "2020-04-23T02:10:16.027Z",
"user_id": 3,
"provider_id": 4,
"user": {
"name": "Fulano"
}
}
]
Obter lista de notificações. As notificações são criadas sempre que um agendamento é realizado.
localhost:3333/notifications
Content-Type application/json
Authorization Bearer {{token}}
GET /notifications HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
[
{
"read": false,
"_id": "5ea0f908d10a6916e1985ee0",
"content": "Novo agendamento de Fulano para dia 30 de abril, às 10:00h",
"user": 4,
"createdAt": "2020-04-23T02:10:16.036Z",
"updatedAt": "2020-04-23T02:10:16.036Z",
"__v": 0
},
{
"read": false,
"_id": "5ea0f8ded10a6916e1985edf",
"content": "Novo agendamento de Joziélio Santiago para dia 30 de abril, às 9:00h",
"user": 4,
"createdAt": "2020-04-23T02:09:34.643Z",
"updatedAt": "2020-04-23T02:09:34.643Z",
"__v": 0
}
]
Variáveis obrigatórias
- notification_id
localhost:3333/notifications/:notification_id
Content-Type application/json
Authorization Bearer {{token}}
notification_id 5ea21efab813563eac5e6e7f
PUT /notifications/5ea21efab813563eac5e6e7f HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
{
"read": true,
"_id": "5ea21efab813563eac5e6e7f",
"content": "Novo agendamento de Nome do Usuário para dia 24 de abril, às 9:00h",
"user": 3,
"createdAt": "2020-04-23T23:04:26.903Z",
"updatedAt": "2020-04-23T23:25:52.811Z",
"__v": 0
}
Obter lista de horários disponíveis para agendamento
Parâmetros obrigatórios
- date
localhost:3333/providers/3/available?date=1587684718798
Content-Type application/json
Authorization Bearer {{token}}
date 1587684718798
GET /providers/3/available?date=1587684718798 HTTP/1.1
Host: localhost:3333
Content-Type: application/json
Authorization: Bearer {{token}}
[
{
"time": "08:00",
"value": "2020-03-05T08:00:00-03:00",
"available": false
},
{
"time": "09:00",
"value": "2020-03-05T09:00:00-03:00",
"available": false
},
{
"time": "11:00",
"value": "2020-03-05T11:00:00-03:00",
"available": false
},
{
"time": "12:00",
"value": "2020-03-05T12:00:00-03:00",
"available": false
}
]