Projeto proposto pela Alura Challend Backend.
- Dokerfile: docker
- docker-compose
- Flask
- dynaconf
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- flask-marshmallow
- marshmallow-sqlalchemy
- marshmallow-enum
- Flask-JWT-Extended
- gunicorn
- CLI
Projeto bem bacana para se trabalhar, utilizando conseitos de login com jwt. Efetuei o vinculo de usuário a cada um dos modelos através do login, pegando o e-mail e assim tendo o id de usuário para cadastrar cada despesa ou receita.
Para adcionar um superuser, somente rodar o comando no terminal
flask create-superuser
flask create-superuser
Create superuser command
Username: nome-de-usuario
E-Mail: email@email.com
Password: minhaSenha
http://localhost:5500/api/v1/auth/login
{
"email": "email@email.com",
"password": "123456"
}
caso de sucesso deve se retornar um novo token
{
"token": "eyJ0eXAiOiJAL1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY2MDc4ODg3NSlkanRpIjoiNzgzNTAyMzYtYzRhYS00NDRmLWE1OGEtOGQwMDliNjFmNzgwIiwidHlaTSI6ImFjY2VzcyIsInN1YiI6eyJlbWFpbCI6ImphY2tzb25zcjQ1MUBnbWFpbC5ja20ifSwibmJmIjoxNjYwNzg4ODc1LCJleHAiOjE2NjA3OTYwNzV9.SgX6-LH4G5lEwGMltxUxi6Zjd80Vn84VPIO10lkq_Ro"
}
caso de erro
{
"error": "Erro ao tentar login!"
}
a cada rota da api deve ser entregue o TOKEN meno para cadastro de usuário.
Authorization: Bearer meu-token
@classmethod
def add_user_id(cls, user_id):
cls.user_id = user_id
return cls
Assim ao controlador chamar o model é passado a ele o usuário que esta utilizando para efetuar o cadastro de uma receita ou despesa.
from flask_jwt_extended import get_jwt_identity
def meu_controller(self):
user = UserModel.get_user_by_email(email=get_jwt_identity()["email"])
DespesasModel.add_user_id(user_id=user.id).add(request=req_request)
ReceitasModel.add_user_id(user_id=user.id).add(request=req_request)
Por padrão as Rotas da api se iniciam como /api/v1
/api/v1/receitas
/api/v1/receitas?descricao=??
/api/v1/receitas/<id>
/api/v1/receitas/<ano>/<mes>
/api/v1/despesas
/api/v1/despesas?descricao=??
/api/v1/despesas/<id>
/api/v1/despesas/<ano>/<mes>
/api/v1/resumo/<ano>/<mes>
/api/v1/usuarios
/api/v1/usuarios/<id>
/api/v1/auth/login
no caso de localhost é porta 5000:
http://localhost.5000/api/v1/receitas
metodo POST com campos obrigatorios (descrição, valor, data), no formato json
{
"descricao": "Minha descrição de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
caso de SUCESSO
{
"message": "Dados inseridos com sucesso"
}
caso ERRO
{
"error": "Não é permitido salvar, verifique os dados inseridos e se não são repeditos!"
}
http://localhost.5000/api/v1/receitas
metodo GET, visualização em json
caso tenha REGISTROS
[
{
"id": 1,
"descricao": "Minha descrição de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
},
{
"id": 2,
"descricao": "Minha descrição 2 de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
]
caso não tenha REGISTOS
{
"error": "Não há registros em receitas"
}
http://localhost.5000/api/v1/receitas/1
metodo DELETE, visualização em json
caso SUCESSO
{
"message": "Registro deletado com sucesso para o id: 1"
}
caso ERRO
{
"error": "Registro não existe para este id: 1"
}
http://localhost.5000/api/v1/receitas/1
metodo GET, visualização em json
{
"id": 1,
"descricao": "Minha descrição de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
http://localhost.5000/api/v1/receitas/1
metodo PUT com campos obrigatorios (descrição, valor, data), no formato json
{
"descricao": "Minha descrição atualizada de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
visualização de resultado com json
caso SUCESSO
{
"message": "Dados atualizado"
}
caso não encontre REGISTO
{
"error": "Não há registro para receita de id: 1"
}
caso ERRO
{
"message": "Erro ao alualizar receita de id: 1"
}
http://localhost.5000/api/v1/despesas
metodo POST com campos obrigatorios (descrição, valor, data), no formato json
{
"descricao": "Minha descrição de receita",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
visualizando resultado em json
caso de SUCESSO
{
"message": "Dados inseridos com sucesso"
}
caso ERRO
{
"message": "Não é permitido salvar, verifique os dados inseridos e se não são repeditos!"
}
http://localhost.5000/api/v1/despesas
metodo GET, visualização em json
caso tenha REGISTROS
[
{
"id": 1,
"descricao": "Minha descrição de despesa",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
},
{
"id": 2,
"descricao": "Minha descrição 2 de despesa",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
]
caso não tenha REGISTOS
{
"message": "Não há registros em receitas"
}
http://localhost.5000/api/v1/despesas/1
metodo DELETE, visualização em json
caso SUCESSO
{
"message": "Registro deletado com sucesso para o id: 1"
}
caso ERRO
{
"message": "Registro não existe para este id: 1"
}
http://localhost.5000/api/v1/despesas/1
metodo GET, visualização em json
{
"id": 1,
"descricao": "Minha descrição de despesa",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
http://localhost.5000/api/v1/despesas/1
metodo PUT com campos obrigatorios (descrição, valor, data), no formato json
{
"descricao": "Minha descrição atualizada de despesa",
"valor": "1000,00",
"data": "2022-08-02 19:43:10"
}
visualização de resulta com json
caso SUCESSO
{
"message": "Dados atualizado"
}
caso não encontre REGISTO
{
"message": "Não há registro para despesa de id: 1"
}
caso ERRO
{
"message": "Erro ao alualizar despesa de id: 1"
}