2026-07-01 08:42:51 +00:00
|
|
|
package usecase
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
app "haixun-backend/internal/library/errors"
|
|
|
|
|
"haixun-backend/internal/library/errors/code"
|
|
|
|
|
"haixun-backend/internal/model/knowledge_graph/domain/entity"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func isGraphNotFound(err error) bool {
|
|
|
|
|
if e := app.FromError(err); e != nil && e.Category() == code.ResNotFound {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// loadTopicGraph resolves a placement-topic graph, including legacy brand-scoped graphs.
|
|
|
|
|
func (u *knowledgeGraphUseCase) loadTopicGraph(ctx context.Context, tenantID, ownerUID, topicID, brandID string) (*entity.Graph, error) {
|
|
|
|
|
topicID = strings.TrimSpace(topicID)
|
|
|
|
|
if topicID == "" {
|
|
|
|
|
return nil, app.For(code.Brand).InputMissingRequired("topic id is required")
|
|
|
|
|
}
|
|
|
|
|
item, err := u.repo.FindByTopic(ctx, tenantID, ownerUID, topicID)
|
|
|
|
|
if err != nil && !isGraphNotFound(err) {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if item != nil {
|
|
|
|
|
return item, nil
|
|
|
|
|
}
|
|
|
|
|
brandID = strings.TrimSpace(brandID)
|
|
|
|
|
if brandID == "" {
|
|
|
|
|
return nil, app.For(code.Brand).ResNotFound("knowledge graph not found")
|
|
|
|
|
}
|
|
|
|
|
legacy, legacyErr := u.repo.FindByBrand(ctx, tenantID, ownerUID, brandID)
|
|
|
|
|
if legacyErr != nil {
|
|
|
|
|
if isGraphNotFound(legacyErr) {
|
|
|
|
|
return nil, app.For(code.Brand).ResNotFound("knowledge graph not found")
|
|
|
|
|
}
|
|
|
|
|
return nil, legacyErr
|
|
|
|
|
}
|
|
|
|
|
if legacy == nil {
|
|
|
|
|
return nil, app.For(code.Brand).ResNotFound("knowledge graph not found")
|
|
|
|
|
}
|
|
|
|
|
legacyTopicID := strings.TrimSpace(legacy.TopicID)
|
|
|
|
|
if legacyTopicID != "" && legacyTopicID != topicID {
|
|
|
|
|
return nil, app.For(code.Brand).ResNotFound("knowledge graph not found")
|
|
|
|
|
}
|
|
|
|
|
if legacyTopicID == "" {
|
|
|
|
|
if err := u.repo.AttachTopicID(ctx, tenantID, ownerUID, brandID, topicID); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
legacy.TopicID = topicID
|
|
|
|
|
}
|
|
|
|
|
return legacy, nil
|
2026-07-03 14:42:19 +00:00
|
|
|
}
|