Files
mayfly-go/server/internal/mongo/application/mongo.go
2024-04-28 23:45:57 +08:00

143 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package application
import (
"context"
"mayfly-go/internal/common/consts"
"mayfly-go/internal/mongo/domain/entity"
"mayfly-go/internal/mongo/domain/repository"
"mayfly-go/internal/mongo/mgm"
tagapp "mayfly-go/internal/tag/application"
tagentity "mayfly-go/internal/tag/domain/entity"
"mayfly-go/pkg/base"
"mayfly-go/pkg/errorx"
"mayfly-go/pkg/model"
)
type Mongo interface {
base.App[*entity.Mongo]
// 分页获取机器脚本信息列表
GetPageList(condition *entity.MongoQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error)
TestConn(entity *entity.Mongo) error
SaveMongo(ctx context.Context, entity *entity.Mongo, tagCodePaths ...string) error
// 删除数据库信息
Delete(ctx context.Context, id uint64) error
// 获取mongo连接实例
// @param id mongo id
GetMongoConn(id uint64) (*mgm.MongoConn, error)
}
type mongoAppImpl struct {
base.AppImpl[*entity.Mongo, repository.Mongo]
tagApp tagapp.TagTree `inject:"TagTreeApp"`
}
// 注入MongoRepo
func (d *mongoAppImpl) InjectMongoRepo(repo repository.Mongo) {
d.Repo = repo
}
// 分页获取数据库信息列表
func (d *mongoAppImpl) GetPageList(condition *entity.MongoQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) {
return d.GetRepo().GetList(condition, pageParam, toEntity, orderBy...)
}
func (d *mongoAppImpl) Delete(ctx context.Context, id uint64) error {
mongoEntity, err := d.GetById(new(entity.Mongo), id)
if err != nil {
return errorx.NewBiz("mongo信息不存在")
}
mgm.CloseConn(id)
return d.Tx(ctx,
func(ctx context.Context) error {
return d.DeleteById(ctx, id)
},
func(ctx context.Context) error {
return d.tagApp.SaveResourceTag(ctx, &tagapp.SaveResourceTagParam{ResourceTag: &tagapp.ResourceTag{
Type: tagentity.TagTypeMongo,
Code: mongoEntity.Code,
}})
})
}
func (d *mongoAppImpl) TestConn(me *entity.Mongo) error {
conn, err := me.ToMongoInfo().Conn()
if err != nil {
return err
}
conn.Close()
return nil
}
func (d *mongoAppImpl) SaveMongo(ctx context.Context, m *entity.Mongo, tagCodePaths ...string) error {
oldMongo := &entity.Mongo{Name: m.Name, SshTunnelMachineId: m.SshTunnelMachineId}
err := d.GetByCond(oldMongo)
if m.Id == 0 {
if err == nil {
return errorx.NewBiz("该名称已存在")
}
if d.CountByCond(&entity.Mongo{Code: m.Code}) > 0 {
return errorx.NewBiz("该编码已存在")
}
return d.Tx(ctx, func(ctx context.Context) error {
return d.Insert(ctx, m)
}, func(ctx context.Context) error {
return d.tagApp.SaveResourceTag(ctx, &tagapp.SaveResourceTagParam{
ResourceTag: &tagapp.ResourceTag{
Type: tagentity.TagTypeMongo,
Code: m.Code,
},
ParentTagCodePaths: tagCodePaths,
})
})
}
// 如果存在该库,则校验修改的库是否为该库
if err == nil && oldMongo.Id != m.Id {
return errorx.NewBiz("该名称已存在")
}
// 如果调整了ssh等会查不到旧数据故需要根据id获取旧信息将code赋值给标签进行关联
if oldMongo.Code == "" {
oldMongo, _ = d.GetById(new(entity.Mongo), m.Id)
}
// 先关闭连接
mgm.CloseConn(m.Id)
m.Code = ""
return d.Tx(ctx, func(ctx context.Context) error {
return d.UpdateById(ctx, m)
}, func(ctx context.Context) error {
if oldMongo.Name != m.Name {
if err := d.tagApp.UpdateTagName(ctx, tagentity.TagTypeMachine, oldMongo.Code, m.Name); err != nil {
return err
}
}
return d.tagApp.SaveResourceTag(ctx, &tagapp.SaveResourceTagParam{
ResourceTag: &tagapp.ResourceTag{
Type: tagentity.TagTypeMongo,
Code: oldMongo.Code,
},
ParentTagCodePaths: tagCodePaths,
})
})
}
func (d *mongoAppImpl) GetMongoConn(id uint64) (*mgm.MongoConn, error) {
return mgm.GetMongoConn(id, func() (*mgm.MongoInfo, error) {
me, err := d.GetById(new(entity.Mongo), id)
if err != nil {
return nil, errorx.NewBiz("mongo信息不存在")
}
return me.ToMongoInfo(d.tagApp.ListTagPathByTypeAndCode(consts.ResourceTypeMongo, me.Code)...), nil
})
}