Changeset 189e335 in Klonkt for src/routes/posts.js
- Timestamp:
- 08/06/2026 07:02:57 AM (5 weeks ago)
- Branches:
- main
- Children:
- 84ce988
- Parents:
- 99a7b40
- git-author:
- Robin <roboburr@…> (08/06/2026 07:02:56 AM)
- git-committer:
- Claude (agent) <aiclaude@…> (08/06/2026 07:02:57 AM)
- File:
-
- 1 edited
-
src/routes/posts.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/posts.js
r99a7b40 r189e335 967 967 }); 968 968 969 // Antwoorden vanuit een gesprek in Berichten. Twee paden, en welke het wordt 970 // bepaalt de draad zelf (zie groupConversations → replyTo): 971 // - hangt de draad aan een post van jou, dan is dit een gewone reply op het 972 // nieuwste ontvangen bericht erin: deliverReply, publiek zoals de thread; 973 // - hangt hij aan een persoon, dan is het een direct bericht terug. 974 // Rijk in beide gevallen: `content` is de HTML uit de reply-editor, `text` de 975 // platte versie die de editor er altijd bij levert (en die het no-JS-formulier 976 // als enige stuurt). 977 router.post('/messages/reply', requireSiteManager, async (req, res) => { 978 const site = res.locals.site; 979 const back = `${res.locals.siteUrlBase || ''}/messages`; 980 if (!site) return res.status(404).send('Site required'); 981 const text = String(req.body.text || ''); 982 const html = String(req.body.content || ''); 983 let attachments = []; 984 try { attachments = JSON.parse(req.body.attachments || '[]'); } catch { /* geen media */ } 985 let mentions; 986 try { if (req.body.mentions !== undefined) mentions = JSON.parse(req.body.mentions || '[]'); } catch { mentions = undefined; } 987 const language = String(req.body.language || ''); 988 // Leeg is leeg: een bericht zonder tekst EN zonder media is geen bericht. 989 if (!text.trim() && !html.trim() && !attachments.length) return res.redirect(back + '?error=reply_empty'); 990 991 const interactionId = parseInt(req.body.interaction_id, 10) || 0; 992 const postSlug = String(req.body.post_slug || ''); 993 const toActor = String(req.body.to || ''); 994 try { 995 if (interactionId && postSlug) { 996 const post = db.prepare('SELECT id, slug FROM posts WHERE site_id = ? AND slug = ?').get(site.id, postSlug); 997 const parent = ActivityPubService.getInteractionById(interactionId); 998 // De parent MOET bij deze post horen: anders zou een gemanipuleerd 999 // formulier een antwoord onder andermans draad kunnen hangen. 1000 if (!post || !parent || parent.post_id !== post.id) return res.redirect(back + '?error=reply_target'); 1001 await ActivityPubService.deliverReply(site, { 1002 postId: post.id, postSlug: post.slug, parent, text, html, attachments, mentions, language, 1003 }); 1004 } else if (/^https?:\/\//i.test(toActor)) { 1005 const r = await Guardianship.deliverDirectNote(site, { recipients: [toActor], text, html, language, attachments }); 1006 if (!r) return res.redirect(back + '?error=reply_failed'); 1007 } else { 1008 return res.redirect(back + '?error=reply_target'); 1009 } 1010 } catch (e) { 1011 console.warn('[AP] reply from Berichten failed:', e.message); 1012 return res.redirect(back + '?error=reply_failed'); 1013 } 1014 res.redirect(back + '?success=reply_sent'); 1015 }); 1016 969 1017 router.get('/fediverse', requireSiteManager, (req, res) => res.redirect(`${res.locals.siteUrlBase || ''}/messages`)); 970 1018
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)