1package cmd
 2
 3import (
 4	"strings"
 5
 6	"github.com/charmbracelet/soft-serve/server/backend"
 7	"github.com/spf13/cobra"
 8)
 9
10func collabCommand() *cobra.Command {
11	cmd := &cobra.Command{
12		Use:     "collab",
13		Aliases: []string{"collaborator", "collaborators"},
14		Short:   "Manage collaborators",
15	}
16
17	cmd.AddCommand(
18		collabAddCommand(),
19		collabRemoveCommand(),
20		collabListCommand(),
21	)
22
23	return cmd
24}
25
26func collabAddCommand() *cobra.Command {
27	cmd := &cobra.Command{
28		Use:               "add REPOSITORY AUTHORIZED_KEY",
29		Short:             "Add a collaborator to a repo",
30		Args:              cobra.MinimumNArgs(2),
31		PersistentPreRunE: checkIfAdmin,
32		RunE: func(cmd *cobra.Command, args []string) error {
33			cfg, _ := fromContext(cmd)
34			repo := args[0]
35			pk, c, err := backend.ParseAuthorizedKey(strings.Join(args[1:], " "))
36			if err != nil {
37				return err
38			}
39
40			return cfg.Backend.AddCollaborator(pk, c, repo)
41		},
42	}
43
44	return cmd
45}
46
47func collabRemoveCommand() *cobra.Command {
48	cmd := &cobra.Command{
49		Use:               "remove REPOSITORY AUTHORIZED_KEY",
50		Args:              cobra.MinimumNArgs(2),
51		Short:             "Remove a collaborator from a repo",
52		PersistentPreRunE: checkIfAdmin,
53		RunE: func(cmd *cobra.Command, args []string) error {
54			cfg, _ := fromContext(cmd)
55			repo := args[0]
56			pk, _, err := backend.ParseAuthorizedKey(strings.Join(args[1:], " "))
57			if err != nil {
58				return err
59			}
60
61			return cfg.Backend.RemoveCollaborator(pk, repo)
62		},
63	}
64
65	return cmd
66}
67
68func collabListCommand() *cobra.Command {
69	cmd := &cobra.Command{
70		Use:               "list REPOSITORY",
71		Short:             "List collaborators for a repo",
72		Args:              cobra.ExactArgs(1),
73		PersistentPreRunE: checkIfCollab,
74		RunE: func(cmd *cobra.Command, args []string) error {
75			cfg, _ := fromContext(cmd)
76			repo := args[0]
77			collabs, err := cfg.Backend.Collaborators(repo)
78			if err != nil {
79				return err
80			}
81
82			for _, c := range collabs {
83				cmd.Println(c)
84			}
85
86			return nil
87		},
88	}
89
90	return cmd
91}