Nice Work

This commit is contained in:
2026-01-13 19:44:02 +00:00
parent b503b372b4
commit 0718377b27
144 changed files with 15587 additions and 2132 deletions
+11
View File
@@ -0,0 +1,11 @@
import { ensureSchema } from './index.js';
ensureSchema()
.then(() => {
console.log('✅ Datenbankschema abgeglichen.');
process.exit(0);
})
.catch((error) => {
console.error('⚠️ Schema-Abgleich fehlgeschlagen:', error);
process.exit(1);
});
+62
View File
@@ -0,0 +1,62 @@
import fs from 'fs';
import path from 'path';
import sqlite3 from 'sqlite3';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const dbPath = path.join(__dirname, 'klangkiste.sqlite');
const schemaPath = path.join(__dirname, 'schema.sql');
export const db = new sqlite3.Database(dbPath);
db.exec('PRAGMA foreign_keys = ON;');
export function run(query, params = []) {
return new Promise((resolve, reject) => {
db.run(query, params, function onRun(error) {
if (error) {
reject(error);
return;
}
resolve({ changes: this.changes, lastID: this.lastID });
});
});
}
export function get(query, params = []) {
return new Promise((resolve, reject) => {
db.get(query, params, (error, row) => {
if (error) {
reject(error);
return;
}
resolve(row || null);
});
});
}
export function all(query, params = []) {
return new Promise((resolve, reject) => {
db.all(query, params, (error, rows) => {
if (error) {
reject(error);
return;
}
resolve(rows || []);
});
});
}
export async function ensureSchema() {
const schema = fs.readFileSync(schemaPath, 'utf-8');
return new Promise((resolve, reject) => {
db.exec(schema, (error) => {
if (error) {
reject(error);
return;
}
resolve(true);
});
});
}
Binary file not shown.
Binary file not shown.
+65
View File
@@ -0,0 +1,65 @@
PRAGMA journal_mode = WAL;
CREATE TABLE IF NOT EXISTS boxes (
box_id TEXT PRIMARY KEY,
fingerprint TEXT NOT NULL,
state TEXT NOT NULL,
first_seen INTEGER NOT NULL,
last_seen INTEGER NOT NULL,
firmware_version TEXT NOT NULL,
capabilities_json TEXT NOT NULL,
api_token TEXT,
last_ip TEXT,
api_port INTEGER,
setup_port INTEGER,
alias TEXT,
media_root TEXT
);
CREATE TABLE IF NOT EXISTS tags (
uid TEXT PRIMARY KEY,
label TEXT,
alias TEXT,
status TEXT NOT NULL,
created_at INTEGER NOT NULL,
written_at INTEGER,
media_path TEXT
);
CREATE TABLE IF NOT EXISTS box_tags (
box_id TEXT NOT NULL,
tag_uid TEXT NOT NULL,
media_path TEXT NOT NULL,
created_at INTEGER NOT NULL,
PRIMARY KEY (box_id, tag_uid),
FOREIGN KEY (box_id) REFERENCES boxes(box_id) ON DELETE CASCADE,
FOREIGN KEY (tag_uid) REFERENCES tags(uid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS box_tag_blocks (
box_id TEXT NOT NULL,
tag_uid TEXT NOT NULL,
created_at INTEGER NOT NULL,
PRIMARY KEY (box_id, tag_uid),
FOREIGN KEY (box_id) REFERENCES boxes(box_id) ON DELETE CASCADE,
FOREIGN KEY (tag_uid) REFERENCES tags(uid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS box_jobs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
box_id TEXT NOT NULL,
job_type TEXT NOT NULL,
payload_json TEXT NOT NULL,
status TEXT NOT NULL,
attempts INTEGER NOT NULL,
last_error TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
FOREIGN KEY (box_id) REFERENCES boxes(box_id) ON DELETE CASCADE
);
+2671
View File
File diff suppressed because it is too large Load Diff
+16
View File
@@ -0,0 +1,16 @@
{
"name": "klangkiste-backend",
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "node server.js",
"db:ensure": "node db/ensure.js"
},
"dependencies": {
"cors": "2.8.5",
"express": "4.19.2",
"music-metadata": "7.14.0",
"multer": "1.4.5-lts.1",
"sqlite3": "5.1.7"
}
}
File diff suppressed because it is too large Load Diff