source: Klonkt/src/routes/artists.js@ e2a8e31

main
Last change on this file since e2a8e31 was 8453812, checked in by roboburr <roboburr@…>, 3 months ago

Branding: 100% PrutCMS/PrutFolio-free — Klonkt as original product

All fork/lineage references (README, package description, server/comments,
PrutFolio-as-noun -> Klonkt-site) removed. Plus a small, mysterious wink
at a certain Bart in CircleFederation.js. Internal package name (prutfolio)
+ PWA id + server paths left untouched (stability).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

  • Property mode set to 100644
File size: 2.5 KB
Line 
1/**
2 * Artiesten-directory — alleen in hub-modus.
3 *
4 * GET /leden?q=&page= -> doorzoekbare, gepagineerde lijst van ALLE
5 * Klonkt-site's. De hub-home toont maar een beperkte selectie; deze pagina
6 * schaalt naar honderden/duizenden artiesten via zoeken + paginering.
7 *
8 * In solo-modus bestaat er maar één site -> next() (valt door naar postsRoutes,
9 * die 'artiesten' als onbekende slug afhandelt).
10 */
11
12import express from 'express';
13import db from '../config/database.js';
14import { renderPage } from '../middleware/render.js';
15import { getTenancy } from '../services/SettingsService.js';
16
17const router = express.Router();
18
19const PER_PAGE = 24;
20
21router.get('/', (req, res, next) => {
22 if (getTenancy() !== 'hub') return next();
23
24 const q = (req.query.q || '').toString().trim().slice(0, 80);
25 let page = parseInt(req.query.page, 10);
26 if (!Number.isFinite(page) || page < 1) page = 1;
27
28 // De hoofd-/labelsite (oudste) is geen artiest -> uit de directory weren,
29 // consistent met de hub-home die 'm apart toont.
30 const mainRow = db.prepare('SELECT id FROM sites ORDER BY created_at ASC LIMIT 1').get();
31 const mainId = mainRow ? mainRow.id : '';
32
33 // Zoekterm tegen titel/slug/tagline (case-insensitive via LIKE; SQLite LIKE is
34 // standaard ongevoelig voor ASCII-hoofdletters). De ESCAPE '\' maakt %, _ en \
35 // in de zoekterm letterlijk (anders zouden ze als wildcards werken).
36 const like = '%' + q.replace(/[\\%_]/g, (m) => '\\' + m) + '%';
37 const conds = ['s.id != @mainId'];
38 if (q) conds.push("(s.title LIKE @like ESCAPE '\\' OR s.slug LIKE @like ESCAPE '\\' OR s.tagline LIKE @like ESCAPE '\\')");
39 const where = 'WHERE ' + conds.join(' AND ');
40 const params = q ? { mainId, like } : { mainId };
41
42 const total = db.prepare(`SELECT COUNT(*) AS c FROM sites s ${where}`)
43 .get(params).c;
44 const pages = Math.max(1, Math.ceil(total / PER_PAGE));
45 if (page > pages) page = pages;
46 const offset = (page - 1) * PER_PAGE;
47
48 const artists = db.prepare(`
49 SELECT s.slug, s.title, s.tagline, s.profile_photo, s.accent,
50 u.avatar_url AS owner_avatar,
51 (SELECT COUNT(*) FROM posts WHERE site_id = s.id AND status = 'published') AS post_count
52 FROM sites s
53 LEFT JOIN users u ON u.id = s.owner_id
54 ${where}
55 ORDER BY s.title COLLATE NOCASE ASC
56 LIMIT @limit OFFSET @offset
57 `).all({ ...params, limit: PER_PAGE, offset });
58
59 renderPage(req, res, 'pages/artists-directory', {
60 pageTitle: 'Leden',
61 bodyClass: 'on-hub',
62 q,
63 artists,
64 total,
65 page,
66 pages,
67 });
68});
69
70export default router;
Note: See TracBrowser for help on using the repository browser.