fix: fixed the language thing and handling of project settings
This commit is contained in:
@@ -25,6 +25,8 @@ interface PostEngineContract {
|
|||||||
interface MetaEngineContract {
|
interface MetaEngineContract {
|
||||||
getProjectMetadata: () => Promise<ProjectMetadata | null>;
|
getProjectMetadata: () => Promise<ProjectMetadata | null>;
|
||||||
setProjectContext: (projectId: string, dataDir?: string) => void;
|
setProjectContext: (projectId: string, dataDir?: string) => void;
|
||||||
|
isInitialized?: () => boolean;
|
||||||
|
syncOnStartup?: () => Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PreviewServerDependencies {
|
interface PreviewServerDependencies {
|
||||||
@@ -421,6 +423,10 @@ export class PreviewServer {
|
|||||||
this.mediaEngine.setProjectContext?.(context.projectId, context.dataDir, context.dataDir);
|
this.mediaEngine.setProjectContext?.(context.projectId, context.dataDir, context.dataDir);
|
||||||
this.settingsEngine.setProjectContext(context.projectId, context.dataDir);
|
this.settingsEngine.setProjectContext(context.projectId, context.dataDir);
|
||||||
|
|
||||||
|
if (this.settingsEngine.isInitialized && this.settingsEngine.syncOnStartup && !this.settingsEngine.isInitialized()) {
|
||||||
|
await this.settingsEngine.syncOnStartup();
|
||||||
|
}
|
||||||
|
|
||||||
const metadata = await this.settingsEngine.getProjectMetadata();
|
const metadata = await this.settingsEngine.getProjectMetadata();
|
||||||
const maxPostsPerPage = clampMaxPostsPerPage(metadata?.maxPostsPerPage);
|
const maxPostsPerPage = clampMaxPostsPerPage(metadata?.maxPostsPerPage);
|
||||||
const htmlRewriteContext = await this.buildHtmlRewriteContext();
|
const htmlRewriteContext = await this.buildHtmlRewriteContext();
|
||||||
|
|||||||
@@ -810,6 +810,9 @@ export function registerIpcHandlers(): void {
|
|||||||
|
|
||||||
safeHandle('meta:getProjectMetadata', async () => {
|
safeHandle('meta:getProjectMetadata', async () => {
|
||||||
const engine = getMetaEngine();
|
const engine = getMetaEngine();
|
||||||
|
if (!engine.isInitialized()) {
|
||||||
|
await engine.syncOnStartup();
|
||||||
|
}
|
||||||
return engine.getProjectMetadata();
|
return engine.getProjectMetadata();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -359,6 +359,34 @@ describe('PreviewServer', () => {
|
|||||||
expect(html).toContain('<html lang="de">');
|
expect(html).toContain('<html lang="de">');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('initializes metadata before reading language when supported by settings engine', async () => {
|
||||||
|
let initialized = false;
|
||||||
|
|
||||||
|
server = new PreviewServer({
|
||||||
|
postEngine: makeEngine([makePost()]),
|
||||||
|
settingsEngine: {
|
||||||
|
setProjectContext: vi.fn(),
|
||||||
|
isInitialized: vi.fn(() => initialized),
|
||||||
|
syncOnStartup: vi.fn(async () => {
|
||||||
|
initialized = true;
|
||||||
|
}),
|
||||||
|
async getProjectMetadata() {
|
||||||
|
return initialized
|
||||||
|
? { name: 'My Great Blog', mainLanguage: 'fr', maxPostsPerPage: 50 }
|
||||||
|
: null;
|
||||||
|
},
|
||||||
|
} as any,
|
||||||
|
getActiveProjectContext: async () => ({ projectId: 'default' }),
|
||||||
|
});
|
||||||
|
|
||||||
|
await server.start(0);
|
||||||
|
|
||||||
|
const response = await fetch(`${server.getBaseUrl()}/`);
|
||||||
|
expect(response.status).toBe(200);
|
||||||
|
const html = await response.text();
|
||||||
|
expect(html).toContain('<html lang="fr">');
|
||||||
|
});
|
||||||
|
|
||||||
it('falls back to active project name in page title when metadata is unavailable', async () => {
|
it('falls back to active project name in page title when metadata is unavailable', async () => {
|
||||||
server = new PreviewServer({
|
server = new PreviewServer({
|
||||||
postEngine: makeEngine([makePost()]),
|
postEngine: makeEngine([makePost()]),
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ const mockProjectEngine = {
|
|||||||
const mockMetaEngine = {
|
const mockMetaEngine = {
|
||||||
on: vi.fn(),
|
on: vi.fn(),
|
||||||
setProjectContext: vi.fn(),
|
setProjectContext: vi.fn(),
|
||||||
|
isInitialized: vi.fn(),
|
||||||
syncOnStartup: vi.fn(),
|
syncOnStartup: vi.fn(),
|
||||||
getTags: vi.fn(),
|
getTags: vi.fn(),
|
||||||
getCategories: vi.fn(),
|
getCategories: vi.fn(),
|
||||||
@@ -1166,6 +1167,7 @@ describe('IPC Handlers', () => {
|
|||||||
describe('meta:getProjectMetadata', () => {
|
describe('meta:getProjectMetadata', () => {
|
||||||
it('should return project metadata', async () => {
|
it('should return project metadata', async () => {
|
||||||
const metadata = { name: 'Test Blog', description: 'A test blog', mainLanguage: 'de' };
|
const metadata = { name: 'Test Blog', description: 'A test blog', mainLanguage: 'de' };
|
||||||
|
mockMetaEngine.isInitialized.mockReturnValue(true);
|
||||||
mockMetaEngine.getProjectMetadata.mockResolvedValue(metadata);
|
mockMetaEngine.getProjectMetadata.mockResolvedValue(metadata);
|
||||||
|
|
||||||
const result = await invokeHandler('meta:getProjectMetadata');
|
const result = await invokeHandler('meta:getProjectMetadata');
|
||||||
@@ -1173,6 +1175,19 @@ describe('IPC Handlers', () => {
|
|||||||
expect(mockMetaEngine.getProjectMetadata).toHaveBeenCalled();
|
expect(mockMetaEngine.getProjectMetadata).toHaveBeenCalled();
|
||||||
expect(result).toEqual(metadata);
|
expect(result).toEqual(metadata);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should sync metadata before reading when engine is not initialized', async () => {
|
||||||
|
const metadata = { name: 'Test Blog', mainLanguage: 'de', defaultAuthor: 'Max' };
|
||||||
|
mockMetaEngine.isInitialized.mockReturnValue(false);
|
||||||
|
mockMetaEngine.syncOnStartup.mockResolvedValue(undefined);
|
||||||
|
mockMetaEngine.getProjectMetadata.mockResolvedValue(metadata);
|
||||||
|
|
||||||
|
const result = await invokeHandler('meta:getProjectMetadata');
|
||||||
|
|
||||||
|
expect(mockMetaEngine.syncOnStartup).toHaveBeenCalled();
|
||||||
|
expect(mockMetaEngine.getProjectMetadata).toHaveBeenCalled();
|
||||||
|
expect(result).toEqual(metadata);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('meta:setProjectMetadata', () => {
|
describe('meta:setProjectMetadata', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user