Files
mercado.clube67.com/backend/controllers/produtoController.js
T

148 lines
4.7 KiB
JavaScript

'use strict'
const Produto = require('../models/Produto')
const produtoController = {
async list(req, res) {
try {
const tenantId = req.tenant.id
const { search, categoria, ativo, limit, offset } = req.query
const rows = await Produto.list(tenantId, {
search,
categoria,
ativo: ativo === undefined ? true : ativo === 'true',
limit,
offset,
})
res.json(rows)
} catch (err) {
console.error('[produto.list]', err.message)
res.status(500).json({ error: 'Erro ao listar produtos' })
}
},
async listAll(req, res) {
try {
const tenantId = req.tenant.id
const { search, categoria, limit, offset } = req.query
const rows = await Produto.list(tenantId, { search, categoria, limit, offset })
res.json(rows)
} catch (err) {
res.status(500).json({ error: 'Erro ao listar produtos' })
}
},
async listCategorias(req, res) {
try {
const rows = await Produto.listCategorias(req.tenant.id)
res.json(rows.map(r => r.categoria))
} catch (err) {
res.status(500).json({ error: 'Erro ao listar categorias' })
}
},
async get(req, res) {
try {
const prod = await Produto.findById(req.params.id)
if (!prod) return res.status(404).json({ error: 'Produto não encontrado' })
res.json(prod)
} catch (err) {
res.status(500).json({ error: 'Erro ao buscar produto' })
}
},
async create(req, res) {
try {
const tenantId = req.tenant.id
const { sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria } = req.body
if (!nome?.trim()) return res.status(400).json({ error: 'nome é obrigatório' })
if (preco === undefined || preco === null) return res.status(400).json({ error: 'preco é obrigatório' })
if (sku) {
const existe = await Produto.findBySku(sku, tenantId)
if (existe) return res.status(409).json({ error: 'SKU já cadastrado' })
}
const prod = await Produto.create({ tenant_id: tenantId, sku, nome: nome.trim(), descricao, unidade, preco, preco_promocional: preco_promocional || null, estoque, categoria })
res.status(201).json(prod)
} catch (err) {
console.error('[produto.create]', err.message)
res.status(500).json({ error: 'Erro ao criar produto' })
}
},
async update(req, res) {
try {
const prod = await Produto.findById(req.params.id)
if (!prod) return res.status(404).json({ error: 'Produto não encontrado' })
await Produto.update(req.params.id, req.body)
res.json({ ok: true })
} catch (err) {
res.status(500).json({ error: 'Erro ao atualizar produto' })
}
},
async updateEstoque(req, res) {
try {
const { estoque } = req.body
if (estoque === undefined) return res.status(400).json({ error: 'estoque é obrigatório' })
await Produto.updateEstoque(req.params.id, estoque)
res.json({ ok: true })
} catch (err) {
res.status(500).json({ error: 'Erro ao atualizar estoque' })
}
},
async updatePreco(req, res) {
try {
const { preco } = req.body
if (preco === undefined) return res.status(400).json({ error: 'preco é obrigatório' })
await Produto.updatePreco(req.params.id, preco)
res.json({ ok: true })
} catch (err) {
res.status(500).json({ error: 'Erro ao atualizar preço' })
}
},
async remove(req, res) {
try {
await Produto.delete(req.params.id)
res.json({ ok: true })
} catch (err) {
res.status(500).json({ error: 'Erro ao remover produto' })
}
},
// Importação CSV — recebe array de produtos no body
async importar(req, res) {
try {
const tenantId = req.tenant.id
const { produtos } = req.body
if (!Array.isArray(produtos) || produtos.length === 0) {
return res.status(400).json({ error: 'produtos deve ser um array não vazio' })
}
const resultados = { inseridos: 0, atualizados: 0, erros: [] }
for (const p of produtos) {
if (!p.nome || !p.sku) {
resultados.erros.push({ sku: p.sku || '?', erro: 'nome e sku são obrigatórios' })
continue
}
try {
const res2 = await Produto.upsertBySku({ tenant_id: tenantId, ...p })
// ON CONFLICT atualiza → xmax > 0 indica UPDATE
if (res2 && res2.xmax && res2.xmax !== '0') resultados.atualizados++
else resultados.inseridos++
} catch (e) {
resultados.erros.push({ sku: p.sku, erro: e.message })
}
}
res.json(resultados)
} catch (err) {
console.error('[produto.importar]', err.message)
res.status(500).json({ error: 'Erro na importação' })
}
},
}
module.exports = produtoController