diff --git a/VERSION b/VERSION index 0bfccb0..ef52a64 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.5 +0.4.6 diff --git a/source_clean/VERSION b/source_clean/VERSION index 0bfccb0..ef52a64 100644 --- a/source_clean/VERSION +++ b/source_clean/VERSION @@ -1 +1 @@ -0.4.5 +0.4.6 diff --git a/source_clean/src/routes/admin.routes.ts b/source_clean/src/routes/admin.routes.ts index 895eed8..339c2ed 100644 --- a/source_clean/src/routes/admin.routes.ts +++ b/source_clean/src/routes/admin.routes.ts @@ -154,7 +154,7 @@ router.get('/admin/cloud-configs', (_req: Request, res: Response) => { }); /** POST /api/admin/cloud-configs — create or smart-replace a cloud config */ -router.post('/admin/cloud-configs', (req: Request, res: Response) => { +router.post('/admin/cloud-configs', async (req: Request, res: Response) => { try { const data = req.body; if (!data.cloud_type) { @@ -164,6 +164,24 @@ router.post('/admin/cloud-configs', (req: Request, res: Response) => { // Normalize is_active: frontend sends boolean, SQLite needs 0/1 if (typeof data.is_active === 'boolean') data.is_active = data.is_active ? 1 : 0; const saved = saveCloudConfig(data); + + // Auto-validate if cookie was provided (best-effort, non-blocking) + if (data.cookie && saved.id) { + try { + const result = await testCloudConnectionWithCookie(data.cloud_type, data.cookie); + if (result.success) { + const updateData: any = { id: saved.id, cloud_type: data.cloud_type }; + if (result.nickname) updateData.nickname = result.nickname; + if (result.storage_used) updateData.storage_used = result.storage_used; + if (result.storage_total) updateData.storage_total = result.storage_total; + saveCloudConfig(updateData); + Object.assign(saved, { nickname: result.nickname, storage_used: result.storage_used, storage_total: result.storage_total }); + } + } catch (_) { + // Auto-validation is best-effort, don't fail the save + } + } + res.json(saved); } catch (err: any) { res.status(500).json({ error: err.message || 'Failed to save cloud config' });