Changeset 37edecd in Klonkt for src/routes


Ignore:
Timestamp:
06/19/2026 03:46:42 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
1794fac
Parents:
91094a4
Message:

Link-in-bio + click stats (premium feature #6)

Linktree-style page from the existing sites.profile_links (JSON [{platform,url}])
+ PLATFORMS icons. Clicks counted per url.

  • DB: link_clicks (site_id, url, clicks), PK (site_id,url).
  • routes/linkbio.js (premium-gated): GET /links (page with profile_links as buttons), GET /links/go/:i (counts click per url + 302 redirect). Open-redirect safe: only redirects to a url in the site's own profile_links; http(s)/mailto only.
  • view pages/linkbio.ejs (photo/name/bio + brand-coloured buttons with SVG icons).
  • admin-stats: link-clicks section (top 50, per url) for the current site.
  • admin dashboard: 🔗 Link-in-bio link (premium, non-hub).

node --check passed.

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

Location:
src/routes
Files:
1 added
1 edited

Legend:

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

    r91094a4 r37edecd  
    1010
    1111import express from 'express';
     12import db from '../config/database.js';
    1213import { renderPage } from '../middleware/render.js';
    1314import { requireGod } from '../middleware/auth.js';
     
    2122    return res.status(403).send('Statistieken is een premium-functie — koppel Patreon in Beheer → Instellingen.');
    2223  }
     24  // Link-in-bio klikken (premium #6) voor de huidige site.
     25  let linkClicks = [];
     26  if (res.locals.site) {
     27    try {
     28      linkClicks = db.prepare(
     29        'SELECT url, clicks FROM link_clicks WHERE site_id = ? AND clicks > 0 ORDER BY clicks DESC LIMIT 50'
     30      ).all(res.locals.site.id);
     31    } catch { linkClicks = []; }
     32  }
    2333  renderPage(req, res, 'pages/admin-stats', {
    2434    pageTitle: 'Statistieken',
    2535    bodyClass: 'on-admin',
    2636    stats: getStats(14),
     37    linkClicks,
    2738  });
    2839});
Note: See TracChangeset for help on using the changeset viewer.