713 lines
26 KiB
Go
713 lines
26 KiB
Go
package grpcserver
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/XingfenD/yoresee_doc/internal/dto"
|
|
doc_container_mapper "github.com/XingfenD/yoresee_doc/internal/mapper/doc_container_mapper"
|
|
"github.com/XingfenD/yoresee_doc/internal/mapper/doc_type_mapper"
|
|
"github.com/XingfenD/yoresee_doc/internal/mapper/template_container_mapper"
|
|
"github.com/XingfenD/yoresee_doc/internal/service/document_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 DocumentServiceServer struct {
|
|
pb.UnimplementedDocumentServiceServer
|
|
}
|
|
|
|
func NewDocumentServiceServer() *DocumentServiceServer {
|
|
return &DocumentServiceServer{}
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListDocuments(ctx context.Context, req *pb.ListDocumentsRequest) (*pb.ListDocumentsResponse, error) {
|
|
if req == nil {
|
|
return &pb.ListDocumentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
filterArgs := &dto.DocumentsListFilterArgs{
|
|
TitleKeyword: req.TitleKeyword,
|
|
DocType: req.Type,
|
|
Tags: req.Tags,
|
|
}
|
|
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.ListDocumentsByExternalRequest{
|
|
ExternalArgs: &dto.DocumentsListExternalArgs{
|
|
UserExternalID: req.UserExternalId,
|
|
RootDocumentExternalID: req.RootDocumentExternalId,
|
|
KnowledgeExternalID: req.KnowledgeBaseExternalId,
|
|
},
|
|
FilterArgs: filterArgs,
|
|
SortArgs: sortArgs,
|
|
Pagination: dto.Pagination{
|
|
Page: int(req.Page),
|
|
PageSize: int(req.PageSize),
|
|
},
|
|
}
|
|
if req.Options != nil {
|
|
serviceReq.Options = &dto.RecursiveOptions{
|
|
IncludeChildren: req.Options.IncludeChildren,
|
|
Recursive: req.Options.Recursive,
|
|
Depth: utils.Of(int(req.Options.Depth)),
|
|
}
|
|
}
|
|
|
|
docs, total, err := document_service.DocumentSvc.ListDocumentsByExternal(ctx, serviceReq)
|
|
if err != nil {
|
|
return &pb.ListDocumentsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
respDocs := make([]*pb.DocumentResponse, 0, len(docs))
|
|
for _, doc := range docs {
|
|
respDocs = append(respDocs, toDocumentResponse(doc))
|
|
}
|
|
|
|
return &pb.ListDocumentsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Documents: respDocs,
|
|
TotalCount: total,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetDocumentContent(ctx context.Context, req *pb.GetDocumentContentRequest) (*pb.GetDocumentContentResponse, error) {
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.GetDocumentContentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
document, err := document_service.DocumentSvc.GetDocumentByExternalID(ctx, req.DocumentExternalId)
|
|
if err != nil {
|
|
return &pb.GetDocumentContentResponse{Base: baseResponseFromErr(status.StatusDocumentNotFound)}, nil
|
|
}
|
|
|
|
return &pb.GetDocumentContentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Document: toDocumentResponse(&document.DocumentMetaResponse),
|
|
Content: document.Content,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetDocumentSettings(ctx context.Context, req *pb.GetDocumentSettingsRequest) (*pb.GetDocumentSettingsResponse, error) {
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.GetDocumentSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
settings, err := document_service.DocumentSvc.GetDocumentSettings(ctx, &dto.GetDocumentSettingsRequest{
|
|
ExternalID: req.DocumentExternalId,
|
|
})
|
|
if err != nil {
|
|
return &pb.GetDocumentSettingsResponse{Base: baseResponseFromErr(status.StatusDocumentNotFound)}, nil
|
|
}
|
|
|
|
return &pb.GetDocumentSettingsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
IsPublic: utils.Of(settings.IsPublic),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) RecordRecentDocument(ctx context.Context, req *pb.RecordRecentDocumentRequest) (*pb.RecordRecentDocumentResponse, error) {
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.RecordRecentDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.RecordRecentDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if err := document_service.DocumentSvc.RecordRecentDocument(&dto.RecordRecentDocumentRequest{
|
|
UserExternalID: userExternalID,
|
|
DocumentExternalID: req.DocumentExternalId,
|
|
}); err != nil {
|
|
return &pb.RecordRecentDocumentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
return &pb.RecordRecentDocumentResponse{Base: baseResponseFromErr(nil)}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListRecentDocuments(ctx context.Context, req *pb.ListRecentDocumentsRequest) (*pb.ListRecentDocumentsResponse, error) {
|
|
if req == nil {
|
|
return &pb.ListRecentDocumentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.ListRecentDocumentsResponse{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.ListRecentDocumentsResponse{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.ListRecentDocumentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
endTime = &t
|
|
}
|
|
|
|
serviceReq := &dto.ListRecentDocumentsRequest{
|
|
UserExternalID: userExternalID,
|
|
StartTime: startTime,
|
|
EndTime: endTime,
|
|
Pagination: dto.Pagination{
|
|
Page: int(req.Page),
|
|
PageSize: int(req.PageSize),
|
|
},
|
|
}
|
|
documents, total, err := document_service.DocumentSvc.ListRecentDocuments(serviceReq)
|
|
if err != nil {
|
|
return &pb.ListRecentDocumentsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
respDocs := make([]*pb.DocumentResponse, 0, len(documents))
|
|
for _, doc := range documents {
|
|
respDocs = append(respDocs, toDocumentResponse(&doc.DocumentMetaResponse))
|
|
}
|
|
|
|
return &pb.ListRecentDocumentsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Documents: respDocs,
|
|
Total: total,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetDocumentYjsSnapshot(ctx context.Context, req *pb.GetDocumentYjsSnapshotRequest) (*pb.GetDocumentYjsSnapshotResponse, error) {
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.GetDocumentYjsSnapshotResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
state, err := document_service.DocumentSvc.GetDocumentYjsSnapshot(ctx, req.DocumentExternalId)
|
|
if err != nil {
|
|
return &pb.GetDocumentYjsSnapshotResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.GetDocumentYjsSnapshotResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
State: state,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) SaveDocumentYjsSnapshot(ctx context.Context, req *pb.SaveDocumentYjsSnapshotRequest) (*pb.SaveDocumentYjsSnapshotResponse, error) {
|
|
if req == nil || req.DocumentExternalId == "" || len(req.State) == 0 {
|
|
return &pb.SaveDocumentYjsSnapshotResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
if err := document_service.DocumentSvc.SaveDocumentYjsSnapshot(ctx, req.DocumentExternalId, req.State); err != nil {
|
|
return &pb.SaveDocumentYjsSnapshotResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.SaveDocumentYjsSnapshotResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetOwnDocuments(ctx context.Context, req *pb.GetOwnDocumentsRequest) (*pb.GetOwnDocumentsResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.GetOwnDocumentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
queryReq := &dto.ListDocumentsByExternalRequest{
|
|
ExternalArgs: &dto.DocumentsListExternalArgs{
|
|
UserExternalID: &userExternalID,
|
|
},
|
|
ListDocumentsBaseArgs: dto.ListDocumentsBaseArgs{
|
|
ListOwnDoc: true,
|
|
DirectoryOnly: req.DirectoryOnly,
|
|
},
|
|
Pagination: dto.Pagination{
|
|
Page: int(req.Page),
|
|
PageSize: int(req.PageSize),
|
|
},
|
|
Options: &dto.RecursiveOptions{
|
|
IncludeChildren: true,
|
|
Recursive: true,
|
|
},
|
|
}
|
|
|
|
docs, count, err := document_service.DocumentSvc.ListDocumentsByExternal(ctx, queryReq)
|
|
if err != nil {
|
|
return &pb.GetOwnDocumentsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
respDocs := make([]*pb.DocumentResponse, 0, len(docs))
|
|
for _, doc := range docs {
|
|
respDocs = append(respDocs, toDocumentResponse(doc))
|
|
}
|
|
|
|
return &pb.GetOwnDocumentsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Documents: respDocs,
|
|
TotalCount: count,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) CreateDocument(ctx context.Context, req *pb.CreateDocumentRequest) (*pb.CreateDocumentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.CreateDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.Title == "" {
|
|
return &pb.CreateDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
dtoReq := &dto.CreateDocumentRequest{
|
|
Title: req.Title,
|
|
Type: doc_type_mapper.FromProtoType(req.Type),
|
|
IsPublic: req.GetIsPublic(),
|
|
CreatorExternalID: utils.Of(userExternalID),
|
|
ParentExternalID: req.ParentExternalId,
|
|
}
|
|
if req.TemplateId != nil && *req.TemplateId > 0 {
|
|
dtoReq.TemplateID = req.TemplateId
|
|
}
|
|
|
|
containerType, ok := doc_container_mapper.FromProtoType(req.ContainerType)
|
|
if !ok {
|
|
return &pb.CreateDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
dtoReq.ContainerType = containerType
|
|
if containerType == dto.ContainerType_KnowledgeBase {
|
|
dtoReq.KnowledgeExternalID = req.KnowledgeBaseExternalId
|
|
}
|
|
|
|
resp, err := document_service.DocumentSvc.Create(ctx, dtoReq)
|
|
if err != nil {
|
|
return &pb.CreateDocumentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.CreateDocumentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
ExternalId: resp.ExternalID,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) UpdateDocument(ctx context.Context, req *pb.UpdateDocumentRequest) (*pb.UpdateDocumentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.UpdateDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if err := validateUpdateDocumentRequest(req); err != nil {
|
|
return &pb.UpdateDocumentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
serviceReq := &dto.UpdateDocumentRequest{
|
|
ExternalID: req.ExternalId,
|
|
Title: req.Title,
|
|
ParentExternalID: req.ParentExternalId,
|
|
KnowledgeBaseExternalID: req.KnowledgeBaseExternalId,
|
|
Content: req.Content,
|
|
}
|
|
|
|
if req.MoveToContainer != nil {
|
|
moveToContainer, ok := doc_container_mapper.FromProtoType(*req.MoveToContainer)
|
|
if !ok {
|
|
return &pb.UpdateDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
serviceReq.MoveToContainer = utils.Of(moveToContainer)
|
|
}
|
|
|
|
if _, err := document_service.DocumentSvc.Update(ctx, serviceReq); err != nil {
|
|
return &pb.UpdateDocumentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.UpdateDocumentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) UpdateDocumentMeta(ctx context.Context, req *pb.UpdateDocumentMetaRequest) (*pb.UpdateDocumentMetaResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.UpdateDocumentMetaResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.ExternalId == "" {
|
|
return &pb.UpdateDocumentMetaResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req.Title == nil && req.Summary == nil && req.Tags == nil {
|
|
return &pb.UpdateDocumentMetaResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
serviceReq := &dto.UpdateDocumentMetaRequest{
|
|
ExternalID: req.ExternalId,
|
|
Title: req.Title,
|
|
Summary: req.Summary,
|
|
}
|
|
if req.Tags != nil {
|
|
tags := req.Tags
|
|
serviceReq.Tags = &tags
|
|
}
|
|
|
|
if _, err := document_service.DocumentSvc.UpdateDocumentMeta(ctx, serviceReq); err != nil {
|
|
return &pb.UpdateDocumentMetaResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.UpdateDocumentMetaResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) UpdateDocumentSettings(ctx context.Context, req *pb.UpdateDocumentSettingsRequest) (*pb.UpdateDocumentSettingsResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.UpdateDocumentSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.ExternalId == "" || req.IsPublic == nil {
|
|
return &pb.UpdateDocumentSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
serviceReq := &dto.UpdateDocumentSettingsRequest{
|
|
ExternalID: req.ExternalId,
|
|
IsPublic: req.GetIsPublic(),
|
|
}
|
|
updated, err := document_service.DocumentSvc.UpdateDocumentSettings(ctx, serviceReq)
|
|
if err != nil {
|
|
return &pb.UpdateDocumentSettingsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.UpdateDocumentSettingsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
IsPublic: utils.Of(updated.IsPublic),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) UploadDocumentAttachment(ctx context.Context, req *pb.UploadDocumentAttachmentRequest) (*pb.UploadDocumentAttachmentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.UploadDocumentAttachmentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" || len(req.FileContent) == 0 {
|
|
return &pb.UploadDocumentAttachmentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
attachment, err := document_service.DocumentSvc.UploadAttachment(
|
|
ctx,
|
|
userExternalID,
|
|
req.DocumentExternalId,
|
|
req.FileContent,
|
|
req.FileName,
|
|
req.GetContentType(),
|
|
)
|
|
if err != nil {
|
|
return &pb.UploadDocumentAttachmentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.UploadDocumentAttachmentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Attachment: toAttachmentResponse(attachment),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListDocumentAttachments(ctx context.Context, req *pb.ListDocumentAttachmentsRequest) (*pb.ListDocumentAttachmentsResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.ListDocumentAttachmentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.ListDocumentAttachmentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
attachments, err := document_service.DocumentSvc.ListAttachments(ctx, req.DocumentExternalId)
|
|
if err != nil {
|
|
return &pb.ListDocumentAttachmentsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
respAttachments := make([]*pb.AttachmentResponse, 0, len(attachments))
|
|
for _, attachment := range attachments {
|
|
respAttachments = append(respAttachments, toAttachmentResponse(attachment))
|
|
}
|
|
|
|
return &pb.ListDocumentAttachmentsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Attachments: respAttachments,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) DeleteDocumentAttachment(ctx context.Context, req *pb.DeleteDocumentAttachmentRequest) (*pb.DeleteDocumentAttachmentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.DeleteDocumentAttachmentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" || req.AttachmentExternalId == "" {
|
|
return &pb.DeleteDocumentAttachmentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
if err := document_service.DocumentSvc.DeleteAttachment(ctx, req.DocumentExternalId, req.AttachmentExternalId); err != nil {
|
|
return &pb.DeleteDocumentAttachmentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.DeleteDocumentAttachmentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListDocumentVersions(ctx context.Context, req *pb.ListDocumentVersionsRequest) (*pb.ListDocumentVersionsResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.ListDocumentVersionsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.ListDocumentVersionsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
items, total, err := document_service.DocumentSvc.ListDocumentVersions(ctx, req.DocumentExternalId, req.Page, req.PageSize)
|
|
if err != nil {
|
|
return &pb.ListDocumentVersionsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
respItems := make([]*pb.DocumentVersionResponse, 0, len(items))
|
|
for _, item := range items {
|
|
respItems = append(respItems, toDocumentVersionResponse(item))
|
|
}
|
|
return &pb.ListDocumentVersionsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Versions: respItems,
|
|
Total: total,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetDocumentVersionContent(ctx context.Context, req *pb.GetDocumentVersionContentRequest) (*pb.GetDocumentVersionContentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.GetDocumentVersionContentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" || req.Version <= 0 {
|
|
return &pb.GetDocumentVersionContentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
item, err := document_service.DocumentSvc.GetDocumentVersionContent(ctx, req.DocumentExternalId, req.Version)
|
|
if err != nil {
|
|
return &pb.GetDocumentVersionContentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
return &pb.GetDocumentVersionContentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Version: toDocumentVersionResponse(item),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) CreateTemplate(ctx context.Context, req *pb.CreateTemplateRequest) (*pb.CreateTemplateResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.CreateTemplateResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
|
|
}
|
|
if req == nil {
|
|
return &pb.CreateTemplateResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
serviceReq := &dto.CreateTemplateRequest{
|
|
UserExternalID: userExternalID,
|
|
TargetContainer: template_container_mapper.FromProtoType(req.TargetContainer),
|
|
TemplateContent: req.TemplateContent,
|
|
Type: doc_type_mapper.FromProtoType(req.Type),
|
|
}
|
|
if req.KnowledgeBaseId != "" {
|
|
serviceReq.KnowledgeBaseExternalID = utils.Of(req.KnowledgeBaseId)
|
|
}
|
|
|
|
if err := document_service.DocumentSvc.CreateTemplate(ctx, serviceReq); err != nil {
|
|
return &pb.CreateTemplateResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.CreateTemplateResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) GetTemplate(ctx context.Context, req *pb.GetTemplateRequest) (*pb.GetTemplateResponse, error) {
|
|
if req == nil || req.TemplateId <= 0 {
|
|
return &pb.GetTemplateResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.GetTemplateResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
resp, err := document_service.DocumentSvc.GetTemplateByID(req.TemplateId)
|
|
if err != nil {
|
|
return &pb.GetTemplateResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
if req.RecordRecentLog {
|
|
_ = document_service.DocumentSvc.CreateRecentTemplate(&dto.CreateRecentTemplateRequest{
|
|
UserExternalID: userExternalID,
|
|
TemplateID: req.TemplateId,
|
|
AccessTime: time.Now(),
|
|
})
|
|
}
|
|
return &pb.GetTemplateResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Template: toTemplateResponse(resp),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListRecentTemplates(ctx context.Context, req *pb.ListRecentTemplatesRequest) (*pb.ListRecentTemplatesResponse, error) {
|
|
if req == nil {
|
|
return &pb.ListRecentTemplatesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.ListRecentTemplatesResponse{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.ListRecentTemplatesResponse{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.ListRecentTemplatesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
endTime = &t
|
|
}
|
|
|
|
serviceReq := &dto.ListRecentTemplatesRequest{
|
|
UserExternalID: userExternalID,
|
|
StartTime: startTime,
|
|
EndTime: endTime,
|
|
Pagination: dto.Pagination{
|
|
Page: int(req.Page),
|
|
PageSize: int(req.PageSize),
|
|
},
|
|
}
|
|
templates, total, err := document_service.DocumentSvc.ListRecentTemplates(serviceReq)
|
|
if err != nil {
|
|
return &pb.ListRecentTemplatesResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
respTemplates := make([]*pb.TemplateResponse, 0, len(templates))
|
|
for _, tpl := range templates {
|
|
respTemplates = append(respTemplates, toTemplateResponse(tpl))
|
|
}
|
|
return &pb.ListRecentTemplatesResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Templates: respTemplates,
|
|
Total: total,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) ListTemplates(ctx context.Context, req *pb.ListTemplatesRequest) (*pb.ListTemplatesResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.ListTemplatesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
if req == nil {
|
|
return &pb.ListTemplatesResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
filterArgs := &dto.TemplateListFilterArgs{
|
|
NameKeyword: req.NameKeyword,
|
|
KnowledgeBaseID: req.KnowledgeBaseId,
|
|
}
|
|
if req.TargetContainer != nil {
|
|
container := template_container_mapper.FromProtoType(req.GetTargetContainer())
|
|
filterArgs.TargetContainer = utils.Of(container)
|
|
}
|
|
if req.Type != nil {
|
|
filterArgs.Type = utils.Of(doc_type_mapper.FromProtoType(req.GetType()))
|
|
}
|
|
|
|
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.TemplateListByExternalRequest{
|
|
FilterArgs: filterArgs,
|
|
SortArgs: sortArgs,
|
|
Pagination: dto.Pagination{
|
|
Page: int(req.Page),
|
|
PageSize: int(req.PageSize),
|
|
},
|
|
}
|
|
if req.OnlyMine {
|
|
serviceReq.CreatorExternalID = userExternalID
|
|
}
|
|
if req.TargetContainer != nil && template_container_mapper.FromProtoType(req.GetTargetContainer()) == dto.TemplateContainerOwn {
|
|
serviceReq.CreatorExternalID = userExternalID
|
|
}
|
|
|
|
templates, total, err := document_service.DocumentSvc.ListTemplatesByExternal(serviceReq)
|
|
if err != nil {
|
|
return &pb.ListTemplatesResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
respTemplates := make([]*pb.TemplateResponse, 0, len(templates))
|
|
for _, tpl := range templates {
|
|
respTemplates = append(respTemplates, toTemplateResponse(tpl))
|
|
}
|
|
|
|
return &pb.ListTemplatesResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
Templates: respTemplates,
|
|
Total: total,
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) UpdateTemplateSettings(ctx context.Context, req *pb.UpdateTemplateSettingsRequest) (*pb.UpdateTemplateSettingsResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.UpdateTemplateSettingsResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
|
|
}
|
|
if req == nil || req.TemplateId <= 0 {
|
|
return &pb.UpdateTemplateSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
serviceReq := &dto.UpdateTemplateSettingsRequest{
|
|
UserExternalID: userExternalID,
|
|
TemplateID: req.TemplateId,
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
IsPublic: req.IsPublic,
|
|
}
|
|
|
|
if err := document_service.DocumentSvc.UpdateTemplateSettings(ctx, serviceReq); err != nil {
|
|
return &pb.UpdateTemplateSettingsResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.UpdateTemplateSettingsResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|
|
|
|
func (s *DocumentServiceServer) DeleteDocument(ctx context.Context, req *pb.DeleteDocumentRequest) (*pb.DeleteDocumentResponse, error) {
|
|
userExternalID, ok := ctx.Value("user_external_id").(string)
|
|
if !ok || userExternalID == "" {
|
|
return &pb.DeleteDocumentResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
|
|
}
|
|
if req == nil || req.DocumentExternalId == "" {
|
|
return &pb.DeleteDocumentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
|
|
}
|
|
|
|
if err := document_service.DocumentSvc.DeleteDocumentByExternalID(ctx, req.DocumentExternalId); err != nil {
|
|
return &pb.DeleteDocumentResponse{Base: baseResponseFromErr(err)}, nil
|
|
}
|
|
|
|
return &pb.DeleteDocumentResponse{
|
|
Base: baseResponseFromErr(nil),
|
|
}, nil
|
|
}
|