110 lines
2.9 KiB
TypeScript
110 lines
2.9 KiB
TypeScript
import { DatabaseSync } from 'node:sqlite';
|
|
import path from 'node:path';
|
|
import fs from 'node:fs';
|
|
|
|
const DATA_DIR = process.env.DATA_DIR || path.join(process.cwd(), 'app', 'data');
|
|
const DB_PATH = path.join(DATA_DIR, 'waas.db');
|
|
|
|
let dbInstance: DatabaseSync | null = null;
|
|
|
|
export function getDb(): DatabaseSync {
|
|
if (dbInstance) return dbInstance;
|
|
|
|
if (!fs.existsSync(DATA_DIR)) {
|
|
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
}
|
|
|
|
dbInstance = new DatabaseSync(DB_PATH);
|
|
initSchema(dbInstance);
|
|
return dbInstance;
|
|
}
|
|
|
|
function initSchema(db: DatabaseSync) {
|
|
// 1. site_settings
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS site_settings (
|
|
key TEXT PRIMARY KEY,
|
|
value_json TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
// 2. pages
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS pages (
|
|
id TEXT PRIMARY KEY,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
title TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'published',
|
|
homepage_id TEXT,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
// 3. page_sections
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS page_sections (
|
|
id TEXT PRIMARY KEY,
|
|
page_id TEXT NOT NULL,
|
|
section_type TEXT NOT NULL,
|
|
order_index INTEGER NOT NULL DEFAULT 0,
|
|
content_draft_json TEXT NOT NULL,
|
|
content_published_json TEXT NOT NULL,
|
|
styles_json TEXT,
|
|
FOREIGN KEY (page_id) REFERENCES pages (id) ON DELETE CASCADE
|
|
);
|
|
`);
|
|
|
|
// Initial Seeding falls DB leer
|
|
seedInitialData(db);
|
|
}
|
|
|
|
function seedInitialData(db: DatabaseSync) {
|
|
const checkPages = db.prepare('SELECT COUNT(*) as count FROM pages').get() as { count: number };
|
|
if (checkPages.count > 0) return;
|
|
|
|
const now = new Date().toISOString();
|
|
|
|
// Seed site_settings
|
|
const initialSettings = {
|
|
siteName: 'N&D IT Solutions',
|
|
metaDescription: 'High-Performance Webdesign & Digital Solutions - 100% DSGVO-konform.',
|
|
is_demo_mode: false,
|
|
header: {
|
|
brandName: 'N&D',
|
|
brandHighlight: 'i-t SOLUTIONS',
|
|
ctaText: 'Erstgespräch buchen',
|
|
ctaLink: '#contact',
|
|
showThemeToggle: true,
|
|
glassEffect: true
|
|
},
|
|
footer: {
|
|
brandDescription: 'Ihr Partner für professionelles Webdesign, Website-Entwicklung und lokale SEO.',
|
|
copyrightText: 'N&D i-t SOLUTIONS. Alle Rechte vorbehalten.',
|
|
showLegalLinks: true
|
|
},
|
|
site_info: {
|
|
title: 'N&D IT Solutions',
|
|
homepage_id: 'page_home'
|
|
}
|
|
};
|
|
|
|
db.prepare('INSERT INTO site_settings (key, value_json, updated_at) VALUES (?, ?, ?)').run(
|
|
'site_config',
|
|
JSON.stringify(initialSettings),
|
|
now
|
|
);
|
|
|
|
// Seed default page only (no prefilled sections/demo content)
|
|
db.prepare('INSERT INTO pages (id, slug, title, status, homepage_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)').run(
|
|
'page_home',
|
|
'/',
|
|
'Startseite',
|
|
'published',
|
|
'page_home',
|
|
now,
|
|
now
|
|
);
|
|
}
|