| 1 | import { v4 as uuid } from 'uuid';
|
|---|
| 2 | import db from '../config/database.js';
|
|---|
| 3 |
|
|---|
| 4 | // Een Klonkt-instance hoort ALTIJD een primaire site te hebben — die draagt de
|
|---|
| 5 | // identiteit (titel, thema, profiel) en is het ankerpunt in solo/hub/circle.
|
|---|
| 6 | // De register-flow maakt er al één aan, maar een via een script aangemaakte
|
|---|
| 7 | // beheerder (of een om wat voor reden dan ook lege sites-tabel) liet de
|
|---|
| 8 | // instance zonder site achter: geen instellingen, dashboard liep dood.
|
|---|
| 9 | //
|
|---|
| 10 | // Deze helper draait bij boot (en is idempotent): zodra er een beheerder is
|
|---|
| 11 | // maar nog geen enkele site, maakt 'ie een standaard-site aan, eigendom van de
|
|---|
| 12 | // eerste god/admin. Tenancy-onafhankelijk — geldt voor solo, hub én circle.
|
|---|
| 13 |
|
|---|
| 14 | function defaultTitle() {
|
|---|
| 15 | try {
|
|---|
| 16 | const base = process.env.PUBLIC_BASE_URL;
|
|---|
| 17 | if (base) {
|
|---|
| 18 | const host = new URL(base).hostname.replace(/^www\./, '');
|
|---|
| 19 | const label = host.split('.')[0];
|
|---|
| 20 | if (label) return label.charAt(0).toUpperCase() + label.slice(1);
|
|---|
| 21 | }
|
|---|
| 22 | } catch { /* val terug op generiek */ }
|
|---|
| 23 | return 'Mijn site';
|
|---|
| 24 | }
|
|---|
| 25 |
|
|---|
| 26 | export function ensurePrimarySite() {
|
|---|
| 27 | const count = db.prepare('SELECT COUNT(*) AS c FROM sites').get().c;
|
|---|
| 28 | if (count > 0) return null; // er is al een site — niets te doen
|
|---|
| 29 |
|
|---|
| 30 | const owner = db.prepare(
|
|---|
| 31 | "SELECT id FROM users WHERE role IN ('god','admin') ORDER BY created_at LIMIT 1"
|
|---|
| 32 | ).get();
|
|---|
| 33 | if (!owner) return null; // nog geen beheerder -> geen eigenaar, niets aanmaken
|
|---|
| 34 |
|
|---|
| 35 | const siteId = uuid();
|
|---|
| 36 | const slug = 'main'; // niet gereserveerd; in solo wordt de primaire site sowieso gepind
|
|---|
| 37 | db.prepare(`
|
|---|
| 38 | INSERT INTO sites (
|
|---|
| 39 | id, slug, title, description, tagline, owner_id,
|
|---|
| 40 | language, palette, accent, profile_photo,
|
|---|
| 41 | is_public, robots_index, require_login_to_comment, enable_audio_player,
|
|---|
| 42 | feed_view_default, comments_moderation_mode, is_primary
|
|---|
| 43 | ) VALUES (?, ?, ?, '', '', ?, 'nl', 'sage', '#c2410c', NULL, 1, 1, 0, 1, 'grid', 'moderate', 1)
|
|---|
| 44 | `).run(siteId, slug, defaultTitle(), owner.id);
|
|---|
| 45 |
|
|---|
| 46 | // site_members-entry zodat de owner door canAdminSite-checks komt.
|
|---|
| 47 | db.prepare(
|
|---|
| 48 | "INSERT INTO site_members (site_id, user_id, role) VALUES (?, ?, 'admin')"
|
|---|
| 49 | ).run(siteId, owner.id);
|
|---|
| 50 |
|
|---|
| 51 | console.log(`[ensurePrimarySite] standaard-site '${slug}' aangemaakt (owner ${owner.id})`);
|
|---|
| 52 | return { siteId, slug };
|
|---|
| 53 | }
|
|---|