From 78109dd400d2c63cfa0668b361ee316fbe39bc6d Mon Sep 17 00:00:00 2001 From: flakronademi Date: Thu, 10 Sep 2026 13:43:59 +0200 Subject: [PATCH] fix(projects): improve duplicate project detection and handle deletion errors --- src/main/services/projects.service.ts | 32 +++++++++++++++++--- src/renderer/screens/selectProject/index.tsx | 5 ++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/services/projects.service.ts b/src/main/services/projects.service.ts index ef468515..80878e95 100644 --- a/src/main/services/projects.service.ts +++ b/src/main/services/projects.service.ts @@ -552,9 +552,25 @@ export default class ProjectsService { const projects = await this.loadProjects(); - // Check if project is already imported (by path) - if (projects.find((p) => p.path === projectPath)) { - throw new Error('This project is already imported.'); + const resolvedProjectPath = (() => { + try { + return fs.realpathSync(projectPath); + } catch { + return projectPath; + } + })(); + const alreadyImported = projects.find((p) => { + if (!p.path || !fs.existsSync(p.path)) return false; + try { + return fs.realpathSync(p.path) === resolvedProjectPath; + } catch { + return p.path === projectPath; + } + }); + if (alreadyImported) { + throw new Error( + `This project is already imported as "${alreadyImported.name}". Remove it from Studio first before re-importing.`, + ); } // Check if project name already exists and make it unique if needed @@ -689,7 +705,15 @@ export default class ProjectsService { const projectToDelete = projects.find((p) => p.id === id); if (projectToDelete) { if (projectToDelete.path) { - deleteDirectory(projectToDelete.path); + try { + deleteDirectory(projectToDelete.path); + } catch (error) { + // eslint-disable-next-line no-console + console.error( + '[ProjectsService] Failed to delete project directory:', + error, + ); + } } const selectedProject = await this.getSelectedProject(); if (selectedProject) { diff --git a/src/renderer/screens/selectProject/index.tsx b/src/renderer/screens/selectProject/index.tsx index 995bffbf..b9717059 100644 --- a/src/renderer/screens/selectProject/index.tsx +++ b/src/renderer/screens/selectProject/index.tsx @@ -724,7 +724,10 @@ const SelectProject: React.FC = () => { toast.error( 'Invalid dbt project structure. Please ensure the folder contains a valid dbt_project.yml file.', ); - } else if (error.message.includes('already exists')) { + } else if ( + error.message.includes('already exists') || + error.message.includes('already imported') + ) { toast.error(error.message); } else { toast.error(