refatorando a arquitetura

This commit is contained in:
2026-07-15 18:47:19 -03:00
parent e57de50bc2
commit 9d1d75f3af
12 changed files with 374 additions and 307 deletions
+58
View File
@@ -0,0 +1,58 @@
package cli
import (
"bufio"
"controle-de-estoque/internal/service"
"fmt"
"os"
"strings"
)
// App representa a aplicação de linha de comando.
// Ele faz o papel de "controller" + "router": lê a entrada do usuário,
// decide qual ação executar e chama o service correspondente.
type App struct {
service *service.InventorySevice
reader *bufio.Scanner
}
func NewApp(s *service.InventorySevice) *App {
return &App{
service: s,
reader: bufio.NewScanner(os.Stdin),
}
}
func (a *App) Run() {
for {
ShowMenu()
if !a.reader.Scan() {
return
}
input := strings.TrimSpace(a.reader.Text())
switch strings.ToLower(input) {
case "1", "adicionar":
a.handleAdd()
case "2", "listar":
a.handleList()
case "3", "atualizar":
a.handleUpdate()
case "4", "deletar":
a.handleDelete()
case "0", "sair":
fmt.Println("Saindo...")
return
default:
fmt.Println("Opção inválida, tente novamente.")
}
}
}
// Helper para pedir e ler uma linha de texto do usuário.
func (a *App) readLine(msg string) string {
fmt.Print(msg)
a.reader.Scan()
return strings.TrimSpace(a.reader.Text())
}
+93
View File
@@ -0,0 +1,93 @@
package cli
import (
"fmt"
"strconv"
)
func (a *App) handleAdd() {
name := a.readLine("Nome do produto: ")
category := a.readLine("Categoria do produto: ")
priceStr := a.readLine("Preço: ")
price, err := strconv.ParseFloat(priceStr, 64)
if err != nil {
fmt.Println("Preço inválido.")
return
}
qtyStr := a.readLine("Quantidade: ")
qty, err := strconv.Atoi(qtyStr)
if err != nil {
fmt.Println("Quantidade inválida.")
return
}
product, err := a.service.CreateProduct(name, category, price, qty)
if err != nil {
fmt.Println("Erro ao adicionar:", err)
return
}
fmt.Printf("Produto adicionado: #%d %s\n", product.ID, product.Name)
}
func (a *App) handleList() {
products := a.service.ListProducts()
if len(products) == 0 {
fmt.Println("Nenhum produto cadastrado.")
return
}
for _, p := range products {
fmt.Printf(
"==============================================="+"\n"+
"ID PRODUTO: %d"+"\n"+
"NOME: %s"+"\n"+
"CATEGORIA: %s"+"\n"+
"PREÇO: %.2f"+"\n"+
"QUANTIDADE: %d"+"\n"+
"==============================================="+"\n",
p.ID, p.Name, p.Category, p.Price, p.Quantity)
}
}
func (a *App) handleUpdate() {
idStr := a.readLine("Informe o Id do produto que deseja atualizar: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("ID inválido.")
return
}
field := a.readLine("Informe o campo que deseja atualizar (nome, categoria, preco, quantidade): ")
value := a.readLine(fmt.Sprintf("Informe o novo valor para %s: ", field))
product, err := a.service.UpdateProduct(id, field, value)
if err != nil {
fmt.Println("Erro ao atualizar:", err)
return
}
fmt.Printf("Produto %d atualizado com sucesso!\n", product.ID)
}
func (a *App) handleDelete() {
idStr := a.readLine("Informe o Id do produto que deseja deletar: ")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println("ID inválido.")
return
}
if err := a.service.DeleteProduct(id); err != nil {
fmt.Println("Erro ao deletar:", err)
return
}
fmt.Printf("Produto %d deletado com sucesso!\n", id)
}
+16
View File
@@ -0,0 +1,16 @@
package cli
import "fmt"
func ShowMenu() {
fmt.Print(`
============ CONTROLE DE ESTOQUE ==============
ESCOLHA UMA DAS OPÇÕES:
1 / adicionar - Adiciona o produto no estoque
2 / listar - Lista todos os produtos do estoque
3 / atualizar - Atualiza um produto do estoque
4 / deletar - Deleta um produto do estoque
0 / sair - Sair do programa
=================================================
Opção: `)
}