add forgotten routes in to build
All checks were successful
CI / update (push) Successful in 1m28s

This commit is contained in:
2026-02-11 10:19:11 +01:00
parent 01ccc705ee
commit 7bdc62489c
5 changed files with 70 additions and 59 deletions

View File

@@ -10,36 +10,45 @@
let session = $derived($page.data?.session);
let user = $derived(session?.user);
// Get Bible quote from SSR via handleError hook
// Get Bible quote and language from SSR via handleError hook
let bibleQuote = $derived($page.error?.bibleQuote);
let isEnglish = $derived($page.error?.lang === 'en');
function getErrorTitle(status) {
if (isEnglish) {
switch (status) {
case 401: return 'Login Required';
case 403: return 'Access Denied';
case 404: return 'Page Not Found';
case 500: return 'Server Error';
default: return 'Error';
}
}
switch (status) {
case 401:
return 'Anmeldung erforderlich';
case 403:
return 'Zugriff verweigert';
case 404:
return 'Seite nicht gefunden';
case 500:
return 'Serverfehler';
default:
return 'Fehler';
case 401: return 'Anmeldung erforderlich';
case 403: return 'Zugriff verweigert';
case 404: return 'Seite nicht gefunden';
case 500: return 'Serverfehler';
default: return 'Fehler';
}
}
function getErrorDescription(status) {
if (isEnglish) {
switch (status) {
case 401: return 'You must be logged in to access this page.';
case 403: return 'You do not have permission for this area.';
case 404: return 'The requested page could not be found.';
case 500: return 'An unexpected error occurred. Please try again later.';
default: return 'An unexpected error occurred.';
}
}
switch (status) {
case 401:
return 'Du musst angemeldet sein, um auf diese Seite zugreifen zu können.';
case 403:
return 'Du hast keine Berechtigung für diesen Bereich.';
case 404:
return 'Die angeforderte Seite konnte nicht gefunden werden.';
case 500:
return 'Es ist ein unerwarteter Fehler aufgetreten. Bitte versuche es später erneut.';
default:
return 'Es ist ein unerwarteter Fehler aufgetreten.';
case 401: return 'Du musst angemeldet sein, um auf diese Seite zugreifen zu können.';
case 403: return 'Du hast keine Berechtigung für diesen Bereich.';
case 404: return 'Die angeforderte Seite konnte nicht gefunden werden.';
case 500: return 'Es ist ein unerwarteter Fehler aufgetreten. Bitte versuche es später erneut.';
default: return 'Es ist ein unerwarteter Fehler aufgetreten.';
}
}
@@ -96,7 +105,7 @@
</h1>
<div class="error-code">
Fehler {status}
{isEnglish ? 'Error' : 'Fehler'} {status}
</div>
<p class="error-description">
@@ -112,38 +121,24 @@
<div class="error-actions">
{#if status === 401}
<button class="btn btn-primary" onclick={login}>
Anmelden
{isEnglish ? 'Log In' : 'Anmelden'}
</button>
<button class="btn btn-secondary" onclick={goHome}>
Zur Startseite
</button>
{:else if status === 403}
<button class="btn btn-primary" onclick={goHome}>
Zur Startseite
</button>
<button class="btn btn-secondary" onclick={goBack}>
Zurück
</button>
{:else if status === 404}
<button class="btn btn-primary" onclick={goHome}>
Zur Startseite
</button>
<button class="btn btn-secondary" onclick={goBack}>
Zurück
{isEnglish ? 'Go to Homepage' : 'Zur Startseite'}
</button>
{:else if status === 500}
<button class="btn btn-primary" onclick={goHome}>
Zur Startseite
{isEnglish ? 'Go to Homepage' : 'Zur Startseite'}
</button>
<button class="btn btn-secondary" onclick={goBack}>
Erneut versuchen
{isEnglish ? 'Try Again' : 'Erneut versuchen'}
</button>
{:else}
<button class="btn btn-primary" onclick={goHome}>
Zur Startseite
{isEnglish ? 'Go to Homepage' : 'Zur Startseite'}
</button>
<button class="btn btn-secondary" onclick={goBack}>
Zurück
{isEnglish ? 'Go Back' : 'Zurück'}
</button>
{/if}
</div>
@@ -152,7 +147,7 @@
{#if bibleQuote}
<div class="bible-quote">
<div class="quote-text">
{bibleQuote.text}"
{isEnglish ? '"' : '„'}{bibleQuote.text}{isEnglish ? '"' : '"'}
</div>
<div class="quote-reference">
{bibleQuote.reference}

View File

@@ -1,4 +1,4 @@
import { mysteryVerseData } from '$lib/data/mysteryVerseData';
import { mysteryVerseDataDe, mysteryVerseDataEn } from '$lib/data/mysteryVerseData';
import type { PageServerLoad } from './$types';
interface StreakData {
@@ -36,7 +36,7 @@ function getMysteryForWeekday(date: Date, includeLuminous: boolean): string {
}
}
export const load: PageServerLoad = async ({ url, fetch, locals }) => {
export const load: PageServerLoad = async ({ url, fetch, locals, params }) => {
const session = await locals.auth();
// Read toggle/mystery state from URL search params (for no-JS progressive enhancement)
@@ -76,7 +76,7 @@ export const load: PageServerLoad = async ({ url, fetch, locals }) => {
}
return {
mysteryDescriptions: mysteryVerseData,
mysteryDescriptions: params.faithLang === 'faith' ? mysteryVerseDataEn : mysteryVerseDataDe,
streakData,
initialMystery,
todaysMystery,

View File

@@ -1884,5 +1884,5 @@ h1 {
<!-- Bible citation modal -->
{#if showModal}
<BibleModal reference={selectedReference} title={selectedTitle} verseData={selectedVerseData} onClose={() => showModal = false} />
<BibleModal reference={selectedReference} title={selectedTitle} verseData={selectedVerseData} lang={data.lang} onClose={() => showModal = false} />
{/if}

View File

@@ -1,6 +1,12 @@
import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { lookupReference } from '$lib/server/bible';
import { resolve } from 'path';
const tsvFiles: Record<string, string> = {
glaube: 'static/allioli.tsv',
faith: 'static/drb.tsv'
};
export const GET: RequestHandler = async ({ params }) => {
const reference = params.reference;
@@ -9,8 +15,10 @@ export const GET: RequestHandler = async ({ params }) => {
return error(400, 'Missing reference parameter');
}
const tsvPath = resolve(tsvFiles[params.faithLang]);
try {
const result = lookupReference(reference);
const result = lookupReference(reference, tsvPath);
if (!result) {
return error(404, 'No verses found for the given reference');

View File

@@ -1,5 +1,6 @@
import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { resolve } from 'path';
interface BibleVerse {
bookName: string;
@@ -10,23 +11,27 @@ interface BibleVerse {
text: string;
}
// Cache for parsed verses to avoid reading file repeatedly
let cachedVerses: BibleVerse[] | null = null;
const tsvFiles: Record<string, string> = {
glaube: '/allioli.tsv',
faith: '/drb.tsv'
};
async function loadVerses(fetch: typeof globalThis.fetch): Promise<BibleVerse[]> {
if (cachedVerses) {
return cachedVerses;
}
// Cache for parsed verses per language
const versesCache = new Map<string, BibleVerse[]>();
async function loadVerses(fetch: typeof globalThis.fetch, tsvFile: string): Promise<BibleVerse[]> {
const cached = versesCache.get(tsvFile);
if (cached) return cached;
try {
const response = await fetch('/allioli.tsv');
const response = await fetch(tsvFile);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const content = await response.text();
const lines = content.trim().split('\n');
cachedVerses = lines.map(line => {
const verses = lines.map(line => {
const [bookName, abbreviation, bookNumber, chapter, verseNumber, text] = line.split('\t');
return {
bookName,
@@ -38,7 +43,8 @@ async function loadVerses(fetch: typeof globalThis.fetch): Promise<BibleVerse[]>
};
});
return cachedVerses;
versesCache.set(tsvFile, verses);
return verses;
} catch (err) {
console.error('Error loading Bible verses:', err);
throw new Error('Failed to load Bible verses');
@@ -54,9 +60,11 @@ function formatVerse(verse: BibleVerse): string {
return `${verse.bookName} ${verse.chapter}:${verse.verseNumber}`;
}
export const GET: RequestHandler = async ({ fetch }) => {
export const GET: RequestHandler = async ({ fetch, params }) => {
const tsvFile = tsvFiles[params.faithLang];
try {
const verses = await loadVerses(fetch);
const verses = await loadVerses(fetch, tsvFile);
const randomVerse = getRandomVerse(verses);
return json({