🇧🇷 Português · 🇺🇸 English
Exemplar da tela inicial do projeto
Este projeto é o resultado de um desafio concluído. O desafio consistia em um aplicativo que conecta numa API e externa através de pedidos HTTPS usando a biblioteca da classe .NET. Link para o desafio: https://thecsharpacademy.com/project/15/drinks
De acordo com o que o desafio solicitava eu produzi um aplicativo de console interativo que permite à equipe de um restaurante navegar por um catálogo de drinks servido por uma API externa
API Externa utilizada: TheCocktailDB(https://www.thecocktaildb.com/). Escrito em C# / .NET
De acordo com a solicitação do desafio: o usuário escolhe uma categoria, depois um drink, e vê seus detalhes. Campos vazios nunca vão ser exibidos e o aplicativo continua funcionando mesmo que a API esteja fora do ar
- Navegação categoria → drink → detalhes, usando Spectre.Console para a interface do terminal.
Exemplar de como é exibido as categorias em produção:
-
Campos opcionais são renderizados apenas quando a API os retorna de modo que nenhum cartão de detalhes exibe valores em branco
-
As chamadas de rede são encapsuladas e então um timeout ou uma indisponibilidade mostra uma mensagem em vez de um stack trace
Funcionalidades extras de acordo com desafio:
-
Favoritos: opção de salvar drinks localmente como favoritos
-
Contagem de visualizações: rastreia quantas vezes cada drink é aberto e então salva localmente
-
Um link clicável para a imagem de cada drink
Exemplar de como as informações do drink aparece em produção:
- O desafio não exigia SQL então os favoritos e contagens de visualização ficam em um arquivo local
userdata.json.
O projeto é dividido em camadas e cada uma com uma única responsabilidade:
Program.cs Raiz de composição (configuração da injeção de dependências)
Models/ Objetos de dados simples (DTOs da API + dados salvos do usuário)
Services/ Camada de negócio e de I/O
├─ IDrinksApiService / DrinksApiService HTTP + JSON (TheCocktailDB)
├─ IUserDataService / UserDataService Persistência local em JSON
└─ DrinksApiException Um único tipo de erro para a UI capturar
UI/
└─ MenuUI Somente a apresentação (Spectre.Console)
IHttpClientFactory+ cliente tipado. A factory reaproveita e recicla os handlers subjacentes, o que evita o esgotamento de sockets que ocorre ao criar um novoHttpClientpor requisição.System.Text.Json. Nativo, rápido e sem dependência extra.[JsonExtensionData]para os ingredientes. A API retorna 15 pares planos destrIngredient/strMeasure. Capturá-los em um único dicionário mantém o modeloDrinkenxuto e reconstrói uma lista limpa sob demanda.- Um único
DrinksApiException. A UI captura um único tipo, então qualquer falha de rede termina em uma mensagem em vez de um crash. - Interfaces entre as camadas. Cada camada pode ser substituída ou testada de forma independente.
- Arquivo JSON para armazenamento. O desafio não exigia SQL, então um arquivo local guarda os dados.
Requer o .NET SDK 8.0 ou superior.
dotnet run -c ReleaseNo Windows, caso o dotnet não esteja no seu PATH:
& "C:\Program Files\dotnet\dotnet.exe" run -c Release| Ação | Endpoint |
|---|---|
| Listar categorias | list.php?c=list |
| Drinks de uma categoria | filter.php?c={category} |
| Detalhes completos do drink | lookup.php?i={id} |



