88 lines
2.0 KiB
Go
88 lines
2.0 KiB
Go
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
|
|
}
|