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

129 lines
4.3 KiB
Go
Raw Normal View History

2023-08-27 11:07:29 +08:00
package api
import (
"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/ginx"
"mayfly-go/pkg/req"
"mayfly-go/pkg/utils/cryptox"
"strconv"
"strings"
2023-09-05 12:49:12 +08:00
"github.com/gin-gonic/gin"
2023-08-27 11:07:29 +08:00
)
type Instance struct {
InstanceApp application.Instance
DbApp application.Db
2023-08-27 11:07:29 +08:00
}
// Instances 获取数据库实例信息
2023-08-27 11:07:29 +08:00
// @router /api/instances [get]
func (d *Instance) Instances(rc *req.Ctx) {
queryCond, page := ginx.BindQueryAndPage[*entity.InstanceQuery](rc.GinCtx, new(entity.InstanceQuery))
2023-10-31 12:36:04 +08:00
res, err := d.InstanceApp.GetPageList(queryCond, page, new([]vo.InstanceListVO))
biz.ErrIsNil(err)
rc.ResData = res
2023-08-27 11:07:29 +08:00
}
func (d *Instance) TestConn(rc *req.Ctx) {
form := &form.InstanceForm{}
instance := ginx.BindJsonAndCopyTo[*entity.DbInstance](rc.GinCtx, form, new(entity.DbInstance))
// 密码解密,并使用解密后的赋值
originPwd, err := cryptox.DefaultRsaDecrypt(form.Password, true)
biz.ErrIsNilAppendErr(err, "解密密码错误: %s")
instance.Password = originPwd
biz.ErrIsNil(d.InstanceApp.TestConn(instance))
}
// SaveInstance 保存数据库实例信息
// @router /api/instances [post]
2023-08-27 11:07:29 +08:00
func (d *Instance) SaveInstance(rc *req.Ctx) {
form := &form.InstanceForm{}
instance := ginx.BindJsonAndCopyTo[*entity.DbInstance](rc.GinCtx, form, new(entity.DbInstance))
2023-08-27 11:07:29 +08:00
// 密码解密,并使用解密后的赋值
originPwd, err := cryptox.DefaultRsaDecrypt(form.Password, true)
biz.ErrIsNilAppendErr(err, "解密密码错误: %s")
instance.Password = originPwd
// 密码脱敏记录日志
form.Password = "****"
rc.ReqParam = form
biz.ErrIsNil(d.InstanceApp.Save(rc.MetaCtx, instance))
2023-08-27 11:07:29 +08:00
}
// GetInstance 获取数据库实例密码,由于数据库是加密存储,故提供该接口展示原文密码
// @router /api/instances/:instance [GET]
func (d *Instance) GetInstance(rc *req.Ctx) {
dbId := getInstanceId(rc.GinCtx)
dbEntity, err := d.InstanceApp.GetById(new(entity.DbInstance), dbId)
biz.ErrIsNil(err, "获取数据库实例错误")
dbEntity.Password = ""
rc.ResData = dbEntity
}
// GetInstancePwd 获取数据库实例密码,由于数据库是加密存储,故提供该接口展示原文密码
// @router /api/instances/:instance/pwd [GET]
2023-08-27 11:07:29 +08:00
func (d *Instance) GetInstancePwd(rc *req.Ctx) {
instanceId := getInstanceId(rc.GinCtx)
instanceEntity, err := d.InstanceApp.GetById(new(entity.DbInstance), instanceId, "Password")
biz.ErrIsNil(err, "获取数据库实例错误")
biz.ErrIsNil(instanceEntity.PwdDecrypt())
rc.ResData = instanceEntity.Password
2023-08-27 11:07:29 +08:00
}
// DeleteInstance 删除数据库实例信息
// @router /api/instances/:instance [DELETE]
2023-08-27 11:07:29 +08:00
func (d *Instance) DeleteInstance(rc *req.Ctx) {
idsStr := ginx.PathParam(rc.GinCtx, "instanceId")
2023-08-27 11:07:29 +08:00
rc.ReqParam = idsStr
ids := strings.Split(idsStr, ",")
for _, v := range ids {
value, err := strconv.Atoi(v)
biz.ErrIsNilAppendErr(err, "string类型转换为int异常: %s")
instanceId := uint64(value)
2023-12-27 22:59:20 +08:00
if d.DbApp.Count(&entity.DbQuery{InstanceId: instanceId}) != 0 {
instance, err := d.InstanceApp.GetById(new(entity.DbInstance), instanceId, "name")
biz.ErrIsNil(err, "获取数据库实例错误数据库实例ID为: %d", instance.Id)
biz.IsTrue(false, "不能删除数据库实例【%s】请先删除其关联的数据库资源。", instance.Name)
}
// todo check if backup task has been disabled and backup histories have been deleted
d.InstanceApp.Delete(rc.MetaCtx, instanceId)
2023-08-27 11:07:29 +08:00
}
}
// 获取数据库实例的所有数据库名
func (d *Instance) GetDatabaseNames(rc *req.Ctx) {
instanceId := getInstanceId(rc.GinCtx)
instance, err := d.InstanceApp.GetById(new(entity.DbInstance), instanceId, "Password")
biz.ErrIsNil(err, "获取数据库实例错误")
biz.ErrIsNil(instance.PwdDecrypt())
res, err := d.InstanceApp.GetDatabases(instance)
biz.ErrIsNil(err)
rc.ResData = res
2023-08-27 11:07:29 +08:00
}
2023-09-05 14:41:12 +08:00
2023-12-20 17:29:16 +08:00
// 获取数据库实例server信息
func (d *Instance) GetDbServer(rc *req.Ctx) {
instanceId := getInstanceId(rc.GinCtx)
conn, err := d.DbApp.GetDbConnByInstanceId(instanceId)
biz.ErrIsNil(err)
res, err := conn.GetDialect().GetDbServer()
biz.ErrIsNil(err)
rc.ResData = res
}
2023-09-05 14:41:12 +08:00
func getInstanceId(g *gin.Context) uint64 {
instanceId, _ := strconv.Atoi(g.Param("instanceId"))
biz.IsTrue(instanceId > 0, "instanceId 错误")
return uint64(instanceId)
}