61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
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<GruppoMagazzinoConAlbero[]> {
|
|
return prisma.gruppoMagazzino.findMany({
|
|
where: { orgId, parentId: null },
|
|
include: includeAlbero,
|
|
orderBy: { creatoIl: 'asc' },
|
|
});
|
|
}
|
|
|
|
findByIdAndOrg(id: string, orgId: string): Promise<GruppoMagazzinoConAlbero | null> {
|
|
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<number> {
|
|
return prisma.gruppoMagazzino.count({ where: { parentId: id } });
|
|
}
|
|
|
|
create(data: CreateGruppoMagazzinoData): Promise<GruppoMagazzinoConAlbero> {
|
|
return prisma.gruppoMagazzino.create({ data, include: includeAlbero });
|
|
}
|
|
|
|
update(id: string, data: UpdateGruppoMagazzinoData): Promise<GruppoMagazzinoConAlbero> {
|
|
return prisma.gruppoMagazzino.update({ where: { id }, data, include: includeAlbero });
|
|
}
|
|
|
|
async delete(id: string): Promise<void> {
|
|
await prisma.gruppoMagazzino.delete({ where: { id } });
|
|
}
|
|
}
|
|
|
|
export const gruppiMagazzinoRepository = new GruppiMagazzinoRepository();
|