API backend desenvolvida com C# e .NET 8 para gerenciamento de produtos, movimentações e níveis de estoque de forma eficiente e segura.
Centralizar e otimizar o controle de inventário, permitindo:
- Controle preciso de quantidade de produtos
- Registro de entradas e saídas
- Monitoramento de níveis mínimos de estoque
- Geração de relatórios operacionais
- Apoio à gestão de compras e vendas
| Tecnologia | Uso |
|---|---|
| .NET 8 / ASP.NET Core | Framework principal |
| Entity Framework Core | ORM e acesso ao banco de dados |
| SQLite | Banco de dados (padrão) |
| JWT Bearer | Autenticação e autorização |
| BCrypt | Hash seguro de senhas |
| Swagger / OpenAPI | Documentação interativa da API |
O projeto segue os princípios de Clean Architecture, com separação clara de responsabilidades entre as camadas:
ControleEstoque/
├── src/
│ ├── ControleEstoque.Domain/ # Entidades, interfaces e enums
│ ├── ControleEstoque.Application/ # Serviços, DTOs e casos de uso
│ ├── ControleEstoque.Infrastructure/ # EF Core, repositórios e segurança
│ └── ControleEstoque.API/ # Controllers, middlewares e configuração
└── ControleEstoque.sln
Domain — núcleo da aplicação, sem dependências externas
- Entidades:
Product,Category,StockMovement,User - Enums:
MovementType(Entry / Exit),UserRole(Admin / Manager / Operator) - Interfaces:
IRepository<T>,IUnitOfWork, repositórios específicos
Application — regras de negócio e casos de uso
- Serviços:
ProductService,CategoryService,StockMovementService,UserService,StockReportService - DTOs de entrada e saída para cada recurso
- Interfaces de serviço e
IPasswordHasher
Infrastructure — implementações técnicas
AppDbContextcom configurações Fluent API- Repositórios concretos com EF Core e padrão Unit of Work
BcryptPasswordHashereJwtAuthService
API — ponto de entrada HTTP
- Controllers REST com controle de acesso por role
ExceptionMiddlewarepara tratamento global de erros- Configuração de JWT, Swagger e CORS no
Program.cs
- Cadastro, edição e exclusão (soft delete) de produtos
- Campos: nome, descrição, SKU, preço, quantidade e estoque mínimo
- Organização por categorias
- Consulta por SKU ou categoria
- Listagem de produtos com estoque abaixo do mínimo
- Registro de entradas (compras, reposições) e saídas (vendas, perdas)
- Atualização automática da quantidade em estoque
- Validação de estoque suficiente para saídas
- Histórico completo com filtros por produto, tipo e período
- Resumo geral do estoque (totais, alertas de baixo estoque)
- Relatório de movimentações por período com totais de entrada e saída
- Login com e-mail e senha, retornando token JWT
- Proteção de endpoints por autenticação e role
- Senhas armazenadas com hash BCrypt
| Role | Permissões |
|---|---|
| Admin | Acesso total — incluindo gestão de usuários |
| Manager | Criar/editar produtos e categorias, registrar movimentações |
| Operator | Consultar dados e registrar movimentações |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
POST |
/api/auth/login |
Autentica e retorna JWT | Público |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/categories |
Lista todas as categorias | Autenticado |
GET |
/api/categories/{id} |
Busca por ID | Autenticado |
POST |
/api/categories |
Cria categoria | Admin, Manager |
PUT |
/api/categories/{id} |
Atualiza categoria | Admin, Manager |
DELETE |
/api/categories/{id} |
Remove categoria | Admin |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/products |
Lista todos os produtos | Autenticado |
GET |
/api/products/{id} |
Busca por ID | Autenticado |
GET |
/api/products/sku/{sku} |
Busca por SKU | Autenticado |
GET |
/api/products/category/{id} |
Lista por categoria | Autenticado |
GET |
/api/products/low-stock |
Produtos com estoque baixo | Autenticado |
POST |
/api/products |
Cadastra produto | Admin, Manager |
PUT |
/api/products/{id} |
Atualiza produto | Admin, Manager |
DELETE |
/api/products/{id} |
Remove produto | Admin |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/stockmovements |
Lista todas as movimentações | Autenticado |
GET |
/api/stockmovements/{id} |
Busca por ID | Autenticado |
GET |
/api/stockmovements/product/{id} |
Por produto | Autenticado |
GET |
/api/stockmovements/period?start=&end= |
Por período | Autenticado |
GET |
/api/stockmovements/type/{type} |
Por tipo (Entry/Exit) | Autenticado |
GET |
/api/stockmovements/report?start=&end= |
Relatório por período | Autenticado |
POST |
/api/stockmovements |
Registra movimentação | Autenticado |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/reports/stock-summary |
Resumo geral do estoque | Autenticado |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/users |
Lista usuários | Admin |
GET |
/api/users/{id} |
Busca por ID | Admin |
POST |
/api/users |
Cria usuário | Admin |
PUT |
/api/users/{id} |
Atualiza usuário | Admin |
DELETE |
/api/users/{id} |
Remove usuário | Admin |
dotnet restoredotnet ef migrations add Initial --project src/ControleEstoque.Infrastructure --startup-project src/ControleEstoque.API
dotnet ef database update --project src/ControleEstoque.Infrastructure --startup-project src/ControleEstoque.APIdotnet run --project src/ControleEstoque.APIhttp://localhost:5000/swagger
O arquivo src/ControleEstoque.API/appsettings.json contém as configurações principais:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=estoque.db"
},
"JwtSettings": {
"SecretKey": "TROQUE_ESTA_CHAVE_POR_UMA_SEGURA_COM_32_CHARS_MINIMO!",
"Issuer": "ControleEstoque.API",
"Audience": "ControleEstoque.Clients",
"ExpiresInHours": "8"
}
}Importante: Substitua o valor de
SecretKeypor uma chave segura antes de usar em produção. Nunca versione chaves reais.
Para usar PostgreSQL, altere o pacote e a connection string:
<!-- Infrastructure.csproj -->
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />// Program.cs
options.UseNpgsql(connectionString);- Faça login em
POST /api/auth/logincom e-mail e senha - Copie o
tokenretornado - Clique em Authorize no topo do Swagger
- Informe:
Bearer {token}
O projeto utiliza SQLite por padrão, gerando o arquivo estoque.db na raiz do projeto da API. O banco é criado e migrado automaticamente na inicialização.
- Seed de dados iniciais (usuário Admin padrão)
- Validações com FluentValidation
- Paginação nas listagens
- Integração com leitura de código de barras / QR Code
- Controle de múltiplos estoques (multi-filial)
- Notificações automáticas de reposição
- Logs de auditoria detalhados
- Dashboard em tempo real com SignalR