package dashboard import ( "sort" "strings" "inbox/internal/domain/message" "inbox/internal/domain/topic" "inbox/internal/domain/workflow" ) func latestMessageID(items []message.Record) string { var latest message.Record for _, item := range items { if item.CreatedAt > latest.CreatedAt || (item.CreatedAt == latest.CreatedAt && item.ID > latest.ID) { latest = item } } return latest.ID } func latestMessageTime(items []message.Record) string { var latest message.Record for _, item := range items { if item.CreatedAt > latest.CreatedAt || (item.CreatedAt == latest.CreatedAt && item.ID > latest.ID) { latest = item } } return latest.CreatedAt } func latestTopicTime(record topic.Record, messages []message.Record, runs []workflow.Run) string { value := record.UpdatedAt for _, item := range messages { value = latestString(value, item.CreatedAt) } for _, item := range runs { value = latestString(value, latestRunTime(&item)) } return value } func latestTopicStage(record topic.Record, messages []message.Record, runs []workflow.Run) string { stage := record.Status timestamp := record.UpdatedAt for _, item := range messages { if item.Stage != "" && item.CreatedAt >= timestamp { stage = item.Stage timestamp = item.CreatedAt } } for _, item := range runs { runTime := latestRunTime(&item) if runTime >= timestamp { stage = string(item.Stage) timestamp = runTime } } return stage } func topicStages(record topic.Record, messages []message.Record, runs []workflow.Run) []string { seen := make(map[string]struct{}) add := func(value string) { value = strings.TrimSpace(value) if value == "" { return } if _, ok := seen[value]; ok { return } seen[value] = struct{}{} } add(record.Status) for _, item := range messages { add(item.Stage) } for _, item := range runs { add(string(item.Stage)) } out := make([]string, 0, len(seen)) for value := range seen { out = append(out, value) } sort.Strings(out) return out }