API para processamento de pedidos em flat positional txt
Utilizei a arquitetura Package by Feature com MVCS para separar de forma independente e clara cada parte do meu sistema (Pedidos e usuarios) em packages com o uso do MVCS. A adoção dessa forma foi decidida para trazer simplicidade e coesão para cada package e menos aclopamento entre ambos.
Em cada package, conta com controllers, entities (model), repositories e services. Estabelecendo um fluxo de MVCS
Os principais principios contidos neste repositorio sao:
- Single Responsability
- Interface Segregation
- Depency Inversion
Cada service de cada package assumiu unicamento uma responsabilidade, seja para abrir o arquivo txt e processar linha por linha, seja para montar a estrututura para salvar no banco ou para listar os pedidos.
Toda comunicação com os services e repositories acontecem por meio de interfaces estabelecidas como contrato. Fugindo assim da implementação do service, e dependendo somente de interfaces.
Todos as classes que dependem de outras classes recebem estas em seus construtores afim de aplicar o principio de inversão
A adoção do MongoDB foi pensada para buscar a simplicidade para lidar com os pedidos, tendo em vista que os arquivos .txt de pedidos contem produtos de mesmo ID com preços diferentes, podendo ser interpretado como um historico de pedidos e produtos
Toda vez que um pedido é busca, um referencia entre documentos é feito e o usuario pertencente ao pedido tambem é buscado.
Pedido
{
"_id": "ObjectId";
"user_id" "ObjectId";
"order_id": "number";
"date": "Date";
"total": "string";
"products": {
"product_id": "number";
"value": "string";
}[];
}
Usuario
{
"_id": "ObjectId";
"user_id" "number";
"name": "string";
}
Necessario:
- docker
- docker-compose
Iniciar aplicação
docker-compose up
Testes
yarn test:cov
POST /orders/file/upload
Parametro | Tipo | Descrição | |
---|---|---|---|
form-data |
file |
File |
Required. Arquivo .txt |
curl -X POST \
-F "file=@caminho/do/seu/arquivo.txt" \
http://localhost:3000/orders/file/upload
{
"message": "File uploaded successfully"
}
HTTP Code | Mensagem | Descrição |
---|---|---|
400 |
Bad Request |
Only .txt files are allowed |
400 |
Bad Request |
Empty file |
GET /orders?order_id=&start_date=&end_date=
Parametro | Tipo | Descrição | |
---|---|---|---|
Query params |
number |
order_id |
Opcional |
Query params |
string |
start_date |
Opcional 'yyyy-mm-dd' |
Query params |
string |
end_date |
Opcional 'yyyy-mm-dd' |
curl -X GET \
http://localhost:3000/orders?start_date=2021-10-18&end_date=2021-10-18&order_id=73
[
{
"user_id": 7,
"name": "Magdalena Kub",
"orders": [
{
"order_id": 73,
"date": "2021-10-18",
"total": "1740.13",
"products": [
{
"product_id": 2,
"value": "423.07"
},
{
"product_id": 0,
"value": "1317.06"
}
]
}
]
}
]
Quando não é encontrado nenhum registro, é devolvido um array vazio ([])