feat: refactor inventory and recipe services for improved error handling and code reuse; add systematic backend review plan
Test Suite / test (24.15.0) (push) Has been cancelled

This commit is contained in:
Nils-Johan Gynther
2026-05-04 20:44:43 +02:00
parent 6dfd4c372d
commit a645d6a364
6 changed files with 212 additions and 194 deletions
+13 -41
View File
@@ -236,10 +236,7 @@ export class ProductsService {
}
async permanentDelete(id: number) {
const product = await this.prisma.product.findUnique({ where: { id } });
if (!product) {
throw new NotFoundException(`Product with id ${id} not found`);
}
await this.findOne(id);
// Ta bort beroenden först
await this.prisma.productTag.deleteMany({ where: { productId: id } });
await this.prisma.userProduct.deleteMany({ where: { productId: id } });
@@ -262,30 +259,21 @@ export class ProductsService {
});
}
private async findProductByIdOrThrow(id: number, label: string) {
const product = await this.prisma.product.findUnique({ where: { id } });
if (!product) {
throw new NotFoundException(`${label} product with id ${id} not found`);
}
return product;
}
async merge(sourceProductId: number, targetProductId: number) {
if (sourceProductId === targetProductId) {
throw new Error('sourceProductId och targetProductId kan inte vara samma');
}
const source = await this.prisma.product.findUnique({
where: { id: sourceProductId },
});
if (!source) {
throw new NotFoundException(
`Source product with id ${sourceProductId} not found`,
);
}
const target = await this.prisma.product.findUnique({
where: { id: targetProductId },
});
if (!target) {
throw new NotFoundException(
`Target product with id ${targetProductId} not found`,
);
}
const source = await this.findProductByIdOrThrow(sourceProductId, 'Source');
const target = await this.findProductByIdOrThrow(targetProductId, 'Target');
return this.prisma.$transaction(async (tx) => {
const movedInventoryCount = await tx.inventoryItem.updateMany({
@@ -318,12 +306,8 @@ export class ProductsService {
const [source, target, sourceInventoryCount, targetInventoryCount] =
await Promise.all([
this.prisma.product.findUnique({
where: { id: sourceProductId },
}),
this.prisma.product.findUnique({
where: { id: targetProductId },
}),
this.findProductByIdOrThrow(sourceProductId, 'Source'),
this.findProductByIdOrThrow(targetProductId, 'Target'),
this.prisma.inventoryItem.count({
where: { productId: sourceProductId },
}),
@@ -332,18 +316,6 @@ export class ProductsService {
}),
]);
if (!source) {
throw new NotFoundException(
`Source product with id ${sourceProductId} not found`,
);
}
if (!target) {
throw new NotFoundException(
`Target product with id ${targetProductId} not found`,
);
}
return {
source: {
...source,