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,184 @@
package grpcserver
import (
"context"
"strings"
"github.com/XingfenD/yoresee_doc/internal/dto"
"github.com/XingfenD/yoresee_doc/internal/media"
"github.com/XingfenD/yoresee_doc/internal/model"
"github.com/XingfenD/yoresee_doc/internal/repository/document_repo"
"github.com/XingfenD/yoresee_doc/internal/repository/user_repo"
"github.com/XingfenD/yoresee_doc/internal/service/auth_service"
"github.com/XingfenD/yoresee_doc/internal/service/comment_service"
"github.com/XingfenD/yoresee_doc/internal/status"
pb "github.com/XingfenD/yoresee_doc/pkg/gen/yoresee_doc/v1"
)
type CommentServiceServer struct {
pb.UnimplementedCommentServiceServer
userRepo *user_repo.UserRepository
docRepo *document_repo.DocumentRepository
}
func NewCommentServiceServer(userRepo *user_repo.UserRepository, docRepo *document_repo.DocumentRepository) *CommentServiceServer {
return &CommentServiceServer{
userRepo: userRepo,
docRepo: docRepo,
}
}
func (s *CommentServiceServer) CreateDocumentComment(ctx context.Context, req *pb.CreateDocumentCommentRequest) (*pb.CreateDocumentCommentResponse, error) {
if req == nil {
return &pb.CreateDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
userExternalID, ok := ctx.Value("user_external_id").(string)
if !ok || strings.TrimSpace(userExternalID) == "" {
return &pb.CreateDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
}
var parentExternalID *string
if req.ParentExternalId != nil && strings.TrimSpace(req.GetParentExternalId()) != "" {
parentExternalID = req.ParentExternalId
}
var anchorID *string
if req.AnchorId != nil && strings.TrimSpace(req.GetAnchorId()) != "" {
anchorID = req.AnchorId
}
var quote *string
if req.Quote != nil && strings.TrimSpace(req.GetQuote()) != "" {
quote = req.Quote
}
comment, err := comment_service.CommentSvc.CreateComment(&dto.CreateCommentRequest{
DocumentExternalID: req.DocumentExternalId,
Content: req.Content,
ParentExternalID: parentExternalID,
AnchorID: anchorID,
Quote: quote,
CreatorExternalID: userExternalID,
MentionedUserExternalIDs: req.MentionedUserExternalIds,
})
if err != nil {
return &pb.CreateDocumentCommentResponse{Base: baseResponseFromErr(err)}, nil
}
creator, _ := s.userRepo.GetByExternalID(userExternalID).Exec()
resp := toCommentResponse(comment, req.DocumentExternalId, req.GetParentExternalId(), creator)
return &pb.CreateDocumentCommentResponse{Base: baseResponseFromErr(nil), Comment: resp}, nil
}
func (s *CommentServiceServer) ListDocumentComments(ctx context.Context, req *pb.ListDocumentCommentsRequest) (*pb.ListDocumentCommentsResponse, error) {
if req == nil {
return &pb.ListDocumentCommentsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
comments, total, err := comment_service.CommentSvc.ListComments(&dto.ListCommentsRequest{
DocumentExternalID: req.DocumentExternalId,
Page: int(req.Page),
PageSize: int(req.PageSize),
})
if err != nil {
return &pb.ListDocumentCommentsResponse{Base: baseResponseFromErr(err)}, nil
}
creatorIDs := make([]int64, 0, len(comments))
for _, item := range comments {
creatorIDs = append(creatorIDs, item.CreatorID)
}
creatorMap, _ := s.userRepo.MGetUserByID(creatorIDs).Exec()
parentMap := make(map[int64]string, len(comments))
for _, item := range comments {
parentMap[item.ID] = item.ExternalID
}
respItems := make([]*pb.DocumentComment, 0, len(comments))
for _, item := range comments {
parentExternalID := ""
if item.ParentID != 0 {
parentExternalID = parentMap[item.ParentID]
}
respItems = append(respItems, toCommentResponse(&item, req.DocumentExternalId, parentExternalID, creatorMap[item.CreatorID]))
}
return &pb.ListDocumentCommentsResponse{
Base: baseResponseFromErr(nil),
Comments: respItems,
Total: total,
}, nil
}
func (s *CommentServiceServer) DeleteDocumentComment(ctx context.Context, req *pb.DeleteDocumentCommentRequest) (*pb.DeleteDocumentCommentResponse, error) {
if req == nil || strings.TrimSpace(req.ExternalId) == "" {
return &pb.DeleteDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
userExternalID, ok := ctx.Value("user_external_id").(string)
if !ok || strings.TrimSpace(userExternalID) == "" {
return &pb.DeleteDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
}
isAdmin, _ := auth_service.AuthSvc.IsAdmin(userExternalID)
if err := comment_service.CommentSvc.DeleteComment(&dto.DeleteCommentRequest{
ExternalID: req.ExternalId,
OperatorExternalID: userExternalID,
}, isAdmin); err != nil {
return &pb.DeleteDocumentCommentResponse{Base: baseResponseFromErr(err)}, nil
}
return &pb.DeleteDocumentCommentResponse{Base: baseResponseFromErr(nil)}, nil
}
func (s *CommentServiceServer) UpdateDocumentComment(ctx context.Context, req *pb.UpdateDocumentCommentRequest) (*pb.UpdateDocumentCommentResponse, error) {
if req == nil || strings.TrimSpace(req.ExternalId) == "" || strings.TrimSpace(req.Content) == "" {
return &pb.UpdateDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
userExternalID, ok := ctx.Value("user_external_id").(string)
if !ok || strings.TrimSpace(userExternalID) == "" {
return &pb.UpdateDocumentCommentResponse{Base: baseResponseFromStatus(status.StatusTokenInvalid)}, nil
}
isAdmin, _ := auth_service.AuthSvc.IsAdmin(userExternalID)
comment, err := comment_service.CommentSvc.UpdateComment(&dto.UpdateCommentRequest{
ExternalID: req.ExternalId,
Content: req.Content,
OperatorExternalID: userExternalID,
}, isAdmin)
if err != nil {
return &pb.UpdateDocumentCommentResponse{Base: baseResponseFromErr(err)}, nil
}
docExternalID := ""
if comment != nil && comment.DocumentID != 0 {
if docs, err := s.docRepo.MGetByIDs([]int64{comment.DocumentID}); err == nil && len(docs) > 0 {
docExternalID = docs[0].ExternalID
}
}
creator, _ := s.userRepo.GetByExternalID(userExternalID).Exec()
resp := toCommentResponse(comment, docExternalID, "", creator)
return &pb.UpdateDocumentCommentResponse{Base: baseResponseFromErr(nil), Comment: resp}, nil
}
func toCommentResponse(comment *model.DocumentComment, docExternalID, parentExternalID string, creator *model.User) *pb.DocumentComment {
if comment == nil {
return nil
}
resp := &pb.DocumentComment{
ExternalId: comment.ExternalID,
DocumentExternalId: docExternalID,
ParentExternalId: parentExternalID,
Content: comment.Content,
AnchorId: comment.AnchorID,
Quote: "",
CreatorUserExternalId: "",
CreatorName: "",
CreatorAvatar: "",
CreatedAt: timeToString(comment.CreatedAt),
}
if creator != nil {
resp.CreatorUserExternalId = creator.ExternalID
if creator.Nickname != "" {
resp.CreatorName = creator.Nickname
} else {
resp.CreatorName = creator.Username
}
resp.CreatorAvatar = media.BuildAvatarURL(creator.ExternalID, creator.AvatarObjectKey, creator.AvatarVersion)
}
return resp
}