Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 96 additions & 45 deletions internal/tui/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,22 @@ func LoadData() tea.Cmd {
return msg.Error{Err: errT}
}

// Load all domains and env vars for all pods
var podDomains []model.PodDomain
var podEnvVars []model.PodEnvVar
for _, p := range pods {
domains, _ := fetchPodDomains(p.ID)
podDomains = append(podDomains, domains...)
vars, _ := fetchPodEnvVars(p.ID)
podEnvVars = append(podEnvVars, vars...)
}

return msg.DataLoaded{
Projects: projects,
Pods: pods,
GitTokens: gitTokens,
Projects: projects,
Pods: pods,
GitTokens: gitTokens,
PodDomains: podDomains,
PodEnvVars: podEnvVars,
}
}
}
Expand Down Expand Up @@ -199,7 +211,12 @@ func CreateProject(title string) tea.Cmd {
}
defer resp.Body.Close()

return msg.ProjectCreated{}
var created model.Project
if err := json.NewDecoder(resp.Body).Decode(&created); err != nil {
return msg.Error{Err: err}
}

return msg.ProjectCreated{Project: created}
}
}

Expand All @@ -211,7 +228,12 @@ func UpdateProject(project *model.Project) tea.Cmd {
}
defer resp.Body.Close()

return msg.ProjectUpdated{}
var updated model.Project
if err := json.NewDecoder(resp.Body).Decode(&updated); err != nil {
return msg.Error{Err: err}
}

return msg.ProjectUpdated{Project: updated}
}
}

Expand All @@ -223,7 +245,7 @@ func DeleteProject(id string) tea.Cmd {
}
defer resp.Body.Close()

return msg.ProjectDeleted{}
return msg.ProjectDeleted{ProjectID: id}
}
}

Expand Down Expand Up @@ -252,7 +274,12 @@ func CreatePod(pod *model.Pod) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodCreated{}
var created model.Pod
if err := json.NewDecoder(resp.Body).Decode(&created); err != nil {
return msg.Error{Err: err}
}

return msg.PodCreated{Pod: created}
}
}

Expand All @@ -264,19 +291,24 @@ func UpdatePod(pod *model.Pod) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodUpdated{}
var updated model.Pod
if err := json.NewDecoder(resp.Body).Decode(&updated); err != nil {
return msg.Error{Err: err}
}

return msg.PodUpdated{Pod: updated}
}
}

func DeletePod(id string) tea.Cmd {
func DeletePod(id, projectID string) tea.Cmd {
return func() tea.Msg {
resp, err := del("/pods/" + id)
if err != nil {
return msg.Error{Err: err}
}
defer resp.Body.Close()

return msg.PodDeleted{}
return msg.PodDeleted{PodID: id, ProjectID: projectID}
}
}

Expand Down Expand Up @@ -373,7 +405,12 @@ func CreateGitToken(name, provider, token string) tea.Cmd {
}
defer resp.Body.Close()

return msg.GitTokenCreated{}
var created model.GitToken
if err := json.NewDecoder(resp.Body).Decode(&created); err != nil {
return msg.Error{Err: err}
}

return msg.GitTokenCreated{Token: created}
}
}

Expand All @@ -385,28 +422,25 @@ func DeleteGitToken(id string) tea.Cmd {
}
defer resp.Body.Close()

return msg.GitTokenDeleted{}
return msg.GitTokenDeleted{TokenID: id}
}
}

// --- Pod Domains ---

func FetchPodDomains(podID string) tea.Cmd {
return func() tea.Msg {
resp, err := get("/pods/" + podID + "/domains")
if err != nil {
return msg.Error{Err: err}
}
defer resp.Body.Close()

var domains []model.PodDomain
err = json.NewDecoder(resp.Body).Decode(&domains)
if err != nil {
return msg.Error{Err: err}
}
func fetchPodDomains(podID string) ([]model.PodDomain, error) {
resp, err := get("/pods/" + podID + "/domains")
if err != nil {
return nil, err
}
defer resp.Body.Close()

return msg.PodDomainsLoaded{Domains: domains}
var domains []model.PodDomain
err = json.NewDecoder(resp.Body).Decode(&domains)
if err != nil {
return nil, err
}
return domains, nil
}

func CreatePodDomain(podID, domain string, port int, sslEnabled bool) tea.Cmd {
Expand All @@ -427,7 +461,12 @@ func CreatePodDomain(podID, domain string, port int, sslEnabled bool) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodDomainCreated{}
var created model.PodDomain
if err := json.NewDecoder(resp.Body).Decode(&created); err != nil {
return msg.Error{Err: err}
}

return msg.PodDomainCreated{Domain: created}
}
}

Expand All @@ -439,7 +478,7 @@ func DeletePodDomain(podID, domainID string) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodDomainDeleted{}
return msg.PodDomainDeleted{DomainID: domainID, PodID: podID}
}
}

Expand All @@ -457,7 +496,12 @@ func UpdatePodDomain(podID, domainID, domain string, port int, sslEnabled bool)
}
defer resp.Body.Close()

return msg.PodDomainUpdated{}
var updated model.PodDomain
if err := json.NewDecoder(resp.Body).Decode(&updated); err != nil {
return msg.Error{Err: err}
}

return msg.PodDomainUpdated{Domain: updated}
}
}

Expand All @@ -477,28 +521,30 @@ func GenerateAutoDomain(podID string, port int, sslEnabled bool) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodDomainCreated{}
var created model.PodDomain
if err := json.NewDecoder(resp.Body).Decode(&created); err != nil {
return msg.Error{Err: err}
}

return msg.PodDomainCreated{Domain: created}
}
}

// --- Pod Env Vars ---

func FetchPodEnvVars(podID string) tea.Cmd {
return func() tea.Msg {
resp, err := get("/pods/" + podID + "/vars")
if err != nil {
return msg.Error{Err: err}
}
defer resp.Body.Close()

var envVars []model.PodEnvVar
err = json.NewDecoder(resp.Body).Decode(&envVars)
if err != nil {
return msg.Error{Err: err}
}
func fetchPodEnvVars(podID string) ([]model.PodEnvVar, error) {
resp, err := get("/pods/" + podID + "/vars")
if err != nil {
return nil, err
}
defer resp.Body.Close()

return msg.PodEnvVarsLoaded{EnvVars: envVars}
var envVars []model.PodEnvVar
err = json.NewDecoder(resp.Body).Decode(&envVars)
if err != nil {
return nil, err
}
return envVars, nil
}

func UpdatePodEnvVars(podID string, vars []model.PodEnvVar) tea.Cmd {
Expand All @@ -513,7 +559,12 @@ func UpdatePodEnvVars(podID string, vars []model.PodEnvVar) tea.Cmd {
}
defer resp.Body.Close()

return msg.PodEnvVarsUpdated{}
var updated []model.PodEnvVar
if err := json.NewDecoder(resp.Body).Decode(&updated); err != nil {
return msg.Error{Err: err}
}

return msg.PodEnvVarsUpdated{PodID: podID, EnvVars: updated}
}
}

Expand Down
47 changes: 31 additions & 16 deletions internal/tui/msg/msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@ type ChangePage struct {
PageFactory func(s Store) tea.Model
}


// Store interface for page factories
type Store interface {
Projects() []model.Project
Pods() []model.Pod
GitTokens() []model.GitToken
PodDomains(podID string) []model.PodDomain
PodEnvVars(podID string) []model.PodEnvVar
}

// --- Connection ---
Expand Down Expand Up @@ -43,46 +46,58 @@ type AuthSuccess struct{}
// --- Data Loaded ---

type DataLoaded struct {
Projects []model.Project
Pods []model.Pod
GitTokens []model.GitToken
Projects []model.Project
Pods []model.Pod
GitTokens []model.GitToken
PodDomains []model.PodDomain
PodEnvVars []model.PodEnvVar
}

type ProjectsLoaded struct{ Projects []model.Project }
type PodsLoaded struct{ Pods []model.Pod }

// --- CRUD Success (trigger reload) ---
// --- CRUD Success (optimistic updates) ---

type ProjectCreated struct{}
type ProjectUpdated struct{}
type ProjectDeleted struct{}
type PodCreated struct{}
type PodUpdated struct{}
type PodDeleted struct{}
type ProjectCreated struct{ Project model.Project }
type ProjectUpdated struct{ Project model.Project }
type ProjectDeleted struct{ ProjectID string }
type PodCreated struct{ Pod model.Pod }
type PodUpdated struct{ Pod model.Pod }
type PodDeleted struct {
PodID string
ProjectID string
}

// --- Pod Deploy ---

type PodLoaded struct{ Pod model.Pod }
type PodDeployed struct{}
type PodStopped struct{}
type PodRestarted struct{}
type PodLogsLoaded struct{ Logs []string }

// --- Git Tokens ---

type GitTokenCreated struct{}
type GitTokenDeleted struct{}
type GitTokenCreated struct{ Token model.GitToken }
type GitTokenDeleted struct{ TokenID string }

// --- Pod Domains ---

type PodDomainsLoaded struct{ Domains []model.PodDomain }
type PodDomainCreated struct{}
type PodDomainUpdated struct{}
type PodDomainDeleted struct{}
type PodDomainCreated struct{ Domain model.PodDomain }
type PodDomainUpdated struct{ Domain model.PodDomain }
type PodDomainDeleted struct {
DomainID string
PodID string
}

// --- Pod Env Vars ---

type PodEnvVarsLoaded struct{ EnvVars []model.PodEnvVar }
type PodEnvVarsUpdated struct{}
type PodEnvVarsUpdated struct {
PodID string
EnvVars []model.PodEnvVar
}

// --- Server Settings ---

Expand Down
Loading