migrate from github
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/model"
|
||||
"github.com/XingfenD/yoresee_doc/internal/repository/knowledge_base_repo"
|
||||
internal_dto "github.com/XingfenD/yoresee_doc/internal/service/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
)
|
||||
|
||||
func buildKnowledgeBaseListReqFromExternal(req *dto.KnowledgeBaseListByExternalRequest, creatorID *int64) *internal_dto.KnowledgeBaseListReq {
|
||||
if req == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &internal_dto.KnowledgeBaseListReq{
|
||||
CreatorID: creatorID,
|
||||
FilterArgs: req.FilterArgs,
|
||||
SortArgs: req.SortArgs,
|
||||
Pagination: req.Pagination,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) buildListKnowledgeBaseOperation(req *internal_dto.KnowledgeBaseListReq) (*knowledge_base_repo.ListKnowledgeBaseOperation, error) {
|
||||
if s == nil || s.knowledgeBaseRepo == nil {
|
||||
return nil, status.StatusServiceInternalError
|
||||
}
|
||||
if req == nil {
|
||||
return nil, status.StatusInternalParamsError
|
||||
}
|
||||
op := s.knowledgeBaseRepo.List(&model.KnowledgeBase{}).WithCreatorID(req.CreatorID)
|
||||
if req.FilterArgs != nil {
|
||||
op = op.WithIsPublic(req.FilterArgs.IsPublic).
|
||||
WithNameKeyword(req.FilterArgs.NameKeyword).
|
||||
WithCreateTimeRange(req.FilterArgs.CreateTimeRangeStart, req.FilterArgs.CreateTimeRangeEnd).
|
||||
WithUpdateTimeRange(req.FilterArgs.UpdateTimeRangeStart, req.FilterArgs.UpdateTimeRangeEnd)
|
||||
}
|
||||
op = op.WithSort(req.SortArgs.Field, req.SortArgs.Desc).
|
||||
WithPagination(req.Pagination.Page, req.Pagination.PageSize)
|
||||
return op, nil
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/model"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
"github.com/XingfenD/yoresee_doc/internal/utils"
|
||||
)
|
||||
|
||||
func (s *KnowledgeBaseService) Create(req *dto.CreateKnowledgeBaseRequest) (*dto.CreateKnowledgeBaseResponse, error) {
|
||||
if req == nil || req.Name == "" {
|
||||
return nil, status.StatusParamError
|
||||
}
|
||||
|
||||
userID, err := s.userRepo.GetIDByExternalID(req.CreatorExternalID).Exec()
|
||||
if err != nil {
|
||||
return nil, status.StatusUserNotFound
|
||||
}
|
||||
|
||||
kbModel := &model.KnowledgeBase{
|
||||
ExternalID: utils.GenerateExternalID(utils.ExternalIDKnowledgeBase),
|
||||
Name: req.Name,
|
||||
Description: req.Description,
|
||||
Cover: req.Cover,
|
||||
IsPublic: req.IsPublic,
|
||||
CreatorUserID: userID,
|
||||
}
|
||||
|
||||
if err := s.knowledgeBaseRepo.Create(kbModel).Exec(); err != nil {
|
||||
return nil, status.StatusWriteDBError
|
||||
}
|
||||
|
||||
return &dto.CreateKnowledgeBaseResponse{ExternalID: kbModel.ExternalID}, nil
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/model"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
)
|
||||
|
||||
func (s *KnowledgeBaseService) CreateRecentKnowledgeBase(req *dto.CreateRecentKnowledgeBaseRequest) error {
|
||||
userID, err := s.userRepo.GetIDByExternalID(req.UserExternalID).Exec()
|
||||
if err != nil {
|
||||
return status.StatusUserNotFound
|
||||
}
|
||||
|
||||
knowledgeBaseID, err := s.knowledgeBaseRepo.GetIDByExternalID(req.KnowledgeBaseExternalID).Exec()
|
||||
if err != nil {
|
||||
return status.StatusKnowledgeBaseNotFound
|
||||
}
|
||||
|
||||
err = s.knowledgeBaseRepo.CreateRecentKnowledgeBase(&model.RecentKnowledgeBase{
|
||||
UserID: userID,
|
||||
KnowledgeBaseID: knowledgeBaseID,
|
||||
AccessedAt: req.AssessTime,
|
||||
}).Exec()
|
||||
|
||||
if err != nil {
|
||||
return status.StatusWriteDBError
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type KnowledgeBaseGetByExternalIDOperation struct {
|
||||
withUserExtend bool
|
||||
withDocumentExtend bool
|
||||
req *dto.KnowledgeBaseGetByExternalIDRequest
|
||||
srvc *KnowledgeBaseService
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) GetByExternalID(req *dto.KnowledgeBaseGetByExternalIDRequest) *KnowledgeBaseGetByExternalIDOperation {
|
||||
return &KnowledgeBaseGetByExternalIDOperation{
|
||||
req: req,
|
||||
srvc: s,
|
||||
}
|
||||
}
|
||||
|
||||
func (op *KnowledgeBaseGetByExternalIDOperation) WithExtend() *KnowledgeBaseGetByExternalIDOperation {
|
||||
op.withUserExtend = true
|
||||
op.withDocumentExtend = true
|
||||
return op
|
||||
}
|
||||
|
||||
func (op *KnowledgeBaseGetByExternalIDOperation) WithUserExtend() *KnowledgeBaseGetByExternalIDOperation {
|
||||
op.withUserExtend = true
|
||||
return op
|
||||
}
|
||||
|
||||
func (op *KnowledgeBaseGetByExternalIDOperation) WithDocumentExtend() *KnowledgeBaseGetByExternalIDOperation {
|
||||
op.withDocumentExtend = true
|
||||
return op
|
||||
}
|
||||
|
||||
func (op *KnowledgeBaseGetByExternalIDOperation) Exec() (*dto.KnowledgeBaseResponse, error) {
|
||||
kbModel, err := op.srvc.knowledgeBaseRepo.GetByExternalID(op.req.KnowledgeBaseExternalID).Exec()
|
||||
if err != nil {
|
||||
logrus.Errorf("[Service layer: KnowledgeBaseService] GetByExternalID failed, external_id=%s, err=%+v", op.req.KnowledgeBaseExternalID, err)
|
||||
return nil, status.GenErrWithCustomMsg(status.StatusKnowledgeBaseNotFound, "knowledge base not found")
|
||||
}
|
||||
extendDTO := &dto.KnowledgeBaseExtend{}
|
||||
|
||||
if op.withUserExtend {
|
||||
userModel, err := op.srvc.userRepo.GetByID(kbModel.CreatorUserID).Exec()
|
||||
if err != nil {
|
||||
logrus.Errorf("[Service layer: KnowledgeBaseService] Get creator user failed, user_id=%d, err=%+v", kbModel.CreatorUserID, err)
|
||||
return nil, status.GenErrWithCustomMsg(status.StatusReadDBError, "query creator failed")
|
||||
}
|
||||
extendDTO.CreatorUserExternalID = userModel.ExternalID
|
||||
extendDTO.CreatorName = userModel.Username
|
||||
}
|
||||
|
||||
if op.withDocumentExtend {
|
||||
ids := []int64{
|
||||
kbModel.ID,
|
||||
}
|
||||
count, err := op.srvc.knowledgeBaseRepo.MGetKnowledgeBaseDocumentsCount(ids).Exec()
|
||||
if err != nil {
|
||||
logrus.Errorf("[Service layer: KnowledgeBaseService] MGetKnowledgeBaseDocumentsCount failed, kb_id=%d, err=%+v", kbModel.ID, err)
|
||||
return nil, status.GenErrWithCustomMsg(status.StatusReadDBError, "query document count failed")
|
||||
}
|
||||
extendDTO.DocumentsCount = count[kbModel.ID]
|
||||
}
|
||||
|
||||
return dto.NewKnowledgeBaseResponseFromModel(
|
||||
kbModel, extendDTO,
|
||||
), nil
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/repository"
|
||||
"github.com/XingfenD/yoresee_doc/internal/repository/knowledge_base_repo"
|
||||
"github.com/XingfenD/yoresee_doc/internal/repository/user_repo"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
)
|
||||
|
||||
type KnowledgeBaseService struct {
|
||||
knowledgeBaseRepo *knowledge_base_repo.KnowledgeBaseRepository
|
||||
userRepo *user_repo.UserRepository
|
||||
}
|
||||
|
||||
func NewKnowledgeBaseService(repos *repository.Repositories) *KnowledgeBaseService {
|
||||
return &KnowledgeBaseService{
|
||||
knowledgeBaseRepo: repos.KnowledgeBase,
|
||||
userRepo: repos.User,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) GetIDByExternalID(externalID string) (int64, error) {
|
||||
id, err := s.knowledgeBaseRepo.GetIDByExternalID(externalID).Exec()
|
||||
if err != nil {
|
||||
return 0, status.StatusKnowledgeBaseNotFound
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
|
||||
var KnowledgeBaseSvc *KnowledgeBaseService
|
||||
@@ -0,0 +1,142 @@
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func (s *KnowledgeBaseService) ListByExternal(req *dto.KnowledgeBaseListByExternalRequest) ([]*dto.KnowledgeBaseResponse, int64, error) {
|
||||
var creatorID *int64
|
||||
if req.CreatorExternalID != "" {
|
||||
id, err := s.userRepo.GetIDByExternalID(req.CreatorExternalID).Exec()
|
||||
if err != nil {
|
||||
logrus.Errorf("[Service layer: KnowledgeBaseService] GetIDByExternalID failed, creator_external_id=%s, err=%+v", req.CreatorExternalID, err)
|
||||
return nil, 0, status.StatusUserNotFound
|
||||
}
|
||||
creatorID = &id
|
||||
}
|
||||
|
||||
routerReq := buildKnowledgeBaseListReqFromExternal(req, creatorID)
|
||||
list, total, err := s.list(routerReq).WithDocumentExtend().WithUserExtend().ExecWithTotal()
|
||||
if err != nil {
|
||||
logrus.Errorf("[Service layer: KnowledgeBaseService] ListByExternal failed, err=%+v", err)
|
||||
return nil, 0, status.GenErrWithCustomMsg(err, "list knowledge bases failed")
|
||||
}
|
||||
return list, total, nil
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package knowledge_base_service
|
||||
|
||||
import (
|
||||
"github.com/XingfenD/yoresee_doc/internal/dto"
|
||||
"github.com/XingfenD/yoresee_doc/internal/model"
|
||||
"github.com/XingfenD/yoresee_doc/internal/status"
|
||||
)
|
||||
|
||||
func (s *KnowledgeBaseService) ListRecentKnowledgeBases(req *dto.ListRecentKnowledgeBasesRequest) ([]*dto.KnowledgeBaseResponse, int64, error) {
|
||||
if req == nil || req.UserExternalID == "" {
|
||||
return nil, 0, status.StatusInternalParamsError
|
||||
}
|
||||
|
||||
userID, err := s.userRepo.GetIDByExternalID(req.UserExternalID).Exec()
|
||||
if err != nil {
|
||||
return nil, 0, status.StatusUserNotFound
|
||||
}
|
||||
|
||||
recentRecords, total, err := s.knowledgeBaseRepo.ListRecentKnowledgeBases(userID).
|
||||
WithTimeRange(req.StartTime, req.EndTime).
|
||||
WithPagination(req.Pagination.Page, req.Pagination.PageSize).
|
||||
Exec()
|
||||
if err != nil {
|
||||
return nil, 0, status.StatusReadDBError
|
||||
}
|
||||
|
||||
if len(recentRecords) == 0 {
|
||||
return []*dto.KnowledgeBaseResponse{}, total, nil
|
||||
}
|
||||
|
||||
kbIDs := make([]int64, 0, len(recentRecords))
|
||||
for _, r := range recentRecords {
|
||||
kbIDs = append(kbIDs, r.KnowledgeBaseID)
|
||||
}
|
||||
|
||||
kbModels, err := s.knowledgeBaseRepo.MGetKnowledgeBaseByIDs(kbIDs).Exec()
|
||||
if err != nil {
|
||||
return nil, 0, status.StatusReadDBError
|
||||
}
|
||||
|
||||
kbMap := make(map[int64]*model.KnowledgeBase, len(kbModels))
|
||||
for _, kb := range kbModels {
|
||||
kbMap[kb.ID] = kb
|
||||
}
|
||||
|
||||
kbExtendMapByID := make(map[int64]*dto.KnowledgeBaseExtend)
|
||||
op := &knowledgeBaseListOperation{
|
||||
srvc: s,
|
||||
withDocumentExtend: true,
|
||||
withUserExtend: true,
|
||||
}
|
||||
_ = op.documentExtend(kbModels, kbExtendMapByID)
|
||||
_ = op.userExtend(kbModels, kbExtendMapByID)
|
||||
|
||||
resp := make([]*dto.KnowledgeBaseResponse, 0, len(recentRecords))
|
||||
for _, record := range recentRecords {
|
||||
kb := kbMap[record.KnowledgeBaseID]
|
||||
if kb == nil {
|
||||
continue
|
||||
}
|
||||
resp = append(resp, dto.NewKnowledgeBaseResponseFromModel(kb, kbExtendMapByID[kb.ID]))
|
||||
}
|
||||
|
||||
return resp, total, nil
|
||||
}
|
||||
Reference in New Issue
Block a user