94 lines
3.1 KiB
Go
94 lines
3.1 KiB
Go
package dashboard
|
|
|
|
import (
|
|
"context"
|
|
|
|
"inbox/internal/domain/humantask"
|
|
"inbox/internal/domain/lane"
|
|
"inbox/internal/domain/message"
|
|
"inbox/internal/domain/role"
|
|
"inbox/internal/domain/topic"
|
|
"inbox/internal/domain/workflow"
|
|
)
|
|
|
|
type workspaceTopicSnapshot struct {
|
|
topics []topic.Record
|
|
topicByID map[string]topic.Record
|
|
messagesByTopic map[string][]message.Record
|
|
runsByTopic map[string][]workflow.Run
|
|
}
|
|
|
|
type workflowBoardSnapshot struct {
|
|
workspaceTopicSnapshot
|
|
roles []role.Definition
|
|
lanesByTopic map[string][]lane.Record
|
|
pendingByTopicRole map[string]map[string]int
|
|
pendingByRole map[string]int
|
|
pendingHumanByTopic map[string][]humantask.Record
|
|
pendingHumanByTopicRole map[string]map[string]int
|
|
pendingHumanByRole map[string]int
|
|
}
|
|
|
|
func (s *Service) loadWorkspaceTopicSnapshot(ctx context.Context, workspaceID string, space topic.Space) (workspaceTopicSnapshot, error) {
|
|
topics, err := s.repo.ListTopicsBySpace(ctx, workspaceID, space)
|
|
if err != nil {
|
|
return workspaceTopicSnapshot{}, err
|
|
}
|
|
messages, err := s.repo.ListMessagesByWorkspace(ctx, workspaceID)
|
|
if err != nil {
|
|
return workspaceTopicSnapshot{}, err
|
|
}
|
|
runs, err := s.repo.ListWorkflowRunsByWorkspace(ctx, workspaceID)
|
|
if err != nil {
|
|
return workspaceTopicSnapshot{}, err
|
|
}
|
|
|
|
topicByID := make(map[string]topic.Record, len(topics))
|
|
for _, item := range topics {
|
|
topicByID[item.ID] = item
|
|
}
|
|
return workspaceTopicSnapshot{
|
|
topics: topics,
|
|
topicByID: topicByID,
|
|
messagesByTopic: filterMessagesByKnownTopics(messages, topicByID),
|
|
runsByTopic: filterRunsByKnownTopics(runs, topicByID),
|
|
}, nil
|
|
}
|
|
|
|
func (s *Service) loadWorkflowBoardSnapshot(ctx context.Context, workspaceID string) (workflowBoardSnapshot, error) {
|
|
topicSnapshot, err := s.loadWorkspaceTopicSnapshot(ctx, workspaceID, topic.SpaceWorkflow)
|
|
if err != nil {
|
|
return workflowBoardSnapshot{}, err
|
|
}
|
|
roles, err := s.repo.ListRoles(ctx)
|
|
if err != nil {
|
|
return workflowBoardSnapshot{}, err
|
|
}
|
|
lanes, err := s.repo.ListLanesByWorkspace(ctx, workspaceID)
|
|
if err != nil {
|
|
return workflowBoardSnapshot{}, err
|
|
}
|
|
pending, err := s.repo.ListPendingDeliveriesByWorkspace(ctx, workspaceID)
|
|
if err != nil {
|
|
return workflowBoardSnapshot{}, err
|
|
}
|
|
pendingHumanTasks, err := s.repo.ListPendingHumanTasksByWorkspace(ctx, workspaceID)
|
|
if err != nil {
|
|
return workflowBoardSnapshot{}, err
|
|
}
|
|
|
|
return workflowBoardSnapshot{
|
|
workspaceTopicSnapshot: topicSnapshot,
|
|
roles: roles,
|
|
lanesByTopic: groupLanesByKnownTopics(lanes, topicSnapshot.topicByID),
|
|
pendingByTopicRole: groupPendingDeliveriesByTopicRole(pending, topicSnapshot.topicByID),
|
|
pendingByRole: groupPendingDeliveriesByRole(pending, topicSnapshot.topicByID),
|
|
pendingHumanByTopic: groupHumanTasksByKnownTopics(pendingHumanTasks, topicSnapshot.topicByID),
|
|
pendingHumanByTopicRole: groupPendingHumanTasksByTopicRole(
|
|
pendingHumanTasks,
|
|
topicSnapshot.topicByID,
|
|
),
|
|
pendingHumanByRole: groupPendingHumanTasksByRole(pendingHumanTasks, topicSnapshot.topicByID),
|
|
}, nil
|
|
}
|