- Backend: Fastify + Prisma/SQLite com autenticacao JWT - CRUD completo: usuarios, categorias, produtos, comandas - Sistema de comandas com itens, status, pagamento - Controle de estoque (entrada/saida automatica) - Relatorios e dashboard com KPIs - Notificacoes sonoras na cozinha - Frontend: SPA vanilla TS com tema dark glassmorphism - Mobile-first com bottom-sheet e cards compactos - Busca de comandas por periodo - Modal de detalhes com secao editavel colapsavel
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { prisma } from '../lib/prisma';
|
|
import { CategoryInput } from '../schemas/category.schema';
|
|
|
|
export async function createCategory(data: CategoryInput) {
|
|
return prisma.categoria.create({
|
|
data,
|
|
});
|
|
}
|
|
|
|
export async function listCategories() {
|
|
return prisma.categoria.findMany({
|
|
include: { _count: { select: { produtos: true } } },
|
|
});
|
|
}
|
|
|
|
export async function getCategoryById(id: string) {
|
|
return prisma.categoria.findUnique({
|
|
where: { id },
|
|
include: { produtos: true },
|
|
});
|
|
}
|
|
|
|
export async function updateCategory(id: string, data: CategoryInput) {
|
|
return prisma.categoria.update({
|
|
where: { id },
|
|
data,
|
|
});
|
|
}
|
|
|
|
export async function deleteCategory(id: string) {
|
|
const categoria = await prisma.categoria.findUnique({
|
|
where: { id },
|
|
include: { _count: { select: { produtos: true } } },
|
|
});
|
|
|
|
if (!categoria) {
|
|
throw new Error('Categoria não encontrada');
|
|
}
|
|
|
|
if (categoria._count.produtos > 0) {
|
|
throw new Error(`Não é possível excluir: a categoria possui ${categoria._count.produtos} produto(s). Remova ou reatribua os produtos primeiro.`);
|
|
}
|
|
|
|
return prisma.categoria.delete({
|
|
where: { id },
|
|
});
|
|
}
|