package logic import ( "context" "strings" "juwan-backend/app/community/rpc/internal/svc" "juwan-backend/app/community/rpc/pb" "github.com/zeromicro/go-zero/core/logx" ) type SearchCommentsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewSearchCommentsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SearchCommentsLogic { return &SearchCommentsLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *SearchCommentsLogic) SearchComments(in *pb.SearchCommentsReq) (*pb.SearchCommentsResp, error) { limit := in.GetLimit() if limit <= 0 { limit = 20 } offset := in.GetPage() if offset < 0 { offset = 0 } store := l.svcCtx.Store store.Mu.RLock() defer store.Mu.RUnlock() filtered := make([]*pb.Comments, 0, len(store.Comments)) for _, c := range store.Comments { if c.GetDeletedAt() > 0 { continue } if in.GetId() > 0 && c.GetId() != in.GetId() { continue } if in.GetPostId() > 0 && c.GetPostId() != in.GetPostId() { continue } if in.GetAuthorId() > 0 && c.GetAuthorId() != in.GetAuthorId() { continue } if in.Content != nil && !strings.Contains(strings.ToLower(c.GetContent()), strings.ToLower(in.GetContent())) { continue } if in.LikeCount != nil && c.GetLikeCount() != in.GetLikeCount() { continue } cc := *c filtered = append(filtered, &cc) } sortCommentsAsc(filtered) if offset >= int64(len(filtered)) { return &pb.SearchCommentsResp{Comments: []*pb.Comments{}}, nil } end := offset + limit if end > int64(len(filtered)) { end = int64(len(filtered)) } return &pb.SearchCommentsResp{Comments: filtered[offset:end]}, nil }