2023-08-27 11:07:29 +08:00
|
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
"mayfly-go/internal/db/api/form"
|
|
|
|
|
|
"mayfly-go/internal/db/api/vo"
|
|
|
|
|
|
"mayfly-go/internal/db/application"
|
|
|
|
|
|
"mayfly-go/internal/db/domain/entity"
|
|
|
|
|
|
msgapp "mayfly-go/internal/msg/application"
|
|
|
|
|
|
"mayfly-go/pkg/biz"
|
|
|
|
|
|
"mayfly-go/pkg/ginx"
|
|
|
|
|
|
"mayfly-go/pkg/req"
|
|
|
|
|
|
"mayfly-go/pkg/utils/cryptox"
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type Instance struct {
|
|
|
|
|
|
InstanceApp application.Instance
|
2023-08-30 22:41:42 +08:00
|
|
|
|
DbApp application.Db
|
2023-08-27 11:07:29 +08:00
|
|
|
|
MsgApp msgapp.Msg
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-30 22:41:42 +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))
|
|
|
|
|
|
rc.ResData = d.InstanceApp.GetPageList(queryCond, page, new([]vo.SelectDataInstanceVO))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
|
// 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.Instance](rc.GinCtx, form, new(entity.Instance))
|
|
|
|
|
|
|
|
|
|
|
|
// 密码解密,并使用解密后的赋值
|
|
|
|
|
|
originPwd, err := cryptox.DefaultRsaDecrypt(form.Password, true)
|
|
|
|
|
|
biz.ErrIsNilAppendErr(err, "解密密码错误: %s")
|
|
|
|
|
|
instance.Password = originPwd
|
|
|
|
|
|
|
|
|
|
|
|
// 密码脱敏记录日志
|
|
|
|
|
|
form.Password = "****"
|
|
|
|
|
|
rc.ReqParam = form
|
|
|
|
|
|
|
|
|
|
|
|
instance.SetBaseInfo(rc.LoginAccount)
|
|
|
|
|
|
d.InstanceApp.Save(instance)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
|
// GetInstance 获取数据库实例密码,由于数据库是加密存储,故提供该接口展示原文密码
|
|
|
|
|
|
// @router /api/instances/:instance [GET]
|
|
|
|
|
|
func (d *Instance) GetInstance(rc *req.Ctx) {
|
|
|
|
|
|
dbId := getInstanceId(rc.GinCtx)
|
|
|
|
|
|
dbEntity := d.InstanceApp.GetById(dbId)
|
|
|
|
|
|
biz.IsTrue(dbEntity != nil, "获取数据库实例错误")
|
|
|
|
|
|
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) {
|
2023-08-30 22:41:42 +08:00
|
|
|
|
instanceId := getInstanceId(rc.GinCtx)
|
|
|
|
|
|
instanceEntity := d.InstanceApp.GetById(instanceId, "Password")
|
|
|
|
|
|
biz.IsTrue(instanceEntity != nil, "获取数据库实例错误")
|
|
|
|
|
|
instanceEntity.PwdDecrypt()
|
|
|
|
|
|
rc.ResData = instanceEntity.Password
|
2023-08-27 11:07:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
|
// DeleteInstance 删除数据库实例信息
|
|
|
|
|
|
// @router /api/instances/:instance [DELETE]
|
2023-08-27 11:07:29 +08:00
|
|
|
|
func (d *Instance) DeleteInstance(rc *req.Ctx) {
|
2023-08-30 22:41:42 +08:00
|
|
|
|
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")
|
2023-08-30 22:41:42 +08:00
|
|
|
|
instanceId := uint64(value)
|
|
|
|
|
|
if d.DbApp.Count(&entity.DbQuery{InstanceId: instanceId}) != 0 {
|
|
|
|
|
|
instance := d.InstanceApp.GetById(instanceId, "name")
|
|
|
|
|
|
biz.NotNil(instance, "获取数据库实例错误,数据库实例ID为:%d", instance.Id)
|
|
|
|
|
|
biz.IsTrue(false, "不能删除数据库实例【%s】,请先删除其关联的数据库资源。", instance.Name)
|
|
|
|
|
|
}
|
|
|
|
|
|
d.InstanceApp.Delete(instanceId)
|
2023-08-27 11:07:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
|
func getInstanceId(g *gin.Context) uint64 {
|
|
|
|
|
|
instanceId, _ := strconv.Atoi(g.Param("instanceId"))
|
|
|
|
|
|
biz.IsTrue(instanceId > 0, "instanceId 错误")
|
|
|
|
|
|
return uint64(instanceId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取数据库实例的所有数据库名
|
|
|
|
|
|
func (d *Instance) GetDatabaseNames(rc *req.Ctx) {
|
|
|
|
|
|
instanceId := getInstanceId(rc.GinCtx)
|
|
|
|
|
|
instance := d.InstanceApp.GetById(instanceId, "Password")
|
|
|
|
|
|
biz.IsTrue(instance != nil, "获取数据库实例错误")
|
|
|
|
|
|
instance.PwdDecrypt()
|
|
|
|
|
|
rc.ResData = d.InstanceApp.GetDatabases(instance)
|
2023-08-27 11:07:29 +08:00
|
|
|
|
}
|