Refactor code structure for improved readability and maintainability
Test Suite / test (24.15.0) (push) Has been cancelled

This commit is contained in:
Nils-Johan Gynther
2026-05-06 07:37:59 +02:00
parent e4f201ea36
commit 969dafdbc6
273 changed files with 11357 additions and 39 deletions
+216
View File
@@ -0,0 +1,216 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InventoryService = void 0;
const common_1 = require("@nestjs/common");
const client_1 = require("@prisma/client");
const prisma_service_1 = require("../prisma/prisma.service");
let InventoryService = class InventoryService {
constructor(prisma) {
this.prisma = prisma;
}
throwInventoryItemNotFound(id) {
throw new common_1.NotFoundException(`Inventory item with id ${id} not found`);
}
async findInventoryItemByIdOrThrow(id) {
const existing = await this.prisma.inventoryItem.findUnique({ where: { id } });
if (!existing) {
this.throwInventoryItemNotFound(id);
}
return existing;
}
async ensureProductExists(productId) {
const product = await this.prisma.product.findUnique({ where: { id: productId } });
if (!product) {
throw new common_1.NotFoundException('Product not found');
}
return product;
}
async findAll(query) {
const where = {};
const orderBy = [];
if (query?.location) {
where.location = query.location;
}
if (query?.sort === 'bestBeforeAsc') {
orderBy.push({ bestBeforeDate: 'asc' });
}
else if (query?.sort === 'bestBeforeDesc') {
orderBy.push({ bestBeforeDate: 'desc' });
}
else if (query?.sort === 'nameAsc') {
orderBy.push({ product: { name: 'asc' } });
}
else if (query?.sort === 'purchaseDateAsc') {
orderBy.push({ purchaseDate: 'asc' });
}
else if (query?.sort === 'purchaseDateDesc') {
orderBy.push({ purchaseDate: 'desc' });
}
else {
orderBy.push({ createdAt: 'desc' });
}
return this.prisma.inventoryItem.findMany({
where,
include: {
product: true,
},
orderBy,
});
}
async consume(id, data) {
const existing = await this.findInventoryItemByIdOrThrow(id);
const currentQuantity = Number(existing.quantity);
const newQuantity = Math.max(0, currentQuantity - data.amountUsed);
return this.prisma.$transaction(async (tx) => {
const updatedItem = await tx.inventoryItem.update({
where: { id },
data: {
quantity: new client_1.Prisma.Decimal(newQuantity),
},
include: {
product: true,
},
});
await tx.inventoryConsumption.create({
data: {
inventoryItemId: id,
amountUsed: new client_1.Prisma.Decimal(data.amountUsed),
comment: data.comment?.trim() || null,
},
});
return updatedItem;
});
}
async findConsumptionHistory(id) {
await this.findInventoryItemByIdOrThrow(id);
return this.prisma.inventoryConsumption.findMany({
where: {
inventoryItemId: id,
},
select: {
id: true,
inventoryItemId: true,
amountUsed: true,
comment: true,
createdAt: true,
inventoryItem: {
select: { unit: true },
},
},
orderBy: {
createdAt: 'desc',
},
});
}
async findExpiring() {
const now = new Date();
return this.prisma.inventoryItem.findMany({
where: {
bestBeforeDate: {
not: null,
gte: now,
},
},
include: {
product: true,
},
orderBy: [{ bestBeforeDate: 'asc' }, { createdAt: 'desc' }],
});
}
async create(data) {
await this.ensureProductExists(data.productId);
return this.prisma.inventoryItem.create({
data: {
...data,
quantity: new client_1.Prisma.Decimal(data.quantity),
location: data.location?.trim() || undefined,
brand: data.brand?.trim() || undefined,
origin: data.origin?.trim() || undefined,
receiptName: data.receiptName?.trim() || undefined,
suitableFor: data.suitableFor?.trim() || undefined,
comment: data.comment?.trim() || undefined,
purchaseDate: data.purchaseDate
? new Date(data.purchaseDate)
: undefined,
bestBeforeDate: data.bestBeforeDate
? new Date(data.bestBeforeDate)
: undefined,
},
include: {
product: true,
},
});
}
async update(id, data) {
await this.findInventoryItemByIdOrThrow(id);
if (typeof data.productId === 'number') {
await this.ensureProductExists(data.productId);
}
const updateData = {};
if (typeof data.productId === 'number') {
updateData.product = {
connect: { id: data.productId },
};
}
if (typeof data.quantity === 'number') {
updateData.quantity = new client_1.Prisma.Decimal(data.quantity);
}
if (typeof data.unit === 'string') {
updateData.unit = data.unit.trim();
}
if (typeof data.location === 'string') {
updateData.location = data.location.trim();
}
if (typeof data.brand === 'string') {
updateData.brand = data.brand.trim();
}
if (typeof data.receiptName === 'string') {
updateData.receiptName = data.receiptName.trim();
}
if (typeof data.purchaseDate === 'string') {
updateData.purchaseDate = data.purchaseDate
? new Date(data.purchaseDate)
: null;
}
if (typeof data.bestBeforeDate === 'string') {
updateData.bestBeforeDate = data.bestBeforeDate
? new Date(data.bestBeforeDate)
: null;
}
if (typeof data.opened === 'boolean') {
updateData.opened = data.opened;
}
if (typeof data.suitableFor === 'string') {
updateData.suitableFor = data.suitableFor.trim();
}
if (typeof data.comment === 'string') {
updateData.comment = data.comment.trim();
}
return this.prisma.inventoryItem.update({
where: { id },
data: updateData,
include: {
product: true,
},
});
}
async remove(id) {
await this.findInventoryItemByIdOrThrow(id);
return this.prisma.inventoryItem.delete({ where: { id } });
}
};
exports.InventoryService = InventoryService;
exports.InventoryService = InventoryService = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [prisma_service_1.PrismaService])
], InventoryService);
//# sourceMappingURL=inventory.service.js.map