source: Klonkt/src/services/ensurePrimarySite.js@ 5258945

main
Last change on this file since 5258945 was 74544fb, checked in by roboburr <roboburr@…>, 3 months ago

New sites: require login to comment on by default + post nav at top

  • require_login_to_comment default 0 → 1 (siteEditableFields, 001-init.sql, ensurePrimarySite). Moderation was already set to 'moderate' by default. Existing sites unchanged; applies to newly created sites.
  • Post navigation (← Newer / Older →) is now ABOVE the post instead of below, with the separator line below it. Applies to all sites.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

  • Property mode set to 100644
File size: 2.2 KB
Line 
1import { v4 as uuid } from 'uuid';
2import 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
14function 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
26export 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, 1, 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}
Note: See TracBrowser for help on using the repository browser.