@@ -4,14 +4,18 @@ import (
44 "fmt"
55 "github.com/OctopusDeploy/cli/pkg/apiclient"
66 "io"
7+ "strings"
78
89 "github.com/MakeNowJust/heredoc/v2"
910 "github.com/OctopusDeploy/cli/pkg/constants"
1011 "github.com/OctopusDeploy/cli/pkg/factory"
1112 "github.com/OctopusDeploy/cli/pkg/output"
1213 "github.com/OctopusDeploy/cli/pkg/usage"
14+ "github.com/OctopusDeploy/cli/pkg/util"
1315 "github.com/OctopusDeploy/cli/pkg/util/flag"
1416 "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client"
17+ "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projectgroups"
18+ "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projects"
1519 "github.com/pkg/browser"
1620 "github.com/spf13/cobra"
1721)
@@ -36,6 +40,7 @@ type ViewOptions struct {
3640 out io.Writer
3741 idOrName string
3842 flags * ViewFlags
43+ Command * cobra.Command
3944}
4045
4146func NewCmdView (f factory.Factory ) * cobra.Command {
@@ -61,6 +66,7 @@ func NewCmdView(f factory.Factory) *cobra.Command {
6166 cmd .OutOrStdout (),
6267 args [0 ],
6368 viewFlags ,
69+ cmd ,
6470 }
6571
6672 return viewRun (opts )
@@ -79,31 +85,99 @@ func viewRun(opts *ViewOptions) error {
7985 return err
8086 }
8187
82- fmt .Fprintf (opts .out , "%s %s\n " , output .Bold (projectGroup .GetName ()), output .Dimf ("(%s)" , projectGroup .GetID ()))
83-
84- if projectGroup .Description == "" {
85- fmt .Fprintln (opts .out , output .Dim (constants .NoDescription ))
86- } else {
87- fmt .Fprintln (opts .out , output .Dim (projectGroup .Description ))
88- }
89-
9088 projects , err := opts .Client .ProjectGroups .GetProjects (projectGroup )
9189 if err != nil {
9290 return err
9391 }
94- fmt .Fprintf (opts .out , output .Cyan ("\n Projects:\n " ))
95- for _ , project := range projects {
96- fmt .Fprintf (opts .out , "%s (%s)\n " , output .Bold (project .GetName ()), project .Slug )
92+
93+ // Use basic format as default for project group view when no -f flag is specified
94+ if ! opts .Command .Flags ().Changed (constants .FlagOutputFormat ) {
95+ opts .Command .Flags ().Set (constants .FlagOutputFormat , constants .OutputFormatBasic )
9796 }
9897
99- url := fmt .Sprintf ("%s/app#/%s/projects?projectGroupId=%s" , opts .Host , projectGroup .SpaceID , projectGroup .GetID ())
98+ return output .PrintResource (projectGroup , opts .Command , output.Mappers [* projectgroups.ProjectGroup ]{
99+ Json : func (pg * projectgroups.ProjectGroup ) any {
100+ projectList := make ([]ProjectInfo , 0 , len (projects ))
101+ for _ , project := range projects {
102+ projectList = append (projectList , ProjectInfo {
103+ Id : project .GetID (),
104+ Name : project .GetName (),
105+ Slug : project .Slug ,
106+ })
107+ }
108+
109+ return ProjectGroupAsJson {
110+ Id : pg .GetID (),
111+ Name : pg .GetName (),
112+ Description : pg .Description ,
113+ Projects : projectList ,
114+ WebUrl : util .GenerateWebURL (opts .Host , pg .SpaceID , fmt .Sprintf ("projects?projectGroupId=%s" , pg .GetID ())),
115+ }
116+ },
117+ Table : output.TableDefinition [* projectgroups.ProjectGroup ]{
118+ Header : []string {"NAME" , "DESCRIPTION" , "PROJECTS COUNT" , "WEB URL" },
119+ Row : func (pg * projectgroups.ProjectGroup ) []string {
120+ description := pg .Description
121+ if description == "" {
122+ description = constants .NoDescription
123+ }
124+
125+ url := util .GenerateWebURL (opts .Host , pg .SpaceID , fmt .Sprintf ("projects?projectGroupId=%s" , pg .GetID ()))
126+
127+ return []string {
128+ output .Bold (pg .GetName ()),
129+ description ,
130+ fmt .Sprintf ("%d" , len (projects )),
131+ output .Blue (url ),
132+ }
133+ },
134+ },
135+ Basic : func (pg * projectgroups.ProjectGroup ) string {
136+ return formatProjectGroupForBasic (opts , pg , projects )
137+ },
138+ })
139+ }
140+
141+ type ProjectInfo struct {
142+ Id string `json:"Id"`
143+ Name string `json:"Name"`
144+ Slug string `json:"Slug"`
145+ }
100146
101- // footer
102- fmt .Fprintf (opts .out , "\n View this project group in Octopus Deploy: %s\n " , output .Blue (url ))
147+ type ProjectGroupAsJson struct {
148+ Id string `json:"Id"`
149+ Name string `json:"Name"`
150+ Description string `json:"Description"`
151+ Projects []ProjectInfo `json:"Projects"`
152+ WebUrl string `json:"WebUrl"`
153+ }
103154
155+ func formatProjectGroupForBasic (opts * ViewOptions , projectGroup * projectgroups.ProjectGroup , projects []* projects.Project ) string {
156+ var result strings.Builder
157+
158+ // header
159+ result .WriteString (fmt .Sprintf ("%s %s\n " , output .Bold (projectGroup .GetName ()), output .Dimf ("(%s)" , projectGroup .GetID ())))
160+
161+ // description
162+ if projectGroup .Description == "" {
163+ result .WriteString (fmt .Sprintln (output .Dim (constants .NoDescription )))
164+ } else {
165+ result .WriteString (fmt .Sprintln (output .Dim (projectGroup .Description )))
166+ }
167+
168+ // projects
169+ result .WriteString (fmt .Sprintf (output .Cyan ("\n Projects:\n " )))
170+ for _ , project := range projects {
171+ result .WriteString (fmt .Sprintf ("%s (%s)\n " , output .Bold (project .GetName ()), project .Slug ))
172+ }
173+
174+ // footer with web URL
175+ url := util .GenerateWebURL (opts .Host , projectGroup .SpaceID , fmt .Sprintf ("projects?projectGroupId=%s" , projectGroup .GetID ()))
176+ result .WriteString (fmt .Sprintf ("\n View this project group in Octopus Deploy: %s\n " , output .Blue (url )))
177+
104178 if opts .flags .Web .Value {
105179 browser .OpenURL (url )
106180 }
107-
108- return nil
181+
182+ return result . String ()
109183}
0 commit comments