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}