package controller import ( "context" "runtime" "github.com/kandev/kandev/internal/user/dto" "github.com/kandev/kandev/internal/user/service" ) type Controller struct { svc *service.Service } func NewController(svc *service.Service) *Controller { return &Controller{svc: svc} } func (c *Controller) GetCurrentUser(ctx context.Context) (dto.UserResponse, error) { user, err := c.svc.GetCurrentUser(ctx) if err != nil { return dto.UserResponse{}, err } settings, err := c.svc.GetUserSettings(ctx) if err != nil { return dto.UserResponse{}, err } return dto.UserResponse{ User: dto.FromUser(user), Settings: dto.FromUserSettings(settings), }, nil } func (c *Controller) GetUserSettings(ctx context.Context) (dto.UserSettingsResponse, error) { settings, err := c.svc.GetUserSettings(ctx) if err != nil { return dto.UserSettingsResponse{}, err } return dto.UserSettingsResponse{ Settings: dto.FromUserSettings(settings), ShellOptions: shellOptionsForOS(), }, nil } func (c *Controller) UpdateUserSettings(ctx context.Context, req dto.UpdateUserSettingsRequest) (dto.UserSettingsResponse, error) { settings, err := c.svc.UpdateUserSettings(ctx, &service.UpdateUserSettingsRequest{ WorkspaceID: req.WorkspaceID, KanbanViewMode: req.KanbanViewMode, StartupPage: req.StartupPage, WorkflowFilterID: req.WorkflowFilterID, RepositoryIDs: req.RepositoryIDs, TasksListSort: req.TasksListSort, TasksListGroup: req.TasksListGroup, TasksListShowDetails: req.TasksListShowDetails, InitialSetupComplete: req.InitialSetupComplete, PreferredShell: req.PreferredShell, DefaultEditorID: req.DefaultEditorID, EnablePreviewOnClick: req.EnablePreviewOnClick, ChatSubmitKey: req.ChatSubmitKey, ReviewAutoMarkOnScroll: req.ReviewAutoMarkOnScroll, ConfirmTaskArchive: req.ConfirmTaskArchive, UnreadDivider: req.UnreadDivider, AgentGeneratedTaskTitles: req.AgentGeneratedTaskTitles, MCPTaskAgentProfileDefault: req.MCPTaskAgentProfileDefault, ShowAnchoredPromptBar: req.ShowAnchoredPromptBar, ShowScrollToLastPrompt: req.ShowScrollToLastPrompt, ShowScrollToStart: req.ShowScrollToStart, ShowTranscriptAutoScrollControl: req.ShowTranscriptAutoScrollControl, ShowReleaseNotification: req.ShowReleaseNotification, ReleaseNotesLastSeenVersion: req.ReleaseNotesLastSeenVersion, LspAutoStartLanguages: req.LspAutoStartLanguages, LspAutoInstallLanguages: req.LspAutoInstallLanguages, LspServerConfigs: req.LspServerConfigs, LspStatusLocation: req.LspStatusLocation, SavedLayouts: req.SavedLayouts, SidebarViews: req.SidebarViews, SidebarActiveViewID: req.SidebarActiveViewID, SidebarDraft: req.SidebarDraft.ServiceValue(), SidebarTaskPrefs: req.SidebarTaskPrefs, TaskCreateLastUsed: req.TaskCreateLastUsed, JiraSavedViews: req.JiraSavedViews.ServiceValue(), JiraTaskPresets: req.JiraTaskPresets.ServiceValue(), GitHubSavedPresets: req.GitHubSavedPresets.ServiceValue(), GitHubDefaultQueryPresets: req.GitHubDefaultQueryPresets.ServiceValue(), GitLabSavedPresets: req.GitLabSavedPresets.ServiceValue(), AzureDevOpsBrowsePreferences: req.AzureDevOpsBrowsePreferences.ServiceValue(), DefaultUtilityAgentID: req.DefaultUtilityAgentID, DefaultUtilityModel: req.DefaultUtilityModel, KeyboardShortcuts: req.KeyboardShortcuts, TerminalLinkBehavior: req.TerminalLinkBehavior, TerminalFontFamily: req.TerminalFontFamily, TerminalFontSize: req.TerminalFontSize, ChangesPanelLayout: req.ChangesPanelLayout, SystemMetricsDisplay: systemMetricsDisplayPatch(req.SystemMetricsDisplay), AppStatusBarOrder: req.AppStatusBarOrder, VoiceMode: req.VoiceMode, }) if err != nil { return dto.UserSettingsResponse{}, err } return dto.UserSettingsResponse{ Settings: dto.FromUserSettings(settings), ShellOptions: shellOptionsForOS(), }, nil } func systemMetricsDisplayPatch(patch *dto.SystemMetricsDisplaySettingsPatch) *service.SystemMetricsDisplaySettingsPatch { if patch == nil { return nil } return &service.SystemMetricsDisplaySettingsPatch{ ShowInTopbar: patch.ShowInTopbar, Simplified: patch.Simplified, } } func shellOptionsForOS() []dto.ShellOption { switch runtime.GOOS { case "windows": return []dto.ShellOption{ {Value: "auto", Label: "System default"}, {Value: "pwsh.exe", Label: "PowerShell (pwsh)"}, {Value: "powershell.exe", Label: "Windows PowerShell"}, {Value: "cmd.exe", Label: "Command Prompt"}, {Value: "custom", Label: "Custom"}, } default: return []dto.ShellOption{ {Value: "auto", Label: "System default"}, {Value: "/bin/zsh", Label: "zsh"}, {Value: "/bin/bash", Label: "bash"}, {Value: "/bin/sh", Label: "sh"}, {Value: "custom", Label: "Custom"}, } } }