1package cmd
2
3import (
4 "fmt"
5 "strconv"
6
7 "github.com/charmbracelet/soft-serve/pkg/access"
8 "github.com/charmbracelet/soft-serve/pkg/backend"
9 "github.com/spf13/cobra"
10)
11
12// SettingsCommand returns a command that manages server settings.
13func SettingsCommand() *cobra.Command {
14 cmd := &cobra.Command{
15 Use: "settings",
16 Short: "Manage server settings",
17 }
18
19 cmd.AddCommand(
20 &cobra.Command{
21 Use: "allow-keyless [true|false]",
22 Short: "Set or get allow keyless access to repositories",
23 Args: cobra.RangeArgs(0, 1),
24 PersistentPreRunE: checkIfAdmin,
25 RunE: func(cmd *cobra.Command, args []string) error {
26 ctx := cmd.Context()
27 be := backend.FromContext(ctx)
28 switch len(args) {
29 case 0:
30 cmd.Println(be.AllowKeyless(ctx))
31 case 1:
32 v, _ := strconv.ParseBool(args[0])
33 if err := be.SetAllowKeyless(ctx, v); err != nil {
34 return err //nolint:wrapcheck
35 }
36 }
37
38 return nil
39 },
40 },
41 )
42
43 als := []string{access.NoAccess.String(), access.ReadOnlyAccess.String(), access.ReadWriteAccess.String(), access.AdminAccess.String()}
44 cmd.AddCommand(
45 &cobra.Command{
46 Use: "anon-access [ACCESS_LEVEL]",
47 Short: "Set or get the default access level for anonymous users",
48 Args: cobra.RangeArgs(0, 1),
49 ValidArgs: als,
50 PersistentPreRunE: checkIfAdmin,
51 RunE: func(cmd *cobra.Command, args []string) error {
52 ctx := cmd.Context()
53 be := backend.FromContext(ctx)
54 switch len(args) {
55 case 0:
56 cmd.Println(be.AnonAccess(ctx))
57 case 1:
58 al := access.ParseAccessLevel(args[0])
59 if al < 0 {
60 return fmt.Errorf("invalid access level: %s. Please choose one of the following: %s", args[0], als)
61 }
62 if err := be.SetAnonAccess(ctx, al); err != nil {
63 return err //nolint:wrapcheck
64 }
65 }
66
67 return nil
68 },
69 },
70 )
71
72 return cmd
73}