rework internal order system
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user