diff --git a/package.json b/package.json index cbbd848..63fe24b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "smartims", "private": true, - "version": "0.2.9", + "version": "0.3.0", "type": "module", "scripts": { "dev": "vite", diff --git a/server/package.json b/server/package.json index a8d233a..66df0a0 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "0.2.9", + "version": "0.3.0", "description": "", "main": "index.js", "scripts": { diff --git a/server/routes/system.js b/server/routes/system.js index 78529de..5b41cf3 100644 --- a/server/routes/system.js +++ b/server/routes/system.js @@ -541,27 +541,21 @@ router.post('/version/update', isAuthenticated, hasRole('admin'), async (req, re authPrefix = `git remote set-url origin ${auth.url} && `; } - const updateScript = ` - ${authPrefix} - git fetch --tags && - git checkout ${targetTag} && - npm install && - npm run build && - cd server && - npm install && - pm2 reload smartims-api - `; + const updateScript = `${authPrefix} git fetch --tags --force && git checkout -f ${targetTag} && npm install && npm run build && cd server && npm install && pm2 reload smartims-api`; - // Note: On Windows, we might need a different script or use a shell + // Note: On Windows, use cmd.exe /c which supports '&&' better than default PowerShell const isWindows = process.platform === 'win32'; - const shellCommand = isWindows ? `powershell.exe -Command "${updateScript.replace(/\n/g, '')}"` : updateScript; + const shellCommand = isWindows ? `cmd.exe /c "${updateScript}"` : updateScript; console.log(`π Starting system update to ${targetTag}...`); + console.log(`Executing: ${shellCommand}`); exec(shellCommand, { cwd: path.join(__dirname, '../..') }, (err, stdout, stderr) => { if (err) { console.error('β Update Failed:', err); - console.error(stderr); + // Sanitize output for logs + const sanitizedErr = stderr.replace(/:[^@]+@/g, ':****@'); + console.error(sanitizedErr); return; } console.log('β Update completed successfully.'); diff --git a/src/platform/pages/VersionPage.tsx b/src/platform/pages/VersionPage.tsx index 18532fb..a730431 100644 --- a/src/platform/pages/VersionPage.tsx +++ b/src/platform/pages/VersionPage.tsx @@ -65,22 +65,39 @@ export function VersionPage() { } setUpdating(true); + setUpdateResult(null); + try { const res = await apiClient.post('/system/version/update', { targetTag: remoteInfo.latest }); setUpdateResult({ success: true, message: res.data.message }); + + // Success: Wait a bit for server to settle, then refresh + let countdown = 5; + const timer = setInterval(() => { + countdown -= 1; + if (countdown <= 0) { + clearInterval(timer); + window.location.reload(); + } else { + setUpdateResult({ + success: true, + message: `${res.data.message} (${countdown}μ΄ ν νμ΄μ§κ° μλ‘κ³ μΉ¨λ©λλ€.)` + }); + } + }, 1000); + } catch (err: any) { console.error('Update failed', err); setUpdateResult({ success: false, message: err.response?.data?.error || 'μ λ°μ΄νΈ μμ² μ€ μ€λ₯κ° λ°μνμ΅λλ€.' }); - } finally { setUpdating(false); } }; // Client/Frontend version fixed at build time - const frontendVersion = '0.2.7'; + const frontendVersion = '0.3.0'; const buildDate = '2026-01-24'; // Check if update is needed based on frontend version vs remote tag @@ -232,6 +249,27 @@ export function VersionPage() {