API REST de vendas — CRUD, cancelamento lógico e desconto progressivo por quantidade (.NET 8).
269
API REST de vendas — CRUD, cancelamento lógico e desconto progressivo por quantidade (.NET 8).
Application Frameworks (secundária opcional: API Management)
API REST para registro e consulta de vendas: CRUD completo, cancelamento lógico — da venda
inteira ou de um item individual — e desconto progressivo por quantidade calculado
automaticamente. Requer um PostgreSQL com o schema já aplicado pela imagem complementar
mouts-sales-api-migrator.
Repositório: github.com/pedrozulian/mouts-sales-api
docker run -d -p 8080:8080 \
--platform linux/amd64 \
-e ConnectionStrings__DefaultConnection="Host=<host>;Port=5432;Database=<db>;Username=<user>;Password=<senha>" \
pedrozulian/mouts-sales-api:latest
Aplique o schema antes de subir a API, usando a imagem mouts-sales-api-migrator da mesma versão
contra o mesmo banco.
Sem ConnectionStrings__DefaultConnection, o container encerra imediatamente na inicialização
com erro nomeando a variável ausente — nunca sobe apontando para um endereço padrão.
Imagem publicada apenas para linux/amd64. Se sua máquina é de outra arquitetura (ex.: Apple
Silicon / arm64), inclua --platform linux/amd64 no docker run — sem essa flag o Docker pode
recusar a execução ou emitir um aviso de incompatibilidade de plataforma antes de rodar via
emulação.
Isso só se aplica ao rodar a imagem publicada diretamente. Ao usar docker compose a partir do
código-fonte do repositório no GitHub (que builda
a imagem localmente em vez de baixar do Docker Hub), a imagem é gerada nativamente para a
arquitetura da sua máquina — por isso a flag não aparece nem é necessária nesse fluxo.
Host=postgres (o nome usado nos exemplos do projeto) só resolve dentro do Docker Compose do
repositório, onde o Compose cria uma rede própria e registra cada serviço pelo nome. Rodando com
docker run isolado, esse nome não existe — aponte para um endereço que o container realmente
alcance:
PostgreSQL em outro container Docker: crie uma rede e coloque os dois containers nela; a
API então resolve o banco pelo nome dado com --name:
docker network create sales-net
docker run -d --name sales-db --network sales-net \
-e POSTGRES_DB=salesapi -e POSTGRES_USER=salesapi -e POSTGRES_PASSWORD=salesapi \
postgres:16
docker run -d -p 8080:8080 --network sales-net --platform linux/amd64 \
-e ConnectionStrings__DefaultConnection="Host=sales-db;Port=5432;Database=salesapi;Username=salesapi;Password=salesapi" \
pedrozulian/mouts-sales-api:latest
PostgreSQL rodando na sua máquina (fora de container): localhost de dentro do container
aponta para o próprio container, não para o host. Use o hostname especial
host.docker.internal — disponível por padrão no Docker Desktop (Mac/Windows); no Linux, é
necessário adicionar --add-host=host.docker.internal:host-gateway ao docker run.
docker run -d -p 8080:8080 --platform linux/amd64 \
--add-host=host.docker.internal:host-gateway \
-e ConnectionStrings__DefaultConnection="Host=host.docker.internal;Port=5432;Database=salesapi;Username=salesapi;Password=salesapi" \
pedrozulian/mouts-sales-api:latest
(--add-host é ignorado no Docker Desktop, onde o hostname já resolve nativamente, mas não
atrapalha deixá-lo.)
PostgreSQL em outro servidor: use o host/IP real diretamente em Host=, sem necessidade de
rede ou flag adicional.
| Variável | Obrigatório | Default |
|---|---|---|
ConnectionStrings__DefaultConnection | Sim | — |
ASPNETCORE_ENVIRONMENT | Não | Production |
Porta 8080. Documentação interativa (/swagger) disponível também em produção, por decisão
deliberada deste projeto.
| Método | Rota | Descrição |
|---|---|---|
POST | /api/sales | Registrar venda |
GET | /api/sales/{id} | Consultar venda |
GET | /api/sales | Listar vendas (paginado) |
PUT | /api/sales/{id} | Alterar venda |
DELETE | /api/sales/{id} | Cancelar venda |
DELETE | /api/sales/{id}/items/{itemId} | Cancelar item da venda |
GET | /health | Health check |
Publicada com as tags X.Y.Z e latest, sempre geradas a partir do mesmo commit que
mouts-sales-api-migrator:X.Y.Z — use a mesma tag nas duas imagens.
Content type
Image
Digest
sha256:35461bf98…
Size
96 MB
Last updated
3 months ago
docker pull pedrozulian/mouts-sales-api