import { AppDataSource } from "./ormconfig.js";
import { Product } from "./entities/Product.js";
export const ProductsDB = {
/**
* Retorna todos os produtos da tabela
*/
async getAllProducts() {
try {
const productRepository = AppDataSource.getRepository(Product);
const products = await productRepository.find();
return {
success: true,
data: products,
};
} catch (error) {
console.error("Erro ao buscar produtos:", error);
return {
success: false,
error: "Erro ao buscar produtos",
details: error.message,
};
}
},
/**
* Busca um produto pelo ID (UUID)
* @param {string} id - UUID do produto
*/
async getProductById(id) {
try {
// Verifica se o ID é um UUID válido
const isValidUUID = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id);
if (!isValidUUID) {
return {
success: false,
error: "ID inválido",
details: "O ID deve ser um UUID válido",
};
}
const productRepository = AppDataSource.getRepository(Product);
const product = await productRepository.findOne({ where: { id } });
if (!product) {
return {
success: false,
error: "Produto não encontrado",
details: `Não foi encontrado produto com o ID: ${id}`,
};
}
return {
success: true,
data: product,
};
} catch (error) {
console.error("Erro ao buscar produto por ID:", error);
return {
success: false,
error: "Erro ao buscar produto",
details: error.message,
};
}
},
/**
* Busca produtos por nome (busca parcial)
*/
async searchProductsByName(name) {
try {
const productRepository = AppDataSource.getRepository(Product);
const products = await productRepository
.createQueryBuilder("product")
.where("product.name ILIKE :name", { name: `%${name}%` })
.getMany();
if (products.length === 0) {
return {
success: false,
error: "Produtos não encontrados",
details: `Não foram encontrados produtos com o nome: ${name}`,
};
}
return {
success: true,
data: products,
};
} catch (error) {
console.error("Erro ao buscar produtos por nome:", error);
return {
success: false,
error: "Erro ao buscar produtos",
details: error.message,
};
}
},
/**
* Cria um novo produto
* @param {Object} productData - Dados do produto
*/
async createProduct(productData) {
try {
const productRepository = AppDataSource.getRepository(Product);
const newProduct = productRepository.create(productData);
const savedProduct = await productRepository.save(newProduct);
return {
success: true,
data: savedProduct,
};
} catch (error) {
console.error("Erro ao criar produto:", error);
return {
success: false,
error: "Erro ao criar produto",
details: error.message,
};
}
},
/**
* Atualiza um produto existente
* @param {string} id - UUID do produto
* @param {Object} updateData - Dados para atualizar
*/
async updateProduct(id, updateData) {
try {
const productRepository = AppDataSource.getRepository(Product);
const product = await productRepository.findOne({ where: { id } });
if (!product) {
return {
success: false,
error: "Produto não encontrado",
details: `Não foi encontrado produto com o ID: ${id}`,
};
}
// Atualiza apenas os campos fornecidos
Object.assign(product, updateData);
const updatedProduct = await productRepository.save(product);
return {
success: true,
data: updatedProduct,
};
} catch (error) {
console.error("Erro ao atualizar produto:", error);
return {
success: false,
error: "Erro ao atualizar produto",
details: error.message,
};
}
},
/**
* Remove um produto (soft delete - marca como inativo)
* @param {string} id - UUID do produto
*/
async deleteProduct(id) {
try {
const productRepository = AppDataSource.getRepository(Product);
const product = await productRepository.findOne({ where: { id } });
if (!product) {
return {
success: false,
error: "Produto não encontrado",
details: `Não foi encontrado produto com o ID: ${id}`,
};
}
// Soft delete - marca como inativo
product.active = false;
await productRepository.save(product);
return {
success: true,
message: "Produto soft delete (desativadp) com sucesso",
};
} catch (error) {
console.error("Erro ao remover produto:", error);
return {
success: false,
error: "Erro ao remover produto",
details: error.message,
};
}
},
};