Files
mayfly-go/server/internal/db/api/db_restore.go

144 lines
4.9 KiB
Go
Raw Normal View History

2023-12-27 22:59:20 +08:00
package api
import (
"context"
"mayfly-go/internal/db/api/form"
"mayfly-go/internal/db/api/vo"
"mayfly-go/internal/db/application"
"mayfly-go/internal/db/domain/entity"
"mayfly-go/pkg/biz"
"mayfly-go/pkg/req"
"strconv"
"strings"
)
type DbRestore struct {
2024-01-23 16:29:41 +08:00
restoreApp *application.DbRestoreApp `inject:"DbRestoreApp"`
dbApp application.Db `inject:"DbApp"`
2023-12-27 22:59:20 +08:00
}
// GetPageList 获取数据库恢复任务
// @router /api/dbs/:dbId/restores [GET]
func (d *DbRestore) GetPageList(rc *req.Ctx) {
2024-02-25 12:46:18 +08:00
dbId := uint64(rc.PathParamInt("dbId"))
2023-12-27 22:59:20 +08:00
biz.IsTrue(dbId > 0, "无效的 dbId: %v", dbId)
2024-01-23 16:29:41 +08:00
db, err := d.dbApp.GetById(new(entity.Db), dbId, "db_instance_id", "database")
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "获取数据库信息失败: %v")
var restores []vo.DbRestore
queryCond, page := req.BindQueryAndPage[*entity.DbRestoreQuery](rc, new(entity.DbRestoreQuery))
2023-12-27 22:59:20 +08:00
queryCond.DbInstanceId = db.InstanceId
queryCond.InDbNames = strings.Fields(db.Database)
2024-01-23 16:29:41 +08:00
res, err := d.restoreApp.GetPageList(queryCond, page, &restores)
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "获取数据库恢复任务失败: %v")
rc.ResData = res
}
// Create 保存数据库恢复任务
// @router /api/dbs/:dbId/restores [POST]
func (d *DbRestore) Create(rc *req.Ctx) {
restoreForm := &form.DbRestoreForm{}
req.BindJsonAndValid(rc, restoreForm)
rc.ReqParam = restoreForm
2023-12-27 22:59:20 +08:00
2024-02-25 12:46:18 +08:00
dbId := uint64(rc.PathParamInt("dbId"))
2023-12-27 22:59:20 +08:00
biz.IsTrue(dbId > 0, "无效的 dbId: %v", dbId)
2024-01-23 16:29:41 +08:00
db, err := d.dbApp.GetById(new(entity.Db), dbId, "instanceId")
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "获取数据库信息失败: %v")
job := &entity.DbRestore{
DbInstanceId: db.InstanceId,
DbName: restoreForm.DbName,
Enabled: true,
Repeated: restoreForm.Repeated,
StartTime: restoreForm.StartTime,
Interval: restoreForm.Interval,
PointInTime: restoreForm.PointInTime,
DbBackupId: restoreForm.DbBackupId,
DbBackupHistoryId: restoreForm.DbBackupHistoryId,
DbBackupHistoryName: restoreForm.DbBackupHistoryName,
2023-12-27 22:59:20 +08:00
}
2024-01-23 16:29:41 +08:00
biz.ErrIsNilAppendErr(d.restoreApp.Create(rc.MetaCtx, job), "添加数据库恢复任务失败: %v")
2023-12-27 22:59:20 +08:00
}
func (d *DbRestore) createWithBackupHistory(backupHistoryIds string) {
}
// Update 保存数据库恢复任务
2023-12-27 22:59:20 +08:00
// @router /api/dbs/:dbId/restores/:restoreId [PUT]
func (d *DbRestore) Update(rc *req.Ctx) {
restoreForm := &form.DbRestoreForm{}
req.BindJsonAndValid(rc, restoreForm)
rc.ReqParam = restoreForm
2023-12-27 22:59:20 +08:00
job := &entity.DbRestore{}
job.Id = restoreForm.Id
job.StartTime = restoreForm.StartTime
job.Interval = restoreForm.Interval
2024-01-23 16:29:41 +08:00
biz.ErrIsNilAppendErr(d.restoreApp.Update(rc.MetaCtx, job), "保存数据库恢复任务失败: %v")
2023-12-27 22:59:20 +08:00
}
func (d *DbRestore) walk(rc *req.Ctx, fn func(ctx context.Context, restoreId uint64) error) error {
2024-02-25 12:46:18 +08:00
idsStr := rc.PathParam("restoreId")
2023-12-27 22:59:20 +08:00
biz.NotEmpty(idsStr, "restoreId 为空")
rc.ReqParam = idsStr
ids := strings.Fields(idsStr)
for _, v := range ids {
value, err := strconv.Atoi(v)
if err != nil {
return err
}
restoreId := uint64(value)
err = fn(rc.MetaCtx, restoreId)
2023-12-27 22:59:20 +08:00
if err != nil {
return err
}
}
return nil
}
// Delete 删除数据库恢复任务
// @router /api/dbs/:dbId/restores/:restoreId [DELETE]
2023-12-27 22:59:20 +08:00
func (d *DbRestore) Delete(rc *req.Ctx) {
2024-01-23 16:29:41 +08:00
err := d.walk(rc, d.restoreApp.Delete)
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "删除数据库恢复任务失败: %v")
}
// Enable 启用数据库恢复任务
// @router /api/dbs/:dbId/restores/:restoreId/enable [PUT]
2023-12-27 22:59:20 +08:00
func (d *DbRestore) Enable(rc *req.Ctx) {
2024-01-23 16:29:41 +08:00
err := d.walk(rc, d.restoreApp.Enable)
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "启用数据库恢复任务失败: %v")
}
// Disable 禁用数据库恢复任务
// @router /api/dbs/:dbId/restores/:restoreId/disable [PUT]
2023-12-27 22:59:20 +08:00
func (d *DbRestore) Disable(rc *req.Ctx) {
2024-01-23 16:29:41 +08:00
err := d.walk(rc, d.restoreApp.Disable)
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "禁用数据库恢复任务失败: %v")
}
// GetDbNamesWithoutRestore 获取未配置定时恢复的数据库名称
// @router /api/dbs/:dbId/db-names-without-backup [GET]
func (d *DbRestore) GetDbNamesWithoutRestore(rc *req.Ctx) {
2024-02-25 12:46:18 +08:00
dbId := uint64(rc.PathParamInt("dbId"))
2024-01-23 16:29:41 +08:00
db, err := d.dbApp.GetById(new(entity.Db), dbId, "instance_id", "database")
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "获取数据库信息失败: %v")
dbNames := strings.Fields(db.Database)
2024-01-23 16:29:41 +08:00
dbNamesWithoutRestore, err := d.restoreApp.GetDbNamesWithoutRestore(db.InstanceId, dbNames)
2023-12-27 22:59:20 +08:00
biz.ErrIsNilAppendErr(err, "获取未配置定时备份的数据库名称失败: %v")
rc.ResData = dbNamesWithoutRestore
}
// GetHistoryPageList 获取数据库备份历史
// @router /api/dbs/:dbId/restores/:restoreId/histories [GET]
func (d *DbRestore) GetHistoryPageList(rc *req.Ctx) {
queryCond := &entity.DbRestoreHistoryQuery{
2024-02-25 12:46:18 +08:00
DbRestoreId: uint64(rc.PathParamInt("restoreId")),
}
2024-02-25 12:46:18 +08:00
res, err := d.restoreApp.GetHistoryPageList(queryCond, rc.GetPageParam(), new([]vo.DbRestoreHistory))
biz.ErrIsNilAppendErr(err, "获取数据库备份历史失败: %v")
rc.ResData = res
}