Changeset a5a6249 in Klonkt for src/routes
- Timestamp:
- 08/12/2026 07:52:13 PM (3 months ago)
- Children:
- 084b046
- Parents:
- 303bfc4
- File:
-
- 1 edited
-
src/routes/ward.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/ward.js
r303bfc4 ra5a6249 25 25 import { carriesGuardians } from '../services/guardianship/context.js'; 26 26 import { t as i18nT, resolveLang } from '../services/i18n.js'; 27 import { injectCspNonce } from '../middleware/render.js';27 import { injectCspNonce, renderNoteBody, formatDateTime } from '../middleware/render.js'; 28 28 29 29 const router = express.Router(); … … 91 91 waiting: i18nT(L, 'ward.waiting'), 92 92 help: i18nT(L, 'ward.help'), 93 feed: i18nT(L, 'ward.feed'), 94 feedEmpty: i18nT(L, 'ward.feed_empty'), 95 buoyHint: i18nT(L, 'ward.buoy_hint'), 96 helpWords: i18nT(L, 'ward.help_words'), 97 helpSend: i18nT(L, 'ward.help_send'), 98 helpSent: i18nT(L, 'ward.help_sent'), 99 cancel: i18nT(L, 'ward.cancel'), 93 100 }, 94 101 }; … … 144 151 })); 145 152 res.json({ checks: out }); 153 }); 154 155 /** 156 * De feed: wat er binnenkomt van de mensen die je volgt. 157 * 158 * Zelfde bron en dezelfde partial als de Krant, Berichten en het 159 * guardian-dashboard (renderNoteBody), zodat een post er overal hetzelfde 160 * uitziet: opmaak, media, quote-kaart en embed. Kale content sturen zou hier 161 * een lege regel opleveren waar een foto hoort. 162 */ 163 router.get('/api/feed', requireAuth, (req, res) => { 164 const site = siteForUser(req); 165 if (!site) return res.status(404).json({ error: 'no_site' }); 166 const L = resolveLang(req); 167 const items = AP.getTimeline(site.slug, 60, 0).map((p) => ({ 168 id: p.id, 169 uri: p.object_uri || p.url, 170 author: p.author_handle || p.author_name || p.author_uri, 171 authorName: p.author_name, 172 authorIcon: p.author_icon, 173 url: p.url, 174 published: p.published || p.created_at, 175 whenText: formatDateTime(p.published || p.created_at), 176 cw: p.cw || null, 177 bodyHtml: renderNoteBody(p, L), 178 })); 179 res.json({ items }); 180 }); 181 182 /** 183 * De reddingsboei (§5.2.1): sleep hem op een post en je guardians krijgen hem. 184 * 185 * Shaer maakt hier een SCHERMAFDRUK van de kaart, met al het gedoe van buiten 186 * beeld renderen. Op de server is dat onnodig: wij weten wélke note het is, dus 187 * de hulpvraag draagt de note zelf mee. Dat is niet alleen minder werk maar ook 188 * eerlijker: een guardian ziet de echte post en niet een plaatje dat er ooit op 189 * leek. 190 * 191 * Gaat naar ALLE guardians tegelijk, als direct bericht. Geen post, nooit 192 * boostbaar. Zonder guardians is er niets om te vragen en zegt dat het ook. 193 */ 194 router.post('/api/help', requireAuth, express.json({ limit: '4kb' }), async (req, res) => { 195 const site = siteForUser(req); 196 if (!site) return res.status(404).json({ error: 'no_site' }); 197 const guardians = Guardianship.listGuardians(site.slug).map((g) => g.other_uri).filter(Boolean); 198 if (!guardians.length) return res.status(409).json({ error: 'no_guardians' }); 199 200 const noteId = String(req.body?.note || '').trim(); 201 const words = String(req.body?.words || '').trim().slice(0, 500); 202 // De post waar het om gaat, als die van deze tijdlijn komt. Niet verplicht: 203 // een kind mag ook om hulp vragen zonder dat er een post bij hoort. 204 const row = noteId ? AP.getTimeline(site.slug, 200, 0).find((p) => String(p.id) === noteId) : null; 205 const link = row && (row.url || row.object_uri); 206 207 const text = [words || 'Ik heb hulp nodig.', link ? `\n\n${link}` : ''].join(''); 208 const sent = await Guardianship.deliverDirectNote(site, { 209 recipients: guardians, 210 text, 211 language: site.language || 'nl', 212 helpRequest: true, 213 }).catch(() => null); 214 215 if (!sent) return res.status(502).json({ error: 'not_delivered' }); 216 res.json({ ok: true, guardians: guardians.length, note: link || null }); 146 217 }); 147 218
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)