package grpcserver import ( "context" "time" "github.com/XingfenD/yoresee_doc/internal/dto" "github.com/XingfenD/yoresee_doc/internal/service/document_service" "github.com/XingfenD/yoresee_doc/internal/service/knowledge_base_service" "github.com/XingfenD/yoresee_doc/internal/status" "github.com/XingfenD/yoresee_doc/internal/utils" pb "github.com/XingfenD/yoresee_doc/pkg/gen/yoresee_doc/v1" ) type KnowledgeBaseServiceServer struct { pb.UnimplementedKnowledgeBaseServiceServer } func NewKnowledgeBaseServiceServer() *KnowledgeBaseServiceServer { return &KnowledgeBaseServiceServer{} } func (s *KnowledgeBaseServiceServer) ListKnowledgeBases(ctx context.Context, req *pb.ListKnowledgeBasesRequest) (*pb.ListKnowledgeBasesResponse, error) { if req == nil { return &pb.ListKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } userExternalID, ok := ctx.Value("user_external_id").(string) if !ok || userExternalID == "" { return &pb.ListKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } filterArgs := &dto.KnowledgeBaseListFilterArgs{ IsPublic: req.IsPublic, NameKeyword: req.NameKeyword, } if req.CreateTimeRange != nil { filterArgs.CreateTimeRangeStart = req.CreateTimeRange.Start filterArgs.CreateTimeRangeEnd = req.CreateTimeRange.End } if req.UpdateTimeRange != nil { filterArgs.UpdateTimeRangeStart = req.UpdateTimeRange.Start filterArgs.UpdateTimeRangeEnd = req.UpdateTimeRange.End } sortArgs := dto.SortArgs{Field: "created_at", Desc: true} if req.OrderBy != nil { sortArgs.Field = req.GetOrderBy() } if req.OrderDesc != nil { sortArgs.Desc = req.GetOrderDesc() } serviceReq := &dto.KnowledgeBaseListByExternalRequest{ CreatorExternalID: "", FilterArgs: filterArgs, SortArgs: sortArgs, Pagination: dto.Pagination{ Page: int(req.Page), PageSize: int(req.PageSize), }, } if req.OnlyMine { serviceReq.CreatorExternalID = userExternalID } kbs, total, err := knowledge_base_service.KnowledgeBaseSvc.ListByExternal(serviceReq) if err != nil { return &pb.ListKnowledgeBasesResponse{Base: baseResponseFromErr(err)}, nil } respKBs := make([]*pb.KnowledgeBaseResponse, 0, len(kbs)) for _, kb := range kbs { respKBs = append(respKBs, toKnowledgeBaseResponse(kb)) } return &pb.ListKnowledgeBasesResponse{ Base: baseResponseFromErr(nil), KnowledgeBases: respKBs, Total: total, }, nil } func (s *KnowledgeBaseServiceServer) GetKnowledgeBase(ctx context.Context, req *pb.GetKnowledgeBaseRequest) (*pb.GetKnowledgeBaseResponse, error) { if req == nil || req.KnowledgeBaseExternalId == "" { return &pb.GetKnowledgeBaseResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } userExternalID, ok := ctx.Value("user_external_id").(string) if !ok || userExternalID == "" { return &pb.GetKnowledgeBaseResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } kbDTO, err := knowledge_base_service.KnowledgeBaseSvc.GetByExternalID(&dto.KnowledgeBaseGetByExternalIDRequest{ KnowledgeBaseExternalID: req.KnowledgeBaseExternalId, }).WithExtend().Exec() if err != nil { return &pb.GetKnowledgeBaseResponse{Base: baseResponseFromErr(status.StatusKnowledgeBaseNotFound)}, nil } if req.RecordRecentLog { knowledge_base_service.KnowledgeBaseSvc.CreateRecentKnowledgeBase(&dto.CreateRecentKnowledgeBaseRequest{ UserExternalID: userExternalID, KnowledgeBaseExternalID: req.KnowledgeBaseExternalId, AssessTime: time.Now(), }) } svcReq := &dto.ListDocumentsByExternalRequest{ ExternalArgs: &dto.DocumentsListExternalArgs{ KnowledgeExternalID: utils.Of(kbDTO.ExternalID), }, ListDocumentsBaseArgs: dto.ListDocumentsBaseArgs{ DirectoryOnly: req.DirectoryOnly, }, Pagination: dto.Pagination{ Page: int(req.Page), PageSize: int(req.PageSize), }, Options: &dto.RecursiveOptions{ IncludeChildren: true, Recursive: true, }, } documents, totalCount, err := document_service.DocumentSvc.ListDocumentsByExternal( ctx, svcReq, ) if err != nil { return &pb.GetKnowledgeBaseResponse{Base: baseResponseFromErr(status.StatusDocumentNotFound)}, nil } respDocs := make([]*pb.DocumentResponse, 0, len(documents)) for _, doc := range documents { respDocs = append(respDocs, toDocumentResponse(doc)) } return &pb.GetKnowledgeBaseResponse{ Base: baseResponseFromErr(nil), KnowledgeBase: toKnowledgeBaseResponse(kbDTO), Documents: respDocs, TotalCount: totalCount, }, nil } func (s *KnowledgeBaseServiceServer) CreateKnowledgeBase(ctx context.Context, req *pb.CreateKnowledgeBaseRequest) (*pb.CreateKnowledgeBaseResponse, error) { userExternalID, ok := ctx.Value("user_external_id").(string) if !ok || userExternalID == "" { return &pb.CreateKnowledgeBaseResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } if req == nil || req.Name == "" { return &pb.CreateKnowledgeBaseResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } resp, err := knowledge_base_service.KnowledgeBaseSvc.Create(&dto.CreateKnowledgeBaseRequest{ CreatorExternalID: userExternalID, Name: req.Name, Description: req.Description, Cover: req.Cover, IsPublic: req.IsPublic, }) if err != nil { return &pb.CreateKnowledgeBaseResponse{Base: baseResponseFromErr(err)}, nil } return &pb.CreateKnowledgeBaseResponse{ Base: baseResponseFromErr(nil), ExternalId: resp.ExternalID, }, nil } func (s *KnowledgeBaseServiceServer) ListRecentKnowledgeBases(ctx context.Context, req *pb.ListRecentKnowledgeBasesRequest) (*pb.ListRecentKnowledgeBasesResponse, error) { if req == nil { return &pb.ListRecentKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } userExternalID, ok := ctx.Value("user_external_id").(string) if !ok || userExternalID == "" { return &pb.ListRecentKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } var startTime *time.Time if req.StartTime != nil && *req.StartTime != "" { t, err := time.Parse(time.RFC3339, *req.StartTime) if err != nil { return &pb.ListRecentKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } startTime = &t } var endTime *time.Time if req.EndTime != nil && *req.EndTime != "" { t, err := time.Parse(time.RFC3339, *req.EndTime) if err != nil { return &pb.ListRecentKnowledgeBasesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil } endTime = &t } serviceReq := &dto.ListRecentKnowledgeBasesRequest{ UserExternalID: userExternalID, StartTime: startTime, EndTime: endTime, Pagination: dto.Pagination{ Page: int(req.Page), PageSize: int(req.PageSize), }, } kbs, total, err := knowledge_base_service.KnowledgeBaseSvc.ListRecentKnowledgeBases(serviceReq) if err != nil { return &pb.ListRecentKnowledgeBasesResponse{Base: baseResponseFromErr(err)}, nil } respKBs := make([]*pb.KnowledgeBaseResponse, 0, len(kbs)) for _, kb := range kbs { respKBs = append(respKBs, toKnowledgeBaseResponse(kb)) } return &pb.ListRecentKnowledgeBasesResponse{ Base: baseResponseFromErr(nil), KnowledgeBases: respKBs, Total: total, }, nil }