source: Klonkt/src/services/ensurePrimarySite.js@ 7e9d0ea

main
Last change on this file since 7e9d0ea was 7e9d0ea, checked in by Robin <roboburr@…>, 4 weeks ago

De laatste tenancy-resten, en een testbestand dat alleen zijn naam kwijt was (shaer-x7c0)

Het meeste van de bead was al gedaan door 72ec6a4 (Hub-modus en guardian-lite
eruit), dezelfde dag nog. Wat er lag:

  • database.js beschreef nog een tenancy-modus met hub, en zette bij elke boot een app_settings-rij 'tenancy' die niemand meer leest. Beide weg. Bestaande rijen blijven staan; die opruimen is een aparte beslissing.
  • ensurePrimarySite.js noemde solo/hub/circle op twee plekken.

En het belangrijkste, precies wat de bead verkeerd had: hub-permissions.test.js
test GEEN verwijderde modus. Het dekt canAdminSite (inclusief de site_members-tak
die ooit stil kapot was), canEditPost en getPrimarySite -- allemaal springlevend,
en CLAUDE.md wijst dit bestand aan als de vangrail daarvoor. Weggooien had die
dekking gesloopt. Alleen de naam verwees nog naar de hub, dus die is aangepast,
met een kop die uitlegt waarom het bestand blijft.

  • Property mode set to 100644
File size: 2.1 KB
Line 
1import { v4 as uuid } from 'uuid';
2import db from '../config/database.js';
3
4// A Klonkt instance should ALWAYS have a primary site — it carries the identity
5// (title, theme, profile) and is the anchor point for the whole instance.
6// The register flow already creates one, but an admin created via a script
7// (or an empty sites table for any reason) left the instance without a site:
8// no settings, dashboard would crash.
9//
10// This helper runs at boot (and is idempotent): as soon as there is an admin
11// but no site yet, it creates a default site owned by the first god/admin.
12
13function defaultTitle() {
14 try {
15 const base = process.env.PUBLIC_BASE_URL;
16 if (base) {
17 const host = new URL(base).hostname.replace(/^www\./, '');
18 const label = host.split('.')[0];
19 if (label) return label.charAt(0).toUpperCase() + label.slice(1);
20 }
21 } catch { /* fall back to generic */ }
22 return 'Mijn site';
23}
24
25export function ensurePrimarySite() {
26 const count = db.prepare('SELECT COUNT(*) AS c FROM sites').get().c;
27 if (count > 0) return null; // a site already exists — nothing to do
28
29 const owner = db.prepare(
30 "SELECT id FROM users WHERE role IN ('god','admin') ORDER BY created_at LIMIT 1"
31 ).get();
32 if (!owner) return null; // no admin yet -> no owner, nothing to create
33
34 const siteId = uuid();
35 const slug = 'main'; // not reserved; in solo mode the primary site is always pinned anyway
36 db.prepare(`
37 INSERT INTO sites (
38 id, slug, title, description, tagline, owner_id,
39 language, palette, accent, profile_photo,
40 is_public, robots_index, require_login_to_comment, enable_audio_player,
41 feed_view_default, is_primary
42 ) VALUES (?, ?, ?, '', '', ?, 'en', 'klonkt', '#e8b04b', NULL, 1, 1, 1, 1, 'grid', 1)
43 `).run(siteId, slug, defaultTitle(), owner.id);
44
45 // site_members-entry zodat de owner door canAdminSite-checks komt.
46 db.prepare(
47 "INSERT INTO site_members (site_id, user_id, role) VALUES (?, ?, 'admin')"
48 ).run(siteId, owner.id);
49
50 console.log(`[ensurePrimarySite] standaard-site '${slug}' aangemaakt (owner ${owner.id})`);
51 return { siteId, slug };
52}
Note: See TracBrowser for help on using the repository browser.