Files
nxxmdata/backend/routes/backup.js
2025-09-12 20:08:42 +08:00

320 lines
7.9 KiB
JavaScript

/**
* 备份管理路由
* @file backup.js
* @description 处理数据备份和恢复请求
*/
const express = require('express');
const { body } = require('express-validator');
const { verifyToken, checkRole } = require('../middleware/auth');
const backupController = require('../controllers/backupController');
const router = express.Router();
/**
* @swagger
* tags:
* name: Backup
* description: 数据备份管理相关接口
*/
/**
* @swagger
* /api/backup/create:
* post:
* summary: 创建数据备份
* tags: [Backup]
* security:
* - bearerAuth: []
* requestBody:
* required: false
* content:
* application/json:
* schema:
* type: object
* properties:
* type:
* type: string
* enum: [full, daily, weekly, monthly]
* description: 备份类型
* default: full
* description:
* type: string
* description: 备份描述
* responses:
* 200:
* description: 备份创建成功
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/ApiResponse'
* 401:
* description: 未授权
* 403:
* description: 权限不足
* 500:
* description: 服务器错误
*/
router.post('/create',
verifyToken,
checkRole(['admin']),
[
body('type').optional().isIn(['full', 'daily', 'weekly', 'monthly']).withMessage('备份类型无效'),
body('description').optional().isLength({ max: 255 }).withMessage('描述长度不能超过255字符')
],
backupController.createBackup
);
/**
* @swagger
* /api/backup/list:
* get:
* summary: 获取备份列表
* tags: [Backup]
* security:
* - bearerAuth: []
* parameters:
* - in: query
* name: page
* schema:
* type: integer
* default: 1
* description: 页码
* - in: query
* name: limit
* schema:
* type: integer
* default: 10
* description: 每页数量
* - in: query
* name: type
* schema:
* type: string
* enum: [full, daily, weekly, monthly]
* description: 备份类型过滤
* responses:
* 200:
* description: 获取成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.get('/list', verifyToken, checkRole(['admin']), backupController.getBackupList);
/**
* @swagger
* /api/backup/stats:
* get:
* summary: 获取备份统计信息
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 获取成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.get('/stats', verifyToken, checkRole(['admin']), backupController.getBackupStats);
/**
* @swagger
* /api/backup/health:
* get:
* summary: 获取备份系统健康状态
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 获取成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.get('/health', verifyToken, checkRole(['admin']), backupController.getBackupHealth);
/**
* @swagger
* /api/backup/{id}:
* delete:
* summary: 删除备份
* tags: [Backup]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: string
* description: 备份ID
* responses:
* 200:
* description: 删除成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
* 404:
* description: 备份不存在
*/
router.delete('/:id', verifyToken, checkRole(['admin']), backupController.deleteBackup);
/**
* @swagger
* /api/backup/{id}/restore:
* post:
* summary: 恢复数据备份
* tags: [Backup]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: string
* description: 备份ID
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - confirm
* properties:
* confirm:
* type: boolean
* description: 确认恢复操作
* responses:
* 200:
* description: 恢复成功
* 400:
* description: 参数错误
* 401:
* description: 未授权
* 403:
* description: 权限不足
* 500:
* description: 恢复失败
*/
router.post('/:id/restore',
verifyToken,
checkRole(['admin']),
[
body('confirm').isBoolean().withMessage('confirm必须是布尔值')
],
backupController.restoreBackup
);
/**
* @swagger
* /api/backup/{id}/download:
* get:
* summary: 下载备份文件
* tags: [Backup]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: string
* description: 备份ID
* responses:
* 200:
* description: 文件下载
* content:
* application/zip:
* schema:
* type: string
* format: binary
* 401:
* description: 未授权
* 403:
* description: 权限不足
* 404:
* description: 备份文件不存在
*/
router.get('/:id/download', verifyToken, checkRole(['admin']), backupController.downloadBackup);
/**
* @swagger
* /api/backup/cleanup:
* post:
* summary: 清理过期备份
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 清理成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.post('/cleanup', verifyToken, checkRole(['admin']), backupController.cleanupBackups);
/**
* @swagger
* /api/backup/schedule/start:
* post:
* summary: 启动自动备份调度
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 启动成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.post('/schedule/start', verifyToken, checkRole(['admin']), backupController.startScheduler);
/**
* @swagger
* /api/backup/schedule/stop:
* post:
* summary: 停止自动备份调度
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 停止成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.post('/schedule/stop', verifyToken, checkRole(['admin']), backupController.stopScheduler);
/**
* @swagger
* /api/backup/schedule/status:
* get:
* summary: 获取自动备份调度状态
* tags: [Backup]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 获取成功
* 401:
* description: 未授权
* 403:
* description: 权限不足
*/
router.get('/schedule/status', verifyToken, checkRole(['admin']), backupController.getSchedulerStatus);
module.exports = router;