Este repositório contém uma implementação de uma API REST em Node.js que utiliza AWS SQS (Simple Queue Service) para a comunicação assíncrona e DynamoDB como banco de dados NoSQL.
Antes de começar, é necessário ter as seguintes ferramentas instaladas em sua máquina:
- Node.js (v18+)
- Conta AWS com acesso ao AWS SQS e DynamoDB
-
Clone este repositório:
git clone https://github.com/the0wl/transactions.git
-
Instale as dependências:
cd transactions npm install
-
Defina as variáveis de ambiente:
Renomeie o arquivo
.env.example
para.env
e defina os valores das variáveis de ambiente conforme necessário.
-
Inicie o servidor:
npm start
-
Acesse a API em
http://localhost:3333
.
Caso necessário altere a porta alterando a linha
server.listen(3333);
no arquivosrc/server.js
. Considere também, criar uma variávelPORT
no arquivo .env e fazer a sua leitura nesta linha.
- GET /transactions: Retorna todos os recursos.
- POST /transactions: Cria um novo recurso.
Para criar ou atualizar um recurso, o payload deve ser enviado no formato JSON, por exemplo:
{
"amount": 1200.00,
"type": "credit"
}
type
deve ser do tipo "credit" ou "debit"
Utilizando React e TailwindCSS.
import { useEffect, useState } from 'react';
interface Transaction {
idempotencyId: string
amount: number
type: string
}
export default function Home() {
const [transactions, setTransactions] = useState<Transaction[]>([]);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch('http://<host>:<port>/transactions');
if (!response.ok) {
throw new Error('Erro ao buscar transações');
}
const data = await response.json();
setTransactions(data);
} catch (error) {
console.error(error);
}
};
fetchData();
}, []);
return (
<main className="flex flex-col bg-stone-900 h-screen px-96 py-8 gap-4">
<h2 className="text-lg text-stone-400 font-bold mb-4">
Lista de Transações
</h2>
<div className="relative overflow-hidden shadow-md rounded-lg">
<table className="table-fixed w-full text-left">
<thead className='text-stone-400 uppercase bg-stone-700'>
<tr>
<th className="py-2 text-center font-bold p-4">ID</th>
<th className="py-2 text-center font-bold p-4">Amount</th>
<th className="py-2 text-center font-bold p-4">Type</th>
</tr>
</thead>
<tbody className='bg-white text-stone-900'>
{transactions.map(transaction => (
<tr key={transaction.idempotencyId} className="py-5">
<td className="py-5 p-4">
<span>{transaction.idempotencyId}</span>
</td>
<td className="py-5 text-center p-4">
<span>USD {transaction.amount}</span>
</td>
<td className="py-5 text-center p-4">
<span>{transaction.type}</span>
</td>
</tr>
))}
</tbody>
</table>
</div>
</main>
);
}