Update server.js
This commit is contained in:
@@ -129,18 +129,19 @@ app.get('/api/settings', authenticateToken, async (req, res) => {
|
|||||||
res.json({
|
res.json({
|
||||||
currentYear: rows[0].current_year,
|
currentYear: rows[0].current_year,
|
||||||
smtpConfig: rows[0].smtp_config || {},
|
smtpConfig: rows[0].smtp_config || {},
|
||||||
features: rows[0].features || { multiCondo: true, tickets: true, payPal: true, notices: true, reports: true, extraordinaryExpenses: true, condoFinancialsView: false }
|
storageConfig: rows[0].storage_config || { provider: 'local_db' },
|
||||||
|
features: rows[0].features || { multiCondo: true, tickets: true, payPal: true, notices: true, reports: true, extraordinaryExpenses: true, condoFinancialsView: false, documents: true }
|
||||||
});
|
});
|
||||||
} else { res.status(404).json({ message: 'Settings not found' }); }
|
} else { res.status(404).json({ message: 'Settings not found' }); }
|
||||||
} catch (e) { res.status(500).json({ error: e.message }); }
|
} catch (e) { res.status(500).json({ error: e.message }); }
|
||||||
});
|
});
|
||||||
|
|
||||||
app.put('/api/settings', authenticateToken, requireAdmin, async (req, res) => {
|
app.put('/api/settings', authenticateToken, requireAdmin, async (req, res) => {
|
||||||
const { currentYear, smtpConfig, features } = req.body;
|
const { currentYear, smtpConfig, features, storageConfig } = req.body;
|
||||||
try {
|
try {
|
||||||
await pool.query(
|
await pool.query(
|
||||||
'UPDATE settings SET current_year = ?, smtp_config = ?, features = ? WHERE id = 1',
|
'UPDATE settings SET current_year = ?, smtp_config = ?, features = ?, storage_config = ? WHERE id = 1',
|
||||||
[currentYear, JSON.stringify(smtpConfig), JSON.stringify(features)]
|
[currentYear, JSON.stringify(smtpConfig), JSON.stringify(features), JSON.stringify(storageConfig)]
|
||||||
);
|
);
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (e) { res.status(500).json({ error: e.message }); }
|
} catch (e) { res.status(500).json({ error: e.message }); }
|
||||||
@@ -763,6 +764,63 @@ app.get('/api/condo-expenses/:id/attachments/:attId', authenticateToken, async (
|
|||||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// --- DOCUMENTS (CLOUD/LOCAL) ---
|
||||||
|
app.get('/api/documents', authenticateToken, async (req, res) => {
|
||||||
|
const { condoId } = req.query;
|
||||||
|
try {
|
||||||
|
// We only fetch metadata, not file_data
|
||||||
|
const [rows] = await pool.query('SELECT id, condo_id, title, description, file_name, file_type, file_size, tags, storage_provider, upload_date FROM documents WHERE condo_id = ? ORDER BY upload_date DESC', [condoId]);
|
||||||
|
res.json(rows.map(r => ({
|
||||||
|
id: r.id, condoId: r.condo_id, title: r.title, description: r.description,
|
||||||
|
fileName: r.file_name, fileType: r.file_type, fileSize: r.file_size,
|
||||||
|
tags: r.tags || [], storageProvider: r.storage_provider, uploadDate: r.upload_date
|
||||||
|
})));
|
||||||
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/api/documents', authenticateToken, requireAdmin, async (req, res) => {
|
||||||
|
const { condoId, title, description, fileName, fileType, fileSize, tags, fileData, storageConfig } = req.body;
|
||||||
|
const id = uuidv4();
|
||||||
|
try {
|
||||||
|
// Here we would implement real Cloud Storage logic based on storageConfig.provider
|
||||||
|
// For 'local_db' or fallback, we save base64 in DB.
|
||||||
|
|
||||||
|
let provider = storageConfig?.provider || 'local_db';
|
||||||
|
// Mocking Cloud upload by just saving to DB for demo purposes,
|
||||||
|
// but acknowledging the config
|
||||||
|
|
||||||
|
await pool.query(
|
||||||
|
'INSERT INTO documents (id, condo_id, title, description, file_name, file_type, file_size, tags, storage_provider, file_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
||||||
|
[id, condoId, title, description, fileName, fileType, fileSize, JSON.stringify(tags), provider, fileData]
|
||||||
|
);
|
||||||
|
res.json({ success: true, id });
|
||||||
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/api/documents/:id/download', authenticateToken, async (req, res) => {
|
||||||
|
try {
|
||||||
|
const [rows] = await pool.query('SELECT file_name, file_type, file_data, storage_provider FROM documents WHERE id = ?', [req.params.id]);
|
||||||
|
if (rows.length === 0) return res.status(404).json({ message: 'Not Found' });
|
||||||
|
const doc = rows[0];
|
||||||
|
|
||||||
|
// If external provider (S3/Drive), we would generate a Signed URL here or proxy the stream.
|
||||||
|
// For local_db:
|
||||||
|
res.json({
|
||||||
|
fileName: doc.file_name,
|
||||||
|
fileType: doc.file_type,
|
||||||
|
data: doc.file_data // Base64
|
||||||
|
});
|
||||||
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
|
});
|
||||||
|
|
||||||
|
app.delete('/api/documents/:id', authenticateToken, requireAdmin, async (req, res) => {
|
||||||
|
try {
|
||||||
|
// Also delete from cloud if configured...
|
||||||
|
await pool.query('DELETE FROM documents WHERE id = ?', [req.params.id]);
|
||||||
|
res.json({ success: true });
|
||||||
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
|
});
|
||||||
|
|
||||||
initDb().then(() => {
|
initDb().then(() => {
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Server running on port ${PORT}`);
|
console.log(`Server running on port ${PORT}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user