143 lines
5.5 KiB
Go
143 lines
5.5 KiB
Go
package knowledge_base_service
|
|
|
|
import (
|
|
"github.com/XingfenD/yoresee_doc/internal/dto"
|
|
"github.com/XingfenD/yoresee_doc/internal/model"
|
|
internal_dto "github.com/XingfenD/yoresee_doc/internal/service/dto"
|
|
"github.com/XingfenD/yoresee_doc/internal/status"
|
|
"github.com/bytedance/gg/gslice"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type knowledgeBaseListOperation struct {
|
|
req *internal_dto.KnowledgeBaseListReq
|
|
srvc *KnowledgeBaseService
|
|
|
|
withDocumentExtend bool
|
|
withUserExtend bool
|
|
}
|
|
|
|
func (s *KnowledgeBaseService) list(req *internal_dto.KnowledgeBaseListReq) *knowledgeBaseListOperation {
|
|
return &knowledgeBaseListOperation{
|
|
req: req,
|
|
srvc: s,
|
|
}
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) WithDocumentExtend() *knowledgeBaseListOperation {
|
|
op.withDocumentExtend = true
|
|
return op
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) WithUserExtend() *knowledgeBaseListOperation {
|
|
op.withUserExtend = true
|
|
return op
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) documentExtend(kbModels []*model.KnowledgeBase, kbExtendMapByID map[int64]*dto.KnowledgeBaseExtend) error {
|
|
if op.withDocumentExtend {
|
|
kbIDs := gslice.Map(kbModels, func(kbModel *model.KnowledgeBase) int64 {
|
|
return kbModel.ID
|
|
})
|
|
countMapByKbID, err := op.srvc.knowledgeBaseRepo.MGetKnowledgeBaseDocumentsCount(kbIDs).Exec()
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: MGetKnowledgeBaseDocumentsCount failed, err: %+v", err)
|
|
return status.GenErrWithCustomMsg(status.StatusReadDBError, "query knowledge base document count failed")
|
|
}
|
|
for id, count := range countMapByKbID {
|
|
if _, ok := kbExtendMapByID[id]; !ok {
|
|
kbExtendMapByID[id] = &dto.KnowledgeBaseExtend{}
|
|
}
|
|
kbExtendMapByID[id].DocumentsCount = count
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) userExtend(kbModels []*model.KnowledgeBase, kbExtendMapByID map[int64]*dto.KnowledgeBaseExtend) error {
|
|
if op.withUserExtend {
|
|
// collect all user_id
|
|
allUserID := gslice.Map(kbModels, func(kb *model.KnowledgeBase) int64 {
|
|
return kb.CreatorUserID
|
|
})
|
|
uniqUserID := gslice.Uniq(allUserID)
|
|
usersMapByUserID, err := op.srvc.userRepo.MGetUserByID(uniqUserID).Exec()
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: MGetUserByID failed, err: %+v", err)
|
|
return status.GenErrWithCustomMsg(status.StatusReadDBError, "query creator users failed")
|
|
}
|
|
for _, kbModel := range kbModels {
|
|
if _, ok := kbExtendMapByID[kbModel.ID]; !ok {
|
|
kbExtendMapByID[kbModel.ID] = &dto.KnowledgeBaseExtend{}
|
|
}
|
|
if user, ok := usersMapByUserID[kbModel.CreatorUserID]; ok {
|
|
kbExtendMapByID[kbModel.ID].CreatorUserExternalID = user.ExternalID
|
|
kbExtendMapByID[kbModel.ID].CreatorName = user.Username
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) Exec() ([]*dto.KnowledgeBaseResponse, error) {
|
|
listOp, err := op.srvc.buildListKnowledgeBaseOperation(op.req)
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: buildListKnowledgeBaseOperation failed, err: %+v", err)
|
|
return nil, status.GenErrWithCustomMsg(err, "build knowledge base list operation failed")
|
|
}
|
|
kbModels, err := listOp.Exec()
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: list operation exec failed, err: %+v", err)
|
|
return nil, status.GenErrWithCustomMsg(err, "list knowledge bases failed")
|
|
}
|
|
|
|
kbExtendMapByID := make(map[int64]*dto.KnowledgeBaseExtend)
|
|
|
|
if err := op.documentExtend(kbModels, kbExtendMapByID); err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: documentExtend failed, err: %+v", err)
|
|
return nil, status.GenErrWithCustomMsg(err, "build knowledge base document extension failed")
|
|
}
|
|
if err := op.userExtend(kbModels, kbExtendMapByID); err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: userExtend failed, err: %+v", err)
|
|
return nil, status.GenErrWithCustomMsg(err, "build knowledge base user extension failed")
|
|
}
|
|
|
|
knowledgeBases := make([]*dto.KnowledgeBaseResponse, 0, len(kbModels))
|
|
for _, kb := range kbModels {
|
|
knowledgeBases = append(knowledgeBases, dto.NewKnowledgeBaseResponseFromModel(kb, kbExtendMapByID[kb.ID]))
|
|
}
|
|
|
|
return knowledgeBases, nil
|
|
}
|
|
|
|
func (op *knowledgeBaseListOperation) ExecWithTotal() ([]*dto.KnowledgeBaseResponse, int64, error) {
|
|
listOp, err := op.srvc.buildListKnowledgeBaseOperation(op.req)
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: buildListKnowledgeBaseOperation failed, err: %+v", err)
|
|
return nil, 0, status.GenErrWithCustomMsg(err, "build knowledge base list operation failed")
|
|
}
|
|
kbModels, total, err := listOp.ExecWithTotal()
|
|
if err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: list operation exec with total failed, err: %+v", err)
|
|
return nil, 0, status.GenErrWithCustomMsg(err, "list knowledge bases failed")
|
|
}
|
|
|
|
kbExtendMapByID := make(map[int64]*dto.KnowledgeBaseExtend)
|
|
|
|
if err := op.documentExtend(kbModels, kbExtendMapByID); err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: documentExtend failed, err: %+v", err)
|
|
return nil, 0, status.GenErrWithCustomMsg(err, "build knowledge base document extension failed")
|
|
}
|
|
if err := op.userExtend(kbModels, kbExtendMapByID); err != nil {
|
|
logrus.Errorf("[Service layer: knowledgeBaseList]: userExtend failed, err: %+v", err)
|
|
return nil, 0, status.GenErrWithCustomMsg(err, "build knowledge base user extension failed")
|
|
}
|
|
|
|
knowledgeBases := make([]*dto.KnowledgeBaseResponse, 0, len(kbModels))
|
|
for _, kb := range kbModels {
|
|
knowledgeBases = append(knowledgeBases, dto.NewKnowledgeBaseResponseFromModel(kb, kbExtendMapByID[kb.ID]))
|
|
}
|
|
|
|
return knowledgeBases, total, nil
|
|
}
|