Files
kandev/apps/backend/internal/backendapp/canvas_source_projection.go
T
2026-09-11 14:51:32 +00:00

81 lines
1.9 KiB
Go

package backendapp
import (
"context"
"strings"
"github.com/kandev/kandev/internal/task/models"
)
type canvasSourceLookup interface {
GetTask(context.Context, string) (*models.Task, error)
GetTaskSession(context.Context, string) (*models.TaskSession, error)
}
type canvasSourceLabels struct {
TaskTitle string
SessionName string
}
// projectCanvasSourceLabels adds only labels that the current caller can read.
// The source identifiers remain action and lookup identities, never fallbacks.
func projectCanvasSourceLabels(
ctx context.Context,
lookup canvasSourceLookup,
workspaceID string,
taskID string,
sessionID string,
) canvasSourceLabels {
if lookup == nil {
return canvasSourceLabels{}
}
if taskID == "" && sessionID != "" {
session, err := lookup.GetTaskSession(ctx, sessionID)
if err != nil || session == nil {
return canvasSourceLabels{}
}
taskID = session.TaskID
}
if taskID == "" {
return canvasSourceLabels{}
}
task, err := lookup.GetTask(ctx, taskID)
if err != nil || task == nil || task.WorkspaceID != workspaceID {
return canvasSourceLabels{}
}
labels := canvasSourceLabels{TaskTitle: strings.TrimSpace(task.Title)}
if sessionID == "" {
return labels
}
session, err := lookup.GetTaskSession(ctx, sessionID)
if err != nil || session == nil || session.TaskID != task.ID {
return labels
}
labels.SessionName = strings.TrimSpace(session.Name)
return labels
}
func (h *canvasHTTPHandler) decorateCanvasReleaseSources(
ctx context.Context,
workspaceID string,
responses ...*canvasReleaseResponse,
) {
for _, response := range responses {
if response == nil || (response.SourceTaskID == "" && response.SourceSessionID == "") {
continue
}
labels := projectCanvasSourceLabels(
ctx,
h.tasks,
workspaceID,
response.SourceTaskID,
response.SourceSessionID,
)
response.SourceTaskTitle = labels.TaskTitle
response.SourceSessionName = labels.SessionName
}
}