Nesse desafio, você deve continuar desenvolvendo a aplicação de gestão de transações, treinando o que você aprendeu até agora no Node.js junto ao TypeScript, mas dessa vez incluindo o uso de banco de dados com o TypeORM e envio de arquivos com o Multer!
Essa será uma aplicação que deve armazenar transações financeiras de entrada e saída e permitir o cadastro e a listagem dessas transações, além de permitir a criação de novos registros no banco de dados a partir do envio de um arquivo csv.
POST /transactions
: A rota deve recebertitle
,value
,type
, ecategory
dentro do corpo da requisição, sendo otype
o tipo da transação, que deve serincome
para entradas (depósitos) eoutcome
para saídas (retiradas). Ao cadastrar uma nova transação, ela deve ser armazenada dentro do seu banco de dados, possuindo os camposid
,title
,value
,type
,category_id
,created_at
,updated_at
.
Dica: Para a categoria, você deve criar uma nova tabela, que terá os campos id
, title
, created_at
, updated_at
.
Dica 2: Antes de criar uma nova categoria, sempre verifique se já existe uma categoria com o mesmo título. Caso ela exista, use o id
já existente no banco de dados.
{
"id": "uuid",
"title": "Salário",
"value": 3000,
"type": "income",
"category": "Alimentação"
}
GET /transactions
: Essa rota deve retornar uma listagem com todas as transações que você cadastrou até agora, junto com o valor da soma de entradas, retiradas e total de crédito. Essa rota deve retornar um objeto o seguinte formato:
{
"transactions": [
{
"id": "uuid",
"title": "Salário",
"value": 4000,
"type": "income",
"category": {
"id": "uuid",
"title": "Salary",
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
{
"id": "uuid",
"title": "Freela",
"value": 2000,
"type": "income",
"category": {
"id": "uuid",
"title": "Others",
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
{
"id": "uuid",
"title": "Pagamento da fatura",
"value": 4000,
"type": "outcome",
"category": {
"id": "uuid",
"title": "Others",
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
{
"id": "uuid",
"title": "Cadeira Gamer",
"value": 1200,
"type": "outcome",
"category": {
"id": "uuid",
"title": "Recreation",
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
},
"created_at": "2020-04-20T00:00:49.620Z",
"updated_at": "2020-04-20T00:00:49.620Z"
}
],
"balance": {
"income": 6000,
"outcome": 5200,
"total": 800
}
}
Dica: Dentro de balance, o income é a soma de todos os valores das transações com type
income. O outcome é a soma de todos os valores das transações com type
outcome, e o total é o valor de income - outcome
.
Dica 2: Para fazer a soma dos valores, você pode usar a função reduce para agrupar as transações pela propriedade type
, assim você irá conseguir somar todos os valores com facilidade e obter o retorno do balance
.
DELETE /transactions/:id
: A rota deve deletar uma transação com oid
presente nos parâmetros da rota;
POST /transactions/import
: A rota deve permitir a importação de um arquivo com formato.csv
contendo as mesmas informações necessárias para criação de uma transaçãoid
,title
,value
,type
,category_id
,created_at
,updated_at
, onde cada linha do arquivo CSV deve ser um novo registro para o banco de dados, e por fim retorne todas astransactions
que foram importadas para seu banco de dados. O arquivo csv, deve seguir o seguinte modelo
Para utilizar a funcionalidade de testes, é importante lembrar: