diff --git a/server/api/search.get.ts b/server/api/search.get.ts index a8c68e5ed..cc4df4506 100644 --- a/server/api/search.get.ts +++ b/server/api/search.get.ts @@ -17,6 +17,7 @@ import { parsePronouns } from '~/src/buildPronoun.ts'; import { buildCalendar } from '~/src/calendar/calendar.ts'; import { Day } from '~/src/calendar/helpers.ts'; import { genders, gendersWithNumerus } from '~/src/classes.ts'; +import forbidden from '~/src/forbidden.ts'; import { clearLinkedText, buildImageUrl } from '~/src/helpers.ts'; import parseMarkdown from '~/src/parseMarkdown.ts'; import { normaliseQuery, type SearchDocument, validateQuery } from '~/src/search.ts'; @@ -376,6 +377,84 @@ const kinds: SearchKind[] = [ }); } + if (config.user.enabled) { + addDocument({ + url: `/${encodeURIComponent(config.user.termsRoute)}`, + title: translator.translate('terms.header'), + content: [ + translator.has('terms.translationDisclaimer') + ? translator.translate('terms.translationDisclaimer') + : '', + translator.translate('terms.content.consent'), + + translator.translate('terms.content.accounts.header'), + translator.translate('terms.content.accounts.age'), + translator.translate('terms.content.accounts.authentication'), + translator.translate('terms.content.accounts.termination'), + translator.translate('terms.content.accounts.inactivity'), + + translator.translate('terms.content.content.header'), + translator.translate('terms.content.content.ownership'), + translator.translate('terms.content.content.liability'), + translator.translate('terms.content.content.violations'), + forbidden.map((violation) => { + translator.translate(`terms.content.content.violationsExamples.${violation}`); + }).join(translator.translate('terms.content.content.violationsSeparator')), + translator.translate('terms.content.content.violationsEnd'), + translator.translate('terms.content.content.violationsStrict'), + translator.translate('terms.content.content.responsibility'), + + translator.translate('terms.content.closing.header'), + translator.translate('terms.content.closing.jurisdiction'), + translator.translate('terms.content.closing.changes'), + ].join(' '), + }); + addDocument({ + url: `/${encodeURIComponent(config.user.privacyRoute)}`, + title: translator.translate('privacy.header'), + content: [ + translator.has('terms.translationDisclaimer') + ? translator.translate('terms.translationDisclaimer') + : '', + translator.translate('privacy.content.intro'), + translator.translate('privacy.content.effort'), + translator.translate('privacy.content.data'), + translator.translate('privacy.content.editRemoval'), + translator.translate('privacy.content.contact'), + translator.translate('privacy.content.cookies'), + translator.translate('privacy.content.plausible'), + translator.translate('privacy.content.turnstile'), + translator.translate('privacy.content.sentry'), + config.ads?.enabled ? translator.translate('privacy.content.publift') : '', + config.ads?.enabled ? translator.translate('privacy.content.gtm') : '', + translator.translate('privacy.content.logsBackups'), + translator.translate('privacy.content.gdpr'), + ].join(' '), + }); + } + + if (config.api) { + addDocument({ + url: '/api', + title: translator.translate('api.header'), + }); + } + + { + const content = await fs.readFile(`${rootDir}/LICENSE.md`, 'utf-8'); + const title = content.match(/^# (.*)\n/)?.[1]; + // exclude title, date and author from searchable content + const trimmed = content.replace(/^(.+\n+){2}/, ''); + const markdown = marked(trimmed); + const parsed = await parseMarkdown(markdown, translator); + const text = JSDOM.fragment(parsed.content ?? '').textContent?.replaceAll(/\s+/g, ' '); + addDocument({ + url: '/license', + title: title ?? '', + content: text ?? '', + }); + } + addDocument({ url: 'https://shop.pronouns.page', title: translator.translate('contact.groups.shop'),