package services import ( "context" "fmt" "strings" "time" iproto "git.solsynth.dev/hypernet/insight/pkg/proto" "git.solsynth.dev/hypernet/interactive/pkg/internal/database" "git.solsynth.dev/hypernet/interactive/pkg/internal/gap" "git.solsynth.dev/hypernet/interactive/pkg/internal/models" "github.com/rs/zerolog/log" ) func GeneratePostInsights(post models.Post, user uint) (string, error) { var insight models.PostInsight if err := database.C.Where("post_id = ?", post.ID).First(&insight).Error; err == nil { return insight.Response, nil } var compactBuilder []string if val, ok := post.Body["title"].(string); ok && len(val) > 0 { compactBuilder = append(compactBuilder, "Title: "+val) } if val, ok := post.Body["description"].(string); ok && len(val) > 0 { compactBuilder = append(compactBuilder, "Description: "+val) } if val, ok := post.Body["content"].(string); ok && len(val) > 0 { compactBuilder = append(compactBuilder, val) } compact := strings.Join(compactBuilder, "\n") conn, err := gap.Nx.GetClientGrpcConn("ai") if err != nil { return "", fmt.Errorf("failed to connect Insight: %v", err) } ic := iproto.NewInsightServiceClient(conn) ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) defer cancel() resp, err := ic.GenerateInsight(ctx, &iproto.InsightRequest{ Source: compact, UserId: uint64(user), }) if err != nil { return "", err } insight = models.PostInsight{ Response: resp.Response, Post: post, PostID: post.ID, } if err := database.C.Create(&insight).Error; err != nil { log.Error().Err(err).Msg("Failed to create post insight result in database...") } return resp.Response, nil }