feat: project deletion
This commit is contained in:
@@ -5,7 +5,7 @@ import * as path from 'path';
|
||||
import { eq } from 'drizzle-orm';
|
||||
import { app } from 'electron';
|
||||
import { getDatabase } from '../database';
|
||||
import { projects, Project, NewProject } from '../database/schema';
|
||||
import { projects, posts, media, Project, NewProject } from '../database/schema';
|
||||
|
||||
export interface ProjectData {
|
||||
id: string;
|
||||
@@ -147,6 +147,42 @@ export class ProjectEngine extends EventEmitter {
|
||||
return true;
|
||||
}
|
||||
|
||||
async deleteProjectWithData(id: string): Promise<boolean> {
|
||||
// Prevent deleting the default project
|
||||
if (id === 'default') {
|
||||
throw new Error('Cannot delete the default project');
|
||||
}
|
||||
|
||||
const db = getDatabase().getLocal();
|
||||
const existing = await db.select().from(projects).where(eq(projects.id, id)).get();
|
||||
|
||||
if (!existing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Delete associated posts from database
|
||||
await db.delete(posts).where(eq(posts.projectId, id));
|
||||
|
||||
// Delete associated media from database
|
||||
await db.delete(media).where(eq(media.projectId, id));
|
||||
|
||||
// Delete project files and directories
|
||||
const paths = this.getProjectPaths(id);
|
||||
try {
|
||||
// Delete posts directory
|
||||
await fs.rm(path.dirname(paths.posts), { recursive: true, force: true });
|
||||
} catch (error) {
|
||||
// Directory may not exist, that's okay
|
||||
console.warn(`Could not delete project directory for ${id}:`, error);
|
||||
}
|
||||
|
||||
// Delete project from database
|
||||
await db.delete(projects).where(eq(projects.id, id));
|
||||
|
||||
this.emit('projectDeleted', id);
|
||||
return true;
|
||||
}
|
||||
|
||||
async getProject(id: string): Promise<ProjectData | null> {
|
||||
const db = getDatabase().getLocal();
|
||||
const dbProject = await db.select().from(projects).where(eq(projects.id, id)).get();
|
||||
|
||||
@@ -28,6 +28,11 @@ export function registerIpcHandlers(): void {
|
||||
return engine.deleteProject(id);
|
||||
});
|
||||
|
||||
ipcMain.handle('projects:deleteWithData', async (_, id: string) => {
|
||||
const engine = getProjectEngine();
|
||||
return engine.deleteProjectWithData(id);
|
||||
});
|
||||
|
||||
ipcMain.handle('projects:get', async (_, id: string) => {
|
||||
const engine = getProjectEngine();
|
||||
return engine.getProject(id);
|
||||
|
||||
@@ -8,6 +8,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
create: (data: { name: string; description?: string; slug?: string }) => ipcRenderer.invoke('projects:create', data),
|
||||
update: (id: string, data: unknown) => ipcRenderer.invoke('projects:update', id, data),
|
||||
delete: (id: string) => ipcRenderer.invoke('projects:delete', id),
|
||||
deleteWithData: (id: string) => ipcRenderer.invoke('projects:deleteWithData', id),
|
||||
get: (id: string) => ipcRenderer.invoke('projects:get', id),
|
||||
getAll: () => ipcRenderer.invoke('projects:getAll'),
|
||||
getActive: () => ipcRenderer.invoke('projects:getActive'),
|
||||
|
||||
Reference in New Issue
Block a user