Changeset 7881080 in Klonkt
- Timestamp:
- 06/18/2026 03:28:34 AM (3 months ago)
- Branches:
- main
- Children:
- 8398935
- Parents:
- 98ecf51
- Location:
- src
- Files:
-
- 8 edited
-
config/database.js (modified) (1 diff)
-
middleware/site.js (modified) (2 diffs)
-
routes/account.js (modified) (2 diffs)
-
routes/admin-sites.js (modified) (2 diffs)
-
routes/admin.js (modified) (2 diffs)
-
routes/hub.js (modified) (2 diffs)
-
services/ensurePrimarySite.js (modified) (1 diff)
-
views/pages/admin-sites.ejs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/config/database.js
r98ecf51 r7881080 50 50 ensureColumn('sites', 'allow_circle', 'INTEGER DEFAULT 1'); 51 51 52 // Eén EXPLICIETE primaire/hoofd-site (= de bedrijfs-/labelsite in hub-modus, 53 // de enige site in solo) i.p.v. de fragiele "oudste = hoofd"-conventie die op 54 // 4 plekken gedupliceerd stond. Backfill: markeer de oudste als er nog geen 55 // primaire site is, zodat bestaand gedrag exact behouden blijft. 56 ensureColumn('sites', 'is_primary', 'INTEGER DEFAULT 0'); 57 try { 58 const hasPrimary = db.prepare('SELECT 1 FROM sites WHERE is_primary = 1 LIMIT 1').get(); 59 if (!hasPrimary) { 60 const oldest = db.prepare('SELECT id FROM sites ORDER BY created_at ASC LIMIT 1').get(); 61 if (oldest) db.prepare('UPDATE sites SET is_primary = 1 WHERE id = ?').run(oldest.id); 62 } 63 } catch (e) { /* sites-tabel nog leeg/afwezig bij verse init — ensurePrimarySite regelt 't */ } 64 52 65 // v9 audit additions ————————————————————————————————————————— 53 66 // SEO/social columns the v9 template uses (most live in 001-init.sql already -
src/middleware/site.js
r98ecf51 r7881080 12 12 import db from '../config/database.js'; 13 13 import { getTenancy } from '../services/SettingsService.js'; 14 15 /** 16 * De primaire/hoofd-site — ÉÉN bron van waarheid (vervangt de "oudste site =" 17 * hoofd"-aanname die voorheen los in resolveSite/hub/account/admin stond). 18 * Leest de expliciete is_primary-vlag; valt terug op de oudste als die (nog) 19 * nergens staat, zodat bestaand gedrag exact behouden blijft. 20 */ 21 export function getPrimarySite() { 22 return db.prepare('SELECT * FROM sites WHERE is_primary = 1 LIMIT 1').get() 23 || db.prepare('SELECT * FROM sites ORDER BY created_at ASC LIMIT 1').get() 24 || null; 25 } 14 26 15 27 export function resolveSite(req, res, next) { … … 43 55 } 44 56 45 // Solo (of hub zonder match): de primaire/owner-site (eerste aangemaakte).46 const defaultSite = db.prepare('SELECT * FROM sites ORDER BY created_at ASC LIMIT 1').get();57 // Solo (of hub zonder match): pin op de primaire/hoofd-site. 58 const defaultSite = getPrimarySite(); 47 59 if (defaultSite) { 48 60 res.locals.site = defaultSite; -
src/routes/account.js
r98ecf51 r7881080 21 21 import { v4 as uuid } from 'uuid'; 22 22 import db from '../config/database.js'; 23 import { getPrimarySite } from '../middleware/site.js'; 23 24 import { renderPage } from '../middleware/render.js'; 24 25 import { requireAuth } from '../middleware/auth.js'; … … 80 81 let site = db.prepare('SELECT id, title, tagline, slug, owner_id FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id); 81 82 if (!site && user.role === 'god') { 82 site = db.prepare('SELECT id, title, tagline, slug, owner_id FROM sites ORDER BY created_at LIMIT 1').get();83 site = getPrimarySite(); // primaire/hoofd-site als fallback 83 84 } 84 85 return site || null; -
src/routes/admin-sites.js
r98ecf51 r7881080 161 161 const sites = db.prepare(` 162 162 SELECT s.id, s.slug, s.title, s.description, s.created_at, 163 s.is_public, s.robots_index, 163 s.is_public, s.robots_index, s.is_primary, 164 164 u.username AS owner_username, 165 165 (SELECT COUNT(*) FROM posts WHERE site_id = s.id) AS post_count 166 166 FROM sites s LEFT JOIN users u ON u.id = s.owner_id 167 ORDER BY s. created_at DESC167 ORDER BY s.is_primary DESC, s.created_at DESC 168 168 `).all(); 169 169 … … 354 354 }); 355 355 356 // ==================== MAAK PRIMAIR ==================== 357 // God kiest welke site de primaire/hoofd-site is (de label-/bedrijfssite in hub; 358 // in solo dé site). Precies één site is primair → eerst alles uit, dan deze aan. 359 router.post('/:slug/make-primary', requireGod, (req, res) => { 360 const site = db.prepare('SELECT id FROM sites WHERE slug = ?').get(req.params.slug); 361 if (!site) return res.redirect('/admin/sites?error=Niet+gevonden'); 362 db.transaction(() => { 363 db.prepare('UPDATE sites SET is_primary = 0').run(); 364 db.prepare('UPDATE sites SET is_primary = 1 WHERE id = ?').run(site.id); 365 })(); 366 res.redirect('/admin/sites?success=' + encodeURIComponent('Primaire site bijgewerkt')); 367 }); 368 356 369 // ==================== DELETE ==================== 357 370 router.post('/:slug/delete', requireGod, (req, res) => { -
src/routes/admin.js
r98ecf51 r7881080 10 10 import { requireAuth } from '../middleware/auth.js'; 11 11 import { getTenancy } from '../services/SettingsService.js'; 12 import { getPrimarySite } from '../middleware/site.js'; 12 13 13 14 const router = express.Router(); … … 59 60 const tenancy = getTenancy(); 60 61 61 // De primaire/ owner-site — in solo dé site, in hub de hoofdsite. Geeft de62 // De primaire/hoofd-site — in solo dé site, in hub de hoofdsite. Geeft de 62 63 // "Uiterlijk"-tegel z'n edit-link + de posts/concepten-lijst. 63 const primarySite = db.prepare( 64 'SELECT id, slug, title FROM sites ORDER BY created_at ASC LIMIT 1' 65 ).get() || null; 64 const primarySite = getPrimarySite(); 66 65 67 66 const stats = { -
src/routes/hub.js
r98ecf51 r7881080 35 35 `).all(); 36 36 37 // De hoofd-/labelsite ( oudste = de bedrijfs-/hoofdaccount) is GEEN artiest;38 // die tonen we apart bovenaan, niet in de Artiesten-roster.37 // De hoofd-/labelsite (de expliciet primaire = de bedrijfs-/hoofdaccount) is 38 // GEEN artiest; die tonen we apart bovenaan, niet in de Artiesten-roster. 39 39 const mainSite = db.prepare(` 40 40 SELECT s.id, s.slug, s.title, s.tagline, s.profile_photo, s.accent, … … 43 43 FROM sites s 44 44 LEFT JOIN users u ON u.id = s.owner_id 45 ORDER BY s.created_at ASC45 WHERE s.is_primary = 1 46 46 LIMIT 1 47 47 `).get() || null; -
src/services/ensurePrimarySite.js
r98ecf51 r7881080 40 40 language, palette, accent, profile_photo, 41 41 is_public, robots_index, require_login_to_comment, enable_audio_player, 42 feed_view_default, comments_moderation_mode 43 ) VALUES (?, ?, ?, '', '', ?, 'nl', 'sage', '#c2410c', NULL, 1, 1, 0, 1, 'grid', 'moderate' )42 feed_view_default, comments_moderation_mode, is_primary 43 ) VALUES (?, ?, ?, '', '', ?, 'nl', 'sage', '#c2410c', NULL, 1, 1, 0, 1, 'grid', 'moderate', 1) 44 44 `).run(siteId, slug, defaultTitle(), owner.id); 45 45 -
src/views/pages/admin-sites.ejs
r98ecf51 r7881080 36 36 <div class="ax-site-name"> 37 37 <a href="/sites/<%= s.slug %>"><%= s.title %></a> 38 <% if (s.is_primary) { %> 39 <span class="ax-pill ax-pill-primary" title="Hoofd-/labelsite van deze installatie">★ primair</span> 40 <% } %> 38 41 <% if (s.is_public) { %> 39 42 <span class="ax-pill ax-pill-ok" title="Publiek zichtbaar">✓ public</span> … … 67 70 68 71 <div class="ax-site-controls"> 72 <% if (!s.is_primary && (typeof canMutate === 'undefined' || canMutate)) { %> 73 <form method="post" action="/admin/sites/<%= s.slug %>/make-primary" style="margin:0;display:inline" 74 onsubmit="return confirm('Deze site instellen als de primaire/hoofd-site?')"> 75 <button type="submit" class="ax-icon-btn" aria-label="Maak primair" title="Maak primaire/hoofd-site">★</button> 76 </form> 77 <% } %> 69 78 <a href="/admin/sites/<%= s.slug %>/edit" class="ax-icon-btn" aria-label="Bewerken" title="Bewerken">✎</a> 70 79 <form method="post" action="/admin/sites/<%= s.slug %>/delete" class="ax-delete-form" … … 198 207 background: rgba(40,160,90,0.12); 199 208 } 209 .ax-pill-primary { 210 color: var(--accent); 211 background: color-mix(in srgb, var(--accent) 14%, transparent); 212 font-weight: 600; 213 } 200 214 201 215 /* ─── Stats (2 mini-columns for sites) ────────────────────────── */
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)