Files
2026-07-15 22:42:31 +08:00

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
}