Changeset 535f955 in Klonkt for src/routes/posts.js
- Timestamp:
- 06/19/2026 09:49:35 AM (3 months ago)
- Branches:
- main
- Children:
- 247988e
- Parents:
- 8cdb377
- File:
-
- 1 edited
-
src/routes/posts.js (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/posts.js
r8cdb377 r535f955 5 5 import { fileURLToPath } from 'url'; 6 6 import multer from 'multer'; 7 import ejs from 'ejs'; 7 8 import db from '../config/database.js'; 8 9 import { requireAuth } from '../middleware/auth.js'; … … 63 64 'archive', 'search', 'account', 'sites', 'comments', 64 65 'posts', 'media', 'audio', 'prutter', 'forum', 65 'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'f eed.xml', 'atom.xml', 'sitemap.xml',66 'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'favorieten', 'feed.xml', 'atom.xml', 'sitemap.xml', 66 67 'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets', 67 68 ]); … … 392 393 bodyClass: 'on-archive', 393 394 }); 395 }); 396 397 // Pad naar de like-knop-partial (voor de htmx-toggle re-render). 398 const LIKE_PARTIAL = path.join(__dirname, '..', 'views', 'partials', 'like-button.ejs'); 399 400 // ==================== LIKE / FAVORIET ==================== 401 // Een ingelogde gebruiker (geen kijker — de globale guard blokkeert non-GET voor 402 // kijkers) togglet een like op een gepubliceerde post. Geeft de her-gerenderde 403 // knop terug (htmx outerHTML-swap). 404 router.post('/posts/:id/like', requireAuth, (req, res) => { 405 const userId = req.session.user.id; 406 const post = db.prepare('SELECT id, status FROM posts WHERE id = ?').get(req.params.id); 407 if (!post) return res.status(404).send('Post niet gevonden'); 408 if (post.status !== 'published') return res.status(403).send('Niet beschikbaar'); 409 410 const exists = db.prepare('SELECT 1 FROM post_likes WHERE post_id = ? AND user_id = ?').get(post.id, userId); 411 if (exists) { 412 db.prepare('DELETE FROM post_likes WHERE post_id = ? AND user_id = ?').run(post.id, userId); 413 } else { 414 db.prepare('INSERT OR IGNORE INTO post_likes (post_id, user_id) VALUES (?, ?)').run(post.id, userId); 415 } 416 const likeCount = db.prepare('SELECT COUNT(*) AS c FROM post_likes WHERE post_id = ?').get(post.id).c; 417 418 const html = ejs.render(fs.readFileSync(LIKE_PARTIAL, 'utf8'), { 419 post: { id: post.id }, likedByMe: !exists, likeCount, loggedIn: true, loginNext: '/', 420 }); 421 res.send(html); 422 }); 423 424 // Favorieten = de posts die de ingelogde gebruiker likete. Solo: binnen de 425 // huidige site. Hub: over alle sites (met juiste /user/<slug>-links). 426 router.get('/favorieten', requireAuth, (req, res) => { 427 const userId = req.session.user.id; 428 const isHub = res.locals.tenancy === 'hub'; 429 const site = res.locals.site; 430 const rows = isHub 431 ? db.prepare(` 432 SELECT p.id, p.slug, p.title, p.excerpt, p.cover_image_url, p.published_at, 433 p.tags, p.type, p.pinned, p.status, s.slug AS site_slug 434 FROM post_likes pl JOIN posts p ON p.id = pl.post_id JOIN sites s ON s.id = p.site_id 435 WHERE pl.user_id = ? AND p.status = 'published' 436 ORDER BY pl.created_at DESC 437 `).all(userId) 438 : db.prepare(` 439 SELECT p.id, p.slug, p.title, p.excerpt, p.cover_image_url, p.published_at, 440 p.tags, p.type, p.pinned, p.status 441 FROM post_likes pl JOIN posts p ON p.id = pl.post_id 442 WHERE pl.user_id = ? AND p.site_id = ? AND p.status = 'published' 443 ORDER BY pl.created_at DESC 444 `).all(userId, site ? site.id : ''); 445 const posts = rows.map((p) => ({ ...p, _urlBase: (isHub && p.site_slug) ? `/user/${p.site_slug}` : '' })); 446 renderPage(req, res, 'pages/favorites', { posts, pageTitle: 'Favorieten', bodyClass: 'on-favorites' }); 394 447 }); 395 448 … … 631 684 relatedPosts = relatedPosts.map(({ _overlap, tags, ...rest }) => ({ ...rest, _urlBase: urlBaseFor(rest) })); 632 685 686 // Likes / favorieten: aantal + of de ingelogde gebruiker deze post likete. 687 const likeCount = db.prepare('SELECT COUNT(*) AS c FROM post_likes WHERE post_id = ?').get(post.id).c; 688 const likedByMe = !!(req.session?.user && 689 db.prepare('SELECT 1 FROM post_likes WHERE post_id = ? AND user_id = ?').get(post.id, req.session.user.id)); 690 633 691 renderPage(req, res, 'pages/post', { 634 692 post, … … 638 696 comments: topLevel, 639 697 totalComments, 698 likeCount, 699 likedByMe, 640 700 pageTitle: post.title + ' - ' + site.title, 641 701 socialDescr: post.excerpt || '',
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)