import { Prisma } from '@prisma/client'; import { prisma } from '../db/prisma'; const includeAlbero = { voci: { include: { materiale: true } }, figli: { include: { voci: { include: { materiale: true } } } }, } satisfies Prisma.GruppoMagazzinoInclude; export type GruppoMagazzinoConAlbero = Prisma.GruppoMagazzinoGetPayload<{ include: typeof includeAlbero }>; export interface CreateGruppoMagazzinoData { orgId: string; nome: string; parentId?: string | null; } export interface UpdateGruppoMagazzinoData { nome?: string; parentId?: string | null; } export class GruppiMagazzinoRepository { // Solo i gruppi radice (parentId null): i figli arrivano annidati via include, // un solo livello come da vincolo applicativo. findRadiceByOrg(orgId: string): Promise { return prisma.gruppoMagazzino.findMany({ where: { orgId, parentId: null }, include: includeAlbero, orderBy: { creatoIl: 'asc' }, }); } findByIdAndOrg(id: string, orgId: string): Promise { return prisma.gruppoMagazzino.findFirst({ where: { id, orgId }, include: includeAlbero }); } // Usato per validare che un parentId indicato esista, sia della stessa org e sia // esso stesso un gruppo radice (nessun nesting a più di un livello). findRadiceByIdAndOrg(id: string, orgId: string): Promise<{ id: string } | null> { return prisma.gruppoMagazzino.findFirst({ where: { id, orgId, parentId: null }, select: { id: true } }); } countFigli(id: string): Promise { return prisma.gruppoMagazzino.count({ where: { parentId: id } }); } create(data: CreateGruppoMagazzinoData): Promise { return prisma.gruppoMagazzino.create({ data, include: includeAlbero }); } update(id: string, data: UpdateGruppoMagazzinoData): Promise { return prisma.gruppoMagazzino.update({ where: { id }, data, include: includeAlbero }); } async delete(id: string): Promise { await prisma.gruppoMagazzino.delete({ where: { id } }); } } export const gruppiMagazzinoRepository = new GruppiMagazzinoRepository();