feat: reworked project location

This commit is contained in:
2026-02-14 09:40:39 +01:00
parent 0412b00f2d
commit 6ff84c2d6a
10 changed files with 366 additions and 149 deletions

View File

@@ -1,4 +1,6 @@
import { ipcMain, dialog, shell } from 'electron';
import * as path from 'path';
import * as fsPromises from 'fs/promises';
import { eq } from 'drizzle-orm';
import { getPostEngine, PostData, PostFilter, PaginationOptions } from '../engine/PostEngine';
import { getMediaEngine, MediaData } from '../engine/MediaEngine';
@@ -32,7 +34,7 @@ function safeHandle(channel: string, handler: (...args: any[]) => Promise<any>):
export function registerIpcHandlers(): void {
// ============ Project Handlers ============
safeHandle('projects:create', async (_, data: { name: string; description?: string; slug?: string }) => {
safeHandle('projects:create', async (_, data: { name: string; description?: string; slug?: string; dataPath?: string }) => {
const engine = getProjectEngine();
return engine.createProject(data);
});
@@ -68,16 +70,17 @@ export function registerIpcHandlers(): void {
// Ensure all engines have the correct project context
if (project) {
const internalDir = projectEngine.getInternalBaseDir(project.id);
const dataDir = projectEngine.getDataDir(project.id, project.dataPath);
// For thumbnails and meta: use dataDir (whether custom or internal)
// This ensures all project data lives in the same location for backup
const postEngine = getPostEngine();
const mediaEngine = getMediaEngine();
const metaEngine = getMetaEngine();
const tagEngine = getTagEngine();
postEngine.setProjectContext(project.id, dataDir);
mediaEngine.setProjectContext(project.id, dataDir, internalDir);
metaEngine.setProjectContext(project.id);
tagEngine.setProjectContext(project.id);
mediaEngine.setProjectContext(project.id, dataDir, dataDir);
metaEngine.setProjectContext(project.id, dataDir);
tagEngine.setProjectContext(project.id, dataDir);
const postMediaEngine = getPostMediaEngine();
postMediaEngine.setProjectContext(project.id);
@@ -94,16 +97,17 @@ export function registerIpcHandlers(): void {
// Update all engines to use the new project context
if (project) {
const internalDir = projectEngine.getInternalBaseDir(project.id);
const dataDir = projectEngine.getDataDir(project.id, project.dataPath);
// For thumbnails and meta: use dataDir (whether custom or internal)
// This ensures all project data lives in the same location for backup
const postEngine = getPostEngine();
const mediaEngine = getMediaEngine();
const metaEngine = getMetaEngine();
const tagEngine = getTagEngine();
postEngine.setProjectContext(project.id, dataDir);
mediaEngine.setProjectContext(project.id, dataDir, internalDir);
metaEngine.setProjectContext(project.id);
tagEngine.setProjectContext(project.id);
mediaEngine.setProjectContext(project.id, dataDir, dataDir);
metaEngine.setProjectContext(project.id, dataDir);
tagEngine.setProjectContext(project.id, dataDir);
const postMediaEngine = getPostMediaEngine();
postMediaEngine.setProjectContext(project.id);
@@ -578,6 +582,23 @@ export function registerIpcHandlers(): void {
return shell.showItemInFolder(itemPath);
});
safeHandle('app:readProjectMetadata', async (_, folderPath: string) => {
const metaPath = path.join(folderPath, 'meta', 'project.json');
try {
const content = await fsPromises.readFile(metaPath, 'utf-8');
const metadata = JSON.parse(content);
// Return metadata but exclude dataPath (will be set to selected folder)
return {
name: metadata.name || undefined,
description: metadata.description || undefined,
mainLanguage: metadata.mainLanguage || undefined,
};
} catch {
// File doesn't exist or is invalid - return null
return null;
}
});
// ============ Meta Handlers ============
safeHandle('meta:getTags', async () => {