API REST desenvolvida em C# com ASP.NET Core (.NET 8) como solução para o Desafio Back-end Developer da DoroTech.
O projeto tem como objetivo auxiliar uma livraria no gerenciamento de seus livros em estoque, permitindo consulta, cadastro, edição e exclusão, com persistência em banco de dados, autenticação JWT e documentação via Swagger.
- C#
- ASP.NET Core Web API (.NET 8)
- Entity Framework Core
- MySQL
- JWT (JSON Web Token)
- Swagger / OpenAPI
- Serilog (logs de registro e erro)
- Injeção de Dependência
- Padrões Repository e Service
- Princípios SOLID e Clean Code
Uma livraria da cidade teve um aumento no número de seus exemplares e está com dificuldades para identificar todos os livros em estoque.
Foi solicitado o desenvolvimento de uma aplicação web para gerenciar esses livros.
- Listar todos os livros cadastrados ordenados de forma ascendente pelo nome
- Validar se o livro já está cadastrado ao persistir
- Permitir consultar, criar, editar e excluir livros
- Persistir os dados em banco de dados
- Criar mecanismo de log de registros e erros
| Requisito | Implementação |
|---|---|
| Listagem ordenada por nome | ✅ Implementado |
| Validação de duplicidade | ✅ Implementado |
| CRUD completo | ✅ Implementado |
| Persistência em banco de dados | ✅ Implementado |
| Logs de registro e erro | ✅ Serilog |
| Requisito | Implementação |
|---|---|
| Swagger configurado | ✅ Swagger + XML Comments |
| Autenticação JWT (Bearer) | ✅ Implementado |
| Entity Framework Core | ✅ Utilizado |
| Banco de dados | ✅ MySQL |
| Migrations / Scripts | ✅ EF Core |
.gitignore |
✅ Incluído |
A API utiliza JWT (Bearer Token) para autenticação.
- Administrador (Admin)
- Criar livros
- Atualizar livros
- Excluir livros
- Usuário Público
- Listar livros
- Buscar livro por ID
- Não requer autenticação
No Swagger UI, utilize o botão Authorize e informe: Bearer {seu_token_jwt}
A aplicação foi desenvolvida seguindo princípios de SOLID, Clean Code e separação de responsabilidades.
ontroller ↓ Service (Regras de Negócio) ↓ Repository (Acesso a Dados) ↓ Entity Framework Core (DbContext) ↓ Banco de Dados MySQL
- Controller: recebe requisições HTTP e retorna respostas apropriadas
- Service: contém regras de negócio e validações
- Repository: responsável pelo acesso ao banco de dados
- DTOs: controlam entrada e saída de dados
- Seed: criação de massa inicial de dados
| Campo | Tipo |
|---|---|
| Id | Guid |
| Nome | string |
| Descricao | string |
| Preco | decimal |
| Estoque | int |
| DataCadastro | DateTime |
POST /api/livro
🔒 Admin
- Valida se já existe livro com o mesmo nome
- Retorna
409 Conflictem caso de duplicidade
GET /api/livro
- Ordenação ascendente por nome
- Paginação (
page,pageSize) - Filtro opcional por nome
GET /api/livro/{id}
- Retorna
400para ID inválido - Retorna
404caso não encontrado
PUT /api/livro/{id}
🔒 Admin
- Atualiza apenas se o livro existir
- Retorna
204 No Content
DELETE /api/livro/{id}
🔒 Admin
- Remove o livro do banco de dados
- Retorna
404caso não encontrado
Ao iniciar a aplicação, o banco de dados é populado automaticamente com dados iniciais para facilitar testes e validação da API.
SeedData.Initialize(context);
⚙️ Configuração do Banco de Dados
No arquivo appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost;database=dorotech_db;user=root;password=senha"
}
}
Banco utilizado: MySQL 8
▶️ Como Executar o Projeto
dotnet restore
dotnet run
Acesse o Swagger em:
http://localhost:5166
🧠 Boas Práticas Aplicadas
Separação clara de responsabilidades
Uso de interfaces para desacoplamento
Regras de negócio centralizadas na camada de serviço
Tratamento adequado de erros HTTP
Logs estruturados de informação e erro
Código preparado para manutenção e evolução
👨💻 Autor
Gabriel Carvalho
Back-end Developer
C# | .NET | APIs REST | SQL