Resumo do que foi proposto para este Chalenge:
Semana 1
Implementar uma API REST: implementar nela o CRUD de receitas e de despesas, seguindo algumas validações e regras de negócio, implementar rotas para que sejam feitas requisicções HTTP, usar o Postman para testar estas requisições Não pode repetir a mesma descrição de despesa e receita para o mesmo mês/ano, caso o usuário tente fazer isso, é feita uma checagem e é devolvida uma mensagem avisando que isto não é permitido, e o post não é efetivado.Semana 2
Realizar ajustes na API: para permitir a categorização de despesas, além de implementar novas funcionalidades, como a busca de receitas e despesas pela descrição. Tambem é para fazer testes automatizados.Semanas 3 e 4
Adicionar segurança na API: com a implementação de um mecanismo de autenticação, além o deploy dela em algum provedor
O que já fiz até hoje (4 semanas):
Fiz tudo o que foi pedido, só falta realizar os testes automatizados, estou estudando sobre isto para poder fazer
Criei o projeto usando o framework Symfony, e o gerenciador Doctrine para fazer o mapeamento de objetos para o banco de dados, facilitando a conexão e consultas com o banco. Implementei as rotas, e em cada uma delas está definida qual requisição pode ser feita.
Criei as rotas pedidas, com as regras pedidas, criei a rota onde saem as despesas categorizadas, implementei a autenticação, tem uma rota que fica escondida, que cria o usuario, depois este usuario insere o nome e senha na rota de login, e é devolvido um token, que ele insere na aba Authorization, type: Bearer Token do Postman (não testei em outro programa mas deve ser parecido com o Postman), após inserir este token ele consegue acessar as demais rotas, a rota de login é a única que não exige que este token esteja inserido. Está feito o deploy, agora só falta estudar melhor a parte dos testes automatizados para tentar implementa-los, por enquanto fiz os testes manualmente e e está tudo funcionando conforme o pedido.
Banco de dados: Criei banco de dados com 3 tabelas, uma pra armazenar as informações das receitas, outra para
as despesas e mais uma para armazenar usuário e senha para autenticação.
Criei as rotas pedidas que são estas abaixo:
OBS: irei tentar melhorar estas urls...consequentemente deixando as rotas melhores e mais curtas...
Rota de login:
@Route("/login", name="app_login")
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/login
Nesta rota o usuario insere os dados assim:
caso queira testar entre em contato para saber o usuário:
{ "usuario": "xxxxx",
"senha" : "xxxxxx"
}
E envia um post, na resposta é retornado o token que ele irá inserir na autorização, no postman, marcar opção bearer token
Apos inserir este token as requisicoes podem ser feitas:
Receitas:
@Route("/receitas", methods={"POST"}, por enquanto está assim a rota:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas
Esta rota é para o usuário inserir uma receita, usando o método POST
Exemplo de post em receitas:
{ "descricao": "salario atualiza", "valor": 2400, "data": "08/07/2022" }
@Route("/receitas", methods={"GET"})
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas
Esta rota é para o usuário buscar informações de todas receitas, usando o método GET
@Route("/receitas/{id}", methods={"GET"}):
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas/id
Esta rota é para o usuário buscar informações de uma receita, passando o seu id e usando o método GET
@Route("/receitas/{id}", methods={"PUT"}):
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas/id
Esta rota é para o usuário atualizar informações de uma receita, passando o seu id e usando o método PUT
@Route("/receitas/{id}", methods={"DELETE"}):
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas/id
Esta rota é para o usuário deletar informações de uma receita, passando o seu id e usando o método DELETE
@Route("/receitas/descricao/{descricao}", methods={"GET"})
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas/descricao/salario
Nesta rota o usuario pode buscar todas as receitas de acordo com uma descrição passada na url, e usando o GET
@Route("/receitas/mes/{mesano}", methods={"GET"}) :
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/receitas/mes/mm-yyyy
Nesta rota o usuario pode buscar todas as receitas de um mesmo mes(no mesmo ano), e usando o GET
Despesas:
@Route("/despesas", methods={"POST"} :
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas
Esta rota é para o usuário inserir uma despesa, usando o método POST
As categorias possíveis para inserir são: alimentação, saúde, moradia, transporte, educação, lazer e imprevistos, caso seja inserida outra categoria
ou uma destas com nome errado será atribuída a categoria outras.
Exemplo de post em despesas:
{ "descricao": "padaria", "valor": 12, "categoria": "alimentação", "data": "22/07/2022" }
@Route("/despesas", methods={"GET"}), :
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas
Esta rota é para o usuário buscar informações de todas despesas, usando o método GET
@Route("/despesas/{id}", methods={"GET"}), abaixo segue um exemplo:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas/id
Esta rota é para o usuário buscar informações de uma despesa, passando o seu id e usando o método GET
@Route("/despesas/{id}", methods={"PUT"}), abaixo segue um exemplo:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas/id
Esta rota é para o usuário atualizar informações de uma despesa, passando o seu id e usando o método PUT
@Route("/despesas/{id}", methods={"DELETE"}), abaixo segue um exemplo:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas/id
Esta rota é para o usuário deletar informações de uma despesa, passando o seu id e usando o método DELETE
@Route("/despesas/descricao/{descricao}", methods={"GET"}), abaixo segue um exemplo:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas/descricao/papelaria
Nesta rota o usuario pode buscar todas as despesas de acordo com uma descrição passada na url, e usando o GET
@Route("/despesas/mes/{mesano}", methods={"GET"}), ficou assim localmente no meu computador:
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/despesas/mes/mm-yyyy
Nesta rota o usuario pode buscar todas as despesas de um mesmo mes(no mesmo ano), e usando o GET
Resumo mensal:
@Route("/resumo/{mesano}", methods={"GET"}
https://apicontrolefinanceiro.crismgsp.com/controlefinanceiro/public/index.php/resumo/mm-yyyy
onde mm -> mês com 2 dígitos e yyyy é ano com 2 dígitos
ao acessar esta rota de resumo mensal, utilizando o GET, obtem-se um resultado assim, por exemplo:
O valor total das receitas do mês é 2700
O saldo final do mês é 1640
Valor total de despesas por categoria neste mês:
Categoria alimentação -> Valor: 325
Categoria educação -> Valor: 125
Categoria imprevistos -> Valor: 40
Categoria lazer -> Valor: 540
Categoria outras -> Valor: 30
Ferramentas e linguagens utilizadas até agora:
PHPMyAdmin (pra acessar o MariaDB)
O que aprendi participando deste projeto
Aprendi a usar um framework, e ainda conheço pouco sobre o symfony, então ao mesmo tempo em que ele me trouxe facilidade e velocidade pra fazer o projeto,
quando ocorre algum erro é mais demorado até descobrir pois desta vez não fiz tudo do zero, tem muita coisa pronta que vem ao instalar o framework, muitos arquivos,
e tive alguns problemas de comandos e partes do pacote que estão depreciadas, então posteriormente pretendo instalar desde o início em uma versão mais recente e atualizar alguns comandos, como estou fazendo para poder acompanhar o curso que ensina sobre testes automatizados. Mas foi um aprendizado muito interessante, inclusive aprendi bastante com os diversos erros que apareceram, se tivesse dado tudo certo apenas assistindo às aulas e adaptando para o projeto, não teria aprendido o mesmo tanto.
<br
Referencias das imagens para credito:
PHP -> https://www.flaticon.com/br/icones-gratis/php