resolve issues with new features

This commit is contained in:
Matthias Hochmeister
2026-03-12 17:20:32 +01:00
parent 68586b01dc
commit 34ca007f9b
8 changed files with 232 additions and 49 deletions

View File

@@ -15,17 +15,23 @@ class ConfigController {
async getPdfSettings(_req: Request, res: Response): Promise<void> {
try {
const header = await settingsService.get('pdf_header');
const footer = await settingsService.get('pdf_footer');
const [header, footer, logo, orgName] = await Promise.all([
settingsService.get('pdf_header'),
settingsService.get('pdf_footer'),
settingsService.get('pdf_logo'),
settingsService.get('pdf_org_name'),
]);
res.json({
success: true,
data: {
pdf_header: header?.value ?? '',
pdf_footer: footer?.value ?? '',
pdf_logo: logo?.value ?? '',
pdf_org_name: orgName?.value ?? '',
},
});
} catch {
res.json({ success: true, data: { pdf_header: '', pdf_footer: '' } });
res.json({ success: true, data: { pdf_header: '', pdf_footer: '', pdf_logo: '', pdf_org_name: '' } });
}
}

View File

@@ -81,6 +81,25 @@ function buildHeaders(): Record<string, string> {
};
}
/**
* Fetches all BookStack books and returns a map of book_id → book_slug.
* The /api/pages list endpoint does not reliably include book_slug, so we
* look it up separately and use it when constructing page URLs.
*/
async function getBookSlugMap(): Promise<Map<number, string>> {
const { bookstack } = environment;
try {
const response = await axios.get(
`${bookstack.url}/api/books`,
{ params: { count: 500 }, headers: buildHeaders() },
);
const books: Array<{ id: number; slug: string }> = response.data?.data ?? [];
return new Map(books.map((b) => [b.id, b.slug]));
} catch {
return new Map();
}
}
async function getRecentPages(): Promise<BookStackPage[]> {
const { bookstack } = environment;
if (!bookstack.url || !isValidServiceUrl(bookstack.url)) {
@@ -88,17 +107,20 @@ async function getRecentPages(): Promise<BookStackPage[]> {
}
try {
const response = await axios.get(
`${bookstack.url}/api/pages`,
{
params: { sort: '-updated_at', count: 20 },
headers: buildHeaders(),
},
);
const [response, bookSlugMap] = await Promise.all([
axios.get(
`${bookstack.url}/api/pages`,
{
params: { sort: '-updated_at', count: 20 },
headers: buildHeaders(),
},
),
getBookSlugMap(),
]);
const pages: BookStackPage[] = response.data?.data ?? [];
return pages.map((p) => ({
...p,
url: `${bookstack.url}/books/${p.book_slug || p.book_id}/page/${p.slug}`,
url: `${bookstack.url}/books/${bookSlugMap.get(p.book_id) || p.book_slug || p.book_id}/page/${p.slug}`,
}));
} catch (error) {
if (axios.isAxiosError(error)) {
@@ -174,11 +196,15 @@ async function getPageById(id: number): Promise<BookStackPageDetail> {
}
try {
const response = await axios.get(
`${bookstack.url}/api/pages/${id}`,
{ headers: buildHeaders() },
);
const [response, bookSlugMap] = await Promise.all([
axios.get(
`${bookstack.url}/api/pages/${id}`,
{ headers: buildHeaders() },
),
getBookSlugMap(),
]);
const page = response.data;
const bookSlug = bookSlugMap.get(page.book_id) || page.book?.slug || page.book_slug || page.book_id;
return {
id: page.id,
name: page.name,
@@ -189,7 +215,7 @@ async function getPageById(id: number): Promise<BookStackPageDetail> {
html: page.html ?? '',
created_at: page.created_at,
updated_at: page.updated_at,
url: `${bookstack.url}/books/${page.book?.slug || page.book_slug || page.book_id}/page/${page.slug}`,
url: `${bookstack.url}/books/${bookSlug}/page/${page.slug}`,
book: page.book,
createdBy: page.created_by,
updatedBy: page.updated_by,