Changeset 8afbdd6 in Klonkt for src/routes/admin-users.js


Ignore:
Timestamp:
06/14/2026 06:07:51 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
c869272
Parents:
b94c08e
Message:

feat: viewer role + artists directory + Klonkt Hub Beta rebrand

Viewer role (replaces the separate view-mode/readonly toggle):

  • 'kijker' is now a real role (VALID_ROLES) selectable in Admin. May view EVERYTHING including Admin, but cannot modify anything.
  • isViewer(user) (= role kijker or legacy readonly flag) is the source; requireGod/requireSiteManager(BySlug) let a viewer through (viewing), the global guard 403s every write. Existing readonly accounts are migrated on each role change (readonly=0).
  • Write leaks via GET patched: /prutter/new (INSERT) blocks for viewers, /prutter/:id skips markAsRead (UPDATE); WS upgrade rejects viewers (the HTTP guard doesn't cover WebSockets).
  • Clean "Viewer mode" page (viewer-blocked) instead of raw 403 text; styled sticky banner; account page shows read-only UI instead of an upload button that silently 403s. canMutate hides write buttons.

Scalability (>50 artists):

  • Hub home shows max 24 (most active first) + "All N artists ->".
  • New searchable, paginated /artiesten directory (hub only).
  • 'user' + 'artiesten' reserved as slugs.

Rebrand PrutFolio v1 -> Klonkt Hub Beta (footer, PWA manifest, account/
admin texts, default page title, startup, README; internal package +
PWA id 'prutfolio' remain for stability).

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-users.js

    rb94c08e r8afbdd6  
    2020const router = express.Router();
    2121
    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.
     25const VALID_ROLES = new Set(['kijker', 'member', 'admin', 'god']);
    2326
    2427function godCount() {
     
    6669  }
    6770
    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 = ?')
    6974    .run(newRole, userId);
    7075  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'));
    8576});
    8677
Note: See TracChangeset for help on using the changeset viewer.