resolve issues with new features

This commit is contained in:
Matthias Hochmeister
2026-03-12 16:05:01 +01:00
parent a5cd78f01f
commit 5aa309b97a
22 changed files with 796 additions and 234 deletions

View File

@@ -6,6 +6,7 @@ import logger from '../utils/logger';
const createSchema = z.object({
message: z.string().min(1).max(2000),
level: z.enum(['info', 'important', 'critical']).default('info'),
show_as: z.enum(['banner', 'widget']).default('banner'),
starts_at: z.string().datetime().optional(),
ends_at: z.string().datetime().nullable().optional(),
});

View File

@@ -13,7 +13,7 @@ class VikunjaController {
}
try {
const tasks = await vikunjaService.getMyTasks();
res.status(200).json({ success: true, data: tasks, configured: true });
res.status(200).json({ success: true, data: tasks, configured: true, vikunjaUrl: environment.vikunja.url });
} catch (error) {
logger.error('VikunjaController.getMyTasks error', { error });
res.status(500).json({ success: false, message: 'Vikunja konnte nicht abgefragt werden' });
@@ -46,7 +46,7 @@ class VikunjaController {
}
}
res.status(200).json({ success: true, data: tasks, configured: true });
res.status(200).json({ success: true, data: tasks, configured: true, vikunjaUrl: environment.vikunja.url });
} catch (error) {
logger.error('VikunjaController.getOverdueTasks error', { error });
res.status(500).json({ success: false, message: 'Vikunja konnte nicht abgefragt werden' });

View File

@@ -0,0 +1,3 @@
ALTER TABLE announcement_banners
ADD COLUMN show_as VARCHAR(20) NOT NULL DEFAULT 'banner'
CHECK (show_as IN ('banner', 'widget'));

View File

@@ -4,6 +4,7 @@ export interface Banner {
id: string;
message: string;
level: 'info' | 'important' | 'critical';
show_as: 'banner' | 'widget';
starts_at: string;
ends_at: string | null;
created_by: string | null;
@@ -13,6 +14,7 @@ export interface Banner {
export interface CreateBannerInput {
message: string;
level: 'info' | 'important' | 'critical';
show_as?: 'banner' | 'widget';
starts_at?: string;
ends_at?: string | null;
}
@@ -39,9 +41,9 @@ class BannerService {
async create(data: CreateBannerInput, userId: string): Promise<Banner> {
const result = await pool.query(
`INSERT INTO announcement_banners (message, level, starts_at, ends_at, created_by)
VALUES ($1, $2, $3, $4, $5) RETURNING *`,
[data.message, data.level, data.starts_at ?? new Date().toISOString(), data.ends_at ?? null, userId]
`INSERT INTO announcement_banners (message, level, show_as, starts_at, ends_at, created_by)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`,
[data.message, data.level, data.show_as ?? 'banner', data.starts_at ?? new Date().toISOString(), data.ends_at ?? null, userId]
);
return result.rows[0];
}

View File

@@ -98,7 +98,7 @@ async function getRecentPages(): Promise<BookStackPage[]> {
const pages: BookStackPage[] = response.data?.data ?? [];
return pages.map((p) => ({
...p,
url: p.url && p.url.startsWith('http') ? p.url : `${bookstack.url}/books/${p.book_slug || p.book_id}/page/${p.slug}`,
url: `${bookstack.url}/books/${p.book_slug || p.book_id}/page/${p.slug}`,
}));
} catch (error) {
if (axios.isAxiosError(error)) {
@@ -134,7 +134,7 @@ async function searchPages(query: string): Promise<BookStackSearchResult[]> {
slug: item.slug,
book_id: item.book_id ?? 0,
book_slug: item.book_slug ?? '',
url: item.url || `${bookstack.url}/books/${item.book_slug || item.book_id}/page/${item.slug}`,
url: `${bookstack.url}/books/${item.book_slug || item.book_id}/page/${item.slug}`,
preview_html: item.preview_html ?? { content: '' },
tags: item.tags ?? [],
}));
@@ -189,7 +189,7 @@ async function getPageById(id: number): Promise<BookStackPageDetail> {
html: page.html ?? '',
created_at: page.created_at,
updated_at: page.updated_at,
url: page.url && page.url.startsWith('http') ? page.url : `${bookstack.url}/books/${page.book_slug || page.book_id}/page/${page.slug}`,
url: `${bookstack.url}/books/${page.book_slug || page.book_id}/page/${page.slug}`,
book: page.book,
createdBy: page.created_by,
updatedBy: page.updated_by,