- Add try-catch to /nextcloud/disconnect route (was crashing on DB errors) - Update docker-compose.yml image tag from v7 to v8 - Remove unused SESSION_SECRET from .env.example
69 lines
3.5 KiB
JavaScript
69 lines
3.5 KiB
JavaScript
var express = require('express');
|
|
var router = express.Router();
|
|
var axios = require('axios');
|
|
var { authMiddleware } = require('../middleware/auth');
|
|
var db = require('../db/database');
|
|
|
|
router.post('/nextcloud/connect', authMiddleware, async function(req, res) {
|
|
try {
|
|
var { nextcloudUrl, username, appPassword, folder } = req.body;
|
|
if (!nextcloudUrl || !username || !appPassword) return res.status(400).json({ error: 'All fields required' });
|
|
|
|
var cleanUrl = nextcloudUrl.replace(/\/+$/, '');
|
|
var targetFolder = (folder || '/PediatricScribe').replace(/\/+$/, '');
|
|
|
|
try {
|
|
await axios({ method: 'PROPFIND', url: cleanUrl + '/remote.php/dav/files/' + username + '/', auth: { username: username, password: appPassword }, headers: { Depth: '0' } });
|
|
} catch (e) {
|
|
return res.status(400).json({ error: 'Cannot connect. Check credentials.' });
|
|
}
|
|
|
|
var parts = targetFolder.split('/').filter(Boolean);
|
|
var current = '';
|
|
for (var i = 0; i < parts.length; i++) {
|
|
current += '/' + parts[i];
|
|
try { await axios({ method: 'MKCOL', url: cleanUrl + '/remote.php/dav/files/' + username + current + '/', auth: { username: username, password: appPassword } }); } catch (e) {}
|
|
}
|
|
|
|
await db.run('UPDATE users SET nextcloud_url = ?, nextcloud_user = ?, nextcloud_token = ?, nextcloud_folder = ? WHERE id = ?',
|
|
[cleanUrl, username, appPassword, targetFolder, req.user.id]);
|
|
|
|
res.json({ success: true, message: 'Connected! Files saved to ' + targetFolder + '/' });
|
|
} catch (err) { res.status(500).json({ error: err.message }); }
|
|
});
|
|
|
|
router.post('/nextcloud/export', authMiddleware, async function(req, res) {
|
|
try {
|
|
var { content, filename, type } = req.body;
|
|
var user = await db.get('SELECT nextcloud_url, nextcloud_user, nextcloud_token, nextcloud_folder FROM users WHERE id = ?', [req.user.id]);
|
|
if (!user || !user.nextcloud_url) return res.status(400).json({ error: 'Nextcloud not connected. Go to Settings.' });
|
|
|
|
var baseFolder = user.nextcloud_folder || '/PediatricScribe';
|
|
var today = new Date().toISOString().split('T')[0];
|
|
var targetPath = baseFolder + '/' + today;
|
|
|
|
var parts = targetPath.split('/').filter(Boolean);
|
|
var current = '';
|
|
for (var i = 0; i < parts.length; i++) {
|
|
current += '/' + parts[i];
|
|
try { await axios({ method: 'MKCOL', url: user.nextcloud_url + '/remote.php/dav/files/' + user.nextcloud_user + current + '/', auth: { username: user.nextcloud_user, password: user.nextcloud_token } }); } catch (e) {}
|
|
}
|
|
|
|
var time = new Date().toTimeString().split(' ')[0].replace(/:/g, '-');
|
|
var safeName = (filename || type + '-' + time).replace(/[^a-zA-Z0-9-_]/g, '_');
|
|
var filePath = user.nextcloud_url + '/remote.php/dav/files/' + user.nextcloud_user + targetPath + '/' + safeName + '.txt';
|
|
|
|
await axios({ method: 'PUT', url: filePath, data: content, auth: { username: user.nextcloud_user, password: user.nextcloud_token }, headers: { 'Content-Type': 'text/plain; charset=utf-8' } });
|
|
|
|
res.json({ success: true, message: 'Saved to ' + targetPath + '/' + safeName + '.txt' });
|
|
} catch (err) { res.status(500).json({ error: err.message }); }
|
|
});
|
|
|
|
router.post('/nextcloud/disconnect', authMiddleware, async function(req, res) {
|
|
try {
|
|
await db.run('UPDATE users SET nextcloud_url = NULL, nextcloud_user = NULL, nextcloud_token = NULL, nextcloud_folder = NULL WHERE id = ?', [req.user.id]);
|
|
res.json({ success: true });
|
|
} catch (err) { res.status(500).json({ error: err.message }); }
|
|
});
|
|
|
|
module.exports = router;
|