fix: modal usuários, rota wasabi storage-config, sync por permissão — v2.1.2
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)

This commit is contained in:
VPS 4 Builder
2026-05-26 23:06:01 +02:00
parent 76f6abdb3c
commit 525f98cbdb
6 changed files with 146 additions and 42 deletions
+92
View File
@@ -68,4 +68,96 @@ router.delete('/factory-reset', async (req, res) => {
}
});
// ================================================================
// GET /api/system/storage-config - Ler configurações de armazenamento
// ================================================================
router.get('/storage-config', async (req, res) => {
try {
const row = await db.get(
"SELECT value FROM system_config WHERE key = 'wasabi_config'"
);
if (!row || !row.value) {
// Retorna estrutura vazia — Wasabi não configurado
return res.json({
enabled: false,
wasabiAccessKey: '',
wasabiSecretKey: '',
wasabiBucket: '',
wasabiRegion: '',
wasabiEndpoint: ''
});
}
const config = JSON.parse(row.value);
// Mascara a secret key parcialmente por segurança
const maskedSecret = config.wasabiSecretKey
? config.wasabiSecretKey.substring(0, 4) + '****'
: '';
return res.json({
enabled: !!(config.wasabiAccessKey && config.wasabiBucket),
wasabiAccessKey: config.wasabiAccessKey || '',
wasabiSecretKey: maskedSecret,
wasabiBucket: config.wasabiBucket || '',
wasabiRegion: config.wasabiRegion || '',
wasabiEndpoint: config.wasabiEndpoint || ''
});
} catch (error) {
console.error('Erro ao ler storage-config:', error);
res.status(500).json({ error: 'Erro interno ao ler configurações.' });
}
});
// ================================================================
// POST /api/system/storage-config - Salvar configurações de armazenamento
// ================================================================
router.post('/storage-config', async (req, res) => {
try {
const {
wasabiAccessKey,
wasabiSecretKey,
wasabiBucket,
wasabiRegion,
wasabiEndpoint
} = req.body;
if (!wasabiAccessKey || !wasabiBucket) {
return res.status(400).json({ error: 'Access Key e Bucket são obrigatórios.' });
}
// Se a secret key vier mascarada (****), preserva a anterior
let finalSecret = wasabiSecretKey;
if (wasabiSecretKey && wasabiSecretKey.includes('****')) {
const existing = await db.get(
"SELECT value FROM system_config WHERE key = 'wasabi_config'"
);
if (existing && existing.value) {
const prev = JSON.parse(existing.value);
finalSecret = prev.wasabiSecretKey || wasabiSecretKey;
}
}
const configJson = JSON.stringify({
wasabiAccessKey: wasabiAccessKey.trim(),
wasabiSecretKey: finalSecret,
wasabiBucket: wasabiBucket.trim(),
wasabiRegion: (wasabiRegion || 'us-east-1').trim(),
wasabiEndpoint: (wasabiEndpoint || 's3.wasabisys.com').trim()
});
await db.run(`
INSERT INTO system_config (key, value, updated_at)
VALUES ('wasabi_config', $1, NOW())
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()
`, [configJson]);
return res.json({ success: true, message: 'Configurações salvas com sucesso.' });
} catch (error) {
console.error('Erro ao salvar storage-config:', error);
res.status(500).json({ error: 'Erro interno ao salvar configurações.' });
}
});
module.exports = router;