API de gerenciamento de planos telefônicos onde é possível criar, consultar, editar e deletar os planos.
- Instalação
- API
- Testes
- Tutorial disponível para o sistema MacOS.
Clonar o projeto e entrar na pasta raiz do projeto.
$ git clone git@github.com:<git_user>/wooza.git
...
$ cd wooza/
Instalar o Homebrew.
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Instalar o Python3.
$ brew install python3
Instalar o Virtualenv.
$ pip install virtualenv
Ainda na pasta raiz do projeto, criar um ambiente virtual.
$ virtualenv venv -p python3
Ativar o ambiente virtual.
$ source venv/bin/active
Para desativar basta rodar o comando: $ deactive
Ainda no ambiente virtual, instalar as dependências.
(venv) $ pip install -r requirements.txt
Para verificar se tudo fora instalado corratamente basta rodar o comando: $ pip freeze
Instalar o Postgresql.
(venv) $ brew install postgresql
Criar o banco de dados.
(venv) $ createdb wooza_db
Entrar no banco de dados.
(venv) $ psql wooza_db
Criar o super usuário para o banco de dados.
> CREATE USER username WITH PASSWORD 'password';
> ALTER ROLE username SET client_encoding TO 'utf8';
> ALTER ROLE username SET default_transaction_isolation TO 'read committed';
> ALTER ROLE username SET timezone TO 'UTC';
Dar as permissões criadas acima do banco de dados para o usuário.
> GRANT ALL PRIVILEGES ON DATABASE simplecommercedb TO username;
Sair do Postegresql.
> \q
Abrir o arquivo settings.py
e modificar as variável do DATABASE
preenchendo de acordo com o usuário e senha criados no banco.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'wooza_db',
'USER': '<username>',
'PASSWORD': '<password>',
'HOST': 'localhost'
}
}
Rodar a migrações do projeto apontando para o novo banco de dados.
(venv) $ cd app/
(venv) $ python manage.py migrate
Rodar o projeto.
(venv) $ python manage.py runserver
Url disponíveis
http://127.0.0.1:8000/plans/
http://127.0.0.1:8000/plans/create/
http://127.0.0.1:8000/plans/update/id
http://127.0.0.1:8000/plans/delete/id
[POST] http://127.0.0.1:8000/plans/create/
Exemplo do body para criar um plano
{
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "Pós",
"operator": "Oi",
"ddds": [21]
}
A API verifica se você está passando corretamente o método de requisição correta.
Caso o método de requisição seja diferente de POST
, a API irá retornar uma mensagem de erro:
{
"error": {
"code": 400,
"message": "Bad Request."
}
}
Todos os campos são obrigatórios para a criação de um plano. Caso alguns desses campos estejam vazios, a API irá retornar uma mensagem de erro.
{
"error": {
"code": 400,
"message": "Bad Request.",
"invalid_fields": [
{
"plan_code": "is empty."
},
{
"minutes": "is empty."
},
{
"internet": "is empty."
},
{
"price": "is empty."
},
{
"plan_type": "is empty."
},
{
"operator": "is empty."
},
{
"ddds": "is empty."
}
]
}
}
Os campos minutes
e price
são do tipo int
ou float
, mas, pode-se passar como str
.
Caso algum desses campos estejam preenchidos erradamente, a API irá retornar uma mensagem de erro.
{
"error": {
"code": 400,
"message": "Bad Request.",
"invalid_fields": [
{
"minutes": "is not a valid number."
},
{
"price": "is not a valid number."
}
]
}
}
Os campos plan_type
e ddds
já são predefinidos.
O campo plan_type
aceita apenas os seguintes dados: Controle, Pós e Pré
.
O campo ddds
aceita uma lista de DDDs do Brasil, como: [11, 21, ...]
.
Caso algum desses campos estejam preenchidos erradamente, a API irá retornar uma mensagem de erro.
{
"error": {
"code": 400,
"message": "Bad Request.",
"invalid_fields": [
{
"plan_type": "is not a valid choice."
},
{
"ddds": "is not a valid choice."
}
]
}
}
O campo plan_code
é único para cada plano criado.
Caso esse campo seja preenchido com algum código de plano já existente, a API irá retornar uma mensagem de erro.
{
"error": {
"code": 400,
"message": "Bad Request.",
"invalid_fields": [
{
"plan_type": "is not a valid choice."
}
]
}
}
Passado todas as validações da API, a mesma irá retornar o objeto criado.
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": 29.75,
"plan_type": "pós",
"operator": "oi",
"ddds": [
21
]
}
],
"status_code": 200
}
[PUT|POST] http://127.0.0.1:8000/plans/update/<id>
Exemplo do body para criar um plano
{
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": "59.90",
"plan_type": "Controle",
"operator": "Tim",
"ddds": [11]
}
Assim como a validação é feita na API de Criação é feita na API de Edição.
Porém, caso um id
seja passado e o objeto não exista na base, a API irá retornar uma mensagem de erro.
{
"error": {
"code": 404,
"message": "Not Found."
}
}
Passado todas as validações da API, a mesma irá retornar o objeto editado.
{
"data": [
{
"id": 1,
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": 59.9,
"plan_type": "controle",
"operator": "tim",
"ddds": [
11
]
}
],
"status_code": 200
}
[POST] http://127.0.0.1:8000/plans/delete/<id>
Possui apenas duas validaçãos. Verifica o método de requisição e se o id
passado existe na base.
A API irá remover da base de dados o objeto. Passado todas as validações da API, a mesma irá retornar o objeto deletado.
{
"data": [
{
"id": 1,
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": 59.9,
"plan_type": "controle",
"operator": "tim",
"ddds": [
11
]
}
],
"status_code": 200
}
GET http://127.0.0.1:8000/plans/
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
21
]
},
{
"id": 2,
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": "59.90",
"plan_type": "controle",
"operator": "tim",
"ddds": [
11
]
}
],
"total": 2,
"status_code": 200
}
Para fazer buscas na API de Consulta é obrigatório o uso de um DDD
.
Opções disponíveis para serem adicionadas na busca dos planos:
- DDD [obrigatório]
- Tipo de plano
- Operador
- Código do plano
GET http://127.0.0.1:8000/plans/?ddds=[21]
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
21
]
}
],
"total": 1,
"status_code": 200
}
ATENÇÃO.
A API ao buscar por uma lista de DDDs
irá retornar apenas aquelas que tenham exatamente todos os DDDs
iguais.
Veja o exemplo abaixo.
GET http://127.0.0.1:8000/plans/
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
},
{
"id": 2,
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": "59.90",
"plan_type": "controle",
"operator": "tim",
"ddds": [
11
]
}
],
"total": 2,
"status_code": 200
}
Buscando os planos que possuem o DDD
11.
GET http://127.0.0.1:8000/plans/?ddds=[11]
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
},
{
"id": 2,
"plan_code": "TimControle200",
"minutes": 200,
"internet": "20GB",
"price": "59.90",
"plan_type": "controle",
"operator": "tim",
"ddds": [
11
]
}
],
"total": 2,
"status_code": 200
}
Buscando os planos que possuem os DDDs
11 e 21.
GET http://127.0.0.1:8000/plans/?ddds=[11, 21]
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
}
],
"total": 1,
"status_code": 200
}
Buscando os planos pelo Tipo do plano
.
GET http://127.0.0.1:8000/plans/?ddds=[21]&plan_type=Pós
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
}
],
"total": 1,
"status_code": 200
}
Buscando os planos pelo Operador
.
GET http://127.0.0.1:8000/plans/?ddds=[21]&operator=Oi
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
}
],
"total": 1,
"status_code": 200
}
Buscando os planos pelo Código do plano
.
GET http://127.0.0.1:8000/plans/?ddds=[21]&plan_code=OiPos100
{
"data": [
{
"id": 1,
"plan_code": "OiPos100",
"minutes": 100,
"internet": "10GB",
"price": "29.75",
"plan_type": "pós",
"operator": "oi",
"ddds": [
11, 21, 22
]
}
],
"total": 1,
"status_code": 200
}
(venv) $ cd app/
(venv) $ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...........................................
----------------------------------------------------------------------
Ran 43 tests in 1.456s
OK
Destroying test database for alias 'default'...