mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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/application/dto"
 | 
						|
	"mayfly-go/internal/db/domain/entity"
 | 
						|
	"mayfly-go/internal/db/imsg"
 | 
						|
	fileapp "mayfly-go/internal/file/application"
 | 
						|
	tagapp "mayfly-go/internal/tag/application"
 | 
						|
	"mayfly-go/pkg/biz"
 | 
						|
	"mayfly-go/pkg/model"
 | 
						|
	"mayfly-go/pkg/req"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/spf13/cast"
 | 
						|
)
 | 
						|
 | 
						|
type DbTransferTask struct {
 | 
						|
	dbTransferTaskApp application.DbTransferTask `inject:"T"`
 | 
						|
	dbTransferFileApp application.DbTransferFile `inject:"T"`
 | 
						|
	dbApp             application.Db             `inject:"T"`
 | 
						|
	tagApp            tagapp.TagTree             `inject:"T"`
 | 
						|
	dbSqlExecApp      application.DbSqlExec      `inject:"T"`
 | 
						|
	fileApp           fileapp.File               `inject:"T"`
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) ReqConfs() *req.Confs {
 | 
						|
	reqs := [...]*req.Conf{
 | 
						|
		// 获取任务列表
 | 
						|
		req.NewGet("", d.Tasks),
 | 
						|
 | 
						|
		// 保存任务
 | 
						|
		req.NewPost("save", d.SaveTask).Log(req.NewLogSaveI(imsg.LogDtsSave)).RequiredPermissionCode("db:transfer:save"),
 | 
						|
 | 
						|
		// 删除任务
 | 
						|
		req.NewDelete(":taskId/del", d.DeleteTask).Log(req.NewLogSaveI(imsg.LogDtsDelete)).RequiredPermissionCode("db:transfer:del"),
 | 
						|
 | 
						|
		// 启停用任务
 | 
						|
		req.NewPost(":taskId/status", d.ChangeStatus).Log(req.NewLogSaveI(imsg.LogDtsChangeStatus)).RequiredPermissionCode("db:transfer:status"),
 | 
						|
 | 
						|
		// 立即执行任务
 | 
						|
		req.NewPost(":taskId/run", d.Run).Log(req.NewLogI(imsg.LogDtsRun)).RequiredPermissionCode("db:transfer:run"),
 | 
						|
 | 
						|
		// 停止正在执行中的任务
 | 
						|
		req.NewPost(":taskId/stop", d.Stop).Log(req.NewLogSaveI(imsg.LogDtsStop)).RequiredPermissionCode("db:transfer:run"),
 | 
						|
 | 
						|
		// 导出文件管理-列表
 | 
						|
		req.NewGet("/files/:taskId", d.Files),
 | 
						|
 | 
						|
		// 导出文件管理-删除
 | 
						|
		req.NewPost("/files/del/:fileId", d.FileDel).Log(req.NewLogSaveI(imsg.LogDtsDeleteFile)).RequiredPermissionCode("db:transfer:files:del"),
 | 
						|
 | 
						|
		req.NewPost("/files/run", d.FileRun).Log(req.NewLogSaveI(imsg.LogDtsRunSqlFile)).RequiredPermissionCode("db:transfer:files:run"),
 | 
						|
	}
 | 
						|
 | 
						|
	return req.NewConfs("/dbTransfer", reqs[:]...)
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) Tasks(rc *req.Ctx) {
 | 
						|
	queryCond := req.BindQuery[*entity.DbTransferTaskQuery](rc)
 | 
						|
 | 
						|
	res, err := d.dbTransferTaskApp.GetPageList(queryCond)
 | 
						|
	biz.ErrIsNil(err)
 | 
						|
	resVo := model.PageResultConv[*entity.DbTransferTask, *vo.DbTransferTaskListVO](res)
 | 
						|
 | 
						|
	for _, item := range resVo.List {
 | 
						|
		item.RunningState = entity.DbTransferTaskRunStateSuccess
 | 
						|
		if d.dbTransferTaskApp.IsRunning(item.Id) {
 | 
						|
			item.RunningState = entity.DbTransferTaskRunStateRunning
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	rc.ResData = resVo
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) SaveTask(rc *req.Ctx) {
 | 
						|
	reqForm, task := req.BindJsonAndCopyTo[*form.DbTransferTaskForm, *entity.DbTransferTask](rc)
 | 
						|
 | 
						|
	rc.ReqParam = reqForm
 | 
						|
	biz.ErrIsNil(d.dbTransferTaskApp.Save(rc.MetaCtx, task))
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) DeleteTask(rc *req.Ctx) {
 | 
						|
	taskId := rc.PathParam("taskId")
 | 
						|
	rc.ReqParam = taskId
 | 
						|
 | 
						|
	for _, id := range strings.Split(taskId, ",") {
 | 
						|
		biz.ErrIsNil(d.dbTransferTaskApp.Delete(rc.MetaCtx, cast.ToUint64(id)))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) ChangeStatus(rc *req.Ctx) {
 | 
						|
	form := req.BindJson[*form.DbTransferTaskStatusForm](rc)
 | 
						|
	rc.ReqParam = form
 | 
						|
 | 
						|
	task, err := d.dbTransferTaskApp.GetById(form.Id)
 | 
						|
	biz.ErrIsNil(err)
 | 
						|
	task.Status = form.Status
 | 
						|
	biz.ErrIsNil(d.dbTransferTaskApp.Save(rc.MetaCtx, task))
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) Run(rc *req.Ctx) {
 | 
						|
	taskId := uint64(rc.PathParamInt("taskId"))
 | 
						|
	rc.ReqParam = taskId
 | 
						|
 | 
						|
	logId, err := d.dbTransferTaskApp.Run(rc.MetaCtx, taskId)
 | 
						|
	biz.ErrIsNil(err)
 | 
						|
	rc.ResData = logId
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) Stop(rc *req.Ctx) {
 | 
						|
	biz.ErrIsNil(d.dbTransferTaskApp.Stop(rc.MetaCtx, uint64(rc.PathParamInt("taskId"))))
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) Files(rc *req.Ctx) {
 | 
						|
	queryCond := req.BindQuery[*entity.DbTransferFileQuery](rc)
 | 
						|
 | 
						|
	res, err := d.dbTransferFileApp.GetPageList(queryCond)
 | 
						|
	biz.ErrIsNil(err)
 | 
						|
	rc.ResData = res
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) FileDel(rc *req.Ctx) {
 | 
						|
	fileId := rc.PathParam("fileId")
 | 
						|
	rc.ReqParam = fileId // 记录操作日志
 | 
						|
	ids := strings.Split(fileId, ",")
 | 
						|
 | 
						|
	uIds := make([]uint64, len(ids))
 | 
						|
	for _, v := range ids {
 | 
						|
		uIds = append(uIds, cast.ToUint64(v))
 | 
						|
	}
 | 
						|
	biz.ErrIsNil(d.dbTransferFileApp.Delete(rc.MetaCtx, uIds...))
 | 
						|
}
 | 
						|
 | 
						|
func (d *DbTransferTask) FileRun(rc *req.Ctx) {
 | 
						|
	fm := req.BindJson[*form.DbTransferFileRunForm](rc)
 | 
						|
 | 
						|
	rc.ReqParam = fm
 | 
						|
 | 
						|
	tFile, err := d.dbTransferFileApp.GetById(fm.Id)
 | 
						|
	biz.IsTrue(tFile != nil && err == nil, "file not found")
 | 
						|
 | 
						|
	targetDbConn, err := d.dbApp.GetDbConn(rc.MetaCtx, fm.TargetDbId, fm.TargetDbName)
 | 
						|
	biz.ErrIsNilAppendErr(err, "failed to connect to the target database: %s")
 | 
						|
 | 
						|
	biz.ErrIsNilAppendErr(d.tagApp.CanAccess(rc.GetLoginAccount().Id, targetDbConn.Info.CodePath...), "%s")
 | 
						|
 | 
						|
	filename, reader, err := d.fileApp.GetReader(context.TODO(), tFile.FileKey)
 | 
						|
	biz.ErrIsNil(err)
 | 
						|
	go func() {
 | 
						|
		biz.ErrIsNil(d.dbSqlExecApp.ExecReader(rc.MetaCtx, &dto.SqlReaderExec{
 | 
						|
			Reader:   reader,
 | 
						|
			Filename: filename,
 | 
						|
			DbConn:   targetDbConn,
 | 
						|
			ClientId: fm.ClientId,
 | 
						|
		}))
 | 
						|
	}()
 | 
						|
}
 |