- Path:
/accounts
- Method:
POST
- Content-Type:
application/json
- Body :
{
"name": "Wonder Woman",
"cpf": 3333,
"secret": "wonder",
"balance": 900
}
Sendo que o balance da conta a ser criada não é obrigatório, sendo inicializada assim com 0.
- Status code:
200
- Content-Type:
application/json
- Body :
{
"id": "91dae4c2-97f4-4e19-9156-2551a7bf21a0",
"name": "Wonder Woman",
"cpf": 3333,
"balance": 900,
"createdAt": "2021-10-13T14:47:32.447513422-03:00"
}
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "This cpf already exists" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Cpf must have 11 caracters" }
- Path:
/accounts
- Method:
GET
- Status code:
200
- Content-Type:
application/json
- Body :
[
{
"id": "91dae4c2-97f4-4e19-9156-2551a7bf21a0",
"name": "Spider Man",
"cpf": 1111,
"balance": 0,
"createdAt": "2021-10-13T14:47:32.447513422-03:00"
},
{
"id": "381443cb-c52c-429b-bd1a-990fcbd9d2fc",
"name": "Wonder Woman",
"cpf": 3333,
"balance": 900,
"createdAt": "2021-10-13T14:42:41.647594446-03:00"
}
]
- Path:
/accounts/{account_id}/balance
- Method:
GET
- Status code:
200
- Content-Type:
application/json
- Body :
{
"balance": 0
}
- Status code:
400
- Content-Type:
application/json
- Body (example):
{ "reason": "Id does not exist" }
A rota de login retorna um token valido para ser usado nas rotas /transfers
- Path:
/login
- Method:
POST
- Body :
{
"cpf": 66568899564,
"secret": "123"
}
- Status code:
200
- Content-Type:
application/json
- Body :
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Ijc4Mjg2NmVmLTBiZmUtNDRhNi04MTk4LWZlYTk3YjIzYjg0MyJ9.x8rSh2h-Lm_P-zFTYHB-CmzDHYGmXf-KtCRM_YyISQg"
}
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Cpf does not exist" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Password invalid" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Invalid token" }
Para acessar essa rota o usuario precisa se autenticar definindo o Auth no header com o token gerado no login.
- Path:
/transfers
- Method:
POST
- Header:
Authorization: token
- Body :
{
"account_destination_id": "de7cb18e-5799-4f08-be4e-f69c2288e3ea",
"amount": 10.5
}
- Status code:
200
- Content-Type:
application/json
- Body :
{
"id": "3422fdcc-37c4-480e-9954-a38502a2cb9b",
"account_origin_id": "3d092a28-2c5e-4af2-bf12-b90010cc45fa",
"account_destination_id": "de7cb18e-5799-4f08-be4e-f69c2288e3ea",
"amount": 10.5,
"createdAt": "2021-10-18T12:13:51.288333982-03:00"
}
-
Status code:
401
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Auth required" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Account destiny id can't be the same account origin id" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Account origin id doesn't exists" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Account destiny id doesn't exists" }
-
Status code:
400
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Insufficient Limit" }
Para acessar essa rota o usuario precisa se autenticar definindo o Auth no header com o token gerado no login.
- Path:
/transfers
- Method:
GET
- Header:
Authorization: token
- Status code:
200
- Content-Type:
application/json
- Body :
[
{
"id": "3422fdcc-37c4-480e-9954-a38502a2cb9b",
"account_origin_id": "3d092a28-2c5e-4af2-bf12-b90010cc45fa",
"account_destination_id": "de7cb18e-5799-4f08-be4e-f69c2288e3ea",
"amount": 10,
"createdAt": "2021-10-18T12:13:51.288333982-03:00"
}
]
-
Status code:
401
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Auth required" }
-
Path:
/bills
-
Method:
POST
-
Header:
Authorization: token
-
Body :
{
"description": "Conta aleatoria",
"value": 300,
"due_date": "2022-01-05T17:35:18Z"
}
- Status code:
200
- Content-Type:
application/json
- Body :
{
"id": "62451496-8b10-46cc-88e6-f924d2b409f0",
"account_id": "02938f42-b7b5-44c5-90b2-51501c3c58d9",
"description": "Conta aleatoria",
"value": 300,
"due_date": "2022-01-05T17:35:18Z",
"scheduled_date": "2022-03-03T12:07:24.792614951-03:00",
"status": "Pago",
"created_at": "2022-03-03T12:07:24Z"
}
-
Status code:
401
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Auth required" }
-
Status code:
500
-
Content-Type:
application/json
-
Body (example):
{ "reason": "Insufficient Limit" }
- Path:
/bills
- Method:
GET
- Header:
Authorization: token
- Status code:
200
- Content-Type:
application/json
- Body :
[
{
"id": "62451496-8b10-46cc-88e6-f924d2b409f0",
"account_id": "02938f42-b7b5-44c5-90b2-51501c3c58d9",
"description": "Conta aleatoria",
"value": 300,
"due_date": "2022-01-05T17:35:18Z",
"scheduled_date": "2022-03-03T12:07:24.792614951-03:00",
"status": "Pago",
"created_at": "2022-03-03T12:07:24Z"
}
]
Faça o clone deste repositorio, entre na pasta apiTestGolang, crie o arquivo .env na raiz do projeto com as variaveis do .env.example e defina a porta que a aplicação ira rodar e o Access_secret que pode ser uma string de valor qualquer que serve para gerar o token.
Para criar a imagem da aplicação com docker digite no terminal.
docker image build -t apitestegolang .
Para rodar o container na porta 3000:
docker run -it -p 3000:3000 apitestegolang
Se nao tiver o docker instalado, baixe as dependencias com go mod tidy
entre na pasta cmd cd cmd
e rode a aplicação com go run main.go
Para rodar os testes rode o comando go test -v ./...
- Utilizar o storage local: adicionar a variável de ambiente LOCAL_STORAGE=true
Para criaçao e manipulação de tokens:
- JWT-GO: github.com/dgrijalva/jwt-go v3.2.0
Para criação e geração de ids automatico.
- UUID: github.com/google/uuid v1.3.0
Para manipulação de rotas HTTP
- Gorilla Mux: github.com/gorilla/mux v1.8.0
Para criptografar senhas como hash e outros formatos.
- BCrypt: golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
Para maniupular variáveis ambiente:
- GoDotEnv: github.com/joho/godotenv v1.4.0
- Adicionar testes a camada HTTP