Changeset 8cb1dc7 in Klonkt for src/routes/admin-sites.js


Ignore:
Timestamp:
06/14/2026 04:17:14 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
640b39c
Parents:
ccbd6a6
Message:

hub: artist self-management — owner manages their own subsite (posts/appearance/comments)

A site owner (member) now gets a "My PrutFolio" dashboard and can manage their
OWN site; cross-site access is restricted.

  • auth.js: requireSiteManager (owner of res.locals.site or god) + requireSiteManagerBySlug (owner of :slug or god).
  • admin.js: /admin role-aware -> god=hub management, owner=my-site dashboard, member without site=403.
  • admin-sites.js: /:slug/edit + /save owner-or-god (was god-only); upload-photo requireAuth. list/new/create/delete remain god-only.
  • admin-comments.js: requireSiteManager + redirects/form actions via siteUrlBase so the artist context (/user/<slug>/admin/comments) is correct.
  • render.js: userOwnsSite flag; topnav + overview show "Admin" for owners; topnav "New post" uses siteUrlBase.
  • pages/my-site.ejs: artist dashboard.

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

File:
1 edited

Legend:

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

    rccbd6a6 r8cb1dc7  
    2222import db from '../config/database.js';
    2323import { renderPage } from '../middleware/render.js';
    24 import { requireGod } from '../middleware/auth.js';
     24import { requireGod, requireAuth, requireSiteManagerBySlug } from '../middleware/auth.js';
    2525import ThemeService from '../services/ThemeService.js';
    2626import { listPlatforms, PLATFORMS } from '../services/PlatformIcons.js';
     
    8282// holds the URL string in `profile_photo` — this endpoint just stores the
    8383// file and hands back a URL that the form can paste into the input field.
    84 router.post('/upload-photo', requireGod, (req, res) => {
     84router.post('/upload-photo', requireAuth, (req, res) => {
    8585  photoUpload.single('photo')(req, res, (err) => {
    8686    if (err) return res.status(400).json({ ok: false, error: err.message });
     
    218218
    219219// ==================== EDIT (form) ====================
    220 router.get('/:slug/edit', requireGod, (req, res) => {
     220router.get('/:slug/edit', requireSiteManagerBySlug, (req, res) => {
    221221  const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(req.params.slug);
    222222  if (!site) return res.redirect('/admin/sites?error=Not+found');
     
    242242
    243243// ==================== SAVE ====================
    244 router.post('/:slug/save', requireGod, (req, res) => {
     244router.post('/:slug/save', requireSiteManagerBySlug, (req, res) => {
    245245  const site = db.prepare('SELECT id FROM sites WHERE slug = ?').get(req.params.slug);
    246246  if (!site) return res.redirect('/admin/sites?error=Not+found');
Note: See TracChangeset for help on using the changeset viewer.