rework internal order system

This commit is contained in:
Matthias Hochmeister
2026-03-24 09:15:57 +01:00
parent 6ff5cc89ad
commit 39b8b30ca2
2 changed files with 166 additions and 88 deletions

View File

@@ -1,11 +1,26 @@
import pool from '../config/database';
import logger from '../utils/logger';
// Helper: check if a table exists (cached per process lifetime)
const existingTables = new Set<string>();
async function tableExists(tableName: string): Promise<boolean> {
if (existingTables.has(tableName)) return true;
try {
const r = await pool.query(
"SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = $1) AS ok",
[tableName],
);
if (r.rows[0]?.ok) { existingTables.add(tableName); return true; }
} catch { /* ignore */ }
return false;
}
// ---------------------------------------------------------------------------
// Categories (ausruestung_kategorien_katalog) — hierarchical with parent_id
// ---------------------------------------------------------------------------
async function getKategorien() {
if (!(await tableExists('ausruestung_kategorien_katalog'))) return [];
const result = await pool.query(
'SELECT * FROM ausruestung_kategorien_katalog ORDER BY parent_id NULLS FIRST, name',
);
@@ -13,6 +28,7 @@ async function getKategorien() {
}
async function createKategorie(name: string, parentId?: number | null) {
if (!(await tableExists('ausruestung_kategorien_katalog'))) throw new Error('Migration 048 has not been applied yet');
const result = await pool.query(
'INSERT INTO ausruestung_kategorien_katalog (name, parent_id) VALUES ($1, $2) RETURNING *',
[name, parentId ?? null],
@@ -69,32 +85,37 @@ async function getItems(filters?: { kategorie?: string; kategorie_id?: number; a
}
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
const hasKategorien = await tableExists('ausruestung_kategorien_katalog');
const hasEigenschaften = await tableExists('ausruestung_artikel_eigenschaften');
const result = await pool.query(
`SELECT a.*, k.name AS kategorie_name,
(SELECT COUNT(*)::int FROM ausruestung_artikel_eigenschaften e WHERE e.artikel_id = a.id) AS eigenschaften_count
`SELECT a.*${hasKategorien ? ', k.name AS kategorie_name' : ''}${hasEigenschaften ? ',\n (SELECT COUNT(*)::int FROM ausruestung_artikel_eigenschaften e WHERE e.artikel_id = a.id) AS eigenschaften_count' : ''}
FROM ausruestung_artikel a
LEFT JOIN ausruestung_kategorien_katalog k ON k.id = a.kategorie_id
${hasKategorien ? 'LEFT JOIN ausruestung_kategorien_katalog k ON k.id = a.kategorie_id' : ''}
${where}
ORDER BY COALESCE(k.name, a.kategorie), a.bezeichnung`,
ORDER BY ${hasKategorien ? 'COALESCE(k.name, a.kategorie)' : 'a.kategorie'}, a.bezeichnung`,
params,
);
return result.rows;
}
async function getItemById(id: number) {
const hasKategorien = await tableExists('ausruestung_kategorien_katalog');
const result = await pool.query(
`SELECT a.*, k.name AS kategorie_name
`SELECT a.*${hasKategorien ? ', k.name AS kategorie_name' : ''}
FROM ausruestung_artikel a
LEFT JOIN ausruestung_kategorien_katalog k ON k.id = a.kategorie_id
${hasKategorien ? 'LEFT JOIN ausruestung_kategorien_katalog k ON k.id = a.kategorie_id' : ''}
WHERE a.id = $1`,
[id],
);
if (!result.rows[0]) return null;
const eigenschaften = await pool.query(
'SELECT * FROM ausruestung_artikel_eigenschaften WHERE artikel_id = $1 ORDER BY sort_order, id',
[id],
);
let eigenschaften: { rows: unknown[] } = { rows: [] };
if (await tableExists('ausruestung_artikel_eigenschaften')) {
eigenschaften = await pool.query(
'SELECT * FROM ausruestung_artikel_eigenschaften WHERE artikel_id = $1 ORDER BY sort_order, id',
[id],
);
}
return {
...result.rows[0],
@@ -193,6 +214,7 @@ async function getCategories() {
// ---------------------------------------------------------------------------
async function getArtikelEigenschaften(artikelId: number) {
if (!(await tableExists('ausruestung_artikel_eigenschaften'))) return [];
const result = await pool.query(
'SELECT * FROM ausruestung_artikel_eigenschaften WHERE artikel_id = $1 ORDER BY sort_order, id',
[artikelId],
@@ -204,6 +226,7 @@ async function upsertArtikelEigenschaft(
artikelId: number,
data: { id?: number; name: string; typ: string; optionen?: string[]; pflicht?: boolean; sort_order?: number },
) {
if (!(await tableExists('ausruestung_artikel_eigenschaften'))) throw new Error('Migration 048 has not been applied yet');
if (data.id) {
const result = await pool.query(
`UPDATE ausruestung_artikel_eigenschaften