93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package contentreviewser
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
"91porn-server/models/v/contentreviewmod"
|
||
|
||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||
)
|
||
|
||
// issueBuilder 用 Builder 模式构建 ReviewIssue:
|
||
// 通过链式调用 MatchXxx 收集各字段的命中,HasHits/Build 在所有匹配后调用
|
||
type issueBuilder struct {
|
||
issue *contentreviewmod.ReviewIssue
|
||
hitSet map[string]struct{}
|
||
descLines []string
|
||
}
|
||
|
||
func newIssueBuilder(taskID primitive.ObjectID, targetType contentreviewmod.IssueTargetType, targetID primitive.ObjectID) *issueBuilder {
|
||
return &issueBuilder{
|
||
issue: &contentreviewmod.ReviewIssue{
|
||
TaskID: taskID,
|
||
TargetType: targetType,
|
||
TargetID: targetID,
|
||
},
|
||
hitSet: make(map[string]struct{}),
|
||
}
|
||
}
|
||
|
||
// WithMediaID 设置关联的 MediaID(仅 ACG_CONTENT 需要)
|
||
func (b *issueBuilder) WithMediaID(id primitive.ObjectID) *issueBuilder {
|
||
b.issue.MediaID = id
|
||
return b
|
||
}
|
||
|
||
// MatchTitle 匹配标题字段;命中时存入高亮版本并累计描述
|
||
// label 是描述文案中的字段名(如"标题"、"章节名")
|
||
func (b *issueBuilder) MatchTitle(label, text string, terms []string) *issueBuilder {
|
||
if hits, hl := matchAndHighlight(text, terms); len(hits) > 0 {
|
||
b.issue.Title = hl
|
||
b.addHits(label, hits)
|
||
}
|
||
return b
|
||
}
|
||
|
||
func (b *issueBuilder) MatchContent(label, text string, terms []string) *issueBuilder {
|
||
if hits, hl := matchAndHighlight(text, terms); len(hits) > 0 {
|
||
b.issue.Content = hl
|
||
b.addHits(label, hits)
|
||
}
|
||
return b
|
||
}
|
||
|
||
func (b *issueBuilder) MatchTags(label, text string, terms []string) *issueBuilder {
|
||
if hits, hl := matchAndHighlight(text, terms); len(hits) > 0 {
|
||
b.issue.Tags = hl
|
||
b.addHits(label, hits)
|
||
}
|
||
return b
|
||
}
|
||
|
||
func (b *issueBuilder) MatchRichText(label, text string, terms []string) *issueBuilder {
|
||
if hits, hl := matchAndHighlight(text, terms); len(hits) > 0 {
|
||
b.issue.RichText = hl
|
||
b.addHits(label, hits)
|
||
}
|
||
return b
|
||
}
|
||
|
||
// HasHits 是否至少有一个字段命中
|
||
func (b *issueBuilder) HasHits() bool {
|
||
return len(b.hitSet) > 0
|
||
}
|
||
|
||
// Build 收尾:拼装 Description 与去重后的 HitWords
|
||
func (b *issueBuilder) Build() *contentreviewmod.ReviewIssue {
|
||
hits := make([]string, 0, len(b.hitSet))
|
||
for h := range b.hitSet {
|
||
hits = append(hits, h)
|
||
}
|
||
b.issue.HitWords = hits
|
||
b.issue.Description = strings.Join(b.descLines, "\n")
|
||
return b.issue
|
||
}
|
||
|
||
func (b *issueBuilder) addHits(label string, hits []string) {
|
||
b.descLines = append(b.descLines, fmt.Sprintf("%s命中 %s", label, strings.Join(hits, "、")))
|
||
for _, h := range hits {
|
||
b.hitSet[h] = struct{}{}
|
||
}
|
||
}
|