feat: обновление с Git из админки (/admin/system)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-17 14:26:11 +03:00
parent d4dd1fb587
commit 69dfd2a93a
14 changed files with 482 additions and 54 deletions
+66
View File
@@ -4,6 +4,7 @@ const { requireAdmin } = require('../middleware/auth');
const { asyncHandler } = require('../utils/asyncHandler');
const { ROLE_LABELS } = require('../constants/roles');
const { notifyIfBackInStock } = require('../services/stock-alerts');
const gitDeploy = require('../services/git-deploy');
const router = express.Router();
@@ -349,4 +350,69 @@ router.post(
})
);
router.get(
'/system',
asyncHandler(async (req, res) => {
const fetchRemote =
req.query.checked === '1' || req.query.done === '1' || req.query.failed === '1';
let updateLog = null;
let updateOk = false;
let updateFail = false;
let updateCode = null;
if (req.query.done === '1' || req.query.failed === '1') {
updateLog = req.session.adminUpdateLog || null;
updateOk = req.session.adminUpdateOk === true;
updateFail = req.session.adminUpdateOk === false;
updateCode = req.session.adminUpdateCode ?? null;
delete req.session.adminUpdateLog;
delete req.session.adminUpdateOk;
delete req.session.adminUpdateCode;
}
const git = await gitDeploy.getGitInfo({ fetchRemote: !!fetchRemote });
res.render('admin/system', {
title: 'Обновление',
git,
updateLog,
updateOk,
updateFail,
updateCode,
confirmError: req.query.error === 'confirm',
disabledError: req.query.error === 'disabled',
});
})
);
router.post(
'/system/check',
asyncHandler(async (req, res) => {
res.redirect('/admin/system?checked=1');
})
);
router.post(
'/system/update',
asyncHandler(async (req, res) => {
if (!gitDeploy.isUpdateEnabled()) {
return res.redirect('/admin/system?error=disabled');
}
const confirm = (req.body.confirm || '').trim().toLowerCase();
if (confirm !== 'update') {
return res.redirect('/admin/system?error=confirm');
}
const result = await gitDeploy.runDeployUpdate();
req.session.adminUpdateLog = result.output;
req.session.adminUpdateOk = result.ok;
req.session.adminUpdateCode = result.code;
if (result.ok) {
return res.redirect('/admin/system?done=1');
}
return res.redirect('/admin/system?failed=1');
})
);
module.exports = router;