source: Klonkt/src/routes/admin.js@ 743bb81

main
Last change on this file since 743bb81 was 6351545, checked in by roboburr <roboburr@…>, 3 months ago

tenancy: runtime Solo/Hub mode + mode-aware /admin (Phase 1)

Admin can switch live between modes in Admin -> Settings:

  • solo: exactly one site (the primary/owner site), no /sites routing, leaner /admin.
  • hub: main site + /sites/:slug routing (company; /gebruikers + assignment flow = Phase 2).

Switching is non-destructive (hides only, deletes nothing).

  • app_settings (key/value singleton) + SettingsService (cached getTenancy/setTenancy).
  • resolveSite: solo pins to the primary site + disables /sites/:slug + host mapping.
  • /admin/settings (god-only) toggle; /admin dashboard rewritten, mode-aware.

Tested on the demo: solo/hub dashboard tiles, /sites routing per mode, toggle back/forth.

Co-Authored-By: Claude <noreply@…>

  • Property mode set to 100644
File size: 1.7 KB
Line 
1/**
2 * Admin routes — Phase B stub.
3 * Read-only god-only overview of users / sites / posts.
4 * Real admin dashboard (create/delete sites, manage users, etc.) comes later.
5 */
6
7import express from 'express';
8import db from '../config/database.js';
9import { renderPage } from '../middleware/render.js';
10import { requireGod } from '../middleware/auth.js';
11import { getTenancy } from '../services/SettingsService.js';
12
13const router = express.Router();
14
15router.get('/', requireGod, (req, res) => {
16 const tenancy = getTenancy();
17
18 // De primaire/owner-site — in solo dé site, in hub de hoofdsite. Geeft de
19 // "Uiterlijk"-tegel z'n edit-link.
20 const primarySite = db.prepare(
21 'SELECT slug, title FROM sites ORDER BY created_at ASC LIMIT 1'
22 ).get() || null;
23
24 const stats = {
25 users: db.prepare('SELECT COUNT(*) AS c FROM users').get().c,
26 sites: db.prepare('SELECT COUNT(*) AS c FROM sites').get().c,
27 posts: db.prepare('SELECT COUNT(*) AS c FROM posts').get().c,
28 published: db.prepare(
29 "SELECT COUNT(*) AS c FROM posts WHERE status = 'published'"
30 ).get().c,
31 };
32
33 // Sites/users-tabellen zijn alleen in hub relevant; in solo besparen we de query.
34 const sites = tenancy === 'hub' ? db.prepare(`
35 SELECT s.slug, s.title, s.created_at, u.username AS owner_username
36 FROM sites s
37 LEFT JOIN users u ON u.id = s.owner_id
38 ORDER BY s.created_at DESC
39 LIMIT 50
40 `).all() : [];
41
42 const users = tenancy === 'hub' ? db.prepare(`
43 SELECT username, email, role, created_at
44 FROM users
45 ORDER BY created_at DESC
46 LIMIT 50
47 `).all() : [];
48
49 renderPage(req, res, 'pages/admin', {
50 pageTitle: 'Beheer',
51 bodyClass: 'on-admin',
52 tenancy,
53 primarySite,
54 stats,
55 sites,
56 users,
57 });
58});
59
60export default router;
Note: See TracBrowser for help on using the repository browser.