2023-08-27 11:07:29 +08:00
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
2024-04-12 13:24:20 +08:00
|
|
|
"mayfly-go/internal/common/consts"
|
2023-08-27 11:07:29 +08:00
|
|
|
"mayfly-go/internal/db/api/form"
|
|
|
|
|
"mayfly-go/internal/db/api/vo"
|
|
|
|
|
"mayfly-go/internal/db/application"
|
2024-05-09 21:29:34 +08:00
|
|
|
"mayfly-go/internal/db/application/dto"
|
2023-08-27 11:07:29 +08:00
|
|
|
"mayfly-go/internal/db/domain/entity"
|
2024-04-12 13:24:20 +08:00
|
|
|
|
|
|
|
|
tagapp "mayfly-go/internal/tag/application"
|
|
|
|
|
tagentity "mayfly-go/internal/tag/domain/entity"
|
2023-08-27 11:07:29 +08:00
|
|
|
"mayfly-go/pkg/biz"
|
2024-04-17 21:28:28 +08:00
|
|
|
"mayfly-go/pkg/model"
|
2023-08-27 11:07:29 +08:00
|
|
|
"mayfly-go/pkg/req"
|
2024-04-12 13:24:20 +08:00
|
|
|
"mayfly-go/pkg/utils/collx"
|
2023-08-27 11:07:29 +08:00
|
|
|
"strings"
|
2024-11-20 22:43:53 +08:00
|
|
|
|
|
|
|
|
"github.com/may-fly/cast"
|
2023-08-27 11:07:29 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Instance struct {
|
2024-04-12 13:24:20 +08:00
|
|
|
InstanceApp application.Instance `inject:"DbInstanceApp"`
|
|
|
|
|
DbApp application.Db `inject:""`
|
|
|
|
|
ResourceAuthCertApp tagapp.ResourceAuthCert `inject:""`
|
2024-04-17 21:28:28 +08:00
|
|
|
TagApp tagapp.TagTree `inject:"TagTreeApp"`
|
2023-08-27 11:07:29 +08:00
|
|
|
}
|
|
|
|
|
|
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) {
|
2024-02-24 16:30:29 +08:00
|
|
|
queryCond, page := req.BindQueryAndPage[*entity.InstanceQuery](rc, new(entity.InstanceQuery))
|
2024-04-12 13:24:20 +08:00
|
|
|
|
2024-04-17 21:28:28 +08:00
|
|
|
tagCodePaths := d.TagApp.GetAccountTagCodePaths(rc.GetLoginAccount().Id, tagentity.TagTypeDbAuthCert, queryCond.TagPath)
|
|
|
|
|
// 不存在可操作的数据库,即没有可操作数据
|
|
|
|
|
if len(tagCodePaths) == 0 {
|
|
|
|
|
rc.ResData = model.EmptyPageResult[any]()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbInstCodes := tagentity.GetCodeByPath(tagentity.TagTypeDb, tagCodePaths...)
|
|
|
|
|
queryCond.Codes = dbInstCodes
|
|
|
|
|
|
2024-04-12 13:24:20 +08:00
|
|
|
var instvos []*vo.InstanceListVO
|
|
|
|
|
res, err := d.InstanceApp.GetPageList(queryCond, page, &instvos)
|
2023-10-26 17:15:49 +08:00
|
|
|
biz.ErrIsNil(err)
|
2024-04-12 13:24:20 +08:00
|
|
|
|
|
|
|
|
// 填充授权凭证信息
|
2024-04-17 21:28:28 +08:00
|
|
|
d.ResourceAuthCertApp.FillAuthCertByAcNames(tagentity.GetCodeByPath(tagentity.TagTypeDbAuthCert, tagCodePaths...), collx.ArrayMap(instvos, func(vos *vo.InstanceListVO) tagentity.IAuthCert {
|
2024-04-12 13:24:20 +08:00
|
|
|
return vos
|
|
|
|
|
})...)
|
|
|
|
|
|
2024-04-17 21:28:28 +08:00
|
|
|
// 填充标签信息
|
|
|
|
|
d.TagApp.FillTagInfo(tagentity.TagType(consts.ResourceTypeDb), collx.ArrayMap(instvos, func(insvo *vo.InstanceListVO) tagentity.ITagResource {
|
|
|
|
|
return insvo
|
|
|
|
|
})...)
|
|
|
|
|
|
2023-10-26 17:15:49 +08:00
|
|
|
rc.ResData = res
|
2023-08-27 11:07:29 +08:00
|
|
|
}
|
|
|
|
|
|
2023-11-12 20:14:44 +08:00
|
|
|
func (d *Instance) TestConn(rc *req.Ctx) {
|
|
|
|
|
form := &form.InstanceForm{}
|
2024-02-24 16:30:29 +08:00
|
|
|
instance := req.BindJsonAndCopyTo[*entity.DbInstance](rc, form, new(entity.DbInstance))
|
2023-11-12 20:14:44 +08:00
|
|
|
|
2024-04-12 13:24:20 +08:00
|
|
|
biz.ErrIsNil(d.InstanceApp.TestConn(instance, form.AuthCerts[0]))
|
2023-11-12 20:14:44 +08:00
|
|
|
}
|
|
|
|
|
|
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{}
|
2024-02-24 16:30:29 +08:00
|
|
|
instance := req.BindJsonAndCopyTo[*entity.DbInstance](rc, form, new(entity.DbInstance))
|
2023-08-27 11:07:29 +08:00
|
|
|
|
|
|
|
|
rc.ReqParam = form
|
2024-05-09 21:29:34 +08:00
|
|
|
id, err := d.InstanceApp.SaveDbInstance(rc.MetaCtx, &dto.SaveDbInstance{
|
2024-04-17 21:28:28 +08:00
|
|
|
DbInstance: instance,
|
|
|
|
|
AuthCerts: form.AuthCerts,
|
|
|
|
|
TagCodePaths: form.TagCodePaths,
|
|
|
|
|
})
|
|
|
|
|
biz.ErrIsNil(err)
|
|
|
|
|
rc.ResData = id
|
2023-08-27 11:07:29 +08:00
|
|
|
}
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
// GetInstance 获取数据库实例密码,由于数据库是加密存储,故提供该接口展示原文密码
|
|
|
|
|
// @router /api/instances/:instance [GET]
|
|
|
|
|
func (d *Instance) GetInstance(rc *req.Ctx) {
|
2024-02-24 16:30:29 +08:00
|
|
|
dbId := getInstanceId(rc)
|
2024-05-05 14:53:30 +08:00
|
|
|
dbEntity, err := d.InstanceApp.GetById(dbId)
|
2024-11-20 22:43:53 +08:00
|
|
|
biz.ErrIsNilAppendErr(err, "get db instance failed: %s")
|
2023-08-30 22:41:42 +08:00
|
|
|
rc.ResData = dbEntity
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DeleteInstance 删除数据库实例信息
|
|
|
|
|
// @router /api/instances/:instance [DELETE]
|
2023-08-27 11:07:29 +08:00
|
|
|
func (d *Instance) DeleteInstance(rc *req.Ctx) {
|
2024-02-25 12:46:18 +08:00
|
|
|
idsStr := rc.PathParam("instanceId")
|
2023-08-27 11:07:29 +08:00
|
|
|
rc.ReqParam = idsStr
|
|
|
|
|
ids := strings.Split(idsStr, ",")
|
|
|
|
|
|
|
|
|
|
for _, v := range ids {
|
2024-11-20 22:43:53 +08:00
|
|
|
biz.ErrIsNilAppendErr(d.InstanceApp.Delete(rc.MetaCtx, cast.ToUint64(v)), "delete db instance failed: %s")
|
2023-08-27 11:07:29 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-30 22:41:42 +08:00
|
|
|
// 获取数据库实例的所有数据库名
|
|
|
|
|
func (d *Instance) GetDatabaseNames(rc *req.Ctx) {
|
2024-04-17 21:28:28 +08:00
|
|
|
form := &form.InstanceDbNamesForm{}
|
|
|
|
|
instance := req.BindJsonAndCopyTo[*entity.DbInstance](rc, form, new(entity.DbInstance))
|
|
|
|
|
res, err := d.InstanceApp.GetDatabases(instance, form.AuthCert)
|
2023-10-26 17:15:49 +08:00
|
|
|
biz.ErrIsNil(err)
|
|
|
|
|
rc.ResData = res
|
2023-08-27 11:07:29 +08:00
|
|
|
}
|
2023-09-05 14:41:12 +08:00
|
|
|
|
2024-05-16 17:26:32 +08:00
|
|
|
func (d *Instance) GetDatabaseNamesByAc(rc *req.Ctx) {
|
|
|
|
|
res, err := d.InstanceApp.GetDatabasesByAc(rc.PathParam("ac"))
|
|
|
|
|
biz.ErrIsNil(err)
|
|
|
|
|
rc.ResData = res
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-20 17:29:16 +08:00
|
|
|
// 获取数据库实例server信息
|
|
|
|
|
func (d *Instance) GetDbServer(rc *req.Ctx) {
|
2024-02-24 16:30:29 +08:00
|
|
|
instanceId := getInstanceId(rc)
|
2023-12-20 17:29:16 +08:00
|
|
|
conn, err := d.DbApp.GetDbConnByInstanceId(instanceId)
|
|
|
|
|
biz.ErrIsNil(err)
|
2024-11-01 17:27:22 +08:00
|
|
|
res, err := conn.GetMetadata().GetDbServer()
|
2023-12-20 17:29:16 +08:00
|
|
|
biz.ErrIsNil(err)
|
|
|
|
|
rc.ResData = res
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-24 16:30:29 +08:00
|
|
|
func getInstanceId(rc *req.Ctx) uint64 {
|
2024-02-25 12:46:18 +08:00
|
|
|
instanceId := rc.PathParamInt("instanceId")
|
2024-11-20 22:43:53 +08:00
|
|
|
biz.IsTrue(instanceId > 0, "instanceId error")
|
2023-09-05 14:41:12 +08:00
|
|
|
return uint64(instanceId)
|
|
|
|
|
}
|