Changeset 8afbdd6 in Klonkt for src/routes
- Timestamp:
- 06/14/2026 06:07:51 PM (3 months ago)
- Branches:
- main
- Children:
- c869272
- Parents:
- b94c08e
- Location:
- src/routes
- Files:
-
- 1 added
- 6 edited
-
admin-sites.js (modified) (1 diff)
-
admin-users.js (modified) (2 diffs)
-
admin.js (modified) (2 diffs)
-
artists.js (added)
-
hub.js (modified) (3 diffs)
-
posts.js (modified) (1 diff)
-
prutter.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/admin-sites.js
rb94c08e r8afbdd6 98 98 'auth', 'admin', 'login', 'register', 'logout', 'archive', 'search', 99 99 'account', 'sites', 'comments', 'posts', 'media', 'audio', 'prutter', 100 'forum', 'tag', 'user s', 'feed.xml', 'atom.xml', 'sitemap.xml',100 'forum', 'tag', 'user', 'users', 'artiesten', 'feed.xml', 'atom.xml', 'sitemap.xml', 101 101 'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets', 102 102 ]); -
src/routes/admin-users.js
rb94c08e r8afbdd6 20 20 const router = express.Router(); 21 21 22 const VALID_ROLES = new Set(['member', 'admin', 'god']); 22 // 'kijker' = alleen-lezen demonstratie/audit-account: mag alles bekijken (incl. 23 // Beheer), maar de globale guard blokkeert elke wijziging. Vervangt de oude 24 // losse 'kijk-modus'-vlag (readonly), die nu door deze rol wordt afgedekt. 25 const VALID_ROLES = new Set(['kijker', 'member', 'admin', 'god']); 23 26 24 27 function godCount() { … … 66 69 } 67 70 68 db.prepare('UPDATE users SET role = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?') 71 // readonly=0: de alleen-lezen-status zit nu volledig in de 'kijker'-rol, dus 72 // bij elke rolwijziging ruimen we de legacy-vlag op (geen dubbele bron). 73 db.prepare('UPDATE users SET role = ?, readonly = 0, updated_at = CURRENT_TIMESTAMP WHERE id = ?') 69 74 .run(newRole, userId); 70 75 res.redirect('/admin/users?success=' + encodeURIComponent('Role updated')); 71 });72 73 // ==================== READ-ONLY (kijk-account) ====================74 router.post('/:id/readonly', requireGod, (req, res) => {75 const target = db.prepare('SELECT id FROM users WHERE id = ?').get(req.params.id);76 if (!target) return res.redirect('/admin/users?error=User+not+found');77 // Niet op jezelf — voorkomt dat een god zichzelf alleen-lezen maakt en vastloopt.78 if (target.id === req.session.user.id) {79 return res.redirect('/admin/users?error=' + encodeURIComponent('Kan jezelf niet op alleen-lezen zetten'));80 }81 const ro = req.body.readonly === '1' ? 1 : 0;82 db.prepare('UPDATE users SET readonly = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?')83 .run(ro, req.params.id);84 res.redirect('/admin/users?success=' + encodeURIComponent(ro ? 'Kijk-modus aan' : 'Kijk-modus uit'));85 76 }); 86 77 -
src/routes/admin.js
rb94c08e r8afbdd6 16 16 const user = req.session.user; 17 17 18 // Niet-god: een artiest die een eigen site bezit krijgt een "Mijn PrutFolio"- 19 // dashboard, gescopet op z'n eigen site. Bezit 'ie geen site -> geen beheer. 20 if (user.role !== 'god') { 18 // Een kijker mag het volledige (god-)Beheer alleen-lezen inzien — net als god 19 // dus, alleen schrijven is globaal geblokkeerd. Een gewone artiest die een 20 // eigen site bezit krijgt een "Mijn Klonkt Hub"-dashboard, gescopet op z'n 21 // eigen site. Bezit 'ie geen site -> geen beheer. 22 if (user.role !== 'god' && user.role !== 'kijker') { 21 23 const mySite = db.prepare( 22 24 'SELECT * FROM sites WHERE owner_id = ? ORDER BY created_at ASC LIMIT 1' … … 29 31 }; 30 32 return renderPage(req, res, 'pages/my-site', { 31 pageTitle: 'Mijn PrutFolio',33 pageTitle: 'Mijn Klonkt Hub', 32 34 bodyClass: 'on-admin', 33 35 mySite, -
src/routes/hub.js
rb94c08e r8afbdd6 35 35 `).all(); 36 36 37 // ALLE PrutFolio's (elke user, incl. de admin z'n eigen site) voor de roster. 37 // Uitgelichte PrutFolio's voor de home-roster: meest-actief eerst (aantal 38 // gepubliceerde posts), dan nieuwste. Beperkt tot HOME_ROSTER_LIMIT zodat de 39 // home schaalt — de volledige, doorzoekbare lijst staat op /artiesten. 40 const HOME_ROSTER_LIMIT = 24; 38 41 const artists = db.prepare(` 39 42 SELECT s.slug, s.title, s.tagline, s.profile_photo, s.accent, … … 42 45 FROM sites s 43 46 LEFT JOIN users u ON u.id = s.owner_id 44 ORDER BY s.created_at ASC 45 `).all(); 47 ORDER BY post_count DESC, s.created_at DESC 48 LIMIT ? 49 `).all(HOME_ROSTER_LIMIT); 50 const totalArtists = db.prepare('SELECT COUNT(*) AS c FROM sites').get().c; 46 51 47 52 // De hub-pagina is GENERIEK (van geen enkele user) — branding komt uit globale … … 60 65 hub, 61 66 artists, 67 totalArtists, 68 rosterLimit: HOME_ROSTER_LIMIT, 62 69 posts, 63 70 }); -
src/routes/posts.js
rb94c08e r8afbdd6 62 62 'archive', 'search', 'account', 'sites', 'comments', 63 63 'posts', 'media', 'audio', 'prutter', 'forum', 64 'tag', 'type', 'user s', 'feed.xml', 'atom.xml', 'sitemap.xml',64 'tag', 'type', 'user', 'users', 'artiesten', 'feed.xml', 'atom.xml', 'sitemap.xml', 65 65 'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets', 66 66 ]); -
src/routes/prutter.js
rb94c08e r8afbdd6 18 18 import db from '../config/database.js'; 19 19 import { renderPage } from '../middleware/render.js'; 20 import { requireAuth } from '../middleware/auth.js';20 import { requireAuth, isViewer } from '../middleware/auth.js'; 21 21 import PermissionsService from '../services/PermissionsService.js'; 22 22 … … 55 55 // ==================== START / RESUME CONVERSATION ==================== 56 56 router.get('/new', requirePrutter, (req, res) => { 57 // Een gesprek starten is een schrijf-actie (INSERT) — een kijker mag dat niet. 58 // De globale guard pakt dit niet omdat het een GET is, dus expliciet blokkeren. 59 if (isViewer(req.session.user)) { 60 res.status(403); 61 return renderPage(req, res, 'pages/viewer-blocked', { pageTitle: 'Kijker-modus', bodyClass: 'on-special' }); 62 } 57 63 const targetUsername = (req.query.to || '').toString().trim(); 58 64 if (!targetUsername) { … … 90 96 const messages = prutter.getMessages(conv.id, 200, 0).reverse(); 91 97 92 // Mark inbound messages as read 93 prutter.markAsRead(conv.id, me); 98 // Mark inbound messages as read — sla over voor kijkers (markAsRead is een 99 // UPDATE; een GET valt buiten de globale guard, dus hier expliciet skippen). 100 if (!isViewer(req.session.user)) prutter.markAsRead(conv.id, me); 94 101 95 102 renderPage(req, res, 'pages/prutter-conversation', {
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)