migrate from github

This commit is contained in:
2026-07-15 22:42:31 +08:00
commit 3ad559f05e
262 changed files with 21637 additions and 0 deletions
@@ -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
}