Files

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
}