fix: modal usuários, rota wasabi storage-config, sync por permissão — v2.1.2
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user