初始化

This commit is contained in:
2026-07-03 16:01:08 +08:00
parent dc90e889e1
commit b51ee98afa
37 changed files with 6282 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
package controller
import (
"strconv"
"seeyon-filesystem/dto"
"seeyon-filesystem/service"
"seeyon-filesystem/utils"
"github.com/gin-gonic/gin"
)
// BackupController 备份控制器
type BackupController struct {
backupService *service.BackupService
}
func NewBackupController() *BackupController {
return &BackupController{
backupService: service.NewBackupService(),
}
}
// ========== 策略管理 ==========
// ListPolicies 备份策略列表
// GET /api/admin/backup/policies
func (c *BackupController) ListPolicies(ctx *gin.Context) {
policies, err := c.backupService.ListPolicies()
if err != nil {
utils.ServerError(ctx, "查询失败")
return
}
utils.Success(ctx, policies)
}
// CreatePolicy 创建备份策略
// POST /api/admin/backup/policies
func (c *BackupController) CreatePolicy(ctx *gin.Context) {
var req dto.BackupPolicyCreateRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误: "+err.Error())
return
}
if err := c.backupService.CreatePolicy(&req); err != nil {
utils.ServerError(ctx, err.Error())
return
}
utils.SuccessWithMessage(ctx, "创建成功", nil)
}
// DeletePolicy 删除备份策略
// DELETE /api/admin/backup/policies/:id
func (c *BackupController) DeletePolicy(ctx *gin.Context) {
id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
if err != nil {
utils.BadRequest(ctx, "无效的ID")
return
}
if err := c.backupService.DeletePolicy(id); err != nil {
utils.ServerError(ctx, err.Error())
return
}
utils.SuccessWithMessage(ctx, "删除成功", nil)
}
// TogglePolicy 启用/禁用备份策略
// PUT /api/admin/backup/policies/:id/toggle
func (c *BackupController) TogglePolicy(ctx *gin.Context) {
id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
if err != nil {
utils.BadRequest(ctx, "无效的ID")
return
}
var req struct {
Status int8 `json:"status"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误")
return
}
if err := c.backupService.TogglePolicy(id, req.Status); err != nil {
utils.ServerError(ctx, err.Error())
return
}
utils.SuccessWithMessage(ctx, "操作成功", nil)
}
// ========== 执行备份 ==========
// ExecuteBackup 手动执行备份
// POST /api/admin/backup/execute/:id
func (c *BackupController) ExecuteBackup(ctx *gin.Context) {
id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
if err != nil {
utils.BadRequest(ctx, "无效的ID")
return
}
log, err := c.backupService.ExecuteBackup(id)
if err != nil {
utils.BadRequest(ctx, err.Error())
return
}
utils.Success(ctx, gin.H{
"log_id": log.ID,
"message": "备份任务已启动",
})
}
// ========== 备份日志 ==========
// ListLogs 备份日志列表
// GET /api/admin/backup/logs?policy_id=1&page=1&size=20
func (c *BackupController) ListLogs(ctx *gin.Context) {
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(ctx.DefaultQuery("size", "20"))
policyID, _ := strconv.ParseUint(ctx.Query("policy_id"), 10, 64)
if page < 1 {
page = 1
}
if size < 1 || size > 100 {
size = 20
}
logs, total, err := c.backupService.ListLogs(policyID, page, size)
if err != nil {
utils.ServerError(ctx, "查询失败")
return
}
utils.PageSuccess(ctx, logs, total, page, size)
}
// ========== 恢复 ==========
// ListBackups 列出可恢复的备份
// GET /api/admin/backup/backups
func (c *BackupController) ListBackups(ctx *gin.Context) {
backups, err := c.backupService.ListBackups()
if err != nil {
utils.ServerError(ctx, "查询失败")
return
}
utils.Success(ctx, backups)
}
// Restore 从备份恢复
// POST /api/admin/backup/restore/:logId
func (c *BackupController) Restore(ctx *gin.Context) {
logID, err := strconv.ParseUint(ctx.Param("logId"), 10, 64)
if err != nil {
utils.BadRequest(ctx, "无效的备份ID")
return
}
var req struct {
RestoreDB bool `json:"restore_db"`
RestoreFiles bool `json:"restore_files"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误")
return
}
if !req.RestoreDB && !req.RestoreFiles {
utils.BadRequest(ctx, "请选择要恢复的内容(数据库或文件)")
return
}
result, err := c.backupService.RestoreFromBackup(logID, req.RestoreDB, req.RestoreFiles)
if err != nil {
utils.BadRequest(ctx, err.Error())
return
}
if result.Success {
utils.Success(ctx, result)
} else {
utils.ServerError(ctx, result.Message)
}
}