Files

90 lines
3.4 KiB
Go

package inboxapp
import (
"context"
dashboardapp "inbox/internal/app/dashboard"
humantasksapp "inbox/internal/app/humantasks"
lanesapp "inbox/internal/app/lanes"
rolesapp "inbox/internal/app/roles"
"inbox/internal/app/runtimeconfig"
skillsapp "inbox/internal/app/skills"
systemfsapp "inbox/internal/app/systemfs"
taskexecapp "inbox/internal/app/taskexec"
tasksapp "inbox/internal/app/tasks"
topicsapp "inbox/internal/app/topics"
"inbox/internal/app/workflowrun"
workspacelifecycleapp "inbox/internal/app/workspacelifecycle"
"inbox/internal/app/workspaceprovision"
"inbox/internal/app/workspaceruntime"
workspacesapp "inbox/internal/app/workspaces"
"inbox/internal/base/timeutil"
"inbox/internal/domain/lane"
"inbox/internal/domain/workspace"
sqlitestore "inbox/internal/store/sqlite"
)
type WorkspaceProvisioner interface {
Provision(ctx context.Context, req workspaceprovision.ProvisionRequest) (workspace.Workspace, workspaceruntime.Runtime, error)
}
type WorkspaceRuntimeManager interface {
Ensure(ctx context.Context, workspaceID string) (workspace.Workspace, workspaceruntime.Runtime, error)
EnsureLane(ctx context.Context, laneID string) (lane.Record, error)
StopLane(ctx context.Context, laneID string) (lane.Record, error)
}
type Options struct {
WorkspaceProvision WorkspaceProvisioner
WorkspaceRuntime WorkspaceRuntimeManager
}
type Services struct {
Roles *rolesapp.Service
Skills *skillsapp.Service
RuntimeConfig *runtimeconfig.Service
Workspaces *workspacesapp.Service
WorkspaceOps *workspacelifecycleapp.Service
Topics *topicsapp.Service
Lanes *lanesapp.Service
Tasks *tasksapp.Service
HumanTasks *humantasksapp.Service
WorkflowRun *workflowrun.Service
TaskExec *taskexecapp.Service
Dashboard *dashboardapp.Service
SystemFS *systemfsapp.Service
}
func BuildServices(store *sqlitestore.Store, clock timeutil.Clock, opts Options) Services {
roleService := rolesapp.NewService(store, store, clock)
skillService := skillsapp.NewService(store)
runtimeConfigService := runtimeconfig.NewService(store, store, clock)
workspacesService := workspacesapp.NewService(store)
workspaceLifecycleService := workspacelifecycleapp.NewService(opts.WorkspaceProvision, opts.WorkspaceRuntime)
topicsService := topicsapp.NewService(store, opts.WorkspaceRuntime, clock)
lanesService := lanesapp.NewService(store, opts.WorkspaceRuntime, clock)
tasksService := tasksapp.NewService(store, clock)
humanTasksService := humantasksapp.NewService(store, clock)
taskExecOptions := make([]taskexecapp.Option, 0, 1)
if releaser, ok := any(opts.WorkspaceRuntime).(taskexecapp.LaneRuntimeReleaser); ok {
taskExecOptions = append(taskExecOptions, taskexecapp.WithLaneRuntimeReleaser(releaser))
}
taskExecService := taskexecapp.NewService(store, runtimeConfigService, clock, taskExecOptions...)
return Services{
Roles: roleService,
Skills: skillService,
RuntimeConfig: runtimeConfigService,
Workspaces: workspacesService,
WorkspaceOps: workspaceLifecycleService,
Topics: topicsService,
Lanes: lanesService,
Tasks: tasksService,
HumanTasks: humanTasksService,
WorkflowRun: workflowrun.NewService(store, runtimeConfigService, clock),
TaskExec: taskExecService,
Dashboard: dashboardapp.NewService(store),
SystemFS: systemfsapp.NewService(),
}
}